-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
For most use-cases, people are using function interpolation to make it possible to design components based on props.
This can be transformed into declarative API as Variants.
What we should consider:
- It should be possible to make some variants as required, without specifying the default value
- It should be possible to make some variants optional and the developer should not write style for default value (e.g. type="flat" in the example doesn't have specified value)
- It should work with boolean types (e.g.
active: { true: 'classes', false: 'classes' }) - Should be easy to work with
- Should support comments and Primitive Interpolations
The possible ways to implement this can be:
- Options object:
export interface ButtonProps {
type?: 'rounded' | 'flat'
variant?: 'filled' | 'outlined'
// ...
}
export const Button = stail<ButtonProps>("button", {
variants: {
type: {
rounded: 'rounded-full',
},
variant: {
filled: 'bg-gray-400 text-white hover:bg-gray-300 active:bg-gray-200',
outlined: 'bg-white border-gray-400 text-gray-400 hover:border-gray-300 active:border-gray-200'
}
},
defaultProps: {
type: 'rounded',
variant: 'filled'
}
})`px-4 py-2 text-xl font-bold`
<Button>Rounded filled</Button>
<Button variant="outlined">Rounded outlined</Button>
<Button type="flat" variant="outlined">Flat outlined</Button>- Variant helper:
export interface ButtonProps {
type?: 'rounded' | 'flat'
variant?: 'filled' | 'outlined'
// ...
}
export const Button = stail.button<ButtonProps>`
px-4 py-2 text-xl font-bold
${variant(
"type",
{
rounded: 'rounded-full',
},
"rounded"
)}
${variant(
"variant",
{
filled: 'bg-gray-400 text-white hover:bg-gray-300 active:bg-gray-200',
outlined: 'bg-white border-gray-400 text-gray-400 hover:border-gray-300 active:border-gray-200'
},
"filled"
)}`
<Button>Rounded filled</Button>
<Button variant="outlined">Rounded outlined</Button>
<Button type="flat" variant="outlined">Flat outlined</Button>As I can see the second option is more native and gives developers more freedom to design component
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request