dispersa 0.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.
- package/LICENSE +21 -0
- package/dist/builders.cjs +1832 -0
- package/dist/builders.cjs.map +1 -0
- package/dist/builders.d.cts +228 -0
- package/dist/builders.d.ts +228 -0
- package/dist/builders.js +1824 -0
- package/dist/builders.js.map +1 -0
- package/dist/errors.cjs +110 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +97 -0
- package/dist/errors.d.ts +97 -0
- package/dist/errors.js +99 -0
- package/dist/errors.js.map +1 -0
- package/dist/filters.cjs +445 -0
- package/dist/filters.cjs.map +1 -0
- package/dist/filters.d.cts +86 -0
- package/dist/filters.d.ts +86 -0
- package/dist/filters.js +440 -0
- package/dist/filters.js.map +1 -0
- package/dist/index-CPB9Ea9U.d.ts +581 -0
- package/dist/index-DKf9WMQG.d.cts +581 -0
- package/dist/index.cjs +7843 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +332 -0
- package/dist/index.d.ts +332 -0
- package/dist/index.js +7802 -0
- package/dist/index.js.map +1 -0
- package/dist/preprocessors.cjs +13 -0
- package/dist/preprocessors.cjs.map +1 -0
- package/dist/preprocessors.d.cts +17 -0
- package/dist/preprocessors.d.ts +17 -0
- package/dist/preprocessors.js +11 -0
- package/dist/preprocessors.js.map +1 -0
- package/dist/renderers.cjs +28 -0
- package/dist/renderers.cjs.map +1 -0
- package/dist/renderers.d.cts +43 -0
- package/dist/renderers.d.ts +43 -0
- package/dist/renderers.js +24 -0
- package/dist/renderers.js.map +1 -0
- package/dist/transforms.cjs +453 -0
- package/dist/transforms.cjs.map +1 -0
- package/dist/transforms.d.cts +138 -0
- package/dist/transforms.d.ts +138 -0
- package/dist/transforms.js +429 -0
- package/dist/transforms.js.map +1 -0
- package/dist/types-BDY1xBmD.d.cts +30 -0
- package/dist/types-C1GpiJ6q.d.cts +368 -0
- package/dist/types-C1GpiJ6q.d.ts +368 -0
- package/dist/types-Cl-1UYGD.d.ts +30 -0
- package/dist/types-DJH6_4U9.d.ts +430 -0
- package/dist/types-DM5faYUn.d.cts +43 -0
- package/dist/types-DbufGPrb.d.cts +430 -0
- package/dist/types-DdPWYkgh.d.ts +43 -0
- package/package.json +141 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { T as Transform } from './types-DdPWYkgh.js';
|
|
2
|
+
import './types-C1GpiJ6q.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @fileoverview Built-in color value transforms with alpha channel support
|
|
6
|
+
* Includes both standard (hex, rgb, hsl) and modern CSS Color Module Level 4 transforms
|
|
7
|
+
* Uses culori for accurate color conversions
|
|
8
|
+
*
|
|
9
|
+
* Note: Transforms only handle DTCG object format. String values are alias references
|
|
10
|
+
* that must be resolved before transforms run.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Convert color to hex format (with alpha support via 8-digit hex)
|
|
15
|
+
*/
|
|
16
|
+
declare function colorToHex(): Transform;
|
|
17
|
+
/**
|
|
18
|
+
* Convert color to rgb/rgba format (preserves alpha)
|
|
19
|
+
*/
|
|
20
|
+
declare function colorToRgb(): Transform;
|
|
21
|
+
/**
|
|
22
|
+
* Convert color to hsl/hsla format (preserves alpha)
|
|
23
|
+
*/
|
|
24
|
+
declare function colorToHsl(): Transform;
|
|
25
|
+
/**
|
|
26
|
+
* Convert color to oklch format (perceptual color space)
|
|
27
|
+
*/
|
|
28
|
+
declare function colorToOklch(): Transform;
|
|
29
|
+
/**
|
|
30
|
+
* Convert color to oklab format (perceptual color space)
|
|
31
|
+
*/
|
|
32
|
+
declare function colorToOklab(): Transform;
|
|
33
|
+
/**
|
|
34
|
+
* Convert color to lch format (CIELAB lightness-chroma-hue)
|
|
35
|
+
*/
|
|
36
|
+
declare function colorToLch(): Transform;
|
|
37
|
+
/**
|
|
38
|
+
* Convert color to lab format (CIELAB)
|
|
39
|
+
*/
|
|
40
|
+
declare function colorToLab(): Transform;
|
|
41
|
+
/**
|
|
42
|
+
* Convert color to hwb format (hue-whiteness-blackness)
|
|
43
|
+
*/
|
|
44
|
+
declare function colorToHwb(): Transform;
|
|
45
|
+
/**
|
|
46
|
+
* Convert color to CSS color() function format
|
|
47
|
+
* Uses the original color space and formats as CSS color() function
|
|
48
|
+
*/
|
|
49
|
+
declare function colorToColorFunction(): Transform;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @fileoverview Built-in dimension value transforms
|
|
53
|
+
* Handles DTCG 2025.10 object format { value: number, unit: string }
|
|
54
|
+
* and converts to string format for output
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Convert dimension to px string format
|
|
59
|
+
*/
|
|
60
|
+
declare function dimensionToPx(): Transform;
|
|
61
|
+
/**
|
|
62
|
+
* Convert dimension to rem string format
|
|
63
|
+
*/
|
|
64
|
+
declare function dimensionToRem(): Transform;
|
|
65
|
+
/**
|
|
66
|
+
* Unitless dimension (extract numeric value)
|
|
67
|
+
*/
|
|
68
|
+
declare function dimensionToUnitless(): Transform;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @fileoverview Built-in name transforms using change-case library for robust case conversion
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Convert token name to camelCase
|
|
76
|
+
*/
|
|
77
|
+
declare function nameCamelCase(): Transform;
|
|
78
|
+
/**
|
|
79
|
+
* Convert token name to kebab-case
|
|
80
|
+
*/
|
|
81
|
+
declare function nameKebabCase(): Transform;
|
|
82
|
+
/**
|
|
83
|
+
* Convert token name to snake_case
|
|
84
|
+
*/
|
|
85
|
+
declare function nameSnakeCase(): Transform;
|
|
86
|
+
/**
|
|
87
|
+
* Convert token name to PascalCase
|
|
88
|
+
*/
|
|
89
|
+
declare function namePascalCase(): Transform;
|
|
90
|
+
/**
|
|
91
|
+
* Convert token name to CONSTANT_CASE
|
|
92
|
+
*/
|
|
93
|
+
declare function nameConstantCase(): Transform;
|
|
94
|
+
/**
|
|
95
|
+
* Add prefix to token name
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* // Add 'ds-' prefix to all token names
|
|
100
|
+
* transforms: [namePrefix('ds-')]
|
|
101
|
+
* // 'color.primary' becomes 'ds-color.primary'
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
declare function namePrefix(prefix: string): Transform;
|
|
105
|
+
/**
|
|
106
|
+
* Add suffix to token name
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* // Add '-token' suffix to all token names
|
|
111
|
+
* transforms: [nameSuffix('-token')]
|
|
112
|
+
* // 'color.primary' becomes 'color.primary-token'
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
declare function nameSuffix(suffix: string): Transform;
|
|
116
|
+
/**
|
|
117
|
+
* Convert token name to CSS custom property format (--name)
|
|
118
|
+
*/
|
|
119
|
+
declare function nameCssVar(): Transform;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @fileoverview Other built-in value transforms
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Convert font weight to numeric value
|
|
127
|
+
*/
|
|
128
|
+
declare function fontWeightToNumber(): Transform;
|
|
129
|
+
/**
|
|
130
|
+
* Convert duration to milliseconds
|
|
131
|
+
*/
|
|
132
|
+
declare function durationToMs(): Transform;
|
|
133
|
+
/**
|
|
134
|
+
* Convert duration to seconds
|
|
135
|
+
*/
|
|
136
|
+
declare function durationToSeconds(): Transform;
|
|
137
|
+
|
|
138
|
+
export { Transform, colorToColorFunction, colorToHex, colorToHsl, colorToHwb, colorToLab, colorToLch, colorToOklab, colorToOklch, colorToRgb, dimensionToPx, dimensionToRem, dimensionToUnitless, durationToMs, durationToSeconds, fontWeightToNumber, nameCamelCase, nameConstantCase, nameCssVar, nameKebabCase, namePascalCase, namePrefix, nameSnakeCase, nameSuffix };
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { formatCss, converter, formatHex8, formatHex, formatRgb, formatHsl } from 'culori';
|
|
2
|
+
import { camelCase, kebabCase, snakeCase, pascalCase, constantCase } from 'change-case';
|
|
3
|
+
|
|
4
|
+
// src/lib/processing/processors/transforms/built-in/color-transforms.ts
|
|
5
|
+
function isColorObject(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && "colorSpace" in value && "components" in value;
|
|
7
|
+
}
|
|
8
|
+
function componentToCulori(component) {
|
|
9
|
+
return component === "none" ? void 0 : component;
|
|
10
|
+
}
|
|
11
|
+
function dtcgObjectToCulori(color) {
|
|
12
|
+
const [c1, c2, c3] = color.components.map(componentToCulori);
|
|
13
|
+
const alpha = color.alpha !== void 0 ? componentToCulori(color.alpha) : void 0;
|
|
14
|
+
const colorSpace = color.colorSpace.toLowerCase();
|
|
15
|
+
switch (colorSpace) {
|
|
16
|
+
// RGB-based color spaces (components are R, G, B in 0-1 range)
|
|
17
|
+
case "srgb":
|
|
18
|
+
return { mode: "rgb", r: c1, g: c2, b: c3, alpha };
|
|
19
|
+
case "srgb-linear":
|
|
20
|
+
return { mode: "lrgb", r: c1, g: c2, b: c3, alpha };
|
|
21
|
+
case "display-p3":
|
|
22
|
+
return { mode: "p3", r: c1, g: c2, b: c3, alpha };
|
|
23
|
+
case "a98-rgb":
|
|
24
|
+
return { mode: "a98", r: c1, g: c2, b: c3, alpha };
|
|
25
|
+
case "prophoto-rgb":
|
|
26
|
+
return { mode: "prophoto", r: c1, g: c2, b: c3, alpha };
|
|
27
|
+
case "rec2020":
|
|
28
|
+
return { mode: "rec2020", r: c1, g: c2, b: c3, alpha };
|
|
29
|
+
// Cylindrical color spaces (Hue, Saturation/Whiteness, Lightness/Blackness)
|
|
30
|
+
case "hsl":
|
|
31
|
+
return { mode: "hsl", h: c1, s: c2, l: c3, alpha };
|
|
32
|
+
case "hwb":
|
|
33
|
+
return { mode: "hwb", h: c1, w: c2, b: c3, alpha };
|
|
34
|
+
// Lab color spaces (Lightness, a/b or Chroma/Hue)
|
|
35
|
+
case "lab":
|
|
36
|
+
return { mode: "lab", l: c1, a: c2, b: c3, alpha };
|
|
37
|
+
case "lch":
|
|
38
|
+
return { mode: "lch", l: c1, c: c2, h: c3, alpha };
|
|
39
|
+
case "oklab":
|
|
40
|
+
return { mode: "oklab", l: c1, a: c2, b: c3, alpha };
|
|
41
|
+
case "oklch":
|
|
42
|
+
return { mode: "oklch", l: c1, c: c2, h: c3, alpha };
|
|
43
|
+
// XYZ color spaces
|
|
44
|
+
case "xyz-d65":
|
|
45
|
+
return { mode: "xyz65", x: c1, y: c2, z: c3, alpha };
|
|
46
|
+
case "xyz-d50":
|
|
47
|
+
return { mode: "xyz50", x: c1, y: c2, z: c3, alpha };
|
|
48
|
+
// Fallback to sRGB if color space is not recognized
|
|
49
|
+
default:
|
|
50
|
+
return { mode: "rgb", r: c1, g: c2, b: c3, alpha };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function colorObjectToHex(color) {
|
|
54
|
+
const culoriColor = dtcgObjectToCulori(color);
|
|
55
|
+
const alpha = color.alpha ?? 1;
|
|
56
|
+
if (alpha < 1) {
|
|
57
|
+
return formatHex8(culoriColor);
|
|
58
|
+
}
|
|
59
|
+
return formatHex(culoriColor);
|
|
60
|
+
}
|
|
61
|
+
function colorObjectToRgb(color) {
|
|
62
|
+
const culoriColor = dtcgObjectToCulori(color);
|
|
63
|
+
return formatRgb(culoriColor);
|
|
64
|
+
}
|
|
65
|
+
function colorObjectToHsl(color) {
|
|
66
|
+
const culoriColor = dtcgObjectToCulori(color);
|
|
67
|
+
return formatHsl(culoriColor);
|
|
68
|
+
}
|
|
69
|
+
function dtcgObjectToCulori2(value) {
|
|
70
|
+
if (!isColorObject(value)) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return dtcgObjectToCulori(value);
|
|
74
|
+
}
|
|
75
|
+
function createColorTransform(converter2) {
|
|
76
|
+
return {
|
|
77
|
+
matcher: (token) => token.$type === "color",
|
|
78
|
+
transform: (token) => {
|
|
79
|
+
const value = token.$value;
|
|
80
|
+
if (!isColorObject(value)) {
|
|
81
|
+
return token;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const converted = converter2(value);
|
|
85
|
+
return { ...token, $value: converted };
|
|
86
|
+
} catch {
|
|
87
|
+
return token;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function createModernColorTransform(mode) {
|
|
93
|
+
return {
|
|
94
|
+
matcher: (token) => token.$type === "color",
|
|
95
|
+
transform: (token) => {
|
|
96
|
+
const value = token.$value;
|
|
97
|
+
try {
|
|
98
|
+
const parsed = dtcgObjectToCulori2(value);
|
|
99
|
+
if (parsed === null) {
|
|
100
|
+
return token;
|
|
101
|
+
}
|
|
102
|
+
const converted = converter(mode)(parsed);
|
|
103
|
+
const formatted = formatCss(converted);
|
|
104
|
+
if (formatted === "") {
|
|
105
|
+
return token;
|
|
106
|
+
}
|
|
107
|
+
return { ...token, $value: formatted };
|
|
108
|
+
} catch {
|
|
109
|
+
return token;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// src/lib/processing/processors/transforms/built-in/color-transforms.ts
|
|
116
|
+
function colorToHex() {
|
|
117
|
+
return createColorTransform(colorObjectToHex);
|
|
118
|
+
}
|
|
119
|
+
function colorToRgb() {
|
|
120
|
+
return createColorTransform(colorObjectToRgb);
|
|
121
|
+
}
|
|
122
|
+
function colorToHsl() {
|
|
123
|
+
return createColorTransform(colorObjectToHsl);
|
|
124
|
+
}
|
|
125
|
+
function colorToOklch() {
|
|
126
|
+
return createModernColorTransform("oklch");
|
|
127
|
+
}
|
|
128
|
+
function colorToOklab() {
|
|
129
|
+
return createModernColorTransform("oklab");
|
|
130
|
+
}
|
|
131
|
+
function colorToLch() {
|
|
132
|
+
return createModernColorTransform("lch");
|
|
133
|
+
}
|
|
134
|
+
function colorToLab() {
|
|
135
|
+
return createModernColorTransform("lab");
|
|
136
|
+
}
|
|
137
|
+
function colorToHwb() {
|
|
138
|
+
return createModernColorTransform("hwb");
|
|
139
|
+
}
|
|
140
|
+
function colorToColorFunction() {
|
|
141
|
+
return {
|
|
142
|
+
matcher: (token) => token.$type === "color",
|
|
143
|
+
transform: (token) => {
|
|
144
|
+
const value = token.$value;
|
|
145
|
+
try {
|
|
146
|
+
const parsed = dtcgObjectToCulori2(value);
|
|
147
|
+
if (parsed === null) {
|
|
148
|
+
return token;
|
|
149
|
+
}
|
|
150
|
+
const formatted = formatCss(parsed);
|
|
151
|
+
if (formatted === "") {
|
|
152
|
+
return token;
|
|
153
|
+
}
|
|
154
|
+
return { ...token, $value: formatted };
|
|
155
|
+
} catch {
|
|
156
|
+
return token;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// src/shared/constants.ts
|
|
163
|
+
var DEFAULT_BASE_FONT_SIZE_PX = 16;
|
|
164
|
+
|
|
165
|
+
// src/lib/processing/processors/transforms/built-in/dimension-converter.ts
|
|
166
|
+
function isDimensionObject(value) {
|
|
167
|
+
return typeof value === "object" && value !== null && "value" in value && "unit" in value;
|
|
168
|
+
}
|
|
169
|
+
function dimensionObjectToString(dimension) {
|
|
170
|
+
return `${dimension.value}${dimension.unit}`;
|
|
171
|
+
}
|
|
172
|
+
function convertDimension(value, toUnit, baseFontSize = DEFAULT_BASE_FONT_SIZE_PX) {
|
|
173
|
+
const fromUnit = value.unit;
|
|
174
|
+
let numValue = value.value;
|
|
175
|
+
if (fromUnit === "rem") {
|
|
176
|
+
numValue = numValue * baseFontSize;
|
|
177
|
+
} else if (fromUnit !== "px" && fromUnit !== toUnit) {
|
|
178
|
+
return value;
|
|
179
|
+
}
|
|
180
|
+
if (toUnit === "rem") {
|
|
181
|
+
numValue = numValue / baseFontSize;
|
|
182
|
+
} else if (toUnit !== "px") {
|
|
183
|
+
return value;
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
value: numValue,
|
|
187
|
+
unit: toUnit
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// src/lib/processing/processors/transforms/built-in/dimension-transforms.ts
|
|
192
|
+
function dimensionToPx() {
|
|
193
|
+
return {
|
|
194
|
+
matcher: (token) => token.$type === "dimension",
|
|
195
|
+
transform: (token) => {
|
|
196
|
+
const value = token.$value;
|
|
197
|
+
if (typeof value === "string") {
|
|
198
|
+
return token;
|
|
199
|
+
}
|
|
200
|
+
if (isDimensionObject(value)) {
|
|
201
|
+
const converted = convertDimension(value, "px", DEFAULT_BASE_FONT_SIZE_PX);
|
|
202
|
+
return { ...token, $value: dimensionObjectToString(converted) };
|
|
203
|
+
}
|
|
204
|
+
return token;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function dimensionToRem() {
|
|
209
|
+
return {
|
|
210
|
+
matcher: (token) => token.$type === "dimension",
|
|
211
|
+
transform: (token) => {
|
|
212
|
+
const value = token.$value;
|
|
213
|
+
if (typeof value === "string") {
|
|
214
|
+
return token;
|
|
215
|
+
}
|
|
216
|
+
if (isDimensionObject(value)) {
|
|
217
|
+
const converted = convertDimension(
|
|
218
|
+
value,
|
|
219
|
+
"rem",
|
|
220
|
+
DEFAULT_BASE_FONT_SIZE_PX
|
|
221
|
+
);
|
|
222
|
+
return { ...token, $value: dimensionObjectToString(converted) };
|
|
223
|
+
}
|
|
224
|
+
return token;
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function dimensionToUnitless() {
|
|
229
|
+
return {
|
|
230
|
+
matcher: (token) => token.$type === "dimension",
|
|
231
|
+
transform: (token) => {
|
|
232
|
+
const value = token.$value;
|
|
233
|
+
if (typeof value === "string") {
|
|
234
|
+
const num = parseFloat(value);
|
|
235
|
+
return { ...token, $value: isNaN(num) ? value : num };
|
|
236
|
+
}
|
|
237
|
+
if (isDimensionObject(value)) {
|
|
238
|
+
return { ...token, $value: value.value };
|
|
239
|
+
}
|
|
240
|
+
return token;
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function nameCamelCase() {
|
|
245
|
+
return {
|
|
246
|
+
transform: (token) => {
|
|
247
|
+
const name = camelCase(token.path.join(" "));
|
|
248
|
+
return {
|
|
249
|
+
...token,
|
|
250
|
+
name
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
function nameKebabCase() {
|
|
256
|
+
return {
|
|
257
|
+
transform: (token) => {
|
|
258
|
+
const name = kebabCase(token.path.join(" "));
|
|
259
|
+
return {
|
|
260
|
+
...token,
|
|
261
|
+
name
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function nameSnakeCase() {
|
|
267
|
+
return {
|
|
268
|
+
transform: (token) => {
|
|
269
|
+
const name = snakeCase(token.path.join(" "));
|
|
270
|
+
return {
|
|
271
|
+
...token,
|
|
272
|
+
name
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
function namePascalCase() {
|
|
278
|
+
return {
|
|
279
|
+
transform: (token) => {
|
|
280
|
+
const name = pascalCase(token.path.join(" "));
|
|
281
|
+
return {
|
|
282
|
+
...token,
|
|
283
|
+
name
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function nameConstantCase() {
|
|
289
|
+
return {
|
|
290
|
+
transform: (token) => {
|
|
291
|
+
const name = constantCase(token.path.join(" "));
|
|
292
|
+
return {
|
|
293
|
+
...token,
|
|
294
|
+
name
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function namePrefix(prefix) {
|
|
300
|
+
return {
|
|
301
|
+
transform: (token) => {
|
|
302
|
+
return {
|
|
303
|
+
...token,
|
|
304
|
+
name: `${prefix}${token.name}`
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function nameSuffix(suffix) {
|
|
310
|
+
return {
|
|
311
|
+
transform: (token) => {
|
|
312
|
+
return {
|
|
313
|
+
...token,
|
|
314
|
+
name: `${token.name}${suffix}`
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function nameCssVar() {
|
|
320
|
+
return {
|
|
321
|
+
transform: (token) => {
|
|
322
|
+
const kebabName = token.path.map((part) => part.replace(/[^a-zA-Z0-9-]/g, "").toLowerCase()).join("-");
|
|
323
|
+
return {
|
|
324
|
+
...token,
|
|
325
|
+
name: `--${kebabName}`
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// src/lib/processing/processors/transforms/built-in/other-transforms.ts
|
|
332
|
+
function fontWeightToNumber() {
|
|
333
|
+
return {
|
|
334
|
+
matcher: (token) => token.$type === "fontWeight",
|
|
335
|
+
transform: (token) => {
|
|
336
|
+
const value = token.$value;
|
|
337
|
+
if (typeof value === "number") {
|
|
338
|
+
return token;
|
|
339
|
+
}
|
|
340
|
+
if (typeof value === "string") {
|
|
341
|
+
const weightMap = {
|
|
342
|
+
thin: 100,
|
|
343
|
+
hairline: 100,
|
|
344
|
+
"extra-light": 200,
|
|
345
|
+
"ultra-light": 200,
|
|
346
|
+
light: 300,
|
|
347
|
+
normal: 400,
|
|
348
|
+
regular: 400,
|
|
349
|
+
medium: 500,
|
|
350
|
+
"semi-bold": 600,
|
|
351
|
+
"demi-bold": 600,
|
|
352
|
+
bold: 700,
|
|
353
|
+
"extra-bold": 800,
|
|
354
|
+
"ultra-bold": 800,
|
|
355
|
+
black: 900,
|
|
356
|
+
heavy: 900,
|
|
357
|
+
"extra-black": 950,
|
|
358
|
+
"ultra-black": 950
|
|
359
|
+
};
|
|
360
|
+
const weight = weightMap[value.toLowerCase()];
|
|
361
|
+
if (weight !== void 0) {
|
|
362
|
+
return { ...token, $value: weight };
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return token;
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
function parseDuration(rawValue) {
|
|
370
|
+
if (typeof rawValue === "object" && rawValue !== null && "value" in rawValue && "unit" in rawValue) {
|
|
371
|
+
const unit = rawValue.unit;
|
|
372
|
+
const numeric = Number(rawValue.value);
|
|
373
|
+
if (Number.isFinite(numeric) && (unit === "ms" || unit === "s")) {
|
|
374
|
+
return { value: numeric, unit };
|
|
375
|
+
}
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
const str = typeof rawValue === "string" || typeof rawValue === "number" ? String(rawValue) : "";
|
|
379
|
+
if (str.endsWith("ms")) {
|
|
380
|
+
const numeric = parseFloat(str);
|
|
381
|
+
return Number.isFinite(numeric) ? { value: numeric, unit: "ms" } : null;
|
|
382
|
+
}
|
|
383
|
+
if (str.endsWith("s")) {
|
|
384
|
+
const numeric = parseFloat(str);
|
|
385
|
+
return Number.isFinite(numeric) ? { value: numeric, unit: "s" } : null;
|
|
386
|
+
}
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
389
|
+
function convertDurationUnit(parsed, target) {
|
|
390
|
+
if (parsed.unit === target) {
|
|
391
|
+
return parsed;
|
|
392
|
+
}
|
|
393
|
+
return target === "ms" ? { value: parsed.value * 1e3, unit: "ms" } : { value: parsed.value / 1e3, unit: "s" };
|
|
394
|
+
}
|
|
395
|
+
function durationToMs() {
|
|
396
|
+
return {
|
|
397
|
+
matcher: (token) => token.$type === "duration",
|
|
398
|
+
transform: (token) => {
|
|
399
|
+
const parsed = parseDuration(token.$value);
|
|
400
|
+
if (!parsed) {
|
|
401
|
+
return token;
|
|
402
|
+
}
|
|
403
|
+
const converted = convertDurationUnit(parsed, "ms");
|
|
404
|
+
return { ...token, $value: { value: converted.value, unit: converted.unit } };
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
function durationToSeconds() {
|
|
409
|
+
return {
|
|
410
|
+
matcher: (token) => token.$type === "duration",
|
|
411
|
+
transform: (token) => {
|
|
412
|
+
const parsed = parseDuration(token.$value);
|
|
413
|
+
if (!parsed) {
|
|
414
|
+
return token;
|
|
415
|
+
}
|
|
416
|
+
const converted = convertDurationUnit(parsed, "s");
|
|
417
|
+
return { ...token, $value: { value: converted.value, unit: converted.unit } };
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* @license
|
|
423
|
+
* Copyright (c) 2025 Dispersa Contributors
|
|
424
|
+
* SPDX-License-Identifier: MIT
|
|
425
|
+
*/
|
|
426
|
+
|
|
427
|
+
export { colorToColorFunction, colorToHex, colorToHsl, colorToHwb, colorToLab, colorToLch, colorToOklab, colorToOklch, colorToRgb, dimensionToPx, dimensionToRem, dimensionToUnitless, durationToMs, durationToSeconds, fontWeightToNumber, nameCamelCase, nameConstantCase, nameCssVar, nameKebabCase, namePascalCase, namePrefix, nameSnakeCase, nameSuffix };
|
|
428
|
+
//# sourceMappingURL=transforms.js.map
|
|
429
|
+
//# sourceMappingURL=transforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/processing/processors/transforms/built-in/color-converter.ts","../src/lib/processing/processors/transforms/built-in/color-format.ts","../src/lib/processing/processors/transforms/built-in/color-transform-factory.ts","../src/lib/processing/processors/transforms/built-in/color-transforms.ts","../src/shared/constants.ts","../src/lib/processing/processors/transforms/built-in/dimension-converter.ts","../src/lib/processing/processors/transforms/built-in/dimension-transforms.ts","../src/lib/processing/processors/transforms/built-in/name-transforms.ts","../src/lib/processing/processors/transforms/built-in/other-transforms.ts"],"names":["dtcgObjectToCulori","converter","formatCss"],"mappings":";;;;AA6BO,SAAS,cAAc,KAAA,EAA2C;AACvE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,YAAA,IAAgB,SAAS,YAAA,IAAgB,KAAA;AAE5F;AAMA,SAAS,kBAAkB,SAAA,EAA+C;AACxE,EAAA,OAAO,SAAA,KAAc,SAAS,MAAA,GAAY,SAAA;AAC5C;AAMO,SAAS,mBAAmB,KAAA,EAAsC;AACvE,EAAA,MAAM,CAAC,IAAI,EAAA,EAAI,EAAE,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,iBAAiB,CAAA;AAC3D,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,KAAU,SAAY,iBAAA,CAAkB,KAAA,CAAM,KAAK,CAAA,GAAI,MAAA;AAG3E,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,WAAA,EAAY;AAGhD,EAAA,QAAQ,UAAA;AAAY;AAAA,IAElB,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAEnD,KAAK,aAAA;AACH,MAAA,OAAO,EAAE,MAAM,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAEpD,KAAK,YAAA;AACH,MAAA,OAAO,EAAE,MAAM,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAElD,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAEnD,KAAK,cAAA;AACH,MAAA,OAAO,EAAE,MAAM,UAAA,EAAY,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAExD,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,MAAM,SAAA,EAAW,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA;AAAA,IAGvD,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAEnD,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA;AAAA,IAGnD,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAEnD,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAEnD,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAErD,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA;AAAA,IAGrD,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA,IAErD,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA;AAAA,IAGrD;AACE,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAM;AAAA;AAEvD;AAKO,SAAS,iBAAiB,KAAA,EAAiC;AAChE,EAAA,MAAM,WAAA,GAAc,mBAAmB,KAAK,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,CAAA;AAE7B,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,WAAW,WAAW,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,UAAU,WAAW,CAAA;AAC9B;AC3GO,SAAS,iBAAiB,KAAA,EAAiC;AAChE,EAAA,MAAM,WAAA,GAAc,mBAAmB,KAAK,CAAA;AAC5C,EAAA,OAAO,UAAU,WAAW,CAAA;AAC9B;AAKO,SAAS,iBAAiB,KAAA,EAAiC;AAChE,EAAA,MAAM,WAAA,GAAc,mBAAmB,KAAK,CAAA;AAC5C,EAAA,OAAO,UAAU,WAAW,CAAA;AAC9B;ACRO,SAASA,oBAAmB,KAAA,EAAmB;AACpD,EAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,mBAAoB,KAAK,CAAA;AAClC;AAcO,SAAS,qBAAqBC,UAAAA,EAA2D;AAC9F,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,OAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAEpB,MAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AAEzB,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAYA,WAAU,KAAK,CAAA;AACjC,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAU;AAAA,MACvC,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;AAcO,SAAS,2BAA2B,IAAA,EAAuB;AAChE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,OAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAEpB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAASD,oBAAmB,KAAK,CAAA;AAEvC,QAAA,IAAI,WAAW,IAAA,EAAM;AACnB,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAI,CAAA,CAAE,MAAM,CAAA;AACxC,QAAA,MAAM,SAAA,GAAY,UAAU,SAAS,CAAA;AAErC,QAAA,IAAI,cAAc,EAAA,EAAI;AACpB,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAU;AAAA,MACvC,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACpEO,SAAS,UAAA,GAAwB;AACtC,EAAA,OAAO,qBAAqB,gBAAgB,CAAA;AAC9C;AAKO,SAAS,UAAA,GAAwB;AACtC,EAAA,OAAO,qBAAqB,gBAAgB,CAAA;AAC9C;AAKO,SAAS,UAAA,GAAwB;AACtC,EAAA,OAAO,qBAAqB,gBAAgB,CAAA;AAC9C;AASO,SAAS,YAAA,GAA0B;AACxC,EAAA,OAAO,2BAA2B,OAAO,CAAA;AAC3C;AAKO,SAAS,YAAA,GAA0B;AACxC,EAAA,OAAO,2BAA2B,OAAO,CAAA;AAC3C;AAKO,SAAS,UAAA,GAAwB;AACtC,EAAA,OAAO,2BAA2B,KAAK,CAAA;AACzC;AAKO,SAAS,UAAA,GAAwB;AACtC,EAAA,OAAO,2BAA2B,KAAK,CAAA;AACzC;AAKO,SAAS,UAAA,GAAwB;AACtC,EAAA,OAAO,2BAA2B,KAAK,CAAA;AACzC;AAMO,SAAS,oBAAA,GAAkC;AAChD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,OAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAEpB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAASA,oBAAmB,KAAK,CAAA;AAEvC,QAAA,IAAI,WAAW,IAAA,EAAM;AACnB,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,MAAM,SAAA,GAAYE,UAAU,MAAM,CAAA;AAElC,QAAA,IAAI,cAAc,EAAA,EAAI;AACpB,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAU;AAAA,MACvC,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACxGO,IAAM,yBAAA,GAA4B,EAAA;;;ACHlC,SAAS,kBAAkB,KAAA,EAAyC;AACzE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,OAAA,IAAW,SAAS,MAAA,IAAU,KAAA;AACtF;AAKO,SAAS,wBAAwB,SAAA,EAAmC;AACzE,EAAA,OAAO,CAAA,EAAG,SAAA,CAAU,KAAK,CAAA,EAAG,UAAU,IAAI,CAAA,CAAA;AAC5C;AAYO,SAAS,gBAAA,CACd,KAAA,EACA,MAAA,EACA,YAAA,GAAe,yBAAA,EACC;AAChB,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AACvB,EAAA,IAAI,WAAW,KAAA,CAAM,KAAA;AAGrB,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,QAAA,GAAW,QAAA,GAAW,YAAA;AAAA,EACxB,CAAA,MAAA,IAAW,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAQ;AAEnD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,QAAA,GAAW,QAAA,GAAW,YAAA;AAAA,EACxB,CAAA,MAAA,IAAW,WAAW,IAAA,EAAM;AAE1B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AACF;;;AC5CO,SAAS,aAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,WAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAGpB,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,KAAA,EAAyB,IAAA,EAAM,yBAAyB,CAAA;AAC3F,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,uBAAA,CAAwB,SAAS,CAAA,EAAE;AAAA,MAChE;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAKO,SAAS,cAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,WAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAGpB,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAM,SAAA,GAAY,gBAAA;AAAA,UAChB,KAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,uBAAA,CAAwB,SAAS,CAAA,EAAE;AAAA,MAChE;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAKO,SAAS,mBAAA,GAAiC;AAC/C,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,WAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAGpB,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA;AAC5B,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,MAAM,GAAG,CAAA,GAAI,QAAQ,GAAA,EAAI;AAAA,MACtD;AAGA,MAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAS,MAAyB,KAAA,EAAM;AAAA,MAC7D;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF;AC7EO,SAAS,aAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,OAAO,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAC3C,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAKO,SAAS,aAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,OAAO,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAC3C,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAKO,SAAS,aAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,OAAO,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAC3C,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAKO,SAAS,cAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,OAAO,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAC5C,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAKO,SAAS,gBAAA,GAA8B;AAC5C,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,OAAO,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAC9C,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAYO,SAAS,WAAW,MAAA,EAA2B;AACpD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,OAC9B;AAAA,IACF;AAAA,GACF;AACF;AAYO,SAAS,WAAW,MAAA,EAA2B;AACpD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,IAAA,EAAM,CAAA,EAAG,KAAA,CAAM,IAAI,GAAG,MAAM,CAAA;AAAA,OAC9B;AAAA,IACF;AAAA,GACF;AACF;AAKO,SAAS,UAAA,GAAwB;AACtC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CACrB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA,CAAE,WAAA,EAAa,CAAA,CAC9D,KAAK,GAAG,CAAA;AAEX,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,IAAA,EAAM,KAAK,SAAS,CAAA;AAAA,OACtB;AAAA,IACF;AAAA,GACF;AACF;;;ACnIO,SAAS,kBAAA,GAAgC;AAC9C,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,YAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAEpB,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,SAAA,GAAoC;AAAA,UACxC,IAAA,EAAM,GAAA;AAAA,UACN,QAAA,EAAU,GAAA;AAAA,UACV,aAAA,EAAe,GAAA;AAAA,UACf,aAAA,EAAe,GAAA;AAAA,UACf,KAAA,EAAO,GAAA;AAAA,UACP,MAAA,EAAQ,GAAA;AAAA,UACR,OAAA,EAAS,GAAA;AAAA,UACT,MAAA,EAAQ,GAAA;AAAA,UACR,WAAA,EAAa,GAAA;AAAA,UACb,WAAA,EAAa,GAAA;AAAA,UACb,IAAA,EAAM,GAAA;AAAA,UACN,YAAA,EAAc,GAAA;AAAA,UACd,YAAA,EAAc,GAAA;AAAA,UACd,KAAA,EAAO,GAAA;AAAA,UACP,KAAA,EAAO,GAAA;AAAA,UACP,aAAA,EAAe,GAAA;AAAA,UACf,aAAA,EAAe;AAAA,SACjB;AAEA,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,WAAA,EAAa,CAAA;AAC5C,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO;AAAA,QACpC;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAMA,SAAS,cAAc,QAAA,EAA0C;AAC/D,EAAA,IACE,OAAO,aAAa,QAAA,IACpB,QAAA,KAAa,QACb,OAAA,IAAW,QAAA,IACX,UAAU,QAAA,EACV;AACA,IAAA,MAAM,OAAQ,QAAA,CAA8B,IAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAQ,QAAA,CAAgC,KAAK,CAAA;AAC7D,IAAA,IAAI,OAAO,QAAA,CAAS,OAAO,MAAM,IAAA,KAAS,IAAA,IAAQ,SAAS,GAAA,CAAA,EAAM;AAC/D,MAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAK;AAAA,IAChC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,GAAW,MAAA,CAAO,QAAQ,CAAA,GAAI,EAAA;AAC9F,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACtB,IAAA,MAAM,OAAA,GAAU,WAAW,GAAG,CAAA;AAC9B,IAAA,OAAO,MAAA,CAAO,SAAS,OAAO,CAAA,GAAI,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK,GAAI,IAAA;AAAA,EACrE;AACA,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACrB,IAAA,MAAM,OAAA,GAAU,WAAW,GAAG,CAAA;AAC9B,IAAA,OAAO,MAAA,CAAO,SAAS,OAAO,CAAA,GAAI,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI,GAAI,IAAA;AAAA,EACpE;AAEA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,mBAAA,CAAoB,QAAwB,MAAA,EAAsC;AACzF,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,WAAW,IAAA,GACd,EAAE,KAAA,EAAO,MAAA,CAAO,QAAQ,GAAA,EAAM,IAAA,EAAM,IAAA,EAAK,GACzC,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,GAAA,EAAM,MAAM,GAAA,EAAI;AAC9C;AAKO,SAAS,YAAA,GAA0B;AACxC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,UAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AACzC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,MAAA,EAAQ,IAAI,CAAA;AAClD,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,SAAA,CAAU,IAAA,EAAK,EAAE;AAAA,IAC9E;AAAA,GACF;AACF;AAKO,SAAS,iBAAA,GAA+B;AAC7C,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,KAAA,KAAyB,KAAA,CAAM,KAAA,KAAU,UAAA;AAAA,IACnD,SAAA,EAAW,CAAC,KAAA,KAAyB;AACnC,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AACzC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,MAAA,EAAQ,GAAG,CAAA;AACjD,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,SAAA,CAAU,IAAA,EAAK,EAAE;AAAA,IAC9E;AAAA,GACF;AACF","file":"transforms.js","sourcesContent":["/**\n * @fileoverview Color format conversion utilities for DTCG 2025.10\n * Uses culori for accurate color science and conversions\n */\n\nimport type { ColorComponent, ColorSpace, ColorValueObject } from '@lib/tokens/types'\nimport {\n formatHex,\n formatHex8,\n type Color as CuloriColor,\n type Rgb,\n type Lrgb,\n type Hsl,\n type Hwb,\n type Lab,\n type Lch,\n type Oklab,\n type Oklch,\n type P3,\n type A98,\n type Prophoto,\n type Rec2020,\n type Xyz65,\n type Xyz50,\n} from 'culori'\n\n/**\n * Check if a color value is in DTCG object format\n */\nexport function isColorObject(value: unknown): value is ColorValueObject {\n return (\n typeof value === 'object' && value !== null && 'colorSpace' in value && 'components' in value\n )\n}\n\n/**\n * Convert a color component value to culori format\n * The \"none\" keyword becomes undefined (culori's representation of missing channels)\n */\nfunction componentToCulori(component: ColorComponent): number | undefined {\n return component === 'none' ? undefined : component\n}\n\n/**\n * Convert DTCG color object to culori color object\n * Handles all 14 DTCG color spaces and the \"none\" keyword\n */\nexport function dtcgObjectToCulori(color: ColorValueObject): CuloriColor {\n const [c1, c2, c3] = color.components.map(componentToCulori)\n const alpha = color.alpha !== undefined ? componentToCulori(color.alpha) : undefined\n\n // Normalize color space (case-insensitive, handle aliases)\n const colorSpace = color.colorSpace.toLowerCase() as Lowercase<ColorSpace>\n\n // Map DTCG color spaces to culori color objects with proper property names\n switch (colorSpace) {\n // RGB-based color spaces (components are R, G, B in 0-1 range)\n case 'srgb':\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n\n case 'srgb-linear':\n return { mode: 'lrgb', r: c1, g: c2, b: c3, alpha } as Lrgb\n\n case 'display-p3':\n return { mode: 'p3', r: c1, g: c2, b: c3, alpha } as P3\n\n case 'a98-rgb':\n return { mode: 'a98', r: c1, g: c2, b: c3, alpha } as A98\n\n case 'prophoto-rgb':\n return { mode: 'prophoto', r: c1, g: c2, b: c3, alpha } as Prophoto\n\n case 'rec2020':\n return { mode: 'rec2020', r: c1, g: c2, b: c3, alpha } as Rec2020\n\n // Cylindrical color spaces (Hue, Saturation/Whiteness, Lightness/Blackness)\n case 'hsl':\n return { mode: 'hsl', h: c1, s: c2, l: c3, alpha } as Hsl\n\n case 'hwb':\n return { mode: 'hwb', h: c1, w: c2, b: c3, alpha } as Hwb\n\n // Lab color spaces (Lightness, a/b or Chroma/Hue)\n case 'lab':\n return { mode: 'lab', l: c1, a: c2, b: c3, alpha } as Lab\n\n case 'lch':\n return { mode: 'lch', l: c1, c: c2, h: c3, alpha } as Lch\n\n case 'oklab':\n return { mode: 'oklab', l: c1, a: c2, b: c3, alpha } as Oklab\n\n case 'oklch':\n return { mode: 'oklch', l: c1, c: c2, h: c3, alpha } as Oklch\n\n // XYZ color spaces\n case 'xyz-d65':\n return { mode: 'xyz65', x: c1, y: c2, z: c3, alpha } as Xyz65\n\n case 'xyz-d50':\n return { mode: 'xyz50', x: c1, y: c2, z: c3, alpha } as Xyz50\n\n // Fallback to sRGB if color space is not recognized\n default:\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n }\n}\n\n/**\n * Convert DTCG color object to hex string\n */\nexport function colorObjectToHex(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n const alpha = color.alpha ?? 1\n\n if (alpha < 1) {\n return formatHex8(culoriColor)\n }\n\n return formatHex(culoriColor)\n}\n","/**\n * @fileoverview Color format conversions that use culori's formatRgb / formatHsl\n * Split from color-converter to avoid pulling these into bundles that only need hex.\n */\n\nimport type { ColorValueObject } from '@lib/tokens/types'\nimport { formatRgb, formatHsl } from 'culori'\n\nimport { dtcgObjectToCulori } from './color-converter'\n\n/**\n * Convert DTCG color object to rgb/rgba string\n */\nexport function colorObjectToRgb(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatRgb(culoriColor)\n}\n\n/**\n * Convert DTCG color object to hsl/hsla string\n */\nexport function colorObjectToHsl(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatHsl(culoriColor)\n}\n","/**\n * @fileoverview Unified factory for creating color transforms\n * Handles both simple conversions and modern color space transformations\n */\n\nimport { ColorValue, ColorValueObject, ResolvedToken } from '@lib/tokens/types'\nimport { converter, formatCss, type Mode } from 'culori'\n\nimport { Transform } from '..'\n\nimport { dtcgObjectToCulori as convertDtcgToCulori, isColorObject } from './color-converter'\n\n/**\n * Convert DTCG color value to culori color object\n * Returns null if value is not a ColorValueObject (e.g., unresolved alias reference)\n */\nexport function dtcgObjectToCulori(value: ColorValue) {\n if (!isColorObject(value)) {\n return null\n }\n return convertDtcgToCulori(value)\n}\n\n/**\n * Create a simple color transform with direct string conversion\n * Used for basic color formats (hex, rgb, hsl)\n *\n * @param converter - Function to convert color object to string\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const hexTransform = createColorTransform('color:hex', colorObjectToHex)\n * ```\n */\nexport function createColorTransform(converter: (value: ColorValueObject) => string): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n if (!isColorObject(value)) {\n // String values should be alias references that get resolved before transforms\n return token\n }\n\n try {\n const converted = converter(value)\n return { ...token, $value: converted }\n } catch {\n // If conversion fails, return token unchanged\n return token\n }\n },\n }\n}\n\n/**\n * Create a modern color transform using culori converter\n * Used for CSS Color Module Level 4 color spaces (oklch, oklab, lch, lab, hwb)\n *\n * @param mode - Culori color mode to convert to\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const oklchTransform = createModernColorTransform('color:oklch', 'oklch')\n * ```\n */\nexport function createModernColorTransform(mode: Mode): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Convert to target color space\n const converted = converter(mode)(parsed)\n const formatted = formatCss(converted)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Built-in color value transforms with alpha channel support\n * Includes both standard (hex, rgb, hsl) and modern CSS Color Module Level 4 transforms\n * Uses culori for accurate color conversions\n *\n * Note: Transforms only handle DTCG object format. String values are alias references\n * that must be resolved before transforms run.\n */\n\nimport type { ColorValue, ResolvedToken } from '@lib/tokens/types'\nimport { formatCss } from 'culori'\n\nimport type { Transform } from '../types'\n\nimport { colorObjectToHex } from './color-converter'\nimport { colorObjectToHsl, colorObjectToRgb } from './color-format'\nimport {\n createColorTransform,\n createModernColorTransform,\n dtcgObjectToCulori,\n} from './color-transform-factory'\n\n// ============================================================================\n// Standard Color Transforms (hex, rgb, hsl)\n// ============================================================================\n\n/**\n * Convert color to hex format (with alpha support via 8-digit hex)\n */\nexport function colorToHex(): Transform {\n return createColorTransform(colorObjectToHex)\n}\n\n/**\n * Convert color to rgb/rgba format (preserves alpha)\n */\nexport function colorToRgb(): Transform {\n return createColorTransform(colorObjectToRgb)\n}\n\n/**\n * Convert color to hsl/hsla format (preserves alpha)\n */\nexport function colorToHsl(): Transform {\n return createColorTransform(colorObjectToHsl)\n}\n\n// ============================================================================\n// Modern CSS Color Module Level 4 Transforms\n// ============================================================================\n\n/**\n * Convert color to oklch format (perceptual color space)\n */\nexport function colorToOklch(): Transform {\n return createModernColorTransform('oklch')\n}\n\n/**\n * Convert color to oklab format (perceptual color space)\n */\nexport function colorToOklab(): Transform {\n return createModernColorTransform('oklab')\n}\n\n/**\n * Convert color to lch format (CIELAB lightness-chroma-hue)\n */\nexport function colorToLch(): Transform {\n return createModernColorTransform('lch')\n}\n\n/**\n * Convert color to lab format (CIELAB)\n */\nexport function colorToLab(): Transform {\n return createModernColorTransform('lab')\n}\n\n/**\n * Convert color to hwb format (hue-whiteness-blackness)\n */\nexport function colorToHwb(): Transform {\n return createModernColorTransform('hwb')\n}\n\n/**\n * Convert color to CSS color() function format\n * Uses the original color space and formats as CSS color() function\n */\nexport function colorToColorFunction(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Format as color() function (preserves original color space)\n const formatted = formatCss(parsed)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Global constants\n */\n\n/**\n * Default maximum depth for alias resolution\n * Prevents infinite recursion in circular references\n */\nexport const DEFAULT_MAX_ALIAS_DEPTH = 10\n\n/**\n * Default base font size in pixels for rem/em conversions\n */\nexport const DEFAULT_BASE_FONT_SIZE_PX = 16\n","/**\n * @fileoverview Dimension format conversion utilities for DTCG 2025.10\n * Handles dimension object format { value: number, unit: string }\n */\n\nimport type { DimensionValue } from '@lib/tokens/types'\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\n/**\n * Check if a value is in dimension object format\n */\nexport function isDimensionObject(value: unknown): value is DimensionValue {\n return typeof value === 'object' && value !== null && 'value' in value && 'unit' in value\n}\n\n/**\n * Convert DTCG dimension object to CSS string\n */\nexport function dimensionObjectToString(dimension: DimensionValue): string {\n return `${dimension.value}${dimension.unit}`\n}\n\n/**\n * Convert a DTCG dimension object between units (px, rem).\n *\n * Converts via px as an intermediate: rem -> px -> target.\n * Returns the original value unchanged for unsupported unit combinations.\n *\n * @param value - Source dimension object\n * @param toUnit - Target CSS unit\n * @param baseFontSize - Base font size in px used for rem conversions\n */\nexport function convertDimension(\n value: DimensionValue,\n toUnit: DimensionValue['unit'],\n baseFontSize = DEFAULT_BASE_FONT_SIZE_PX,\n): DimensionValue {\n const fromUnit = value.unit\n let numValue = value.value\n\n // Convert to px first (as intermediate)\n if (fromUnit === 'rem') {\n numValue = numValue * baseFontSize\n } else if (fromUnit !== 'px' && fromUnit !== toUnit) {\n // If not px, rem, or em, and not already target unit, return as-is\n return value\n }\n\n // Convert from px to target unit\n if (toUnit === 'rem') {\n numValue = numValue / baseFontSize\n } else if (toUnit !== 'px') {\n // Can't convert to other units, return original\n return value\n }\n\n return {\n value: numValue,\n unit: toUnit,\n }\n}\n","/**\n * @fileoverview Built-in dimension value transforms\n * Handles DTCG 2025.10 object format { value: number, unit: string }\n * and converts to string format for output\n */\n\nimport type { DimensionValue, ResolvedToken } from '@lib/tokens/types'\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\n\nimport type { Transform } from '../types'\n\nimport { convertDimension, dimensionObjectToString, isDimensionObject } from './dimension-converter'\n/**\n * Convert dimension to px string format\n */\nexport function dimensionToPx(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to px\n if (isDimensionObject(value)) {\n const converted = convertDimension(value as DimensionValue, 'px', DEFAULT_BASE_FONT_SIZE_PX)\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Convert dimension to rem string format\n */\nexport function dimensionToRem(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to rem\n if (isDimensionObject(value)) {\n const converted = convertDimension(\n value as DimensionValue,\n 'rem',\n DEFAULT_BASE_FONT_SIZE_PX,\n )\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Unitless dimension (extract numeric value)\n */\nexport function dimensionToUnitless(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, parse out the number\n if (typeof value === 'string') {\n const num = parseFloat(value)\n return { ...token, $value: isNaN(num) ? value : num }\n }\n\n // Extract value from dimension object\n if (isDimensionObject(value)) {\n return { ...token, $value: (value as DimensionValue).value }\n }\n\n return token\n },\n }\n}\n","/**\n * @fileoverview Built-in name transforms using change-case library for robust case conversion\n */\n\nimport { ResolvedToken } from '@lib/tokens/types'\nimport { camelCase, kebabCase, snakeCase, pascalCase, constantCase } from 'change-case'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert token name to camelCase\n */\nexport function nameCamelCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = camelCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to kebab-case\n */\nexport function nameKebabCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = kebabCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to snake_case\n */\nexport function nameSnakeCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = snakeCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to PascalCase\n */\nexport function namePascalCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = pascalCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to CONSTANT_CASE\n */\nexport function nameConstantCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = constantCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Add prefix to token name\n *\n * @example\n * ```typescript\n * // Add 'ds-' prefix to all token names\n * transforms: [namePrefix('ds-')]\n * // 'color.primary' becomes 'ds-color.primary'\n * ```\n */\nexport function namePrefix(prefix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${prefix}${token.name}`,\n }\n },\n }\n}\n\n/**\n * Add suffix to token name\n *\n * @example\n * ```typescript\n * // Add '-token' suffix to all token names\n * transforms: [nameSuffix('-token')]\n * // 'color.primary' becomes 'color.primary-token'\n * ```\n */\nexport function nameSuffix(suffix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${token.name}${suffix}`,\n }\n },\n }\n}\n\n/**\n * Convert token name to CSS custom property format (--name)\n */\nexport function nameCssVar(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const kebabName = token.path\n .map((part) => part.replace(/[^a-zA-Z0-9-]/g, '').toLowerCase())\n .join('-')\n\n return {\n ...token,\n name: `--${kebabName}`,\n }\n },\n }\n}\n","/**\n * @fileoverview Other built-in value transforms\n */\n\nimport { ResolvedToken } from '@lib/tokens/types'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert font weight to numeric value\n */\nexport function fontWeightToNumber(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'fontWeight',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n if (typeof value === 'number') {\n return token\n }\n\n if (typeof value === 'string') {\n const weightMap: Record<string, number> = {\n thin: 100,\n hairline: 100,\n 'extra-light': 200,\n 'ultra-light': 200,\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n 'semi-bold': 600,\n 'demi-bold': 600,\n bold: 700,\n 'extra-bold': 800,\n 'ultra-bold': 800,\n black: 900,\n heavy: 900,\n 'extra-black': 950,\n 'ultra-black': 950,\n }\n\n const weight = weightMap[value.toLowerCase()]\n if (weight !== undefined) {\n return { ...token, $value: weight }\n }\n }\n\n return token\n },\n }\n}\n\ntype DurationUnit = 'ms' | 's'\ntype ParsedDuration = { value: number; unit: DurationUnit }\n\n/** Parse a raw duration value (object or string form) into a normalized representation */\nfunction parseDuration(rawValue: unknown): ParsedDuration | null {\n if (\n typeof rawValue === 'object' &&\n rawValue !== null &&\n 'value' in rawValue &&\n 'unit' in rawValue\n ) {\n const unit = (rawValue as { unit: string }).unit\n const numeric = Number((rawValue as { value: unknown }).value)\n if (Number.isFinite(numeric) && (unit === 'ms' || unit === 's')) {\n return { value: numeric, unit }\n }\n return null\n }\n\n const str = typeof rawValue === 'string' || typeof rawValue === 'number' ? String(rawValue) : ''\n if (str.endsWith('ms')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 'ms' } : null\n }\n if (str.endsWith('s')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 's' } : null\n }\n\n return null\n}\n\n/** Convert a parsed duration to the target unit */\nfunction convertDurationUnit(parsed: ParsedDuration, target: DurationUnit): ParsedDuration {\n if (parsed.unit === target) {\n return parsed\n }\n return target === 'ms'\n ? { value: parsed.value * 1000, unit: 'ms' }\n : { value: parsed.value / 1000, unit: 's' }\n}\n\n/**\n * Convert duration to milliseconds\n */\nexport function durationToMs(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 'ms')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n\n/**\n * Convert duration to seconds\n */\nexport function durationToSeconds(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 's')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { a as ResolvedToken } from './types-C1GpiJ6q.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Filter system types for token selection
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Filter definition for selecting tokens
|
|
9
|
+
*
|
|
10
|
+
* Filters determine which tokens should be included in output configuration.
|
|
11
|
+
* They are applied before transforms.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const colorsOnly: Filter = {
|
|
16
|
+
* filter: (token) => token.$type === 'color'
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
type Filter = {
|
|
21
|
+
/**
|
|
22
|
+
* Function that determines if a token should be included
|
|
23
|
+
*
|
|
24
|
+
* @param token - Token to test
|
|
25
|
+
* @returns true if token should be included in output, false otherwise
|
|
26
|
+
*/
|
|
27
|
+
filter: (token: ResolvedToken) => boolean;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type { Filter as F };
|