@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.
Files changed (130) hide show
  1. package/dist/AssetGroup.d.ts +77 -0
  2. package/dist/AssetGroup.js +125 -0
  3. package/dist/Component.d.ts +308 -0
  4. package/dist/Component.js +896 -0
  5. package/dist/ComponentGroup.d.ts +20 -0
  6. package/dist/ComponentGroup.js +46 -0
  7. package/dist/CompositeStyle.d.ts +27 -0
  8. package/dist/CompositeStyle.js +52 -0
  9. package/dist/Config.d.ts +423 -0
  10. package/dist/Config.js +1429 -0
  11. package/dist/Mode.d.ts +41 -0
  12. package/dist/Mode.js +81 -0
  13. package/dist/Modifier.d.ts +51 -0
  14. package/dist/Modifier.js +97 -0
  15. package/dist/MotionDef.d.ts +49 -0
  16. package/dist/MotionDef.js +97 -0
  17. package/dist/Props.d.ts +317 -0
  18. package/dist/Props.js +35 -0
  19. package/dist/Provider.d.ts +20 -0
  20. package/dist/Provider.js +14 -0
  21. package/dist/StyleProp.d.ts +112 -0
  22. package/dist/StyleProp.js +197 -0
  23. package/dist/Token.d.ts +55 -0
  24. package/dist/Token.js +112 -0
  25. package/dist/TokenGroup.d.ts +32 -0
  26. package/dist/TokenGroup.js +68 -0
  27. package/dist/asset-kind.d.ts +55 -0
  28. package/dist/asset-kind.js +29 -0
  29. package/dist/brands.d.ts +30 -0
  30. package/dist/brands.js +20 -0
  31. package/dist/captureCallerPath.d.ts +48 -0
  32. package/dist/captureCallerPath.js +95 -0
  33. package/dist/colorExpressions.d.ts +131 -0
  34. package/dist/colorExpressions.js +148 -0
  35. package/dist/defineAssetGroup.d.ts +166 -0
  36. package/dist/defineAssetGroup.js +264 -0
  37. package/dist/defineProvider.d.ts +29 -0
  38. package/dist/defineProvider.js +60 -0
  39. package/dist/element-marker.d.ts +54 -0
  40. package/dist/element-marker.js +113 -0
  41. package/dist/entity-utils.d.ts +56 -0
  42. package/dist/entity-utils.js +105 -0
  43. package/dist/factories.d.ts +707 -0
  44. package/dist/factories.js +393 -0
  45. package/dist/foreign-component-name.d.ts +21 -0
  46. package/dist/foreign-component-name.js +42 -0
  47. package/dist/index.d.ts +32 -0
  48. package/dist/index.js +28 -0
  49. package/dist/interpolate.d.ts +20 -0
  50. package/dist/interpolate.js +10 -0
  51. package/dist/jsx/__fixtures__/cross-component-preview.d.ts +3 -0
  52. package/dist/jsx/__fixtures__/cross-component-preview.js +15 -0
  53. package/dist/jsx/jsx-dev-runtime.d.ts +15 -0
  54. package/dist/jsx/jsx-dev-runtime.js +11 -0
  55. package/dist/jsx/jsx-runtime.d.ts +48 -0
  56. package/dist/jsx/jsx-runtime.js +305 -0
  57. package/dist/markers.d.ts +217 -0
  58. package/dist/markers.js +67 -0
  59. package/dist/refs.d.ts +158 -0
  60. package/dist/refs.js +104 -0
  61. package/dist/renderer/RendererErrorBoundary.d.ts +26 -0
  62. package/dist/renderer/RendererErrorBoundary.js +30 -0
  63. package/dist/renderer/UdsRenderer.d.ts +80 -0
  64. package/dist/renderer/UdsRenderer.js +33 -0
  65. package/dist/renderer/assetRenderable.d.ts +13 -0
  66. package/dist/renderer/assetRenderable.js +13 -0
  67. package/dist/renderer/index.d.ts +14 -0
  68. package/dist/renderer/index.js +14 -0
  69. package/dist/renderer/makeRegistry.d.ts +34 -0
  70. package/dist/renderer/makeRegistry.js +52 -0
  71. package/dist/renderer/makeUdsRenderer.d.ts +29 -0
  72. package/dist/renderer/makeUdsRenderer.js +35 -0
  73. package/dist/renderer/primitives/FragmentRenderer.d.ts +12 -0
  74. package/dist/renderer/primitives/FragmentRenderer.js +11 -0
  75. package/dist/renderer/primitives/SlotRenderer.d.ts +21 -0
  76. package/dist/renderer/primitives/SlotRenderer.js +20 -0
  77. package/dist/renderer/wrapRegistry.d.ts +64 -0
  78. package/dist/renderer/wrapRegistry.js +39 -0
  79. package/dist/renderer/wrappers/component-slots.d.ts +41 -0
  80. package/dist/renderer/wrappers/component-slots.js +66 -0
  81. package/dist/renderer/wrappers/event-bridge.d.ts +20 -0
  82. package/dist/renderer/wrappers/event-bridge.js +78 -0
  83. package/dist/renderer/wrappers/hex-normalize.d.ts +14 -0
  84. package/dist/renderer/wrappers/hex-normalize.js +35 -0
  85. package/dist/renderer/wrappers/html-aliases.d.ts +24 -0
  86. package/dist/renderer/wrappers/html-aliases.js +62 -0
  87. package/dist/renderer/wrappers/inline-styles.d.ts +16 -0
  88. package/dist/renderer/wrappers/inline-styles.js +104 -0
  89. package/dist/renderer/wrappers/slot-resolution.d.ts +25 -0
  90. package/dist/renderer/wrappers/slot-resolution.js +68 -0
  91. package/dist/renderer/wrappers/void-elements.d.ts +23 -0
  92. package/dist/renderer/wrappers/void-elements.js +28 -0
  93. package/dist/spec/apply-forced-modifiers.d.ts +19 -0
  94. package/dist/spec/apply-forced-modifiers.js +49 -0
  95. package/dist/spec/asset-jsx.d.ts +48 -0
  96. package/dist/spec/asset-jsx.js +48 -0
  97. package/dist/spec/collapse-text-labels.d.ts +44 -0
  98. package/dist/spec/collapse-text-labels.js +107 -0
  99. package/dist/spec/empty-node-slots.d.ts +51 -0
  100. package/dist/spec/empty-node-slots.js +141 -0
  101. package/dist/spec/index.d.ts +10 -0
  102. package/dist/spec/index.js +10 -0
  103. package/dist/spec/jsxToSpec.d.ts +48 -0
  104. package/dist/spec/jsxToSpec.js +506 -0
  105. package/dist/spec/layer-props.d.ts +52 -0
  106. package/dist/spec/layer-props.js +149 -0
  107. package/dist/spec/preview-controls.d.ts +44 -0
  108. package/dist/spec/preview-controls.js +139 -0
  109. package/dist/spec/slot-refs.d.ts +39 -0
  110. package/dist/spec/slot-refs.js +56 -0
  111. package/dist/spec/specToJsx.d.ts +35 -0
  112. package/dist/spec/specToJsx.js +127 -0
  113. package/dist/token-override-rows.d.ts +66 -0
  114. package/dist/token-override-rows.js +223 -0
  115. package/dist/tokenValueType.d.ts +34 -0
  116. package/dist/tokenValueType.js +138 -0
  117. package/dist/tsconfig.tsbuildinfo +1 -0
  118. package/dist/types/css-properties.d.ts +232 -0
  119. package/dist/types/css-properties.js +14 -0
  120. package/dist/types/css-property-keywords.d.ts +156 -0
  121. package/dist/types/css-property-keywords.js +616 -0
  122. package/dist/types/css-values.d.ts +63 -0
  123. package/dist/types/css-values.js +16 -0
  124. package/dist/types.d.ts +708 -0
  125. package/dist/types.js +12 -0
  126. package/dist/units.d.ts +14 -0
  127. package/dist/units.js +16 -0
  128. package/dist/utils/index.d.ts +4 -0
  129. package/dist/utils/index.js +4 -0
  130. 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 };