@weser/theme 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createTheme.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTheme.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/createTheme.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import createTheme from '../createTheme';
3
+ describe('createTheme', () => {
4
+ test('transforms tokens to CSS variables', () => {
5
+ const tokens = { color: 'red', spacing: '16px' };
6
+ const [theme, css] = createTheme(tokens);
7
+ expect(theme.color).toBe('var(--color)');
8
+ expect(theme.spacing).toBe('var(--spacing)');
9
+ });
10
+ test('generates CSS string with declarations', () => {
11
+ const tokens = { color: 'red' };
12
+ const [, css] = createTheme(tokens);
13
+ expect(css).toContain(':root');
14
+ expect(css).toContain('--color:red');
15
+ });
16
+ test('uses default :root selector', () => {
17
+ const tokens = { color: 'red' };
18
+ const [, css] = createTheme(tokens);
19
+ expect(css.startsWith(':root{')).toBe(true);
20
+ });
21
+ test('uses custom selector', () => {
22
+ const tokens = { color: 'red' };
23
+ const [, css] = createTheme(tokens, { selector: '.dark' });
24
+ expect(css.startsWith('.dark{')).toBe(true);
25
+ });
26
+ test('handles nested tokens', () => {
27
+ const tokens = {
28
+ colors: {
29
+ primary: 'blue',
30
+ secondary: 'green',
31
+ },
32
+ };
33
+ const [theme, css] = createTheme(tokens);
34
+ expect(theme.colors.primary).toBe('var(--colors-primary)');
35
+ expect(theme.colors.secondary).toBe('var(--colors-secondary)');
36
+ expect(css).toContain('--colors-primary:blue');
37
+ expect(css).toContain('--colors-secondary:green');
38
+ });
39
+ test('handles deeply nested tokens', () => {
40
+ const tokens = {
41
+ theme: {
42
+ colors: {
43
+ brand: {
44
+ primary: 'blue',
45
+ },
46
+ },
47
+ },
48
+ };
49
+ const [theme, css] = createTheme(tokens);
50
+ expect(theme.theme.colors.brand.primary).toBe('var(--theme-colors-brand-primary)');
51
+ expect(css).toContain('--theme-colors-brand-primary:blue');
52
+ });
53
+ test('respects shouldTransformValue config', () => {
54
+ const tokens = {
55
+ colors: { primary: 'blue' },
56
+ spacing: { small: '4px' },
57
+ };
58
+ const [theme, css] = createTheme(tokens, {
59
+ shouldTransformValue: (path) => path === 'colors',
60
+ });
61
+ expect(theme.colors.primary).toBe('var(--colors-primary)');
62
+ expect(theme.spacing.small).toBe('4px'); // not transformed
63
+ expect(css).toContain('--colors-primary:blue');
64
+ expect(css).not.toContain('--spacing-small');
65
+ });
66
+ test('returns tuple of theme and CSS', () => {
67
+ const tokens = { color: 'red' };
68
+ const result = createTheme(tokens);
69
+ expect(Array.isArray(result)).toBe(true);
70
+ expect(result).toHaveLength(2);
71
+ expect(typeof result[0]).toBe('object');
72
+ expect(typeof result[1]).toBe('string');
73
+ });
74
+ // Test based on docs example
75
+ test('handles color palette from docs example', () => {
76
+ const tokens = {
77
+ colors: {
78
+ brand50: 'hsl(255, 100%, 97%)',
79
+ brand100: 'hsl(255, 90%, 92%)',
80
+ brand200: 'hsl(255, 85%, 85%)',
81
+ brand300: 'hsl(255, 80%, 75%)',
82
+ brand400: 'hsl(255, 75%, 65%)',
83
+ brand500: 'hsl(255, 70%, 55%)',
84
+ brand600: 'hsl(255, 65%, 45%)',
85
+ brand700: 'hsl(255, 60%, 35%)',
86
+ brand800: 'hsl(255, 55%, 25%)',
87
+ brand900: 'hsl(255, 50%, 15%)',
88
+ brand950: 'hsl(255, 45%, 8%)',
89
+ },
90
+ };
91
+ const [theme, css] = createTheme(tokens);
92
+ // As shown in docs: theme.colors.brand500 => 'var(--colors-brand500)'
93
+ expect(theme.colors.brand500).toBe('var(--colors-brand500)');
94
+ expect(theme.colors.brand50).toBe('var(--colors-brand50)');
95
+ expect(theme.colors.brand950).toBe('var(--colors-brand950)');
96
+ // CSS should contain all declarations
97
+ expect(css).toContain('--colors-brand500:hsl(255, 70%, 55%)');
98
+ expect(css).toContain('--colors-brand50:hsl(255, 100%, 97%)');
99
+ });
100
+ test('config example from docs with custom selector and shouldTransformValue', () => {
101
+ const tokens = {
102
+ colors: { primary: 'blue' },
103
+ spacing: { small: '4px', medium: '8px' },
104
+ other: { value: 'test' },
105
+ };
106
+ const [theme, css] = createTheme(tokens, {
107
+ selector: '.light-theme',
108
+ shouldTransformValue: (path) => path.startsWith('colors'),
109
+ });
110
+ // Only colors should be transformed
111
+ expect(theme.colors.primary).toBe('var(--colors-primary)');
112
+ expect(theme.spacing.small).toBe('4px'); // not transformed
113
+ expect(theme.other.value).toBe('test'); // not transformed
114
+ // CSS should use custom selector
115
+ expect(css.startsWith('.light-theme{')).toBe(true);
116
+ });
117
+ });
118
+ //# sourceMappingURL=createTheme.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTheme.test.js","sourceRoot":"","sources":["../../src/__tests__/createTheme.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,WAAW,MAAM,gBAAgB,CAAA;AAExC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;QAChD,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;QAExC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QAC/B,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;QAEnC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QAC/B,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;QAEnC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QAC/B,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAE1D,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG;YACb,MAAM,EAAE;gBACN,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,OAAO;aACnB;SACF,CAAA;QACD,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;QAExC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG;YACb,KAAK,EAAE;gBACL,MAAM,EAAE;oBACN,KAAK,EAAE;wBACL,OAAO,EAAE,MAAM;qBAChB;iBACF;aACF;SACF,CAAA;QACD,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;QAExC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAC3C,mCAAmC,CACpC,CAAA;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YAC3B,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SAC1B,CAAA;QACD,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE;YACvC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ;SAClD,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,kBAAkB;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;QAElC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,6BAA6B;IAC7B,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG;YACb,MAAM,EAAE;gBACN,OAAO,EAAE,qBAAqB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,mBAAmB;aAC9B;SACF,CAAA;QAED,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;QAExC,sEAAsE;QACtE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QAC5D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QAE5D,sCAAsC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAA;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAClF,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YAC3B,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;YACxC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;SACzB,CAAA;QAED,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE;YACvC,QAAQ,EAAE,cAAc;YACxB,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;SAC1D,CAAC,CAAA;QAEF,oCAAoC;QACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,kBAAkB;QAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAC,kBAAkB;QAEzD,iCAAiC;QACjC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createThemes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createThemes.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/createThemes.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import createThemes from '../createThemes';
3
+ describe('createThemes', () => {
4
+ test('creates multiple themes', () => {
5
+ const themes = {
6
+ light: { color: 'black', bg: 'white' },
7
+ dark: { color: 'white', bg: 'black' },
8
+ };
9
+ const [theme, css] = createThemes(themes);
10
+ expect(css).toContain('.light{');
11
+ expect(css).toContain('.dark{');
12
+ });
13
+ test('uses class selectors by default', () => {
14
+ const themes = {
15
+ primary: { color: 'blue' },
16
+ };
17
+ const [, css] = createThemes(themes);
18
+ expect(css.startsWith('.primary{')).toBe(true);
19
+ });
20
+ test('uses custom getSelector function', () => {
21
+ const themes = {
22
+ light: { color: 'black' },
23
+ dark: { color: 'white' },
24
+ };
25
+ const [, css] = createThemes(themes, {
26
+ getSelector: (name) => `[data-theme="${name}"]`,
27
+ });
28
+ expect(css).toContain('[data-theme="light"]');
29
+ expect(css).toContain('[data-theme="dark"]');
30
+ });
31
+ test('transforms all theme tokens', () => {
32
+ const themes = {
33
+ theme1: { primary: 'blue' },
34
+ theme2: { primary: 'green' },
35
+ };
36
+ const [theme, css] = createThemes(themes);
37
+ expect(theme.primary).toBe('var(--primary)');
38
+ expect(css).toContain('--primary:blue');
39
+ expect(css).toContain('--primary:green');
40
+ });
41
+ test('respects shouldTransformValue config', () => {
42
+ const themes = {
43
+ main: {
44
+ colors: { primary: 'blue' },
45
+ spacing: { small: '4px' },
46
+ },
47
+ };
48
+ const [theme, css] = createThemes(themes, {
49
+ shouldTransformValue: (path) => path === 'colors',
50
+ });
51
+ expect(theme.colors.primary).toBe('var(--colors-primary)');
52
+ expect(theme.spacing.small).toBe('4px');
53
+ });
54
+ test('handles single theme', () => {
55
+ const themes = {
56
+ only: { color: 'red' },
57
+ };
58
+ const [theme, css] = createThemes(themes);
59
+ expect(theme.color).toBe('var(--color)');
60
+ expect(css).toContain('.only{');
61
+ });
62
+ test('returns last theme as the returned theme object', () => {
63
+ const themes = {
64
+ a: { value: 'a' },
65
+ b: { value: 'b' },
66
+ };
67
+ const [theme] = createThemes(themes);
68
+ // The theme object should have transformed values
69
+ expect(theme.value).toBe('var(--value)');
70
+ });
71
+ // Test based on docs example
72
+ test('handles light/dark theme from docs example', () => {
73
+ const light = {
74
+ colors: {
75
+ foreground: 'black',
76
+ background: 'white',
77
+ },
78
+ };
79
+ const dark = {
80
+ colors: {
81
+ foreground: 'white',
82
+ background: 'black',
83
+ },
84
+ };
85
+ const themes = { light, dark };
86
+ const [theme, css] = createThemes(themes, {
87
+ getSelector: (name) => '.' + name,
88
+ });
89
+ // As shown in docs: theme.colors.foreground => 'var(--colors-foreground)'
90
+ expect(theme.colors.foreground).toBe('var(--colors-foreground)');
91
+ expect(theme.colors.background).toBe('var(--colors-background)');
92
+ // CSS should contain both theme selectors
93
+ expect(css).toContain('.light{');
94
+ expect(css).toContain('.dark{');
95
+ // CSS should contain the variable declarations
96
+ expect(css).toContain('--colors-foreground:black');
97
+ expect(css).toContain('--colors-foreground:white');
98
+ expect(css).toContain('--colors-background:white');
99
+ expect(css).toContain('--colors-background:black');
100
+ });
101
+ test('handles data attribute selector pattern', () => {
102
+ const themes = {
103
+ light: { color: 'black' },
104
+ dark: { color: 'white' },
105
+ };
106
+ const [, css] = createThemes(themes, {
107
+ getSelector: (name) => `[data-theme="${name}"]`,
108
+ });
109
+ expect(css).toContain('[data-theme="light"]');
110
+ expect(css).toContain('[data-theme="dark"]');
111
+ });
112
+ test('config example from docs with shouldTransformValue', () => {
113
+ const themes = {
114
+ main: {
115
+ colors: { primary: 'blue' },
116
+ spacing: { small: '4px' },
117
+ },
118
+ };
119
+ const [theme, css] = createThemes(themes, {
120
+ shouldTransformValue: (path) => path === 'colors',
121
+ });
122
+ // Only colors should be transformed
123
+ expect(theme.colors.primary).toBe('var(--colors-primary)');
124
+ expect(theme.spacing.small).toBe('4px');
125
+ });
126
+ });
127
+ //# sourceMappingURL=createThemes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createThemes.test.js","sourceRoot":"","sources":["../../src/__tests__/createThemes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createVariable.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createVariable.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/createVariable.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import createVariable from '../createVariable';
3
+ describe('createVariable', () => {
4
+ test('creates CSS variable reference and declaration', () => {
5
+ const [reference, declaration] = createVariable('color', 'red');
6
+ expect(reference).toBe('var(--color)');
7
+ expect(declaration).toBe('--color:red');
8
+ });
9
+ test('handles hyphenated names', () => {
10
+ const [reference, declaration] = createVariable('primary-color', 'blue');
11
+ expect(reference).toBe('var(--primary-color)');
12
+ expect(declaration).toBe('--primary-color:blue');
13
+ });
14
+ test('handles complex values', () => {
15
+ const [reference, declaration] = createVariable('shadow', '0 2px 4px rgba(0,0,0,0.2)');
16
+ expect(reference).toBe('var(--shadow)');
17
+ expect(declaration).toBe('--shadow:0 2px 4px rgba(0,0,0,0.2)');
18
+ });
19
+ test('handles numeric values as strings', () => {
20
+ const [reference, declaration] = createVariable('spacing', '16px');
21
+ expect(reference).toBe('var(--spacing)');
22
+ expect(declaration).toBe('--spacing:16px');
23
+ });
24
+ test('returns tuple of two strings', () => {
25
+ const result = createVariable('test', 'value');
26
+ expect(Array.isArray(result)).toBe(true);
27
+ expect(result).toHaveLength(2);
28
+ expect(typeof result[0]).toBe('string');
29
+ expect(typeof result[1]).toBe('string');
30
+ });
31
+ });
32
+ //# sourceMappingURL=createVariable.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createVariable.test.js","sourceRoot":"","sources":["../../src/__tests__/createVariable.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,cAAc,MAAM,mBAAmB,CAAA;AAE9C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAE/D,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,cAAc,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;QAExE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;QAC9C,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAA;QAEtF,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACvC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAElE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACxC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAE9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createVariableReference.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createVariableReference.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/createVariableReference.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import createVariableReference from '../createVariableReference';
3
+ describe('createVariableReference', () => {
4
+ test('creates var() reference without fallback', () => {
5
+ const [variable, reference] = createVariableReference('color');
6
+ expect(variable).toBe('--color');
7
+ expect(reference).toBe('var(--color)');
8
+ });
9
+ test('creates var() reference with fallback', () => {
10
+ const [variable, reference] = createVariableReference('color', 'red');
11
+ expect(variable).toBe('--color');
12
+ expect(reference).toBe('var(--color, red)');
13
+ });
14
+ test('handles hyphenated names', () => {
15
+ const [variable, reference] = createVariableReference('primary-color', 'blue');
16
+ expect(variable).toBe('--primary-color');
17
+ expect(reference).toBe('var(--primary-color, blue)');
18
+ });
19
+ test('handles complex fallback values', () => {
20
+ const [variable, reference] = createVariableReference('shadow', '0 2px 4px rgba(0,0,0,0.2)');
21
+ expect(variable).toBe('--shadow');
22
+ expect(reference).toBe('var(--shadow, 0 2px 4px rgba(0,0,0,0.2))');
23
+ });
24
+ test('returns tuple of two strings', () => {
25
+ const result = createVariableReference('test');
26
+ expect(Array.isArray(result)).toBe(true);
27
+ expect(result).toHaveLength(2);
28
+ expect(typeof result[0]).toBe('string');
29
+ expect(typeof result[1]).toBe('string');
30
+ });
31
+ });
32
+ //# sourceMappingURL=createVariableReference.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createVariableReference.test.js","sourceRoot":"","sources":["../../src/__tests__/createVariableReference.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,uBAAuB,MAAM,4BAA4B,CAAA;AAEhE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAA;QAE9D,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAErE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,uBAAuB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;QAE9E,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,uBAAuB,CACnD,QAAQ,EACR,2BAA2B,CAC5B,CAAA;QAED,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAA;QAE9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weser/theme",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Utils for theming with CSS variables",
5
5
  "author": "Robin Weser <robin@weser.io>",
6
6
  "license": "MIT",
@@ -46,7 +46,7 @@
46
46
  "devDependencies": {
47
47
  "rimraf": "^3.0.2",
48
48
  "typescript": "^5.4.5",
49
- "vitest": "^2.1.8"
49
+ "vitest": "^3.0.0"
50
50
  },
51
- "gitHead": "b3b4b818ca3c59b3e92342c0d1c3e9e0be81876e"
51
+ "gitHead": "07cd8acd29e916cf20fe509029328862df87b08d"
52
52
  }