@tenphi/tasty 3.0.0 → 3.0.2

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 (57) hide show
  1. package/README.md +16 -16
  2. package/dist/{babel-HlEpSZrj.d.ts → babel-R2qT7yLN.d.ts} +2 -2
  3. package/dist/{collector-D14DcZx9.js → collector-BpkjNQDo.js} +3 -3
  4. package/dist/{collector-D14DcZx9.js.map → collector-BpkjNQDo.js.map} +1 -1
  5. package/dist/{collector-BPzZezAG.d.ts → collector-D8o4Wdq-.d.ts} +2 -2
  6. package/dist/{config-CCcE_tqx.js → config-DOCuTykY.js} +260 -107
  7. package/dist/config-DOCuTykY.js.map +1 -0
  8. package/dist/{config-D2INrjr_.d.ts → config-De8L9NWM.d.ts} +2 -2
  9. package/dist/core/index.d.ts +4 -4
  10. package/dist/core/index.js +5 -5
  11. package/dist/{core-B5d0IPi2.js → core-p6iTbQnn.js} +7 -7
  12. package/dist/core-p6iTbQnn.js.map +1 -0
  13. package/dist/{css-writer-B5DBoxhf.js → css-writer-BHjTF0YN.js} +3 -3
  14. package/dist/{css-writer-B5DBoxhf.js.map → css-writer-BHjTF0YN.js.map} +1 -1
  15. package/dist/{format-rules-BbKDjsfO.js → format-rules-Cb0YIjyS.js} +2 -2
  16. package/dist/{format-rules-BbKDjsfO.js.map → format-rules-Cb0YIjyS.js.map} +1 -1
  17. package/dist/{hydrate-CwALW3J9.js → hydrate-xnaB3SDm.js} +2 -2
  18. package/dist/{hydrate-CwALW3J9.js.map → hydrate-xnaB3SDm.js.map} +1 -1
  19. package/dist/{index-BAAbdfRs.d.ts → index-DzGxoeyN.d.ts} +5 -5
  20. package/dist/{index-l_NdJSUS.d.ts → index-KUYya3x7.d.ts} +11 -1
  21. package/dist/index.d.ts +4 -4
  22. package/dist/index.js +6 -6
  23. package/dist/{keyframes-B8M1FmtE.js → keyframes-DiXjNoBZ.js} +2 -2
  24. package/dist/{keyframes-B8M1FmtE.js.map → keyframes-DiXjNoBZ.js.map} +1 -1
  25. package/dist/{merge-styles--1zOSFlS.js → merge-styles-B0lMso5W.js} +2 -2
  26. package/dist/{merge-styles--1zOSFlS.js.map → merge-styles-B0lMso5W.js.map} +1 -1
  27. package/dist/{merge-styles-NEvqayL_.d.ts → merge-styles-DLm4wdnb.d.ts} +2 -2
  28. package/dist/{resolve-recipes-Caix5NnH.js → resolve-recipes-C9nAuwgR.js} +3 -3
  29. package/dist/{resolve-recipes-Caix5NnH.js.map → resolve-recipes-C9nAuwgR.js.map} +1 -1
  30. package/dist/ssr/astro-client.js +1 -1
  31. package/dist/ssr/astro-middleware-static.d.ts +16 -0
  32. package/dist/ssr/astro-middleware-static.js +18 -0
  33. package/dist/ssr/astro-middleware-static.js.map +1 -0
  34. package/dist/ssr/astro-middleware.d.ts +8 -6
  35. package/dist/ssr/astro-middleware.js +10 -10
  36. package/dist/ssr/astro-middleware.js.map +1 -1
  37. package/dist/ssr/astro.js +156 -1
  38. package/dist/ssr/astro.js.map +1 -0
  39. package/dist/ssr/index.d.ts +1 -1
  40. package/dist/ssr/index.js +3 -3
  41. package/dist/ssr/next.d.ts +1 -1
  42. package/dist/ssr/next.js +4 -4
  43. package/dist/static/index.d.ts +2 -2
  44. package/dist/static/index.js +1 -1
  45. package/dist/zero/babel.d.ts +1 -1
  46. package/dist/zero/babel.js +4 -4
  47. package/dist/zero/index.d.ts +1 -1
  48. package/dist/zero/index.js +1 -1
  49. package/dist/zero/next.d.ts +1 -1
  50. package/docs/ai-agents.md +3 -0
  51. package/docs/configuration.md +1 -0
  52. package/docs/ssr.md +1 -0
  53. package/package.json +27 -11
  54. package/dist/astro-B53trJyX.js +0 -156
  55. package/dist/astro-B53trJyX.js.map +0 -1
  56. package/dist/config-CCcE_tqx.js.map +0 -1
  57. package/dist/core-B5d0IPi2.js.map +0 -1
@@ -1,3 +1,115 @@
1
+ //#region src/parser/const.ts
2
+ const VALUE_KEYWORDS = new Set([
3
+ "auto",
4
+ "max-content",
5
+ "min-content",
6
+ "fit-content",
7
+ "stretch",
8
+ "initial",
9
+ "inherit",
10
+ "revert",
11
+ "unset",
12
+ "revert-layer"
13
+ ]);
14
+ const CSS_WIDE_KEYWORDS = new Set([
15
+ "initial",
16
+ "inherit",
17
+ "revert",
18
+ "unset",
19
+ "revert-layer"
20
+ ]);
21
+ const COLOR_FUNCS = new Set([
22
+ "rgb",
23
+ "rgba",
24
+ "hsl",
25
+ "hsla",
26
+ "hwb",
27
+ "lab",
28
+ "lch",
29
+ "oklab",
30
+ "oklch",
31
+ "color",
32
+ "device-cmyk",
33
+ "gray",
34
+ "color-mix",
35
+ "color-contrast"
36
+ ]);
37
+ const RE_UNIT_NUM = /^[+-]?(?:\d*\.\d+|\d+)([a-z][a-z0-9]*)$/;
38
+ const RE_NUMBER = /^[+-]?(?:\d*\.\d+|\d+)$/;
39
+ const RE_HEX = /^(?:[0-9a-f]{3,4}|[0-9a-f]{6}(?:[0-9a-f]{2})?)$/;
40
+ const RE_RAW_UNIT = /^([+-]?(?:\d*\.\d+|\d+))([a-z%]+)$/;
41
+ const CANONICAL_FUNC_CASE = new Map([
42
+ ["translatex", "translateX"],
43
+ ["translatey", "translateY"],
44
+ ["translatez", "translateZ"],
45
+ ["scalex", "scaleX"],
46
+ ["scaley", "scaleY"],
47
+ ["scalez", "scaleZ"],
48
+ ["rotatex", "rotateX"],
49
+ ["rotatey", "rotateY"],
50
+ ["rotatez", "rotateZ"],
51
+ ["skewx", "skewX"],
52
+ ["skewy", "skewY"]
53
+ ]);
54
+ function canonicalFuncName(lowered) {
55
+ return CANONICAL_FUNC_CASE.get(lowered) ?? lowered;
56
+ }
57
+ //#endregion
58
+ //#region src/utils/string.ts
59
+ function toSnakeCase(str) {
60
+ return str.replace(/[A-Z]/g, (s) => `-${s.toLowerCase()}`);
61
+ }
62
+ /**
63
+ * Normalize a DSL identifier to the CSS custom-property name it emits.
64
+ *
65
+ * CSS custom-property names are case-sensitive, so `$myVar` has to keep its
66
+ * inner case to reference `--myVar`. A leading capital is the one exception:
67
+ * `$Foo` is not a supported way to name a property, so the first character is
68
+ * folded rather than kebab-cased (`--foo`, not `---foo`) and every later
69
+ * character is left alone.
70
+ *
71
+ * Every place that turns a `$name` / `#name` identifier into a CSS name goes
72
+ * through this, so authoring a token and referencing it always agree.
73
+ */
74
+ function normalizeDslName(name) {
75
+ if (!name) return name;
76
+ const first = name[0];
77
+ const lower = first.toLowerCase();
78
+ return lower === first ? name : lower + name.slice(1);
79
+ }
80
+ /** A DSL identifier: `$name`, `$$name`, `#name` or `##name`. */
81
+ const RE_DSL_IDENTIFIER = /(\$\$?|##?)([a-zA-Z_][a-zA-Z0-9_-]*)/g;
82
+ /**
83
+ * Case-fold a DSL string for parsing, preserving the case of custom-property
84
+ * names.
85
+ *
86
+ * Everything the parser matches on — keywords, units, modifiers, function names,
87
+ * color-token names — is compared lowercase, so the whole string used to be
88
+ * lowercased up front. That also folded custom-property names, which are
89
+ * case-sensitive in CSS: `$myVar` referenced `var(--myvar)` while the token
90
+ * definition emitted `--myVar`, so the two could never meet.
91
+ *
92
+ * Identifier bodies now keep their case (their first character still folds, see
93
+ * {@link normalizeDslName}); everything else is lowercased exactly as before.
94
+ * Hex literals are excluded — `#FF0000` is a color, not a name, and must fold to
95
+ * match {@link RE_HEX}.
96
+ */
97
+ function foldDslCase(src) {
98
+ const folded = src.toLowerCase();
99
+ if (folded === src || !src.includes("$") && !src.includes("#")) return folded;
100
+ RE_DSL_IDENTIFIER.lastIndex = 0;
101
+ let out = "";
102
+ let last = 0;
103
+ let match;
104
+ while (match = RE_DSL_IDENTIFIER.exec(src)) {
105
+ const [whole, prefix, body] = match;
106
+ out += src.slice(last, match.index).toLowerCase();
107
+ out += prefix + (prefix[0] === "#" && RE_HEX.test(body.toLowerCase()) ? body.toLowerCase() : normalizeDslName(body));
108
+ last = match.index + whole.length;
109
+ }
110
+ return out + src.slice(last).toLowerCase();
111
+ }
112
+ //#endregion
1
113
  //#region src/parser/lru.ts
2
114
  var Lru = class {
3
115
  limit;
@@ -1203,63 +1315,6 @@ function getComponentPropertySyntax() {
1203
1315
  }
1204
1316
  }
1205
1317
  //#endregion
1206
- //#region src/parser/const.ts
1207
- const VALUE_KEYWORDS = new Set([
1208
- "auto",
1209
- "max-content",
1210
- "min-content",
1211
- "fit-content",
1212
- "stretch",
1213
- "initial",
1214
- "inherit",
1215
- "revert",
1216
- "unset",
1217
- "revert-layer"
1218
- ]);
1219
- const CSS_WIDE_KEYWORDS = new Set([
1220
- "initial",
1221
- "inherit",
1222
- "revert",
1223
- "unset",
1224
- "revert-layer"
1225
- ]);
1226
- const COLOR_FUNCS = new Set([
1227
- "rgb",
1228
- "rgba",
1229
- "hsl",
1230
- "hsla",
1231
- "hwb",
1232
- "lab",
1233
- "lch",
1234
- "oklab",
1235
- "oklch",
1236
- "color",
1237
- "device-cmyk",
1238
- "gray",
1239
- "color-mix",
1240
- "color-contrast"
1241
- ]);
1242
- const RE_UNIT_NUM = /^[+-]?(?:\d*\.\d+|\d+)([a-z][a-z0-9]*)$/;
1243
- const RE_NUMBER = /^[+-]?(?:\d*\.\d+|\d+)$/;
1244
- const RE_HEX = /^(?:[0-9a-f]{3,4}|[0-9a-f]{6}(?:[0-9a-f]{2})?)$/;
1245
- const RE_RAW_UNIT = /^([+-]?(?:\d*\.\d+|\d+))([a-z%]+)$/;
1246
- const CANONICAL_FUNC_CASE = new Map([
1247
- ["translatex", "translateX"],
1248
- ["translatey", "translateY"],
1249
- ["translatez", "translateZ"],
1250
- ["scalex", "scaleX"],
1251
- ["scaley", "scaleY"],
1252
- ["scalez", "scaleZ"],
1253
- ["rotatex", "rotateX"],
1254
- ["rotatey", "rotateY"],
1255
- ["rotatez", "rotateZ"],
1256
- ["skewx", "skewX"],
1257
- ["skewy", "skewY"]
1258
- ]);
1259
- function canonicalFuncName(lowered) {
1260
- return CANONICAL_FUNC_CASE.get(lowered) ?? lowered;
1261
- }
1262
- //#endregion
1263
1318
  //#region src/parser/types.ts
1264
1319
  const makeEmptyPart = () => ({
1265
1320
  mods: [],
@@ -1414,17 +1469,19 @@ function classify(raw, opts, recurse) {
1414
1469
  if (token[0] === "$" || token[0] === "#") {
1415
1470
  const predefinedTokens = getGlobalPredefinedTokens();
1416
1471
  if (predefinedTokens) {
1417
- if (token in predefinedTokens) {
1418
- const tokenValue = predefinedTokens[token];
1419
- return classify(tokenValue.toLowerCase(), opts, recurse);
1472
+ const lookupKey = token.toLowerCase();
1473
+ if (lookupKey in predefinedTokens) {
1474
+ const tokenValue = predefinedTokens[lookupKey];
1475
+ return classify(foldDslCase(tokenValue), opts, recurse);
1420
1476
  }
1421
1477
  if (token[0] === "#") {
1422
1478
  const alphaMatch = token.match(/^(#[a-z0-9-]+)\.(\$[a-z_][a-z0-9-_]*|[0-9]+)$/i);
1423
1479
  if (alphaMatch) {
1424
1480
  const [, baseToken, rawAlpha] = alphaMatch;
1425
- if (baseToken in predefinedTokens) {
1426
- const resolvedValue = predefinedTokens[baseToken];
1427
- if (resolvedValue.startsWith("#")) return classify(`${resolvedValue.toLowerCase()}.${rawAlpha}`, opts, recurse);
1481
+ const baseKey = baseToken.toLowerCase();
1482
+ if (baseKey in predefinedTokens) {
1483
+ const resolvedValue = predefinedTokens[baseKey];
1484
+ if (resolvedValue.startsWith("#")) return classify(`${foldDslCase(resolvedValue)}.${rawAlpha}`, opts, recurse);
1428
1485
  const funcMatch = resolvedValue.match(/^([a-z][a-z0-9-]*)\((.+)\)$/i);
1429
1486
  if (funcMatch) {
1430
1487
  const [, funcName, args] = funcMatch;
@@ -1493,7 +1550,7 @@ function classify(raw, opts, recurse) {
1493
1550
  }
1494
1551
  }
1495
1552
  }
1496
- if (token.match(/^var\(--([a-z0-9-]+)-color\)$/)) return {
1553
+ if (token.match(/^var\(--([a-zA-Z0-9-]+)-color\)$/)) return {
1497
1554
  bucket: 0,
1498
1555
  processed: token
1499
1556
  };
@@ -1502,12 +1559,12 @@ function classify(raw, opts, recurse) {
1502
1559
  processed: token
1503
1560
  };
1504
1561
  if (token[0] === "$") {
1505
- const identMatch = token.match(/^\$([a-z_][a-z0-9-_]*)$/);
1562
+ const identMatch = token.match(/^\$([a-z_][a-zA-Z0-9-_]*)$/);
1506
1563
  if (identMatch) {
1507
1564
  const name = identMatch[1];
1508
1565
  const processed = `var(--${name})`;
1509
1566
  return {
1510
- bucket: name.endsWith("-color") ? 0 : 1,
1567
+ bucket: name.endsWith("-color") ? 3 : 1,
1511
1568
  processed
1512
1569
  };
1513
1570
  }
@@ -1570,12 +1627,12 @@ function classify(raw, opts, recurse) {
1570
1627
  }
1571
1628
  }
1572
1629
  if (token.startsWith("(") && token.endsWith(")")) {
1573
- const match = token.slice(1, -1).match(/^\$([a-z_][a-z0-9-_]*)\s*,\s*(.*)$/);
1630
+ const match = token.slice(1, -1).match(/^\$([a-z_][a-zA-Z0-9-_]*)\s*,\s*(.*)$/);
1574
1631
  if (match) {
1575
1632
  const [, name, fallback] = match;
1576
1633
  const processedFallback = recurse(fallback).output;
1577
1634
  return {
1578
- bucket: name.endsWith("-color") ? 0 : 1,
1635
+ bucket: name.endsWith("-color") ? 3 : 1,
1579
1636
  processed: `var(--${name}, ${processedFallback})`
1580
1637
  };
1581
1638
  }
@@ -1712,7 +1769,7 @@ var StyleParser = class {
1712
1769
  const key = String(src);
1713
1770
  const hit = this.cache.get(key);
1714
1771
  if (hit) return hit;
1715
- const stripped = src.replace(/\/\*[^*]*\*+(?:[^/*][^*]*\*+)*\//g, "").toLowerCase();
1772
+ const stripped = foldDslCase(src.replace(/\/\*[^*]*\*+(?:[^/*][^*]*\*+)*\//g, ""));
1716
1773
  const groups = [];
1717
1774
  let currentGroup = makeEmptyDetails();
1718
1775
  let currentPart = makeEmptyPart();
@@ -1739,6 +1796,10 @@ var StyleParser = class {
1739
1796
  case 2:
1740
1797
  currentPart.mods.push(processed);
1741
1798
  break;
1799
+ case 3:
1800
+ currentPart.colors.push(processed);
1801
+ currentPart.values.push(processed);
1802
+ break;
1742
1803
  }
1743
1804
  currentPart.all.push(processed);
1744
1805
  };
@@ -2161,6 +2222,28 @@ function parseStyle(value) {
2161
2222
  else str = "";
2162
2223
  return getOrCreateParser().process(str);
2163
2224
  }
2225
+ /** A `$`-prefixed custom-property reference — the only DSL syntax that starts with `$`. */
2226
+ const RE_CUSTOM_PROPERTY_REF = /\$[a-zA-Z_$]/;
2227
+ /**
2228
+ * Substitute custom-property references (`$ident` → `var(--ident)`) inside a
2229
+ * value a handler would otherwise emit to CSS verbatim.
2230
+ *
2231
+ * Handlers for keyword-valued properties (`display`, `align`, `text-transform`,
2232
+ * `overflow`, …) pass their input straight through, since there are no units or
2233
+ * color tokens to resolve. That leaked the raw DSL into the stylesheet:
2234
+ * `display: '$my-display'` emitted `display: $my-display`, which the browser
2235
+ * drops as invalid. The same applies to color props whose value the parser could
2236
+ * not classify as a color — `$ident` is a color only when the name ends with
2237
+ * `-color`, so `fill: '$my-fill'` fell back to the unparsed input.
2238
+ *
2239
+ * Values without a `$` skip the parser entirely, so pass-through behaviour (and
2240
+ * the parser's case folding) is unchanged for every value that was already
2241
+ * valid CSS.
2242
+ */
2243
+ function resolveCustomProperties(value) {
2244
+ if (!RE_CUSTOM_PROPERTY_REF.test(value)) return value;
2245
+ return parseStyle(value).output || value;
2246
+ }
2164
2247
  /**
2165
2248
  * Parse color. Find it value, name and opacity.
2166
2249
  * Optimized to avoid heavy parseStyle calls for simple color patterns.
@@ -3259,8 +3342,59 @@ function extractCSSWideKeyword(group) {
3259
3342
  if (group.values.length !== 1 || group.colors.length > 0) return null;
3260
3343
  return CSS_WIDE_KEYWORDS.has(group.values[0]) ? group.values[0] : null;
3261
3344
  }
3345
+ /** A resolved custom-property reference, i.e. `var(--name)` or `var(--name, …)`. */
3346
+ const RE_VAR_REFERENCE = /^var\(/;
3347
+ /**
3348
+ * Assign custom-property references to the style and color slots of a
3349
+ * `<line-width> <line-style> <line-color>` shorthand (`border`, `outline`).
3350
+ *
3351
+ * The parser cannot type a reference, so it buckets `$name` as a plain value and
3352
+ * the handler has to place it. A reference fills the first slot still free, in
3353
+ * shorthand order: the width takes `values[0]`, then the style, then the color.
3354
+ * The style would otherwise arrive as a keyword (`solid`, `dashed`, …) that a
3355
+ * reference has no way to match, and the color as `#name` — the `$name-color`
3356
+ * form the parser buckets as a color exists to reference a raw CSS custom
3357
+ * property, not as the way colors are written, so a reference should not reach
3358
+ * for the color slot until the style slot is taken.
3359
+ *
3360
+ * Lengths are left alone: a second length is not valid in these shorthands, and
3361
+ * promoting one would emit an invalid declaration instead of ignoring an extra
3362
+ * value. Callers supply their own slot defaults.
3363
+ */
3364
+ function assignLineSlots(values, styleKeyword, colorToken) {
3365
+ if (styleKeyword && colorToken) return {
3366
+ style: styleKeyword,
3367
+ color: colorToken
3368
+ };
3369
+ const spare = values.slice(1).filter((value) => RE_VAR_REFERENCE.test(value) && value !== colorToken);
3370
+ return {
3371
+ style: styleKeyword || spare.shift(),
3372
+ color: colorToken || spare.shift()
3373
+ };
3374
+ }
3262
3375
  /** Warning keys already emitted, so each distinct offending value warns once. */
3263
3376
  const emittedWarnings$2 = /* @__PURE__ */ new Set();
3377
+ /** A resolved custom-property reference anywhere in a token. */
3378
+ const RE_HAS_VAR_REFERENCE = /var\(/;
3379
+ /**
3380
+ * Reject a custom-property reference used where a *token name* is expected.
3381
+ *
3382
+ * `preset` and `transition` take the name of a design token (`t3`, `fill`) and
3383
+ * interpolate it into a CSS custom property — `var(--t3-font-size)`. A reference
3384
+ * substituted into that position builds `var(--var(--x)-font-size)`, which is not
3385
+ * a valid custom-property name, so the browser drops the declaration and the
3386
+ * style silently does nothing. The DSL has no way to indirect a token name
3387
+ * through a custom property: the name is needed at build time, and a reference
3388
+ * only resolves in the browser.
3389
+ *
3390
+ * Returns true (warning once per value in dev) so the caller can fall back
3391
+ * instead of emitting a declaration that cannot work.
3392
+ */
3393
+ function isTokenNameReference(property, name) {
3394
+ if (!RE_HAS_VAR_REFERENCE.test(name)) return false;
3395
+ warnOnceDev(`token-name-reference:${property}:${name}`, `${property}="${name}": a custom property cannot name a token. The name is interpolated into a CSS custom property at build time, so a reference would build an unusable name. It is ignored.`);
3396
+ return true;
3397
+ }
3264
3398
  /**
3265
3399
  * Emit a style-level warning at most once per `key`. No-op outside dev mode.
3266
3400
  *
@@ -3314,13 +3448,13 @@ function warnExtraGroupValues(property, input, maxValues) {
3314
3448
  function processGroup$1(group) {
3315
3449
  const { values, mods, colors } = group;
3316
3450
  const directions = filterMods(mods, DIRECTIONS);
3317
- const typeMods = filterMods(mods, BORDER_STYLES);
3451
+ const slots = assignLineSlots(values, filterMods(mods, BORDER_STYLES)[0], colors?.[0]);
3318
3452
  return {
3319
3453
  directions,
3320
3454
  borderValue: {
3321
3455
  width: values[0] || "var(--border-width)",
3322
- style: typeMods[0] || "solid",
3323
- color: colors?.[0] || "var(--border-color, currentColor)"
3456
+ style: slots.style || "solid",
3457
+ color: slots.color || "var(--border-color, currentColor)"
3324
3458
  }
3325
3459
  };
3326
3460
  }
@@ -3419,11 +3553,6 @@ function borderStyle({ border }) {
3419
3553
  }
3420
3554
  borderStyle.__lookupStyles = ["border"];
3421
3555
  //#endregion
3422
- //#region src/utils/string.ts
3423
- function toSnakeCase(str) {
3424
- return str.replace(/[A-Z]/g, (s) => `-${s.toLowerCase()}`);
3425
- }
3426
- //#endregion
3427
3556
  //#region src/styles/createStyle.ts
3428
3557
  const CACHE = {};
3429
3558
  /**
@@ -3453,16 +3582,18 @@ function createStyle(styleName, cssStyle, converter) {
3453
3582
  if (styleValue == null || styleValue === false) return null;
3454
3583
  let finalCssStyle;
3455
3584
  const isColorToken = !cssStyle && typeof styleName === "string" && styleName.startsWith("#");
3456
- if (isColorToken) finalCssStyle = `--${toSnakeCase(styleName.slice(1)).replace(/^-+/, "")}-color`;
3457
- else finalCssStyle = cssStyle || toSnakeCase(styleName).replace(/^\$/, "--");
3585
+ if (isColorToken) finalCssStyle = `--${normalizeDslName(styleName.slice(1))}-color`;
3586
+ else if (!cssStyle && styleName[0] === "$") finalCssStyle = `--${normalizeDslName(styleName.slice(1))}`;
3587
+ else finalCssStyle = cssStyle || toSnakeCase(styleName);
3458
3588
  if (isColorToken) {
3459
3589
  const normalized = normalizeColorTokenValue(styleValue);
3460
3590
  if (normalized === null) return null;
3461
3591
  styleValue = normalized;
3462
3592
  }
3463
- if (converter && typeof styleValue !== "string") {
3464
- styleValue = converter(styleValue);
3465
- if (!styleValue) return null;
3593
+ if (converter) {
3594
+ const converted = converter(styleValue);
3595
+ if (converted) styleValue = converted;
3596
+ else if (typeof styleValue !== "string") return null;
3466
3597
  }
3467
3598
  if (typeof styleValue === "string" && finalCssStyle.startsWith("--") && finalCssStyle.endsWith("-color")) {
3468
3599
  styleValue = styleValue.trim();
@@ -3502,6 +3633,7 @@ function colorStyle({ color }) {
3502
3633
  if (!color) return null;
3503
3634
  if (color === true) color = "currentColor";
3504
3635
  if (typeof color === "string" && (color.startsWith("#") || color.startsWith("(#"))) color = parseColor(color).color || color;
3636
+ else if (typeof color === "string") color = resolveCustomProperties(color);
3505
3637
  const match = color.match(/var\(--(.+?)-color/);
3506
3638
  let name = "";
3507
3639
  if (match) name = match[1];
@@ -3567,14 +3699,15 @@ function processTextOverflow(textOverflow, whiteSpace) {
3567
3699
  */
3568
3700
  function displayStyle({ display, hide, textOverflow, overflow, whiteSpace }) {
3569
3701
  const result = {};
3702
+ const whiteSpaceValue = whiteSpace ? resolveCustomProperties(whiteSpace) : whiteSpace;
3570
3703
  if (textOverflow != null && textOverflow !== false) {
3571
- const textResult = processTextOverflow(textOverflow, whiteSpace);
3704
+ const textResult = processTextOverflow(textOverflow, whiteSpaceValue);
3572
3705
  if (textResult) Object.assign(result, textResult);
3573
3706
  }
3574
- if (overflow && !result["overflow"]) result["overflow"] = overflow;
3575
- if (whiteSpace && !result["white-space"]) result["white-space"] = whiteSpace;
3707
+ if (overflow && !result["overflow"]) result["overflow"] = resolveCustomProperties(overflow);
3708
+ if (whiteSpaceValue && !result["white-space"]) result["white-space"] = whiteSpaceValue;
3576
3709
  if (hide) result["display"] = "none";
3577
- else if (!result["display"] && display) result["display"] = display;
3710
+ else if (!result["display"] && display) result["display"] = resolveCustomProperties(display);
3578
3711
  if (Object.keys(result).length === 0) return null;
3579
3712
  return result;
3580
3713
  }
@@ -3655,7 +3788,7 @@ function fillStyle({ fill, backgroundColor, image, backgroundImage, backgroundPo
3655
3788
  const parsed = parseStyle(colorValue);
3656
3789
  const firstColor = parsed.groups[0]?.colors[0];
3657
3790
  const secondColor = parsed.groups[0]?.colors[1];
3658
- result["background-color"] = firstColor || colorValue;
3791
+ result["background-color"] = firstColor || resolveCustomProperties(colorValue);
3659
3792
  if (secondColor) result["--tasty-second-fill-color"] = secondColor;
3660
3793
  }
3661
3794
  const gradientLayer = result["--tasty-second-fill-color"] ? "linear-gradient(var(--tasty-second-fill-color), var(--tasty-second-fill-color))" : null;
@@ -3666,10 +3799,10 @@ function fillStyle({ fill, backgroundColor, image, backgroundImage, backgroundPo
3666
3799
  } else if (gradientLayer) result["background-image"] = gradientLayer;
3667
3800
  if (backgroundPosition) result["background-position"] = parseStyle(backgroundPosition).output || backgroundPosition;
3668
3801
  if (backgroundSize) result["background-size"] = parseStyle(backgroundSize).output || backgroundSize;
3669
- if (backgroundRepeat) result["background-repeat"] = backgroundRepeat;
3670
- if (backgroundAttachment) result["background-attachment"] = backgroundAttachment;
3671
- if (backgroundOrigin) result["background-origin"] = backgroundOrigin;
3672
- if (backgroundClip) result["background-clip"] = backgroundClip;
3802
+ if (backgroundRepeat) result["background-repeat"] = resolveCustomProperties(backgroundRepeat);
3803
+ if (backgroundAttachment) result["background-attachment"] = resolveCustomProperties(backgroundAttachment);
3804
+ if (backgroundOrigin) result["background-origin"] = resolveCustomProperties(backgroundOrigin);
3805
+ if (backgroundClip) result["background-clip"] = resolveCustomProperties(backgroundClip);
3673
3806
  if (Object.keys(result).length === 0) return null;
3674
3807
  return result;
3675
3808
  }
@@ -3688,7 +3821,7 @@ fillStyle.__lookupStyles = [
3688
3821
  ];
3689
3822
  function svgFillStyle({ svgFill }) {
3690
3823
  if (!svgFill) return null;
3691
- svgFill = parseStyle(svgFill).groups[0]?.colors[0] || svgFill;
3824
+ svgFill = parseStyle(svgFill).groups[0]?.colors[0] || resolveCustomProperties(svgFill);
3692
3825
  return { fill: svgFill };
3693
3826
  }
3694
3827
  svgFillStyle.__lookupStyles = ["svgFill"];
@@ -3698,7 +3831,7 @@ function flowStyle({ display = "block", flow }) {
3698
3831
  let style;
3699
3832
  if (display.includes("grid")) style = "grid-auto-flow";
3700
3833
  else if (display.includes("flex")) style = "flex-flow";
3701
- return style ? { [style]: flow } : null;
3834
+ return style && flow ? { [style]: resolveCustomProperties(flow) } : null;
3702
3835
  }
3703
3836
  flowStyle.__lookupStyles = ["display", "flow"];
3704
3837
  //#endregion
@@ -4083,17 +4216,18 @@ function outlineStyle({ outline, outlineOffset }) {
4083
4216
  };
4084
4217
  const offsetPart = parts[1];
4085
4218
  const typeMods = filterMods(outlinePart.mods, BORDER_STYLES);
4219
+ const slots = assignLineSlots(outlinePart.values, typeMods[0], outlinePart.colors[0]);
4086
4220
  result["outline"] = [
4087
4221
  outlinePart.values[0] || "var(--outline-width)",
4088
- typeMods[0] || "solid",
4089
- outlinePart.colors[0] || "var(--outline-color)"
4222
+ slots.style || "solid",
4223
+ slots.color || "var(--outline-color)"
4090
4224
  ].join(" ");
4091
4225
  if (offsetPart?.values[0]) result["outline-offset"] = offsetPart.values[0];
4092
4226
  }
4093
4227
  }
4094
4228
  if (outlineOffset != null && !result["outline-offset"]) {
4095
4229
  const offsetValue = typeof outlineOffset === "number" ? `${outlineOffset}px` : outlineOffset;
4096
- result["outline-offset"] = parseStyle(offsetValue).groups[0]?.values[0] || offsetValue;
4230
+ result["outline-offset"] = parseStyle(offsetValue).groups[0]?.values[0] || resolveCustomProperties(offsetValue);
4097
4231
  }
4098
4232
  if (Object.keys(result).length === 0) return null;
4099
4233
  return result;
@@ -4132,7 +4266,7 @@ paddingStyle.__lookupStyles = [
4132
4266
  function str(val) {
4133
4267
  if (val == null || val === false || val === "") return null;
4134
4268
  if (val === true) return "center";
4135
- return String(val);
4269
+ return resolveCustomProperties(String(val));
4136
4270
  }
4137
4271
  /**
4138
4272
  * Unified placement handler replacing align, justify, and place.
@@ -4214,7 +4348,7 @@ const PRESET_MODIFIERS = new Set([
4214
4348
  function toCSS(value, isNumeric) {
4215
4349
  if (value == null) return null;
4216
4350
  if (typeof value === "number") return isNumeric ? `${value}px` : String(value);
4217
- return parseStyle(String(value)).groups[0]?.values[0] || String(value);
4351
+ return parseStyle(String(value)).groups[0]?.values[0] || resolveCustomProperties(String(value));
4218
4352
  }
4219
4353
  function setCSSValue(styles, styleName, presetName, { varOnly, cssOnly } = {}) {
4220
4354
  const value = (() => {
@@ -4236,11 +4370,11 @@ function setCSSValue(styles, styleName, presetName, { varOnly, cssOnly } = {}) {
4236
4370
  * - `fontFamily="Arial"` → Arial (direct, no fallback)
4237
4371
  */
4238
4372
  function resolveFontFamily(font, fontFamily) {
4239
- if (fontFamily) return fontFamily;
4373
+ if (fontFamily) return resolveCustomProperties(fontFamily);
4240
4374
  if (font == null || font === false) return null;
4241
4375
  if (font === "monospace") return "var(--font-mono, var(--font-mono-fallback))";
4242
4376
  if (font === true) return "var(--font-sans, var(--font-sans-fallback))";
4243
- return `${font}, var(--font-sans, var(--font-sans-fallback))`;
4377
+ return `${resolveCustomProperties(font)}, var(--font-sans, var(--font-sans-fallback))`;
4244
4378
  }
4245
4379
  /**
4246
4380
  * Handles typography preset and individual font properties.
@@ -4274,7 +4408,7 @@ function presetStyle({ preset, fontSize, lineHeight, textTransform, letterSpacin
4274
4408
  const nameTokens = namePart?.all ?? [];
4275
4409
  const isModOnly = nameTokens.length > 0 && nameTokens.every((t) => PRESET_MODIFIERS.has(t));
4276
4410
  const nameToken = namePart?.mods[0] ?? namePart?.values[0] ?? "";
4277
- const name = isModOnly ? "inherit" : nameToken || "inherit";
4411
+ const name = isModOnly || isTokenNameReference("preset", nameToken) ? "inherit" : nameToken || "inherit";
4278
4412
  const modTokens = isModOnly ? nameTokens : modPart?.all ?? [];
4279
4413
  const activeMods = /* @__PURE__ */ new Set();
4280
4414
  for (const tok of modTokens) if (PRESET_MODIFIERS.has(tok)) activeMods.add(tok);
@@ -4312,7 +4446,7 @@ function presetStyle({ preset, fontSize, lineHeight, textTransform, letterSpacin
4312
4446
  if (fontStyle != null) if (fontStyle === true) styles["font-style"] = "italic";
4313
4447
  else if (typeof fontStyle === "string" && CSS_WIDE_KEYWORDS.has(fontStyle)) styles["font-style"] = fontStyle;
4314
4448
  else styles["font-style"] = fontStyle ? "italic" : "normal";
4315
- if (textTransform) styles["text-transform"] = textTransform;
4449
+ if (textTransform) styles["text-transform"] = resolveCustomProperties(textTransform);
4316
4450
  const fontFamily_ = resolveFontFamily(font, fontFamily);
4317
4451
  if (fontFamily_) styles["font-family"] = fontFamily_;
4318
4452
  if (Object.keys(styles).length === 0) return null;
@@ -4647,6 +4781,7 @@ function transitionStyle({ transition }) {
4647
4781
  const map = {};
4648
4782
  transitions.forEach((transition) => {
4649
4783
  const name = transition[0];
4784
+ if (isTokenNameReference("transition", name)) return;
4650
4785
  let timing;
4651
4786
  let easing;
4652
4787
  let delay;
@@ -4667,6 +4802,7 @@ function transitionStyle({ transition }) {
4667
4802
  ];
4668
4803
  });
4669
4804
  });
4805
+ if (Object.keys(map).length === 0) return null;
4670
4806
  return { transition: Object.entries(map).map(([style, [name, easing, timing, delay]]) => {
4671
4807
  let value = `${style} ${timing || getTiming(name)}`;
4672
4808
  if (easing || delay) value += ` ${easing || DEFAULT_EASING}`;
@@ -4703,11 +4839,28 @@ const devMode$2 = isDevEnv();
4703
4839
  function inDevMode() {
4704
4840
  return isDevEnv();
4705
4841
  }
4842
+ /**
4843
+ * Read a grid track count, or `undefined` when the value isn't one.
4844
+ *
4845
+ * Plain digit strings count: every value inside a state map arrives as a
4846
+ * string, so `gridColumns: { '': '2', '@media(w < 600px)': '1' }` would
4847
+ * otherwise emit `grid-template-columns: 2` — invalid CSS that browsers drop
4848
+ * silently.
4849
+ *
4850
+ * Zero and negatives yield `undefined`. Zero already produced an empty value,
4851
+ * and a negative number used to throw inside `String.repeat`.
4852
+ */
4853
+ function trackCount(val) {
4854
+ const count = typeof val === "number" ? val : typeof val === "string" && /^\d+$/.test(val.trim()) ? Number(val.trim()) : NaN;
4855
+ return Number.isFinite(count) && count >= 1 ? Math.floor(count) : void 0;
4856
+ }
4706
4857
  const columnsConverter = (val) => {
4707
- if (typeof val === "number") return "minmax(1px, 1fr) ".repeat(val).trim();
4858
+ const count = trackCount(val);
4859
+ return count === void 0 ? void 0 : "minmax(1px, 1fr) ".repeat(count).trim();
4708
4860
  };
4709
4861
  const rowsConverter = (val) => {
4710
- if (typeof val === "number") return "auto ".repeat(val).trim();
4862
+ const count = trackCount(val);
4863
+ return count === void 0 ? void 0 : "auto ".repeat(count).trim();
4711
4864
  };
4712
4865
  const STYLE_HANDLER_MAP$1 = {};
4713
4866
  let initialHandlerMapSnapshot = null;
@@ -4754,7 +4907,7 @@ function predefine() {
4754
4907
  defineStyleAlias("gridRows", "grid-template-rows", rowsConverter);
4755
4908
  defineStyleAlias("gridTemplate", "grid-template", (val) => {
4756
4909
  if (typeof val !== "string") return;
4757
- return val.split("/").map((s, i) => (i ? columnsConverter : rowsConverter)(s)).join("/");
4910
+ return val.split("/").map((s, i) => (i ? columnsConverter : rowsConverter)(s) ?? s).join("/");
4758
4911
  });
4759
4912
  [
4760
4913
  displayStyle,
@@ -12157,6 +12310,6 @@ function resetConfig() {
12157
12310
  delete storage[GLOBAL_INJECTOR_KEY];
12158
12311
  }
12159
12312
  //#endregion
12160
- export { SheetManager as $, getNamedColorHex as $t, FLOW_STYLES as A, registerFunctionPolyfill as At, createStateParserContext as B, stringifyStyles as Bt, BASE_STYLES as C, LAYOUT_CHUNK_STYLES as Ct, COLOR_STYLES as D, formatFunctionRule as Dt, BLOCK_STYLES as E, extractLocalFunctions as Et, hasPipelineCacheEntry as F, getGlobalParser as Ft, StyleInjector as G, createColorFunc as Gt, extractPredefinedStateRefs as H, okhstPlugin as Ht, isSelector as I, getGlobalPredefinedTokens as It, hasLocalCounterStyle as J, colorInitialValueToComponents as Jt, extractLocalCounterStyle as K, isDevEnv as Kt, renderStyles as L, normalizeColorTokenValue as Lt, OUTER_STYLES as M, CUSTOM_UNITS as Mt, POSITION_STYLES as N, DIRECTIONS as Nt, CONTAINER_STYLES as O, hasLocalFunctions as Ot, TEXT_STYLES as P, filterMods as Pt, hasLocalFontFace as Q, getComponentPropertySyntax as Qt, parseStateKey as R, parseColor as Rt, baseStylePropsRegistry as S, FONT_CHUNK_STYLES as St, BLOCK_OUTER_STYLES as T, STYLE_TO_CHUNK as Tt, getGlobalPredefinedStates as U, okhslFunction as Ut, extractLocalPredefinedStates as V, okhstFunction as Vt, setGlobalPredefinedStates as W, okhslPlugin as Wt, fontFaceContentHash as X, getColorSpaceFunc as Xt, extractLocalFontFace as Y, getColorSpaceComponents as Yt, formatFontFaceRule as Z, getColorSpaceSuffix as Zt, isFunctionsPolyfillEnabled as _, propHandlerRegistry as _t, getGlobalCounterStyles as a, Lru as an, DEFAULT_NAME_PREFIX as at, resetConfig as b, DIMENSION_CHUNK_STYLES as bt, getGlobalInjector as c, makeCounterStyleName as ct, getGlobalStyles as d, validateNamePrefix as dt, getRgbValuesFromRgbaString as en, STYLE_HANDLER_MAP as et, getNamePrefix as f, hashString as ft, isConfigLocked as g, parsePropertyToken as gt, hasStylesGenerated as h, hasLocalProperties as ht, getGlobalConfigTokens as i, resolveFunctionColor as in, PropertyTypeResolver as it, INNER_STYLES as j, registerLocalFunctionPolyfills as jt, DIMENSION_STYLES as k, parseFunctionName as kt, getGlobalKeyframes as l, makeKeyframeName as lt, hasGlobalRecipes as m, getEffectiveDefinition as mt, getConfig as n, hslToRgbValues as nn, styleHandlers as nt, getGlobalFontFaces as o, DEFAULT_ZERO_NAME_PREFIX as ot, hasGlobalKeyframes as p, extractLocalProperties as pt, formatCounterStyleRule as q, StyleParser as qt, getEffectiveProperties as r, strToRgb as rn, createStyle as rt, getGlobalFunctions as s, makeClassName as st, configure as t, hexToRgb as tn, defineHandler as tt, getGlobalRecipes as u, tastyClassRegex as ut, isTestEnvironment as v, APPEARANCE_CHUNK_STYLES as vt, BLOCK_INNER_STYLES as w, POSITION_CHUNK_STYLES as wt, generateTypographyTokens as x, DISPLAY_CHUNK_STYLES as xt, markStylesGenerated as y, CHUNK_NAMES as yt, camelToKebab as z, parseStyle as zt };
12313
+ export { SheetManager as $, getNamedColorHex as $t, FLOW_STYLES as A, registerFunctionPolyfill as At, createStateParserContext as B, stringifyStyles as Bt, BASE_STYLES as C, LAYOUT_CHUNK_STYLES as Ct, COLOR_STYLES as D, formatFunctionRule as Dt, BLOCK_STYLES as E, extractLocalFunctions as Et, hasPipelineCacheEntry as F, getGlobalParser as Ft, StyleInjector as G, createColorFunc as Gt, extractPredefinedStateRefs as H, okhstPlugin as Ht, isSelector as I, getGlobalPredefinedTokens as It, hasLocalCounterStyle as J, colorInitialValueToComponents as Jt, extractLocalCounterStyle as K, isDevEnv as Kt, renderStyles as L, normalizeColorTokenValue as Lt, OUTER_STYLES as M, CUSTOM_UNITS as Mt, POSITION_STYLES as N, DIRECTIONS as Nt, CONTAINER_STYLES as O, hasLocalFunctions as Ot, TEXT_STYLES as P, filterMods as Pt, hasLocalFontFace as Q, getComponentPropertySyntax as Qt, parseStateKey as R, parseColor as Rt, baseStylePropsRegistry as S, FONT_CHUNK_STYLES as St, BLOCK_OUTER_STYLES as T, STYLE_TO_CHUNK as Tt, getGlobalPredefinedStates as U, okhslFunction as Ut, extractLocalPredefinedStates as V, okhstFunction as Vt, setGlobalPredefinedStates as W, okhslPlugin as Wt, fontFaceContentHash as X, getColorSpaceFunc as Xt, extractLocalFontFace as Y, getColorSpaceComponents as Yt, formatFontFaceRule as Z, getColorSpaceSuffix as Zt, isFunctionsPolyfillEnabled as _, propHandlerRegistry as _t, getGlobalCounterStyles as a, Lru as an, DEFAULT_NAME_PREFIX as at, resetConfig as b, DIMENSION_CHUNK_STYLES as bt, getGlobalInjector as c, makeCounterStyleName as ct, getGlobalStyles as d, validateNamePrefix as dt, getRgbValuesFromRgbaString as en, STYLE_HANDLER_MAP as et, getNamePrefix as f, hashString as ft, isConfigLocked as g, parsePropertyToken as gt, hasStylesGenerated as h, hasLocalProperties as ht, getGlobalConfigTokens as i, resolveFunctionColor as in, PropertyTypeResolver as it, INNER_STYLES as j, registerLocalFunctionPolyfills as jt, DIMENSION_STYLES as k, parseFunctionName as kt, getGlobalKeyframes as l, makeKeyframeName as lt, hasGlobalRecipes as m, getEffectiveDefinition as mt, getConfig as n, hslToRgbValues as nn, styleHandlers as nt, getGlobalFontFaces as o, normalizeDslName as on, DEFAULT_ZERO_NAME_PREFIX as ot, hasGlobalKeyframes as p, extractLocalProperties as pt, formatCounterStyleRule as q, StyleParser as qt, getEffectiveProperties as r, strToRgb as rn, createStyle as rt, getGlobalFunctions as s, makeClassName as st, configure as t, hexToRgb as tn, defineHandler as tt, getGlobalRecipes as u, tastyClassRegex as ut, isTestEnvironment as v, APPEARANCE_CHUNK_STYLES as vt, BLOCK_INNER_STYLES as w, POSITION_CHUNK_STYLES as wt, generateTypographyTokens as x, DISPLAY_CHUNK_STYLES as xt, markStylesGenerated as y, CHUNK_NAMES as yt, camelToKebab as z, parseStyle as zt };
12161
12314
 
12162
- //# sourceMappingURL=config-CCcE_tqx.js.map
12315
+ //# sourceMappingURL=config-DOCuTykY.js.map