import { describe, expect, test } from 'vitest'; import { emit } from './tokens-to-css.js'; const sample = { colors: { dark: { obsidian: '#000', parchment: '#FFF' }, light: { obsidian: '#FFF', parchment: '#000' }, flat: { accent: '#4A6B5C', 'on-action': '#E8E4D8' } }, radii: { sm: '4px' }, fontStacks: { display: "'Fraunces', serif", body: "'Inter', sans-serif", mono: "'JetBrains Mono', monospace" } }; describe('tokens-to-css emit()', () => { test('emits :root block with dark and flat tokens', () => { const css = emit(sample); expect(css).toMatch(/:root \{[\s\S]*--fs-obsidian: #000;[\s\S]*--fs-parchment: #FFF;[\s\S]*--fs-accent: #4A6B5C;[\s\S]*--fs-on-action: #E8E4D8;[\s\S]*\}/); }); test('emits [data-theme="light"] block with light tokens only', () => { const css = emit(sample); expect(css).toMatch(/\[data-theme="light"\] \{[\s\S]*--fs-obsidian: #FFF;[\s\S]*--fs-parchment: #000;[\s\S]*\}/); }); test('flat tokens are not duplicated into the light block', () => { const css = emit(sample); const match = css.match(/\[data-theme="light"\] \{([\s\S]*?)\}/); expect(match).not.toBeNull(); const lightBlock = match[1]; expect(lightBlock).not.toContain('--fs-accent'); expect(lightBlock).not.toContain('--fs-on-action'); }); test('preserves radii and font stacks in :root', () => { const css = emit(sample); expect(css).toContain('--fs-radius-sm: 4px;'); expect(css).toContain("--fs-font-display: 'Fraunces', serif;"); }); });