Style variants
VEUI provide style variants via the ui
prop. Theme packages can provide different ui
value for each component and users can also use custom ui
values to create extended style variants.
The ui
prop
The ui
prop takes a string consists of a list of whitespace-separated tokens, similar to HTML's native class
attribute. Each token stands for a style variant of a component. In the following example, primary
and large
are both style variants of component <veui-button>
:
<veui-button ui="primary large">OK</veui-button>
As we know, most component libraries provide style variants via enum props like shape
/size
/type
/... .
While our design goal is that VEUI should not be bound to a specific design language tightly (though it's hard to completely decouple component structure/behavior and design languages). If we use enum props, once we need to create a completely new theme package but some of the new style variants cannot be described with the preserved enum props, we'll have to use something like class
to attach style hooks to implement these style variants.
Using class
will lead to problems of naming conventions, prefixes, etc. So we decided to directly output a custom attribute ui
to component's DOM nodes for more semantic style variants and minimize the coupling with component logic.
Use the ONE DESIGN theme
You can enable veui-theme-one by setting the corresponding options for veui-loader. The theme package provides style variants for most components. You can refer to documentation for the ui
prop in each component to learn about the supported style variants.
Custom style variants
You don't need to register via component API to define custom ui
tokens. Just adding style declarations for the corresponding [ui~="..."]
selector would be sufficient.
eg. If you want a new secondary
variant for Button
component, just add styles to .veui-button[ui~"secondary"]
:
<template>
<article>
<veui-button ui="primary">
Primary
</veui-button>
<veui-button ui="secondary">
Custom
</veui-button>
</article>
</template>
<script>
import Button from 'veui/components/Button'
export default {
components: {
'veui-button': Button
}
}
</script>
<style lang="less" scoped>
.veui-button[ui~="secondary"] {
background-color: #e5e5ff;
&:hover {
background-color: #ddf;
}
&:active {
background-color: #ccf;
}
}
</style>
Custom theme package
If you want to create a custom theme package, please read more about VEUI's theming API more the advanced ways of customizing ui
prop at Advanced › Theming.