UNPKG

@aesthetic/system

Version:

Web based building blocks for the Aesthetic design system.

505 lines (455 loc) 15.4 kB
import { ColorScheme, ContrastLevel, UnitValue } from '@aesthetic/types'; export type Hexcode = string; export type CommonSize = 'df' | 'lg' | 'sm'; export type BorderSize = CommonSize; export type BreakpointSize = 'lg' | 'md' | 'sm' | 'xl' | 'xs'; export type HeadingSize = 'l1' | 'l2' | 'l3' | 'l4' | 'l5' | 'l6'; export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6; export type ElevationType = | 'content' | 'dialog' | 'menu' | 'modal' | 'navigation' | 'overlay' | 'sheet' | 'toast' | 'tooltip'; export type PaletteType = | 'brand' | 'danger' | 'muted' | 'negative' | 'neutral' | 'positive' | 'primary' | 'secondary' | 'tertiary' | 'warning'; export type ShadowSize = 'lg' | 'md' | 'sm' | 'xl' | 'xs'; export type SpacingSize = CommonSize | 'md' | 'xl' | 'xs' | 'xxl' | 'xxs'; export type TextSize = CommonSize; export type ColorShade = '00' | '10' | '20' | '30' | '40' | '50' | '60' | '70' | '80' | '90'; export type StateType = 'disabled' | 'focused' | 'hovered' | 'selected'; // TOKENS export interface BorderToken { radius: UnitValue; width: UnitValue; } export type BorderTokens = Record<BorderSize, BorderToken>; export interface BreakpointToken { query: string; querySize: number; rootLineHeight: number; rootTextSize: UnitValue; } export type BreakpointTokens = Record<BreakpointSize, BreakpointToken>; export type DepthTokens = Record<ElevationType, number>; export type ColorRangeToken = Record<ColorShade, Hexcode>; export type ColorStateToken = Record<StateType, Hexcode> & { base: Hexcode; }; export interface ShadowToken { blur: UnitValue; spread: UnitValue; x: UnitValue; y: UnitValue; } export type ShadowTokens = Record<ShadowSize, ShadowToken>; export type SpacingTokens = Record<SpacingSize, UnitValue> & { type: string; unit: number; }; export interface HeadingToken { letterSpacing: UnitValue; lineHeight: number; size: UnitValue; } export type HeadingTokens = Record<HeadingSize, HeadingToken>; export interface TextToken { lineHeight: number; size: UnitValue; } export type TextTokens = Record<TextSize, TextToken>; export interface TypographyToken { font: { heading: string; locale: Record<string, string>; monospace: string; text: string; system: string; }; rootLineHeight: number; rootTextSize: UnitValue; } export interface DesignTokens { border: BorderTokens; breakpoint: BreakpointTokens; depth: DepthTokens; heading: HeadingTokens; shadow: ShadowTokens; spacing: SpacingTokens; text: TextTokens; typography: TypographyToken; } // Keep roughly in sync with the tokens above export interface DesignVariables { 'border-sm-radius': UnitValue; 'border-sm-width': UnitValue; 'border-df-radius': UnitValue; 'border-df-width': UnitValue; 'border-lg-radius': UnitValue; 'border-lg-width': UnitValue; 'breakpoint-xs-query': string; 'breakpoint-xs-query-size': number; 'breakpoint-xs-root-line-height': number; 'breakpoint-xs-root-text-size': UnitValue; 'breakpoint-sm-query': string; 'breakpoint-sm-query-size': number; 'breakpoint-sm-root-line-height': number; 'breakpoint-sm-root-text-size': UnitValue; 'breakpoint-md-query': string; 'breakpoint-md-query-size': number; 'breakpoint-md-root-line-height': number; 'breakpoint-md-root-text-size': UnitValue; 'breakpoint-lg-query': string; 'breakpoint-lg-query-size': number; 'breakpoint-lg-root-line-height': number; 'breakpoint-lg-root-text-size': UnitValue; 'breakpoint-xl-query': string; 'breakpoint-xl-query-size': number; 'breakpoint-xl-root-line-height': number; 'breakpoint-xl-root-text-size': UnitValue; 'depth-content': number; 'depth-dialog': number; 'depth-menu': number; 'depth-modal': number; 'depth-navigation': number; 'depth-overlay': number; 'depth-sheet': number; 'depth-toast': number; 'depth-tooltip': number; 'heading-l1-letter-spacing': UnitValue; 'heading-l1-line-height': number; 'heading-l1-size': UnitValue; 'heading-l2-letter-spacing': UnitValue; 'heading-l2-line-height': number; 'heading-l2-size': UnitValue; 'heading-l3-letter-spacing': UnitValue; 'heading-l3-line-height': number; 'heading-l3-size': UnitValue; 'heading-l4-letter-spacing': UnitValue; 'heading-l4-line-height': number; 'heading-l4-size': UnitValue; 'heading-l5-letter-spacing': UnitValue; 'heading-l5-line-height': number; 'heading-l5-size': UnitValue; 'heading-l6-letter-spacing': UnitValue; 'heading-l6-line-height': number; 'heading-l6-size': UnitValue; 'shadow-xs-blur': UnitValue; 'shadow-xs-spread': UnitValue; 'shadow-xs-x': UnitValue; 'shadow-xs-y': UnitValue; 'shadow-sm-blur': UnitValue; 'shadow-sm-spread': UnitValue; 'shadow-sm-x': UnitValue; 'shadow-sm-y': UnitValue; 'shadow-md-blur': UnitValue; 'shadow-md-spread': UnitValue; 'shadow-md-x': UnitValue; 'shadow-md-y': UnitValue; 'shadow-lg-blur': UnitValue; 'shadow-lg-spread': UnitValue; 'shadow-lg-x': UnitValue; 'shadow-lg-y': UnitValue; 'shadow-xl-blur': UnitValue; 'shadow-xl-spread': UnitValue; 'shadow-xl-x': UnitValue; 'shadow-xl-y': UnitValue; 'spacing-xxs': UnitValue; 'spacing-xs': UnitValue; 'spacing-sm': UnitValue; 'spacing-df': UnitValue; 'spacing-md': UnitValue; 'spacing-lg': UnitValue; 'spacing-xl': UnitValue; 'spacing-xxl': UnitValue; 'spacing-unit': number; 'text-sm-line-height': number; 'text-sm-size': UnitValue; 'text-df-line-height': number; 'text-df-size': UnitValue; 'text-lg-line-height': number; 'text-lg-size': UnitValue; 'typography-font-heading': string; 'typography-font-monospace': string; 'typography-font-text': string; 'typography-font-system': string; 'typography-root-line-height': number; 'typography-root-text-size': UnitValue; } export interface PaletteToken { color: ColorRangeToken; bg: ColorStateToken; fg: ColorStateToken; text: Hexcode; } export type PaletteTokens = Record<PaletteType, PaletteToken>; export interface ThemeTokens { palette: PaletteTokens; } // Keep in sync with the tokens above export interface ThemeVariables { 'palette-brand-bg-base': Hexcode; 'palette-brand-bg-disabled': Hexcode; 'palette-brand-bg-focused': Hexcode; 'palette-brand-bg-hovered': Hexcode; 'palette-brand-bg-selected': Hexcode; 'palette-brand-color-00': Hexcode; 'palette-brand-color-10': Hexcode; 'palette-brand-color-20': Hexcode; 'palette-brand-color-30': Hexcode; 'palette-brand-color-40': Hexcode; 'palette-brand-color-50': Hexcode; 'palette-brand-color-60': Hexcode; 'palette-brand-color-70': Hexcode; 'palette-brand-color-80': Hexcode; 'palette-brand-color-90': Hexcode; 'palette-brand-fg-base': Hexcode; 'palette-brand-fg-disabled': Hexcode; 'palette-brand-fg-focused': Hexcode; 'palette-brand-fg-hovered': Hexcode; 'palette-brand-fg-selected': Hexcode; 'palette-brand-text': Hexcode; 'palette-danger-bg-base': Hexcode; 'palette-danger-bg-disabled': Hexcode; 'palette-danger-bg-focused': Hexcode; 'palette-danger-bg-hovered': Hexcode; 'palette-danger-bg-selected': Hexcode; 'palette-danger-color-00': Hexcode; 'palette-danger-color-10': Hexcode; 'palette-danger-color-20': Hexcode; 'palette-danger-color-30': Hexcode; 'palette-danger-color-40': Hexcode; 'palette-danger-color-50': Hexcode; 'palette-danger-color-60': Hexcode; 'palette-danger-color-70': Hexcode; 'palette-danger-color-80': Hexcode; 'palette-danger-color-90': Hexcode; 'palette-danger-fg-base': Hexcode; 'palette-danger-fg-disabled': Hexcode; 'palette-danger-fg-focused': Hexcode; 'palette-danger-fg-hovered': Hexcode; 'palette-danger-fg-selected': Hexcode; 'palette-danger-text': Hexcode; 'palette-muted-bg-base': Hexcode; 'palette-muted-bg-disabled': Hexcode; 'palette-muted-bg-focused': Hexcode; 'palette-muted-bg-hovered': Hexcode; 'palette-muted-bg-selected': Hexcode; 'palette-muted-color-00': Hexcode; 'palette-muted-color-10': Hexcode; 'palette-muted-color-20': Hexcode; 'palette-muted-color-30': Hexcode; 'palette-muted-color-40': Hexcode; 'palette-muted-color-50': Hexcode; 'palette-muted-color-60': Hexcode; 'palette-muted-color-70': Hexcode; 'palette-muted-color-80': Hexcode; 'palette-muted-color-90': Hexcode; 'palette-muted-fg-base': Hexcode; 'palette-muted-fg-disabled': Hexcode; 'palette-muted-fg-focused': Hexcode; 'palette-muted-fg-hovered': Hexcode; 'palette-muted-fg-selected': Hexcode; 'palette-muted-text': Hexcode; 'palette-negative-bg-base': Hexcode; 'palette-negative-bg-disabled': Hexcode; 'palette-negative-bg-focused': Hexcode; 'palette-negative-bg-hovered': Hexcode; 'palette-negative-bg-selected': Hexcode; 'palette-negative-color-00': Hexcode; 'palette-negative-color-10': Hexcode; 'palette-negative-color-20': Hexcode; 'palette-negative-color-30': Hexcode; 'palette-negative-color-40': Hexcode; 'palette-negative-color-50': Hexcode; 'palette-negative-color-60': Hexcode; 'palette-negative-color-70': Hexcode; 'palette-negative-color-80': Hexcode; 'palette-negative-color-90': Hexcode; 'palette-negative-fg-base': Hexcode; 'palette-negative-fg-disabled': Hexcode; 'palette-negative-fg-focused': Hexcode; 'palette-negative-fg-hovered': Hexcode; 'palette-negative-fg-selected': Hexcode; 'palette-negative-text': Hexcode; 'palette-neutral-bg-base': Hexcode; 'palette-neutral-bg-disabled': Hexcode; 'palette-neutral-bg-focused': Hexcode; 'palette-neutral-bg-hovered': Hexcode; 'palette-neutral-bg-selected': Hexcode; 'palette-neutral-color-00': Hexcode; 'palette-neutral-color-10': Hexcode; 'palette-neutral-color-20': Hexcode; 'palette-neutral-color-30': Hexcode; 'palette-neutral-color-40': Hexcode; 'palette-neutral-color-50': Hexcode; 'palette-neutral-color-60': Hexcode; 'palette-neutral-color-70': Hexcode; 'palette-neutral-color-80': Hexcode; 'palette-neutral-color-90': Hexcode; 'palette-neutral-fg-base': Hexcode; 'palette-neutral-fg-disabled': Hexcode; 'palette-neutral-fg-focused': Hexcode; 'palette-neutral-fg-hovered': Hexcode; 'palette-neutral-fg-selected': Hexcode; 'palette-neutral-text': Hexcode; 'palette-positive-bg-base': Hexcode; 'palette-positive-bg-disabled': Hexcode; 'palette-positive-bg-focused': Hexcode; 'palette-positive-bg-hovered': Hexcode; 'palette-positive-bg-selected': Hexcode; 'palette-positive-color-00': Hexcode; 'palette-positive-color-10': Hexcode; 'palette-positive-color-20': Hexcode; 'palette-positive-color-30': Hexcode; 'palette-positive-color-40': Hexcode; 'palette-positive-color-50': Hexcode; 'palette-positive-color-60': Hexcode; 'palette-positive-color-70': Hexcode; 'palette-positive-color-80': Hexcode; 'palette-positive-color-90': Hexcode; 'palette-positive-fg-base': Hexcode; 'palette-positive-fg-disabled': Hexcode; 'palette-positive-fg-focused': Hexcode; 'palette-positive-fg-hovered': Hexcode; 'palette-positive-fg-selected': Hexcode; 'palette-positive-text': Hexcode; 'palette-primary-bg-base': Hexcode; 'palette-primary-bg-disabled': Hexcode; 'palette-primary-bg-focused': Hexcode; 'palette-primary-bg-hovered': Hexcode; 'palette-primary-bg-selected': Hexcode; 'palette-primary-color-00': Hexcode; 'palette-primary-color-10': Hexcode; 'palette-primary-color-20': Hexcode; 'palette-primary-color-30': Hexcode; 'palette-primary-color-40': Hexcode; 'palette-primary-color-50': Hexcode; 'palette-primary-color-60': Hexcode; 'palette-primary-color-70': Hexcode; 'palette-primary-color-80': Hexcode; 'palette-primary-color-90': Hexcode; 'palette-primary-fg-base': Hexcode; 'palette-primary-fg-disabled': Hexcode; 'palette-primary-fg-focused': Hexcode; 'palette-primary-fg-hovered': Hexcode; 'palette-primary-fg-selected': Hexcode; 'palette-primary-text': Hexcode; 'palette-secondary-bg-base': Hexcode; 'palette-secondary-bg-disabled': Hexcode; 'palette-secondary-bg-focused': Hexcode; 'palette-secondary-bg-hovered': Hexcode; 'palette-secondary-bg-selected': Hexcode; 'palette-secondary-color-00': Hexcode; 'palette-secondary-color-10': Hexcode; 'palette-secondary-color-20': Hexcode; 'palette-secondary-color-30': Hexcode; 'palette-secondary-color-40': Hexcode; 'palette-secondary-color-50': Hexcode; 'palette-secondary-color-60': Hexcode; 'palette-secondary-color-70': Hexcode; 'palette-secondary-color-80': Hexcode; 'palette-secondary-color-90': Hexcode; 'palette-secondary-fg-base': Hexcode; 'palette-secondary-fg-disabled': Hexcode; 'palette-secondary-fg-focused': Hexcode; 'palette-secondary-fg-hovered': Hexcode; 'palette-secondary-fg-selected': Hexcode; 'palette-secondary-text': Hexcode; 'palette-tertiary-bg-base': Hexcode; 'palette-tertiary-bg-disabled': Hexcode; 'palette-tertiary-bg-focused': Hexcode; 'palette-tertiary-bg-hovered': Hexcode; 'palette-tertiary-bg-selected': Hexcode; 'palette-tertiary-color-00': Hexcode; 'palette-tertiary-color-10': Hexcode; 'palette-tertiary-color-20': Hexcode; 'palette-tertiary-color-30': Hexcode; 'palette-tertiary-color-40': Hexcode; 'palette-tertiary-color-50': Hexcode; 'palette-tertiary-color-60': Hexcode; 'palette-tertiary-color-70': Hexcode; 'palette-tertiary-color-80': Hexcode; 'palette-tertiary-color-90': Hexcode; 'palette-tertiary-fg-base': Hexcode; 'palette-tertiary-fg-disabled': Hexcode; 'palette-tertiary-fg-focused': Hexcode; 'palette-tertiary-fg-hovered': Hexcode; 'palette-tertiary-fg-selected': Hexcode; 'palette-tertiary-text': Hexcode; 'palette-warning-bg-base': Hexcode; 'palette-warning-bg-disabled': Hexcode; 'palette-warning-bg-focused': Hexcode; 'palette-warning-bg-hovered': Hexcode; 'palette-warning-bg-selected': Hexcode; 'palette-warning-color-00': Hexcode; 'palette-warning-color-10': Hexcode; 'palette-warning-color-20': Hexcode; 'palette-warning-color-30': Hexcode; 'palette-warning-color-40': Hexcode; 'palette-warning-color-50': Hexcode; 'palette-warning-color-60': Hexcode; 'palette-warning-color-70': Hexcode; 'palette-warning-color-80': Hexcode; 'palette-warning-color-90': Hexcode; 'palette-warning-fg-base': Hexcode; 'palette-warning-fg-disabled': Hexcode; 'palette-warning-fg-focused': Hexcode; 'palette-warning-fg-hovered': Hexcode; 'palette-warning-fg-selected': Hexcode; 'palette-warning-text': Hexcode; } export type Tokens = DesignTokens & ThemeTokens; export type Variables = DesignVariables & ThemeVariables; export type VariableName = keyof Variables; export type TokenUtil = <K extends VariableName>(name: K) => Variables[K]; export type VarUtil = (name: VariableName, ...fallbacks: (number | string)[]) => string; export type UnitUtil = (...sizes: number[]) => UnitValue; // MIXINS export type MixinType = | 'hide-offscreen' | 'hide-visually' | 'reset-button' | 'reset-input' | 'reset-list' | 'reset-media' | 'reset-typography' | 'root' | 'text-break' | 'text-truncate' | 'text-wrap'; export type MixinTemplate<Block extends object> = (utils: Utilities<Block>) => Block; export type MixinUtil<Block extends object> = (name: MixinType, rule?: Block) => Block; // OTHER export interface Utilities<Block extends object> { contrast: ContrastLevel; mixin: MixinUtil<Block>; scheme: ColorScheme; tokens: Tokens; unit: UnitUtil; var: VarUtil; } export interface ThemeOptions { contrast: ContrastLevel; scheme: ColorScheme; } export type DeepPartial<T> = { [P in keyof T]?: T[P] extends (infer U)[] ? DeepPartial<U>[] : T[P] extends readonly (infer U)[] ? readonly DeepPartial<U>[] : DeepPartial<T[P]>; };