@aesthetic/system
Version:
Web based building blocks for the Aesthetic design system.
41 lines (31 loc) • 1.23 kB
text/typescript
import { deepMerge } from '@aesthetic/utils';
import { DEPTHS } from './constants';
import { Theme } from './Theme';
import { DeepPartial, DesignTokens, ThemeOptions, ThemeTokens } from './types';
export class Design<Block extends object> {
readonly name: string;
readonly rootLineHeight: number;
readonly rootTextSize: number;
readonly spacingUnit: number;
readonly tokens: DesignTokens;
constructor(name: string, tokens: Omit<DesignTokens, 'depth'>) {
this.name = name;
this.tokens = { ...tokens, depth: DEPTHS };
this.rootLineHeight = tokens.typography.rootLineHeight;
this.rootTextSize = Number.parseFloat(tokens.typography.rootTextSize);
// Pre-compiled for the chosen type, no need to calculate manually
this.spacingUnit = tokens.spacing.unit;
}
/**
* Create a new theme with the defined theme tokens, while inheriting the shared design tokens.
*/
createTheme(options: ThemeOptions, tokens: ThemeTokens): Theme<Block> {
return new Theme(options, tokens, this);
}
/**
* Extend and instantiate a new design instance with customized design tokens.
*/
extend(name: string, tokens: DeepPartial<DesignTokens>): Design<Block> {
return new Design(name, deepMerge(this.tokens, tokens));
}
}