chaincss 1.13.3 → 2.0.0
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.
- package/CHANGELOG.md +81 -0
- package/LICENSE +2 -3
- package/README.md +238 -105
- package/dist/cli/commands/build.d.ts +3 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/compile.d.ts +3 -0
- package/dist/cli/commands/compile.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +5 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/timeline.d.ts +2 -0
- package/dist/cli/commands/timeline.d.ts.map +1 -0
- package/dist/cli/commands/watch.d.ts +6 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +5960 -0
- package/dist/cli/types.d.ts +51 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/utils/config-loader.d.ts +8 -0
- package/dist/cli/utils/config-loader.d.ts.map +1 -0
- package/dist/cli/utils/file-utils.d.ts +9 -0
- package/dist/cli/utils/file-utils.d.ts.map +1 -0
- package/dist/cli/utils/logger.d.ts +17 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/compiler/atomic-optimizer.d.ts +76 -0
- package/dist/compiler/atomic-optimizer.d.ts.map +1 -0
- package/dist/compiler/btt.d.ts +138 -0
- package/dist/compiler/btt.d.ts.map +1 -0
- package/dist/compiler/cache-manager.d.ts +20 -0
- package/dist/compiler/cache-manager.d.ts.map +1 -0
- package/dist/compiler/commonProps.d.ts +2 -0
- package/dist/compiler/commonProps.d.ts.map +1 -0
- package/dist/compiler/index.d.ts +12 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +5177 -0
- package/dist/compiler/prefixer.d.ts +42 -0
- package/dist/compiler/prefixer.d.ts.map +1 -0
- package/dist/compiler/theme-contract.d.ts +61 -0
- package/dist/compiler/theme-contract.d.ts.map +1 -0
- package/dist/compiler/tokens.d.ts +52 -0
- package/dist/compiler/tokens.d.ts.map +1 -0
- package/dist/compiler/types.d.ts +57 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/core/compiler.d.ts +32 -0
- package/dist/core/compiler.d.ts.map +1 -0
- package/dist/core/constants.d.ts +129 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/types.d.ts +88 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/utils.d.ts +37 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5667 -0
- package/dist/plugins/vite.d.ts +11 -0
- package/dist/plugins/vite.d.ts.map +1 -0
- package/dist/plugins/vite.js +25839 -0
- package/dist/plugins/webpack.d.ts +45 -0
- package/dist/plugins/webpack.d.ts.map +1 -0
- package/dist/plugins/webpack.js +107 -0
- package/dist/runtime/hmr.d.ts +3 -0
- package/dist/runtime/hmr.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +15 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +552 -0
- package/dist/runtime/injector.d.ts +85 -0
- package/dist/runtime/injector.d.ts.map +1 -0
- package/dist/runtime/react.d.ts +54 -0
- package/dist/runtime/react.d.ts.map +1 -0
- package/dist/runtime/react.js +270 -0
- package/dist/runtime/types.d.ts +45 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/utils.d.ts +62 -0
- package/dist/runtime/utils.d.ts.map +1 -0
- package/dist/runtime/vue.d.ts +52 -0
- package/dist/runtime/vue.d.ts.map +1 -0
- package/dist/runtime/vue.js +232 -0
- package/package.json +90 -119
- package/browser/commonProps.js +0 -14
- package/browser/index.js +0 -3
- package/browser/react-hooks.js +0 -162
- package/browser/rtt.js +0 -400
- package/browser/vue-composables.js +0 -200
- package/node/atomic-optimizer.js +0 -526
- package/node/btt.js +0 -1009
- package/node/cache-manager.js +0 -56
- package/node/chaincss.js +0 -642
- package/node/index.js +0 -2
- package/node/loaders/chaincss-loader.js +0 -62
- package/node/plugins/next-plugin.js +0 -120
- package/node/plugins/vite-plugin.js +0 -383
- package/node/plugins/webpack-plugin.js +0 -41
- package/node/prefixer.js +0 -237
- package/node/strVal.js +0 -92
- package/node/theme-validator.js +0 -32
- package/shared/theme-contract.js +0 -98
- package/shared/tokens.cjs +0 -256
- package/shared/tokens.mjs +0 -320
- package/types.d.ts +0 -325
package/shared/tokens.cjs
DELETED
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
class DesignTokens {
|
|
2
|
-
constructor(tokens = {}) {
|
|
3
|
-
this.tokens = this.deepFreeze({
|
|
4
|
-
colors: {},
|
|
5
|
-
spacing: {},
|
|
6
|
-
typography: {},
|
|
7
|
-
breakpoints: {},
|
|
8
|
-
zIndex: {},
|
|
9
|
-
shadows: {},
|
|
10
|
-
borderRadius: {},
|
|
11
|
-
...tokens
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
this.flattened = this.flattenTokens(this.tokens);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// Deep freeze to prevent accidental modifications
|
|
18
|
-
deepFreeze(obj) {
|
|
19
|
-
Object.keys(obj).forEach(key => {
|
|
20
|
-
if (typeof obj[key] === 'object' && obj[key] !== null) {
|
|
21
|
-
this.deepFreeze(obj[key]);
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
return Object.freeze(obj);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Flatten nested tokens for easy access
|
|
28
|
-
flattenTokens(obj, prefix = '') {
|
|
29
|
-
return Object.keys(obj).reduce((acc, key) => {
|
|
30
|
-
const prefixed = prefix ? `${prefix}.${key}` : key;
|
|
31
|
-
|
|
32
|
-
if (typeof obj[key] === 'object' && obj[key] !== null) {
|
|
33
|
-
Object.assign(acc, this.flattenTokens(obj[key], prefixed));
|
|
34
|
-
} else {
|
|
35
|
-
acc[prefixed] = obj[key];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return acc;
|
|
39
|
-
}, {});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Get token value by path (e.g., 'colors.primary')
|
|
43
|
-
get(path, defaultValue = '') {
|
|
44
|
-
return this.flattened[path] || defaultValue;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Generate CSS variables from tokens
|
|
48
|
-
toCSSVariables(prefix = 'chain') {
|
|
49
|
-
let css = ':root {\n';
|
|
50
|
-
|
|
51
|
-
Object.entries(this.flattened).forEach(([key, value]) => {
|
|
52
|
-
const varName = `--${prefix}-${key.replace(/\./g, '-')}`;
|
|
53
|
-
css += ` ${varName}: ${value};\n`;
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
css += '}\n';
|
|
57
|
-
return css;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Create a theme variant
|
|
61
|
-
createTheme(name, overrides) {
|
|
62
|
-
const themeTokens = { ...this.flattened };
|
|
63
|
-
|
|
64
|
-
Object.entries(overrides).forEach(([key, value]) => {
|
|
65
|
-
if (themeTokens[key]) {
|
|
66
|
-
themeTokens[key] = value;
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
return new DesignTokens(this.expandTokens(themeTokens));
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Expand flattened tokens back to nested structure
|
|
74
|
-
expandTokens(flattened) {
|
|
75
|
-
const result = {};
|
|
76
|
-
|
|
77
|
-
Object.entries(flattened).forEach(([key, value]) => {
|
|
78
|
-
const parts = key.split('.');
|
|
79
|
-
let current = result;
|
|
80
|
-
|
|
81
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
82
|
-
current[parts[i]] = current[parts[i]] || {};
|
|
83
|
-
current = current[parts[i]];
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
current[parts[parts.length - 1]] = value;
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
return result;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Default tokens
|
|
94
|
-
const defaultTokens = {
|
|
95
|
-
colors: {
|
|
96
|
-
primary: '#667eea',
|
|
97
|
-
secondary: '#764ba2',
|
|
98
|
-
success: '#48bb78',
|
|
99
|
-
danger: '#f56565',
|
|
100
|
-
warning: '#ed8936',
|
|
101
|
-
info: '#4299e1',
|
|
102
|
-
light: '#f7fafc',
|
|
103
|
-
dark: '#1a202c',
|
|
104
|
-
white: '#ffffff',
|
|
105
|
-
black: '#000000',
|
|
106
|
-
gray: {
|
|
107
|
-
100: '#f7fafc',
|
|
108
|
-
200: '#edf2f7',
|
|
109
|
-
300: '#e2e8f0',
|
|
110
|
-
400: '#cbd5e0',
|
|
111
|
-
500: '#a0aec0',
|
|
112
|
-
600: '#718096',
|
|
113
|
-
700: '#4a5568',
|
|
114
|
-
800: '#2d3748',
|
|
115
|
-
900: '#1a202c'
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
|
|
119
|
-
spacing: {
|
|
120
|
-
0: '0',
|
|
121
|
-
1: '0.25rem',
|
|
122
|
-
2: '0.5rem',
|
|
123
|
-
3: '0.75rem',
|
|
124
|
-
4: '1rem',
|
|
125
|
-
5: '1.25rem',
|
|
126
|
-
6: '1.5rem',
|
|
127
|
-
8: '2rem',
|
|
128
|
-
10: '2.5rem',
|
|
129
|
-
12: '3rem',
|
|
130
|
-
16: '4rem',
|
|
131
|
-
20: '5rem',
|
|
132
|
-
24: '6rem',
|
|
133
|
-
32: '8rem',
|
|
134
|
-
40: '10rem',
|
|
135
|
-
48: '12rem',
|
|
136
|
-
56: '14rem',
|
|
137
|
-
64: '16rem',
|
|
138
|
-
xs: '0.5rem',
|
|
139
|
-
sm: '1rem',
|
|
140
|
-
md: '1.5rem',
|
|
141
|
-
lg: '2rem',
|
|
142
|
-
xl: '3rem',
|
|
143
|
-
'2xl': '4rem',
|
|
144
|
-
'3xl': '6rem'
|
|
145
|
-
},
|
|
146
|
-
|
|
147
|
-
typography: {
|
|
148
|
-
fontFamily: {
|
|
149
|
-
sans: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
|
|
150
|
-
serif: 'Georgia, Cambria, "Times New Roman", Times, serif',
|
|
151
|
-
mono: 'SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace'
|
|
152
|
-
},
|
|
153
|
-
fontSize: {
|
|
154
|
-
xs: '0.75rem',
|
|
155
|
-
sm: '0.875rem',
|
|
156
|
-
base: '1rem',
|
|
157
|
-
lg: '1.125rem',
|
|
158
|
-
xl: '1.25rem',
|
|
159
|
-
'2xl': '1.5rem',
|
|
160
|
-
'3xl': '1.875rem',
|
|
161
|
-
'4xl': '2.25rem',
|
|
162
|
-
'5xl': '3rem'
|
|
163
|
-
},
|
|
164
|
-
fontWeight: {
|
|
165
|
-
hairline: '100',
|
|
166
|
-
thin: '200',
|
|
167
|
-
light: '300',
|
|
168
|
-
normal: '400',
|
|
169
|
-
medium: '500',
|
|
170
|
-
semibold: '600',
|
|
171
|
-
bold: '700',
|
|
172
|
-
extrabold: '800',
|
|
173
|
-
black: '900'
|
|
174
|
-
},
|
|
175
|
-
lineHeight: {
|
|
176
|
-
none: '1',
|
|
177
|
-
tight: '1.25',
|
|
178
|
-
snug: '1.375',
|
|
179
|
-
normal: '1.5',
|
|
180
|
-
relaxed: '1.625',
|
|
181
|
-
loose: '2'
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
|
|
185
|
-
breakpoints: {
|
|
186
|
-
sm: '640px',
|
|
187
|
-
md: '768px',
|
|
188
|
-
lg: '1024px',
|
|
189
|
-
xl: '1280px',
|
|
190
|
-
'2xl': '1536px'
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
zIndex: {
|
|
194
|
-
0: '0',
|
|
195
|
-
10: '10',
|
|
196
|
-
20: '20',
|
|
197
|
-
30: '30',
|
|
198
|
-
40: '40',
|
|
199
|
-
50: '50',
|
|
200
|
-
auto: 'auto',
|
|
201
|
-
dropdown: '1000',
|
|
202
|
-
sticky: '1020',
|
|
203
|
-
fixed: '1030',
|
|
204
|
-
modal: '1040',
|
|
205
|
-
popover: '1050',
|
|
206
|
-
tooltip: '1060'
|
|
207
|
-
},
|
|
208
|
-
|
|
209
|
-
shadows: {
|
|
210
|
-
sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
|
|
211
|
-
base: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',
|
|
212
|
-
md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
|
|
213
|
-
lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
|
|
214
|
-
xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
|
|
215
|
-
'2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',
|
|
216
|
-
inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',
|
|
217
|
-
none: 'none'
|
|
218
|
-
},
|
|
219
|
-
|
|
220
|
-
borderRadius: {
|
|
221
|
-
none: '0',
|
|
222
|
-
sm: '0.125rem',
|
|
223
|
-
base: '0.25rem',
|
|
224
|
-
md: '0.375rem',
|
|
225
|
-
lg: '0.5rem',
|
|
226
|
-
xl: '0.75rem',
|
|
227
|
-
'2xl': '1rem',
|
|
228
|
-
'3xl': '1.5rem',
|
|
229
|
-
full: '9999px'
|
|
230
|
-
}
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
// Create and export tokens instance
|
|
234
|
-
const tokens = new DesignTokens(defaultTokens);
|
|
235
|
-
|
|
236
|
-
// Token utility functions
|
|
237
|
-
const createTokens = (customTokens) => {
|
|
238
|
-
return new DesignTokens(customTokens);
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
// Generate responsive values
|
|
242
|
-
const responsive = (values) => {
|
|
243
|
-
if (typeof values === 'string') return values;
|
|
244
|
-
|
|
245
|
-
return Object.entries(values).map(([breakpoint, value]) => {
|
|
246
|
-
if (breakpoint === 'base') return value;
|
|
247
|
-
return `@media (min-width: ${tokens.get(`breakpoints.${breakpoint}`)}) { ${value} }`;
|
|
248
|
-
}).join(' ');
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
module.exports = {
|
|
252
|
-
tokens,
|
|
253
|
-
createTokens,
|
|
254
|
-
responsive,
|
|
255
|
-
DesignTokens
|
|
256
|
-
};
|
package/shared/tokens.mjs
DELETED
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
// shared/tokens.mjs
|
|
2
|
-
|
|
3
|
-
class DesignTokens {
|
|
4
|
-
constructor(tokens = {}, contract = null) {
|
|
5
|
-
// Store contract for validation
|
|
6
|
-
this.contract = contract;
|
|
7
|
-
|
|
8
|
-
// Validate against contract if provided
|
|
9
|
-
if (contract) {
|
|
10
|
-
this.validateContract(tokens, contract);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
this.tokens = this.deepFreeze({
|
|
14
|
-
colors: {},
|
|
15
|
-
spacing: {},
|
|
16
|
-
typography: {},
|
|
17
|
-
breakpoints: {},
|
|
18
|
-
zIndex: {},
|
|
19
|
-
shadows: {},
|
|
20
|
-
borderRadius: {},
|
|
21
|
-
...tokens
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
this.flattened = this.flattenTokens(this.tokens);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Validate token structure against contract
|
|
28
|
-
validateContract(tokens, contract, path = '') {
|
|
29
|
-
const errors = [];
|
|
30
|
-
|
|
31
|
-
const validate = (contractPart, tokenPart, currentPath) => {
|
|
32
|
-
if (typeof contractPart === 'object' && contractPart !== null) {
|
|
33
|
-
const requiredKeys = Object.keys(contractPart);
|
|
34
|
-
const tokenKeys = Object.keys(tokenPart || {});
|
|
35
|
-
|
|
36
|
-
requiredKeys.forEach(key => {
|
|
37
|
-
const newPath = currentPath ? `${currentPath}.${key}` : key;
|
|
38
|
-
|
|
39
|
-
if (!tokenPart || !tokenPart.hasOwnProperty(key)) {
|
|
40
|
-
errors.push(`❌ Missing required token: "${newPath}"`);
|
|
41
|
-
} else {
|
|
42
|
-
validate(contractPart[key], tokenPart[key], newPath);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// Warn about extra keys
|
|
47
|
-
tokenKeys.forEach(key => {
|
|
48
|
-
if (!contractPart.hasOwnProperty(key)) {
|
|
49
|
-
const newPath = currentPath ? `${currentPath}.${key}` : key;
|
|
50
|
-
console.warn(`⚠️ Extra token not in contract: "${newPath}"`);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
} else {
|
|
54
|
-
if (typeof tokenPart !== 'string') {
|
|
55
|
-
errors.push(`❌ Token "${currentPath}" must be a string, got ${typeof tokenPart}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
validate(contract, tokens, path);
|
|
61
|
-
|
|
62
|
-
if (errors.length > 0) {
|
|
63
|
-
throw new Error(`Theme Contract Validation Failed:\n${errors.join('\n')}`);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Deep freeze to prevent accidental modifications
|
|
70
|
-
deepFreeze(obj) {
|
|
71
|
-
Object.keys(obj).forEach(key => {
|
|
72
|
-
if (typeof obj[key] === 'object' && obj[key] !== null) {
|
|
73
|
-
this.deepFreeze(obj[key]);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
return Object.freeze(obj);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Flatten nested tokens for easy access
|
|
80
|
-
flattenTokens(obj, prefix = '') {
|
|
81
|
-
return Object.keys(obj).reduce((acc, key) => {
|
|
82
|
-
const prefixed = prefix ? `${prefix}.${key}` : key;
|
|
83
|
-
|
|
84
|
-
if (typeof obj[key] === 'object' && obj[key] !== null) {
|
|
85
|
-
Object.assign(acc, this.flattenTokens(obj[key], prefixed));
|
|
86
|
-
} else {
|
|
87
|
-
acc[prefixed] = obj[key];
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return acc;
|
|
91
|
-
}, {});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Get token value by path (e.g., 'colors.primary')
|
|
95
|
-
get(path, defaultValue = '') {
|
|
96
|
-
return this.flattened[path] || defaultValue;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Generate CSS variables from tokens
|
|
100
|
-
toCSSVariables(prefix = 'chain') {
|
|
101
|
-
let css = ':root {\n';
|
|
102
|
-
|
|
103
|
-
Object.entries(this.flattened).forEach(([key, value]) => {
|
|
104
|
-
const varName = `--${prefix}-${key.replace(/\./g, '-')}`;
|
|
105
|
-
css += ` ${varName}: ${value};\n`;
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
css += '}\n';
|
|
109
|
-
return css;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Create a theme variant with contract validation
|
|
113
|
-
createTheme(name, overrides) {
|
|
114
|
-
const themeTokens = { ...this.flattened };
|
|
115
|
-
|
|
116
|
-
Object.entries(overrides).forEach(([key, value]) => {
|
|
117
|
-
if (themeTokens[key]) {
|
|
118
|
-
themeTokens[key] = value;
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
// Validate theme against original contract if exists
|
|
123
|
-
if (this.contract) {
|
|
124
|
-
const expandedTokens = this.expandTokens(themeTokens);
|
|
125
|
-
this.validateContract(expandedTokens, this.contract);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return new DesignTokens(this.expandTokens(themeTokens), this.contract);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Expand flattened tokens back to nested structure
|
|
132
|
-
expandTokens(flattened) {
|
|
133
|
-
const result = {};
|
|
134
|
-
|
|
135
|
-
Object.entries(flattened).forEach(([key, value]) => {
|
|
136
|
-
const parts = key.split('.');
|
|
137
|
-
let current = result;
|
|
138
|
-
|
|
139
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
140
|
-
current[parts[i]] = current[parts[i]] || {};
|
|
141
|
-
current = current[parts[i]];
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
current[parts[parts.length - 1]] = value;
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
return result;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Default tokens
|
|
152
|
-
const defaultTokens = {
|
|
153
|
-
colors: {
|
|
154
|
-
primary: '#667eea',
|
|
155
|
-
secondary: '#764ba2',
|
|
156
|
-
success: '#48bb78',
|
|
157
|
-
danger: '#f56565',
|
|
158
|
-
warning: '#ed8936',
|
|
159
|
-
info: '#4299e1',
|
|
160
|
-
light: '#f7fafc',
|
|
161
|
-
dark: '#1a202c',
|
|
162
|
-
white: '#ffffff',
|
|
163
|
-
black: '#000000',
|
|
164
|
-
gray: {
|
|
165
|
-
100: '#f7fafc',
|
|
166
|
-
200: '#edf2f7',
|
|
167
|
-
300: '#e2e8f0',
|
|
168
|
-
400: '#cbd5e0',
|
|
169
|
-
500: '#a0aec0',
|
|
170
|
-
600: '#718096',
|
|
171
|
-
700: '#4a5568',
|
|
172
|
-
800: '#2d3748',
|
|
173
|
-
900: '#1a202c'
|
|
174
|
-
}
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
spacing: {
|
|
178
|
-
0: '0',
|
|
179
|
-
1: '0.25rem',
|
|
180
|
-
2: '0.5rem',
|
|
181
|
-
3: '0.75rem',
|
|
182
|
-
4: '1rem',
|
|
183
|
-
5: '1.25rem',
|
|
184
|
-
6: '1.5rem',
|
|
185
|
-
8: '2rem',
|
|
186
|
-
10: '2.5rem',
|
|
187
|
-
12: '3rem',
|
|
188
|
-
16: '4rem',
|
|
189
|
-
20: '5rem',
|
|
190
|
-
24: '6rem',
|
|
191
|
-
32: '8rem',
|
|
192
|
-
40: '10rem',
|
|
193
|
-
48: '12rem',
|
|
194
|
-
56: '14rem',
|
|
195
|
-
64: '16rem',
|
|
196
|
-
xs: '0.5rem',
|
|
197
|
-
sm: '1rem',
|
|
198
|
-
md: '1.5rem',
|
|
199
|
-
lg: '2rem',
|
|
200
|
-
xl: '3rem',
|
|
201
|
-
'2xl': '4rem',
|
|
202
|
-
'3xl': '6rem'
|
|
203
|
-
},
|
|
204
|
-
|
|
205
|
-
typography: {
|
|
206
|
-
fontFamily: {
|
|
207
|
-
sans: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
|
|
208
|
-
serif: 'Georgia, Cambria, "Times New Roman", Times, serif',
|
|
209
|
-
mono: 'SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace'
|
|
210
|
-
},
|
|
211
|
-
fontSize: {
|
|
212
|
-
xs: '0.75rem',
|
|
213
|
-
sm: '0.875rem',
|
|
214
|
-
base: '1rem',
|
|
215
|
-
lg: '1.125rem',
|
|
216
|
-
xl: '1.25rem',
|
|
217
|
-
'2xl': '1.5rem',
|
|
218
|
-
'3xl': '1.875rem',
|
|
219
|
-
'4xl': '2.25rem',
|
|
220
|
-
'5xl': '3rem'
|
|
221
|
-
},
|
|
222
|
-
fontWeight: {
|
|
223
|
-
hairline: '100',
|
|
224
|
-
thin: '200',
|
|
225
|
-
light: '300',
|
|
226
|
-
normal: '400',
|
|
227
|
-
medium: '500',
|
|
228
|
-
semibold: '600',
|
|
229
|
-
bold: '700',
|
|
230
|
-
extrabold: '800',
|
|
231
|
-
black: '900'
|
|
232
|
-
},
|
|
233
|
-
lineHeight: {
|
|
234
|
-
none: '1',
|
|
235
|
-
tight: '1.25',
|
|
236
|
-
snug: '1.375',
|
|
237
|
-
normal: '1.5',
|
|
238
|
-
relaxed: '1.625',
|
|
239
|
-
loose: '2'
|
|
240
|
-
}
|
|
241
|
-
},
|
|
242
|
-
|
|
243
|
-
breakpoints: {
|
|
244
|
-
sm: '640px',
|
|
245
|
-
md: '768px',
|
|
246
|
-
lg: '1024px',
|
|
247
|
-
xl: '1280px',
|
|
248
|
-
'2xl': '1536px'
|
|
249
|
-
},
|
|
250
|
-
|
|
251
|
-
zIndex: {
|
|
252
|
-
0: '0',
|
|
253
|
-
10: '10',
|
|
254
|
-
20: '20',
|
|
255
|
-
30: '30',
|
|
256
|
-
40: '40',
|
|
257
|
-
50: '50',
|
|
258
|
-
auto: 'auto',
|
|
259
|
-
dropdown: '1000',
|
|
260
|
-
sticky: '1020',
|
|
261
|
-
fixed: '1030',
|
|
262
|
-
modal: '1040',
|
|
263
|
-
popover: '1050',
|
|
264
|
-
tooltip: '1060'
|
|
265
|
-
},
|
|
266
|
-
|
|
267
|
-
shadows: {
|
|
268
|
-
sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
|
|
269
|
-
base: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',
|
|
270
|
-
md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
|
|
271
|
-
lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
|
|
272
|
-
xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
|
|
273
|
-
'2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',
|
|
274
|
-
inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',
|
|
275
|
-
none: 'none'
|
|
276
|
-
},
|
|
277
|
-
|
|
278
|
-
borderRadius: {
|
|
279
|
-
none: '0',
|
|
280
|
-
sm: '0.125rem',
|
|
281
|
-
base: '0.25rem',
|
|
282
|
-
md: '0.375rem',
|
|
283
|
-
lg: '0.5rem',
|
|
284
|
-
xl: '0.75rem',
|
|
285
|
-
'2xl': '1rem',
|
|
286
|
-
'3xl': '1.5rem',
|
|
287
|
-
full: '9999px'
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
|
|
291
|
-
// Create and export tokens instance
|
|
292
|
-
const tokens = new DesignTokens(defaultTokens);
|
|
293
|
-
|
|
294
|
-
// Token utility functions
|
|
295
|
-
const createTokens = (customTokens, contract = null) => {
|
|
296
|
-
return new DesignTokens(customTokens, contract);
|
|
297
|
-
};
|
|
298
|
-
|
|
299
|
-
// Define a theme contract
|
|
300
|
-
const defineThemeContract = (contract) => {
|
|
301
|
-
return contract;
|
|
302
|
-
};
|
|
303
|
-
|
|
304
|
-
// Generate responsive values
|
|
305
|
-
const responsive = (values) => {
|
|
306
|
-
if (typeof values === 'string') return values;
|
|
307
|
-
|
|
308
|
-
return Object.entries(values).map(([breakpoint, value]) => {
|
|
309
|
-
if (breakpoint === 'base') return value;
|
|
310
|
-
return `@media (min-width: ${tokens.get(`breakpoints.${breakpoint}`)}) { ${value} }`;
|
|
311
|
-
}).join(' ');
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
export {
|
|
315
|
-
tokens,
|
|
316
|
-
createTokens,
|
|
317
|
-
defineThemeContract,
|
|
318
|
-
responsive,
|
|
319
|
-
DesignTokens
|
|
320
|
-
};
|