@yahoo/uds-create-config 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.
- package/dist/AssetGroup.d.ts +77 -0
- package/dist/AssetGroup.js +125 -0
- package/dist/Component.d.ts +308 -0
- package/dist/Component.js +896 -0
- package/dist/ComponentGroup.d.ts +20 -0
- package/dist/ComponentGroup.js +46 -0
- package/dist/CompositeStyle.d.ts +27 -0
- package/dist/CompositeStyle.js +52 -0
- package/dist/Config.d.ts +423 -0
- package/dist/Config.js +1429 -0
- package/dist/Mode.d.ts +41 -0
- package/dist/Mode.js +81 -0
- package/dist/Modifier.d.ts +51 -0
- package/dist/Modifier.js +97 -0
- package/dist/MotionDef.d.ts +49 -0
- package/dist/MotionDef.js +97 -0
- package/dist/Props.d.ts +317 -0
- package/dist/Props.js +35 -0
- package/dist/Provider.d.ts +20 -0
- package/dist/Provider.js +14 -0
- package/dist/StyleProp.d.ts +112 -0
- package/dist/StyleProp.js +197 -0
- package/dist/Token.d.ts +55 -0
- package/dist/Token.js +112 -0
- package/dist/TokenGroup.d.ts +32 -0
- package/dist/TokenGroup.js +68 -0
- package/dist/asset-kind.d.ts +55 -0
- package/dist/asset-kind.js +29 -0
- package/dist/brands.d.ts +30 -0
- package/dist/brands.js +20 -0
- package/dist/captureCallerPath.d.ts +48 -0
- package/dist/captureCallerPath.js +95 -0
- package/dist/colorExpressions.d.ts +131 -0
- package/dist/colorExpressions.js +148 -0
- package/dist/defineAssetGroup.d.ts +166 -0
- package/dist/defineAssetGroup.js +264 -0
- package/dist/defineProvider.d.ts +29 -0
- package/dist/defineProvider.js +60 -0
- package/dist/element-marker.d.ts +54 -0
- package/dist/element-marker.js +113 -0
- package/dist/entity-utils.d.ts +56 -0
- package/dist/entity-utils.js +105 -0
- package/dist/factories.d.ts +707 -0
- package/dist/factories.js +393 -0
- package/dist/foreign-component-name.d.ts +21 -0
- package/dist/foreign-component-name.js +42 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +28 -0
- package/dist/interpolate.d.ts +20 -0
- package/dist/interpolate.js +10 -0
- package/dist/jsx/__fixtures__/cross-component-preview.d.ts +3 -0
- package/dist/jsx/__fixtures__/cross-component-preview.js +15 -0
- package/dist/jsx/jsx-dev-runtime.d.ts +15 -0
- package/dist/jsx/jsx-dev-runtime.js +11 -0
- package/dist/jsx/jsx-runtime.d.ts +48 -0
- package/dist/jsx/jsx-runtime.js +305 -0
- package/dist/markers.d.ts +217 -0
- package/dist/markers.js +67 -0
- package/dist/refs.d.ts +158 -0
- package/dist/refs.js +104 -0
- package/dist/renderer/RendererErrorBoundary.d.ts +26 -0
- package/dist/renderer/RendererErrorBoundary.js +30 -0
- package/dist/renderer/UdsRenderer.d.ts +80 -0
- package/dist/renderer/UdsRenderer.js +33 -0
- package/dist/renderer/assetRenderable.d.ts +13 -0
- package/dist/renderer/assetRenderable.js +13 -0
- package/dist/renderer/index.d.ts +14 -0
- package/dist/renderer/index.js +14 -0
- package/dist/renderer/makeRegistry.d.ts +34 -0
- package/dist/renderer/makeRegistry.js +52 -0
- package/dist/renderer/makeUdsRenderer.d.ts +29 -0
- package/dist/renderer/makeUdsRenderer.js +35 -0
- package/dist/renderer/primitives/FragmentRenderer.d.ts +12 -0
- package/dist/renderer/primitives/FragmentRenderer.js +11 -0
- package/dist/renderer/primitives/SlotRenderer.d.ts +21 -0
- package/dist/renderer/primitives/SlotRenderer.js +20 -0
- package/dist/renderer/wrapRegistry.d.ts +64 -0
- package/dist/renderer/wrapRegistry.js +39 -0
- package/dist/renderer/wrappers/component-slots.d.ts +41 -0
- package/dist/renderer/wrappers/component-slots.js +66 -0
- package/dist/renderer/wrappers/event-bridge.d.ts +20 -0
- package/dist/renderer/wrappers/event-bridge.js +78 -0
- package/dist/renderer/wrappers/hex-normalize.d.ts +14 -0
- package/dist/renderer/wrappers/hex-normalize.js +35 -0
- package/dist/renderer/wrappers/html-aliases.d.ts +24 -0
- package/dist/renderer/wrappers/html-aliases.js +62 -0
- package/dist/renderer/wrappers/inline-styles.d.ts +16 -0
- package/dist/renderer/wrappers/inline-styles.js +104 -0
- package/dist/renderer/wrappers/slot-resolution.d.ts +25 -0
- package/dist/renderer/wrappers/slot-resolution.js +68 -0
- package/dist/renderer/wrappers/void-elements.d.ts +23 -0
- package/dist/renderer/wrappers/void-elements.js +28 -0
- package/dist/spec/apply-forced-modifiers.d.ts +19 -0
- package/dist/spec/apply-forced-modifiers.js +49 -0
- package/dist/spec/asset-jsx.d.ts +48 -0
- package/dist/spec/asset-jsx.js +48 -0
- package/dist/spec/collapse-text-labels.d.ts +44 -0
- package/dist/spec/collapse-text-labels.js +107 -0
- package/dist/spec/empty-node-slots.d.ts +51 -0
- package/dist/spec/empty-node-slots.js +141 -0
- package/dist/spec/index.d.ts +10 -0
- package/dist/spec/index.js +10 -0
- package/dist/spec/jsxToSpec.d.ts +48 -0
- package/dist/spec/jsxToSpec.js +506 -0
- package/dist/spec/layer-props.d.ts +52 -0
- package/dist/spec/layer-props.js +149 -0
- package/dist/spec/preview-controls.d.ts +44 -0
- package/dist/spec/preview-controls.js +139 -0
- package/dist/spec/slot-refs.d.ts +39 -0
- package/dist/spec/slot-refs.js +56 -0
- package/dist/spec/specToJsx.d.ts +35 -0
- package/dist/spec/specToJsx.js +127 -0
- package/dist/token-override-rows.d.ts +66 -0
- package/dist/token-override-rows.js +223 -0
- package/dist/tokenValueType.d.ts +34 -0
- package/dist/tokenValueType.js +138 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/css-properties.d.ts +232 -0
- package/dist/types/css-properties.js +14 -0
- package/dist/types/css-property-keywords.d.ts +156 -0
- package/dist/types/css-property-keywords.js +616 -0
- package/dist/types/css-values.d.ts +63 -0
- package/dist/types/css-values.js +16 -0
- package/dist/types.d.ts +708 -0
- package/dist/types.js +12 -0
- package/dist/units.d.ts +14 -0
- package/dist/units.js +16 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +4 -0
- package/package.json +81 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
//#region src/token-override-rows.ts
|
|
2
|
+
function createModeBackedModifierLookup(inputs) {
|
|
3
|
+
const byModifier = /* @__PURE__ */ new Map();
|
|
4
|
+
const byModeRef = /* @__PURE__ */ new Map();
|
|
5
|
+
for (const input of inputs) {
|
|
6
|
+
const definition = {
|
|
7
|
+
...input,
|
|
8
|
+
modeRef: `${input.mode}.${input.option}`
|
|
9
|
+
};
|
|
10
|
+
byModifier.set(input.modifier, definition);
|
|
11
|
+
byModeRef.set(definition.modeRef, definition);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
byModifier,
|
|
15
|
+
byModeRef
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function buildModeBackedModifierLookup(modes, modifiers) {
|
|
19
|
+
const optionMetadata = /* @__PURE__ */ new Map();
|
|
20
|
+
modes.forEach((mode, modeOrder) => {
|
|
21
|
+
mode.options.forEach((option, optionOrder) => {
|
|
22
|
+
optionMetadata.set(`${mode.name}/${option.name}`, {
|
|
23
|
+
mode: mode.name,
|
|
24
|
+
option: option.name,
|
|
25
|
+
label: option.label ?? option.name,
|
|
26
|
+
modeOrder,
|
|
27
|
+
optionOrder
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
const inputs = [];
|
|
32
|
+
for (const modifier of modifiers) {
|
|
33
|
+
const marker = getModeMarker(modifier.selector);
|
|
34
|
+
if (!marker) continue;
|
|
35
|
+
const metadata = optionMetadata.get(marker.ref);
|
|
36
|
+
if (!metadata) continue;
|
|
37
|
+
inputs.push({
|
|
38
|
+
...metadata,
|
|
39
|
+
modifier: modifier.modifier
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return createModeBackedModifierLookup(inputs);
|
|
43
|
+
}
|
|
44
|
+
function modifierTreeToOverrideRows(modifiers, lookup) {
|
|
45
|
+
const rows = [];
|
|
46
|
+
let sourceOrder = 0;
|
|
47
|
+
const visit = (value, modifierPath) => {
|
|
48
|
+
const node = asModifierNode(value);
|
|
49
|
+
const modes = canonicalizeModifierPath(modifierPath, lookup);
|
|
50
|
+
if (!node) {
|
|
51
|
+
rows.push({
|
|
52
|
+
modes,
|
|
53
|
+
value,
|
|
54
|
+
sourceModifierPath: modifierPath,
|
|
55
|
+
sourceOrder
|
|
56
|
+
});
|
|
57
|
+
sourceOrder++;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (Object.hasOwn(node, "value") && node.value !== void 0) {
|
|
61
|
+
rows.push({
|
|
62
|
+
modes,
|
|
63
|
+
value: node.value,
|
|
64
|
+
sourceModifierPath: modifierPath,
|
|
65
|
+
sourceOrder
|
|
66
|
+
});
|
|
67
|
+
sourceOrder++;
|
|
68
|
+
}
|
|
69
|
+
for (const [key, nestedValue] of Object.entries(node)) {
|
|
70
|
+
if (key === "value" || nestedValue === void 0) continue;
|
|
71
|
+
if (!isModifierKey(key) || !lookup.byModifier.has(key)) continue;
|
|
72
|
+
visit(nestedValue, [...modifierPath, key]);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
for (const [modifier, value] of Object.entries(modifiers ?? {})) {
|
|
76
|
+
if (value === void 0) continue;
|
|
77
|
+
if (!isModifierKey(modifier) || !lookup.byModifier.has(modifier)) continue;
|
|
78
|
+
visit(value, [modifier]);
|
|
79
|
+
}
|
|
80
|
+
return rows;
|
|
81
|
+
}
|
|
82
|
+
function overrideRowsToModifierTree(rows, lookup) {
|
|
83
|
+
const tree = {};
|
|
84
|
+
for (const row of rows) {
|
|
85
|
+
const path = resolveWritableModifierPath(row, lookup);
|
|
86
|
+
if (path.length === 0) continue;
|
|
87
|
+
assignModifierPath(tree, path, row.value);
|
|
88
|
+
}
|
|
89
|
+
return tree;
|
|
90
|
+
}
|
|
91
|
+
function resolveOverrideRowValue(baseValue, rows, activeModes) {
|
|
92
|
+
const active = new Set(activeModes);
|
|
93
|
+
let resolved = baseValue;
|
|
94
|
+
let bestSpecificity = -1;
|
|
95
|
+
let bestOrder = -1;
|
|
96
|
+
rows.forEach((row, order) => {
|
|
97
|
+
if (!row.modes.every((mode) => active.has(mode))) return;
|
|
98
|
+
const specificity = row.modes.length;
|
|
99
|
+
if (specificity < bestSpecificity) return;
|
|
100
|
+
if (specificity === bestSpecificity && order < bestOrder) return;
|
|
101
|
+
resolved = row.value;
|
|
102
|
+
bestSpecificity = specificity;
|
|
103
|
+
bestOrder = order;
|
|
104
|
+
});
|
|
105
|
+
return resolved;
|
|
106
|
+
}
|
|
107
|
+
function modifierPathToId(path) {
|
|
108
|
+
return path.join(".");
|
|
109
|
+
}
|
|
110
|
+
function modifierIdToPath(id) {
|
|
111
|
+
return id.split(".").filter(isModifierKey).map((part) => part);
|
|
112
|
+
}
|
|
113
|
+
function buildNestedModifierUpdate(modifierPath, value) {
|
|
114
|
+
if (modifierPath.length === 0) return {};
|
|
115
|
+
const [first, ...rest] = modifierPath;
|
|
116
|
+
if (!first) return {};
|
|
117
|
+
if (rest.length === 0) return { [first]: value };
|
|
118
|
+
return { [first]: buildNestedModifierUpdate(rest, value) };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Combines multiple token-modifier update payloads into one patch
|
|
122
|
+
* object. Later updates win on scalar/null leaves; object branches
|
|
123
|
+
* deep-merge so swap operations can delete one nested row and set
|
|
124
|
+
* another nested row under the same parent modifier in a single
|
|
125
|
+
* patch.
|
|
126
|
+
*/
|
|
127
|
+
function mergeModifierUpdates(...updates) {
|
|
128
|
+
const merged = {};
|
|
129
|
+
for (const update of updates) mergeModifierUpdateInto(merged, update);
|
|
130
|
+
return merged;
|
|
131
|
+
}
|
|
132
|
+
function getModeMarker(selector) {
|
|
133
|
+
if (typeof selector !== "object" || selector === null) return null;
|
|
134
|
+
const marker = selector;
|
|
135
|
+
if (marker.__kind !== "mode" || typeof marker.ref !== "string") return null;
|
|
136
|
+
return {
|
|
137
|
+
__kind: "mode",
|
|
138
|
+
ref: marker.ref
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function mergeModifierUpdateInto(target, update) {
|
|
142
|
+
for (const [key, value] of Object.entries(update)) {
|
|
143
|
+
if (value === void 0) continue;
|
|
144
|
+
const current = target[key];
|
|
145
|
+
if (isModifierUpdateObject(current) && isModifierUpdateObject(value)) {
|
|
146
|
+
target[key] = mergeModifierUpdateObjects(current, value);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
target[key] = value;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function mergeModifierUpdateObjects(current, update) {
|
|
153
|
+
const merged = {};
|
|
154
|
+
for (const [key, value] of Object.entries(current)) if (value !== void 0) merged[key] = value;
|
|
155
|
+
mergeModifierUpdateInto(merged, update);
|
|
156
|
+
return merged;
|
|
157
|
+
}
|
|
158
|
+
function isModifierUpdateObject(value) {
|
|
159
|
+
return typeof value === "object" && value !== null;
|
|
160
|
+
}
|
|
161
|
+
function canonicalizeModifierPath(modifierPath, lookup) {
|
|
162
|
+
return modifierPath.map((modifier) => lookup.byModifier.get(modifier)).filter((definition) => definition !== void 0).sort(compareModeBackedModifiers).map((definition) => definition.modeRef);
|
|
163
|
+
}
|
|
164
|
+
function resolveWritableModifierPath(row, lookup) {
|
|
165
|
+
if (pathMatchesModes(row.sourceModifierPath, row.modes, lookup)) return row.sourceModifierPath;
|
|
166
|
+
return row.modes.map((modeRef) => lookup.byModeRef.get(modeRef)).filter((definition) => definition !== void 0).sort(compareModeBackedModifiers).map((definition) => definition.modifier);
|
|
167
|
+
}
|
|
168
|
+
function pathMatchesModes(path, modes, lookup) {
|
|
169
|
+
if (path.length !== modes.length) return false;
|
|
170
|
+
const pathModes = canonicalizeModifierPath(path, lookup);
|
|
171
|
+
const expectedModes = [...modes].sort((a, b) => compareModeBackedModifiersByRef(a, b, lookup));
|
|
172
|
+
return pathModes.length === expectedModes.length && pathModes.every((mode, index) => mode === expectedModes[index]);
|
|
173
|
+
}
|
|
174
|
+
function assignModifierPath(tree, path, value) {
|
|
175
|
+
const [modifier, ...rest] = path;
|
|
176
|
+
if (!modifier) return;
|
|
177
|
+
if (rest.length === 0) {
|
|
178
|
+
tree[modifier] = mergeLeafValue(tree[modifier], value);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const current = tree[modifier];
|
|
182
|
+
const node = asWritableModifierNode(current);
|
|
183
|
+
tree[modifier] = node;
|
|
184
|
+
assignModifierPath(node, rest, value);
|
|
185
|
+
}
|
|
186
|
+
function mergeLeafValue(current, value) {
|
|
187
|
+
const node = asModifierNode(current);
|
|
188
|
+
if (!node) return value;
|
|
189
|
+
return {
|
|
190
|
+
...node,
|
|
191
|
+
value
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function asWritableModifierNode(current) {
|
|
195
|
+
const node = asModifierNode(current);
|
|
196
|
+
if (node) return { ...node };
|
|
197
|
+
if (current !== void 0) return { value: current };
|
|
198
|
+
return {};
|
|
199
|
+
}
|
|
200
|
+
function asModifierNode(value) {
|
|
201
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
|
|
202
|
+
if (Object.hasOwn(value, "value")) return value;
|
|
203
|
+
if (Object.keys(value).some(isModifierKey)) return value;
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
function isModifierKey(value) {
|
|
207
|
+
return value.startsWith("_");
|
|
208
|
+
}
|
|
209
|
+
function compareModeBackedModifiers(a, b) {
|
|
210
|
+
if (a.modeOrder !== b.modeOrder) return a.modeOrder - b.modeOrder;
|
|
211
|
+
if (a.optionOrder !== b.optionOrder) return a.optionOrder - b.optionOrder;
|
|
212
|
+
return a.modifier.localeCompare(b.modifier);
|
|
213
|
+
}
|
|
214
|
+
function compareModeBackedModifiersByRef(a, b, lookup) {
|
|
215
|
+
const aDefinition = lookup.byModeRef.get(a);
|
|
216
|
+
const bDefinition = lookup.byModeRef.get(b);
|
|
217
|
+
if (aDefinition && bDefinition) return compareModeBackedModifiers(aDefinition, bDefinition);
|
|
218
|
+
if (aDefinition) return -1;
|
|
219
|
+
if (bDefinition) return 1;
|
|
220
|
+
return a.localeCompare(b);
|
|
221
|
+
}
|
|
222
|
+
//#endregion
|
|
223
|
+
export { buildModeBackedModifierLookup, buildNestedModifierUpdate, createModeBackedModifierLookup, mergeModifierUpdates, modifierIdToPath, modifierPathToId, modifierTreeToOverrideRows, overrideRowsToModifierTree, resolveOverrideRowValue };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal token value-type resolution. Lives outside `index.ts` —
|
|
3
|
+
* consumers reach for `Token.derived.cssValueType` instead. The static
|
|
4
|
+
* `Token.sniffValueType(value)` helper is the one entry point exposed
|
|
5
|
+
* to picker UIs that don't yet have a `Token` instance to derive from.
|
|
6
|
+
*/
|
|
7
|
+
import type { TokenType } from './types';
|
|
8
|
+
import type { CssValueTypeName } from './types/css-values';
|
|
9
|
+
/**
|
|
10
|
+
* Heuristic CSS-value classifier. Given a raw value string, returns the
|
|
11
|
+
* best-guess type or `undefined` when no confident match is possible
|
|
12
|
+
* (e.g. `var(...)` references). Used by `Token.sniffValueType` and as
|
|
13
|
+
* the value-shape tier of {@link resolveTokenValueType}.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sniffTokenType(value: string): TokenType | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a token's effective {@link CssValueTypeName} using the
|
|
18
|
+
* canonical 3-tier precedence:
|
|
19
|
+
*
|
|
20
|
+
* 1. Per-token explicit `type` — authored override always wins.
|
|
21
|
+
* 2. Value-shape sniff — handles `'#1167f4' → color` even inside a
|
|
22
|
+
* `string` group, and `'transparent' → string` even inside a
|
|
23
|
+
* `color` group.
|
|
24
|
+
* 3. Group `type` — least-specific fallback for legacy untyped
|
|
25
|
+
* values.
|
|
26
|
+
*
|
|
27
|
+
* `length-percentage` narrows to `length` / `percentage` / `angle` /
|
|
28
|
+
* `time` based on the trailing suffix; `string` narrows to `shadow`
|
|
29
|
+
* when the value looks like a CSS shadow declaration.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveTokenValueType(token: {
|
|
32
|
+
value: string;
|
|
33
|
+
type?: TokenType;
|
|
34
|
+
}, groupType: TokenType | undefined): CssValueTypeName | undefined;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
//#region src/tokenValueType.ts
|
|
2
|
+
const CSS_STRING_KEYWORDS = new Set([
|
|
3
|
+
"inherit",
|
|
4
|
+
"initial",
|
|
5
|
+
"unset",
|
|
6
|
+
"revert",
|
|
7
|
+
"revert-layer",
|
|
8
|
+
"auto",
|
|
9
|
+
"none",
|
|
10
|
+
"currentColor",
|
|
11
|
+
"currentcolor",
|
|
12
|
+
"transparent",
|
|
13
|
+
"min-content",
|
|
14
|
+
"max-content",
|
|
15
|
+
"fit-content"
|
|
16
|
+
]);
|
|
17
|
+
const HEX_COLOR_RE = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
|
|
18
|
+
const COLOR_FUNCTION_RE = /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\s*\(/i;
|
|
19
|
+
const GRADIENT_FUNCTION_RE = /^(?:linear|radial|conic|repeating-linear|repeating-radial|repeating-conic)-gradient\s*\(/i;
|
|
20
|
+
const EASING_FUNCTION_RE = /^(?:cubic-bezier|steps)\s*\(/i;
|
|
21
|
+
const EASING_KEYWORDS = new Set([
|
|
22
|
+
"linear",
|
|
23
|
+
"ease",
|
|
24
|
+
"ease-in",
|
|
25
|
+
"ease-out",
|
|
26
|
+
"ease-in-out",
|
|
27
|
+
"step-start",
|
|
28
|
+
"step-end"
|
|
29
|
+
]);
|
|
30
|
+
const NAMED_COLOR_KEYWORDS = new Set([
|
|
31
|
+
"aliceblue",
|
|
32
|
+
"antiquewhite",
|
|
33
|
+
"aqua",
|
|
34
|
+
"aquamarine",
|
|
35
|
+
"azure",
|
|
36
|
+
"beige",
|
|
37
|
+
"bisque",
|
|
38
|
+
"black",
|
|
39
|
+
"blue",
|
|
40
|
+
"brown",
|
|
41
|
+
"crimson",
|
|
42
|
+
"cyan",
|
|
43
|
+
"fuchsia",
|
|
44
|
+
"gold",
|
|
45
|
+
"gray",
|
|
46
|
+
"grey",
|
|
47
|
+
"green",
|
|
48
|
+
"indigo",
|
|
49
|
+
"lavender",
|
|
50
|
+
"lime",
|
|
51
|
+
"magenta",
|
|
52
|
+
"maroon",
|
|
53
|
+
"navy",
|
|
54
|
+
"olive",
|
|
55
|
+
"orange",
|
|
56
|
+
"pink",
|
|
57
|
+
"purple",
|
|
58
|
+
"red",
|
|
59
|
+
"salmon",
|
|
60
|
+
"silver",
|
|
61
|
+
"teal",
|
|
62
|
+
"tomato",
|
|
63
|
+
"violet",
|
|
64
|
+
"white",
|
|
65
|
+
"yellow"
|
|
66
|
+
]);
|
|
67
|
+
const NUMBER_RE_SRC = "(?:\\d+(?:\\.\\d+)?|\\.\\d+)";
|
|
68
|
+
const DIMENSION_RE = new RegExp(`^-?${NUMBER_RE_SRC}(?:px|rem|em|%|vh|vw|vmin|vmax|vi|vb|svh|svw|lvh|lvw|dvh|dvw|ch|ex|cap|ic|lh|rlh|pt|pc|in|cm|mm|q|fr|deg|turn|rad|grad)$`, "i");
|
|
69
|
+
const DURATION_RE = new RegExp(`^-?${NUMBER_RE_SRC}(?:ms|s)$`, "i");
|
|
70
|
+
const PURE_NUMBER_RE = new RegExp(`^-?${NUMBER_RE_SRC}$`);
|
|
71
|
+
const RATIO_RE = /^\d+(?:\.\d+)?\s*\/\s*\d+(?:\.\d+)?$/;
|
|
72
|
+
const SHADOW_LENGTH_RE = /(?:^|[\s,])-?\d+(?:\.\d+)?(?:px|rem|em|ch|ex)/i;
|
|
73
|
+
const SHADOW_COLOR_RE = /(?:rgba?|hsla?|color|oklch|oklab|lch|lab|hwb)\(|#[0-9a-fA-F]{3,8}\b/;
|
|
74
|
+
function looksLikeShadow(value) {
|
|
75
|
+
return SHADOW_LENGTH_RE.test(value) && SHADOW_COLOR_RE.test(value);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Heuristic CSS-value classifier. Given a raw value string, returns the
|
|
79
|
+
* best-guess type or `undefined` when no confident match is possible
|
|
80
|
+
* (e.g. `var(...)` references). Used by `Token.sniffValueType` and as
|
|
81
|
+
* the value-shape tier of {@link resolveTokenValueType}.
|
|
82
|
+
*/
|
|
83
|
+
function sniffTokenType(value) {
|
|
84
|
+
const v = value.trim();
|
|
85
|
+
if (v.length === 0) return void 0;
|
|
86
|
+
if (CSS_STRING_KEYWORDS.has(v)) return "string";
|
|
87
|
+
if (v.startsWith("var(")) return void 0;
|
|
88
|
+
if (COLOR_FUNCTION_RE.test(v)) return "color";
|
|
89
|
+
if (HEX_COLOR_RE.test(v)) return "color";
|
|
90
|
+
if (NAMED_COLOR_KEYWORDS.has(v.toLowerCase())) return "color";
|
|
91
|
+
if (GRADIENT_FUNCTION_RE.test(v)) return "gradient";
|
|
92
|
+
if (EASING_FUNCTION_RE.test(v)) return "easing-function";
|
|
93
|
+
if (EASING_KEYWORDS.has(v.toLowerCase())) return "easing-function";
|
|
94
|
+
if (DURATION_RE.test(v)) return "time";
|
|
95
|
+
if (DIMENSION_RE.test(v)) {
|
|
96
|
+
if (v.endsWith("%")) return "percentage";
|
|
97
|
+
if (/(deg|rad|grad|turn)$/i.test(v)) return "angle";
|
|
98
|
+
return "length";
|
|
99
|
+
}
|
|
100
|
+
if (PURE_NUMBER_RE.test(v)) return "number";
|
|
101
|
+
if (RATIO_RE.test(v)) return "ratio";
|
|
102
|
+
if (looksLikeShadow(v)) return "shadow";
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resolve a token's effective {@link CssValueTypeName} using the
|
|
106
|
+
* canonical 3-tier precedence:
|
|
107
|
+
*
|
|
108
|
+
* 1. Per-token explicit `type` — authored override always wins.
|
|
109
|
+
* 2. Value-shape sniff — handles `'#1167f4' → color` even inside a
|
|
110
|
+
* `string` group, and `'transparent' → string` even inside a
|
|
111
|
+
* `color` group.
|
|
112
|
+
* 3. Group `type` — least-specific fallback for legacy untyped
|
|
113
|
+
* values.
|
|
114
|
+
*
|
|
115
|
+
* `length-percentage` narrows to `length` / `percentage` / `angle` /
|
|
116
|
+
* `time` based on the trailing suffix; `string` narrows to `shadow`
|
|
117
|
+
* when the value looks like a CSS shadow declaration.
|
|
118
|
+
*/
|
|
119
|
+
function resolveTokenValueType(token, groupType) {
|
|
120
|
+
let resolved;
|
|
121
|
+
if (token.type) resolved = token.type;
|
|
122
|
+
else {
|
|
123
|
+
resolved = sniffTokenType(token.value);
|
|
124
|
+
if (resolved === void 0 && groupType) resolved = groupType;
|
|
125
|
+
}
|
|
126
|
+
if (resolved === void 0) return void 0;
|
|
127
|
+
const trimmed = token.value.trim();
|
|
128
|
+
if (resolved === "length-percentage") {
|
|
129
|
+
if (trimmed.endsWith("%")) return "percentage";
|
|
130
|
+
if (/(deg|rad|grad|turn)$/.test(trimmed)) return "angle";
|
|
131
|
+
if (/(ms|s)$/.test(trimmed)) return "time";
|
|
132
|
+
return "length";
|
|
133
|
+
}
|
|
134
|
+
if (resolved === "string" && looksLikeShadow(trimmed)) return "shadow";
|
|
135
|
+
return resolved;
|
|
136
|
+
}
|
|
137
|
+
//#endregion
|
|
138
|
+
export { resolveTokenValueType, sniffTokenType };
|