@payfit/unity-themes
Version:
80 lines (60 loc) • 1.98 kB
Markdown
# Unity theme styling patterns
## Responsive and state modifiers
Keep the `uy:` prefix before the complete Tailwind modifier chain.
```tsx
<div className="uy:grid uy:grid-cols-1 uy:md:grid-cols-2 uy:lg:grid-cols-3" />
```
When a Unity component exposes managed state through `data-*`, target that
state rather than the native pseudo-class.
```tsx
import { ListViewItem } from '@payfit/unity-components'
;<ListViewItem className="uy:data-[hovered=true]:bg-surface-primary-hover" />
```
## Merge external classes with uyMerge
`uyMerge` knows Unity's custom class groups and token families.
```tsx
import { uyMerge } from '@payfit/unity-themes'
uyMerge('uy:p-100', 'uy:p-200')
// => 'uy:p-200'
uyMerge('uy:bg-surface-primary', 'uy:bg-surface-danger')
// => 'uy:bg-surface-danger'
```
## Define typed variants with uyTv
Use `uyTv` for reusable component variants and derive public props with
`VariantProps`.
```tsx
import type { VariantProps } from '@payfit/unity-themes'
import { uyTv } from '@payfit/unity-themes'
export const callout = uyTv({
base: 'uy:inline-flex uy:items-center uy:gap-100 uy:rounded-100 uy:px-200 uy:py-100',
variants: {
intent: {
info: 'uy:bg-surface-primary uy:text-content-inverted',
danger: 'uy:bg-surface-danger uy:text-content-inverted',
neutral: 'uy:bg-surface-neutral uy:text-content-neutral',
},
size: {
sm: 'uy:typography-body-small',
md: 'uy:typography-body',
},
},
defaultVariants: { intent: 'info', size: 'md' },
})
export type CalloutVariantProps = VariantProps<typeof callout>
```
## Compose conditional classes with cn
Use `cn` for local boolean conditions, not for a reusable multi-axis variant
API.
```tsx
import { cn } from '@payfit/unity-themes'
function Row({ isActive }: { isActive: boolean }) {
return (
<div
className={cn(
'uy:flex uy:items-center uy:px-200 uy:py-100',
isActive && 'uy:bg-surface-primary',
)}
/>
)
}
```