@vtex/admin-ui
Version:
> VTEX admin component library
146 lines (134 loc) • 2.68 kB
text/typescript
import { focusVisible, style, styleVariants } from '@vtex/admin-ui-core'
type ActionTone = 'main' | 'critical' | 'neutral'
type ActionVariant = 'primary' | 'secondary' | 'tertiary'
interface ActionOptions {
tone: ActionTone
variant: ActionVariant
}
function action(options: ActionOptions) {
const { tone, variant } = options
return style({
color: `action.${tone}.${variant}`,
bg: `action.${tone}.${variant}`,
':hover': {
color: `action.${tone}.${variant}Hover`,
bg: `action.${tone}.${variant}Hover`,
},
':active': {
color: `action.${tone}.${variant}Pressed`,
bg: `action.${tone}.${variant}Pressed`,
},
':disabled': {
bg: variant === 'tertiary' ? 'transparent' : '$disabled',
color: '$disabled',
},
...focusVisible(tone),
})
}
export const buttonStyle = style({
text: '$action1',
border: 'none',
borderRadius: 'default',
cursor: 'pointer',
position: 'relative',
})
export const bleedY = styleVariants({
size: {
normal: {
marginY: '$-l',
},
large: {
marginY: '$-xl',
},
},
})
export const bleedX = styleVariants({
size: {
normal: {
marginX: '$-l',
},
large: {
marginX: '$-xl',
},
},
})
export const variants = styleVariants({
variant: {
primary: action({
tone: 'main',
variant: 'primary',
}),
secondary: action({
tone: 'main',
variant: 'secondary',
}),
tertiary: action({
tone: 'main',
variant: 'tertiary',
}),
critical: action({
tone: 'critical',
variant: 'primary',
}),
criticalSecondary: action({
tone: 'critical',
variant: 'secondary',
}),
criticalTertiary: action({
tone: 'critical',
variant: 'tertiary',
}),
neutralTertiary: action({
tone: 'neutral',
variant: 'tertiary',
}),
},
size: {
normal: {
padding: '$s',
height: '2.25rem',
},
large: {
padding: '$m',
height: '2.75rem',
},
},
})
export const innerContainerStyle = style({
text: '$action1',
})
export const innerContainerVariants = styleVariants({
loading: {
true: {
visibility: 'hidden',
},
false: {
visibility: 'visible',
},
},
iconPosition: {
start: {
flexDirection: 'row',
svg: {
marginRight: '$s',
},
},
end: {
flexDirection: 'row-reverse',
svg: {
marginLeft: '$xs',
},
},
},
})
export const spinnerContainerStyle = style({
text: '$action1',
position: 'absolute',
bottom: 0,
top: 0,
left: 0,
right: 0,
svg: {
size: '1.3rem',
},
})