// Генерирует CSS-переменные (веб) и TS-объект (React Native) из tokens.json. import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; const root = join(dirname(fileURLToPath(import.meta.url)), '..'); const t = JSON.parse(readFileSync(join(root, 'tokens.json'), 'utf8')); const out = join(root, 'src', 'generated'); mkdirSync(out, { recursive: true }); const vars = (theme) => Object.entries({ ...t.color[theme], ...t.effect[theme] }) .map(([k, v]) => ` --${k}: ${v};`) .join('\n'); const common = [ ...Object.entries(t.radius).map(([k, v]) => ` --radius-${k}: ${v}px;`), ...Object.entries(t.wave).map(([k, v]) => ` --wave-${k}: ${v};`), ` --font-display: '${t.font.display}', system-ui, sans-serif;`, ` --font-body: '${t.font.body}', system-ui, sans-serif;`, ` --font-mono: '${t.font.mono}', ui-monospace, monospace;`, ].join('\n'); const header = '/* Сгенерировано scripts/build.mjs из tokens.json — не редактировать. */\n'; const css = `${header}:root {\n${common}\n${vars('dark')}\n}\n @media (prefers-color-scheme: light) {\n :root:not([data-theme='dark']) {\n${vars('light').replace(/^/gm, ' ')}\n }\n}\n :root[data-theme='light'] {\n${vars('light')}\n}\n :root[data-theme='dark'] {\n${vars('dark')}\n}\n`; writeFileSync(join(out, 'tokens.css'), css); const ts = `${header}export const tokens = ${JSON.stringify( { color: t.color, effect: t.effect, wave: t.wave, radius: t.radius, font: t.font }, null, 2, )} as const;\n`; writeFileSync(join(out, 'tokens.ts'), ts); console.log('design-tokens: generated tokens.css, tokens.ts');