|
|
|
|
@ -22,6 +22,7 @@ import {
|
|
|
|
|
type FontFamily,
|
|
|
|
|
type FocusColorRoles,
|
|
|
|
|
type LayoutPrimitiveSet,
|
|
|
|
|
type PrimitiveSet,
|
|
|
|
|
type SizePrimitiveSet,
|
|
|
|
|
type SurfaceColorRoles,
|
|
|
|
|
type ThemeColorSet,
|
|
|
|
|
@ -152,6 +153,8 @@ export function renderStaticCss(options: EidosConfig): string {
|
|
|
|
|
appendSizeDeclarations(declarations, primitives.size)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
appendTransitionAliasDeclarations(declarations, options)
|
|
|
|
|
|
|
|
|
|
const blocks = [renderBlock(':root', declarations)]
|
|
|
|
|
if (primitives.density) blocks.push(renderDensityBlocks())
|
|
|
|
|
|
|
|
|
|
@ -358,6 +361,113 @@ function appendSizeDeclarations(declarations: string[], sizes: SizePrimitiveSet)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function appendTransitionAliasDeclarations(
|
|
|
|
|
declarations: string[],
|
|
|
|
|
options: EidosConfig
|
|
|
|
|
): void {
|
|
|
|
|
const { primitives } = options
|
|
|
|
|
|
|
|
|
|
if (primitives.controlHeight?.xxs) {
|
|
|
|
|
declarations.push(cssVar('control-height-2xs', 'var(--control-height-xxs)'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (primitives.radius?.sm) {
|
|
|
|
|
declarations.push(cssVar('radius-xs', 'var(--radius-sm)'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
appendFontFamilyAliases(declarations, primitives.typography?.families)
|
|
|
|
|
appendTypographyAliases(declarations, primitives.typography)
|
|
|
|
|
|
|
|
|
|
if (primitives.motion) {
|
|
|
|
|
declarations.push(cssVar('motion-spin-duration', '800ms'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasFocusColor(options)) {
|
|
|
|
|
declarations.push(cssVar('color-focus-ring', 'var(--focus-ring-color)'))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function appendFontFamilyAliases(
|
|
|
|
|
declarations: string[],
|
|
|
|
|
families: TypographyPrimitiveSet['families'] | undefined
|
|
|
|
|
): void {
|
|
|
|
|
if (!families) return
|
|
|
|
|
|
|
|
|
|
if (families.primary) {
|
|
|
|
|
declarations.push(cssVar('font-sans', 'var(--font-family-primary)'))
|
|
|
|
|
declarations.push(cssVar('font-ui', 'var(--font-family-primary)'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (families.secondary) {
|
|
|
|
|
declarations.push(cssVar('font-serif', 'var(--font-family-secondary)'))
|
|
|
|
|
declarations.push(cssVar('font-prose', 'var(--font-family-secondary)'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (families.display) {
|
|
|
|
|
declarations.push(cssVar('font-heading', 'var(--font-family-display)'))
|
|
|
|
|
declarations.push(cssVar('font-display', 'var(--font-family-display)'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (families.mono) {
|
|
|
|
|
declarations.push(cssVar('font-mono', 'var(--font-family-mono)'))
|
|
|
|
|
declarations.push(cssVar('font-code', 'var(--font-family-mono)'))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function appendTypographyAliases(
|
|
|
|
|
declarations: string[],
|
|
|
|
|
typography: PrimitiveSet['typography']
|
|
|
|
|
): void {
|
|
|
|
|
if (!typography) return
|
|
|
|
|
|
|
|
|
|
const textAliasMap = {
|
|
|
|
|
'1': 'xxs',
|
|
|
|
|
'2': 'xs',
|
|
|
|
|
'3': 'sm',
|
|
|
|
|
'4': 'md',
|
|
|
|
|
'5': 'lg',
|
|
|
|
|
'6': 'xl'
|
|
|
|
|
} as const
|
|
|
|
|
|
|
|
|
|
for (const [alias, size] of Object.entries(textAliasMap)) {
|
|
|
|
|
if (!typography.sizes[size]) continue
|
|
|
|
|
|
|
|
|
|
declarations.push(cssVar(`text-${alias}-size`, `var(--font-size-${size})`))
|
|
|
|
|
declarations.push(cssVar(`text-${alias}-lh`, `var(--font-line-height-${size})`))
|
|
|
|
|
declarations.push(cssVar(`text-${alias}-ls`, `var(--font-letter-spacing-${size})`))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (typography.sizes.md) declarations.push(cssVar('font-size-base', 'var(--font-size-md)'))
|
|
|
|
|
if (typography.sizes.xxl) declarations.push(cssVar('font-size-2xl', 'var(--font-size-xxl)'))
|
|
|
|
|
if (typography.sizes.xxxl) declarations.push(cssVar('font-size-3xl', 'var(--font-size-xxxl)'))
|
|
|
|
|
|
|
|
|
|
if (typography.weights.regular) {
|
|
|
|
|
declarations.push(cssVar('font-weight-normal', 'var(--font-weight-regular)'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
declarations.push(cssVar('leading-ui', '1.25'))
|
|
|
|
|
declarations.push(cssVar('leading-prose', '1.6'))
|
|
|
|
|
declarations.push(cssVar('leading-text', 'var(--leading-prose)'))
|
|
|
|
|
declarations.push(cssVar('leading-heading', '1.2'))
|
|
|
|
|
declarations.push(cssVar('leading-display', '1.05'))
|
|
|
|
|
declarations.push(cssVar('tracking-badge', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-label', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-ui', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-prose', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-heading', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-display', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-tight', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-normal', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-wide', '0'))
|
|
|
|
|
declarations.push(cssVar('tracking-wider', '0'))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function hasFocusColor(options: EidosConfig): boolean {
|
|
|
|
|
if (options.semantics.color.focus) return true
|
|
|
|
|
|
|
|
|
|
return Object.values(options.themes ?? {}).some((theme) => theme.color?.focus)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function appendThemeColorDeclarations(
|
|
|
|
|
declarations: string[],
|
|
|
|
|
color: ReturnType<typeof mergeThemeColor>
|
|
|
|
|
|