@conductor-by-89soone/tokens 0.5.0 → 0.6.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/cli.js CHANGED
@@ -271,7 +271,13 @@ var motion = [
271
271
  semantic("motion.fast", "140ms {ease.entrance}", "Colour, background and border transitions."),
272
272
  semantic("motion.standard", "240ms {ease.entrance}", "Overlay and page entrance."),
273
273
  semantic("motion.bounce", "300ms {ease.overshoot}", "Toggle and switch settle."),
274
- semantic("motion.spin", "1000ms {ease.linear}", "One revolution of the indeterminate spinner.")
274
+ semantic("motion.spin", "1000ms {ease.linear}", "One revolution of the indeterminate spinner."),
275
+ // CR-047: a press, an exit, a large surface, a spring settle, and the step between staged items.
276
+ semantic("motion.instant", "90ms {ease.entrance}", "Press feedback and pointer-tracking highlights."),
277
+ semantic("motion.exit", "160ms {ease.exit}", "Overlay, popover and drawer exits."),
278
+ semantic("motion.slow", "420ms {ease.emphasized}", "Drawers and other large surfaces entering."),
279
+ semantic("motion.spring", "520ms {ease.spring}", "Spring settle for dialogs, popovers and checked indicators (entrances only)."),
280
+ semantic("motion.stagger", "45ms", "Delay step between items of a staged entrance; a duration, never an easing.")
275
281
  ];
276
282
  var scaleTokens = [
277
283
  ...fontSize,
@@ -477,7 +483,7 @@ var overlay = [
477
483
  component("overlay.drawerBackground", ref("surface.raised"), "Drawer panel fill."),
478
484
  component("overlay.drawerWidth", value("500px"), "Drawer panel width."),
479
485
  component("overlay.enter", ref("motion.standard"), "Overlay entrance."),
480
- component("overlay.exit", ref("motion.fast"), "Overlay exit.")
486
+ component("overlay.exit", ref("motion.exit"), "Overlay exit.")
481
487
  ];
482
488
  var HEADING_MIN_PX = FONT_SIZE_PX.xl * 1.2;
483
489
  var HEADING_MAX_PX = FONT_SIZE_PX.xl * 1.6;
@@ -605,6 +611,59 @@ var componentTokens = [
605
611
  ...workbench
606
612
  ];
607
613
 
614
+ // src/oklab.ts
615
+ var HEX = /^#([0-9a-f]{6})$/i;
616
+ function parseHex(hex) {
617
+ const match = HEX.exec(hex);
618
+ if (match === null) throw new Error(`oklab: expected #rrggbb, got "${hex}"`);
619
+ const digits = match[1];
620
+ return [0, 2, 4].map((offset) => Number.parseInt(digits.slice(offset, offset + 2), 16) / 255);
621
+ }
622
+ var toLinear = (channel) => channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
623
+ var toGamma = (channel) => channel <= 31308e-7 ? 12.92 * channel : 1.055 * channel ** (1 / 2.4) - 0.055;
624
+ var clamp = (channel) => Math.min(1, Math.max(0, channel));
625
+ function toOklab(hex) {
626
+ const [r, g, b] = parseHex(hex).map(toLinear);
627
+ const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
628
+ const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
629
+ const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
630
+ return [
631
+ 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,
632
+ 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,
633
+ 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s
634
+ ];
635
+ }
636
+ function fromOklab([lightness, a, b]) {
637
+ const l = (lightness + 0.3963377774 * a + 0.2158037573 * b) ** 3;
638
+ const m = (lightness - 0.1055613458 * a - 0.0638541728 * b) ** 3;
639
+ const s = (lightness - 0.0894841775 * a - 1.291485548 * b) ** 3;
640
+ const linear = [
641
+ 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
642
+ -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
643
+ -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s
644
+ ];
645
+ return `#${linear.map((channel) => Math.round(clamp(toGamma(clamp(channel))) * 255).toString(16).padStart(2, "0")).join("")}`;
646
+ }
647
+ function mixOklab(foreground, background, weight) {
648
+ if (!(weight >= 0 && weight <= 1)) throw new Error(`oklab: weight must be within [0, 1], got ${weight}`);
649
+ const front = toOklab(foreground);
650
+ const back = toOklab(background);
651
+ return fromOklab(front.map((channel, index) => channel * weight + back[index] * (1 - weight)));
652
+ }
653
+ var TONE_WEIGHTS = {
654
+ background: 0.04,
655
+ border: 0.14,
656
+ backgroundHover: 0.12,
657
+ borderHover: 0.45
658
+ };
659
+ function toneValues(tones, surfaceRaised) {
660
+ const out = {};
661
+ for (const tone2 of Object.keys(tones)) {
662
+ for (const [state, weight] of Object.entries(TONE_WEIGHTS)) out[`tone.${tone2}.${state}`] = mixOklab(tones[tone2], surfaceRaised, weight);
663
+ }
664
+ return out;
665
+ }
666
+
608
667
  // src/palette.dark.ts
609
668
  function darkToken(input2) {
610
669
  return { tier: "semantic", ...input2 };
@@ -1098,6 +1157,27 @@ var dataviz = [
1098
1157
  description: "Sequential distribution step 5 of 5 (most prominent), single-hue luminance ramp. Fill only; non-text 3:1 on chart surfaces (CP-115~CP-117)."
1099
1158
  })
1100
1159
  ];
1160
+ var TONE_STATE_DESCRIPTIONS = {
1161
+ background: "rest fill",
1162
+ border: "rest edge",
1163
+ backgroundHover: "hover fill",
1164
+ borderHover: "hover edge"
1165
+ };
1166
+ function valueOf(tokens, key) {
1167
+ const value2 = tokens.find((token) => token.key === key)?.value;
1168
+ if (typeof value2 !== "string") throw new Error(`palette.dark: tone base "${key}" has no literal colour value`);
1169
+ return value2;
1170
+ }
1171
+ var toneBases = { accent: valueOf(accent, "accent.DEFAULT"), danger: valueOf(status, "status.danger") };
1172
+ var tone = Object.entries(toneValues(toneBases, valueOf(surface, "surface.raised"))).map(([key, value2]) => {
1173
+ const [, toneName, state] = key.split(".");
1174
+ return darkToken({
1175
+ key,
1176
+ usage: "decorative",
1177
+ value: value2,
1178
+ description: `Secondary ${toneName}-tone button ${TONE_STATE_DESCRIPTIONS[state]}: ${Math.round(TONE_WEIGHTS[state] * 100)}% of \`${toneName === "accent" ? "accent" : "status.danger"}\` over \`surface.raised\`, mixed in OKLab at build time (CR-050).`
1179
+ });
1180
+ });
1101
1181
  var darkPalette = [
1102
1182
  ...surface,
1103
1183
  ...text,
@@ -1109,11 +1189,12 @@ var darkPalette = [
1109
1189
  ...fontFamily,
1110
1190
  ...elevation,
1111
1191
  ...interaction,
1192
+ ...tone,
1112
1193
  ...dataviz
1113
1194
  ];
1114
1195
 
1115
1196
  // src/palette.light.ts
1116
- var values = {
1197
+ var baseValues = {
1117
1198
  "surface.base": "#e8ecf2",
1118
1199
  "surface.canvas": "#eef1f6",
1119
1200
  "surface.subtle": "#f3f6f9",
@@ -1183,6 +1264,13 @@ var values = {
1183
1264
  "dataviz.sequential.4": "#4539cd",
1184
1265
  "dataviz.sequential.5": "#3329a4"
1185
1266
  };
1267
+ var values = {
1268
+ ...baseValues,
1269
+ ...toneValues(
1270
+ { accent: baseValues["accent.DEFAULT"], danger: baseValues["status.danger"] },
1271
+ baseValues["surface.raised"]
1272
+ )
1273
+ };
1186
1274
  var lightAdditions = [];
1187
1275
  function derivePalette(base, overrides, additions = []) {
1188
1276
  const baseKeys = new Set(base.map((token) => token.key));
@@ -1314,7 +1402,15 @@ var nonColour = [
1314
1402
  primitive("curve.24", "24px", "Corner radius step."),
1315
1403
  primitive("ease.entrance", "cubic-bezier(0.2, 0, 0, 1)", "Entrance and state-change easing."),
1316
1404
  primitive("ease.overshoot", "cubic-bezier(0.34, 1.56, 0.64, 1)", "Toggle settle easing."),
1317
- primitive("ease.linear", "linear", "Constant-rate motion: spinners and marquees.")
1405
+ primitive("ease.linear", "linear", "Constant-rate motion: spinners and marquees."),
1406
+ // CR-047: exits accelerate away, large surfaces decelerate hard, and settles follow a sampled spring.
1407
+ primitive("ease.exit", "cubic-bezier(0.4, 0, 1, 1)", "Exit easing: accelerates out of view."),
1408
+ primitive("ease.emphasized", "cubic-bezier(0.05, 0.7, 0.1, 1)", "Emphasized deceleration for large surfaces and hero entrances."),
1409
+ primitive(
1410
+ "ease.spring",
1411
+ "linear(0, 0.075 5%, 0.242 10%, 0.435 15%, 0.616 20%, 0.766 25%, 0.878 30%, 0.967 36%, 1.015 42%, 1.037 50%, 1.033 60%, 1.012 75%, 1)",
1412
+ "Damped spring (ratio 0.72, ~4% overshoot) sampled into linear(); entrances only."
1413
+ )
1318
1414
  ];
1319
1415
  var primitiveTokens = [
1320
1416
  ...ink,
@@ -362,6 +362,12 @@ var datavizPairs = [
362
362
  pair("CP-116", "dataviz.sequential.5", "surface.canvas", "nonText"),
363
363
  pair("CP-117", "dataviz.sequential.5", "surface.raised", "nonText")
364
364
  ];
365
+ var tonePairs = [
366
+ pair("CP-118", "text.primary", "tone.accent.background", "body"),
367
+ pair("CP-119", "text.primary", "tone.accent.backgroundHover", "body"),
368
+ pair("CP-120", "text.primary", "tone.danger.background", "body"),
369
+ pair("CP-121", "text.primary", "tone.danger.backgroundHover", "body")
370
+ ];
365
371
  var contrastPairs = [
366
372
  ...textOnSurface,
367
373
  ...accentPairs,
@@ -371,7 +377,8 @@ var contrastPairs = [
371
377
  ...severityPairs,
372
378
  ...badgePairs,
373
379
  ...disabledPairs,
374
- ...datavizPairs
380
+ ...datavizPairs,
381
+ ...tonePairs
375
382
  ];
376
383
  var forbiddenPairs = [
377
384
  {
@@ -492,7 +499,13 @@ var motion = [
492
499
  semantic("motion.fast", "140ms {ease.entrance}", "Colour, background and border transitions."),
493
500
  semantic("motion.standard", "240ms {ease.entrance}", "Overlay and page entrance."),
494
501
  semantic("motion.bounce", "300ms {ease.overshoot}", "Toggle and switch settle."),
495
- semantic("motion.spin", "1000ms {ease.linear}", "One revolution of the indeterminate spinner.")
502
+ semantic("motion.spin", "1000ms {ease.linear}", "One revolution of the indeterminate spinner."),
503
+ // CR-047: a press, an exit, a large surface, a spring settle, and the step between staged items.
504
+ semantic("motion.instant", "90ms {ease.entrance}", "Press feedback and pointer-tracking highlights."),
505
+ semantic("motion.exit", "160ms {ease.exit}", "Overlay, popover and drawer exits."),
506
+ semantic("motion.slow", "420ms {ease.emphasized}", "Drawers and other large surfaces entering."),
507
+ semantic("motion.spring", "520ms {ease.spring}", "Spring settle for dialogs, popovers and checked indicators (entrances only)."),
508
+ semantic("motion.stagger", "45ms", "Delay step between items of a staged entrance; a duration, never an easing.")
496
509
  ];
497
510
  var scaleTokens = [
498
511
  ...fontSize,
@@ -698,7 +711,7 @@ var overlay = [
698
711
  component("overlay.drawerBackground", ref("surface.raised"), "Drawer panel fill."),
699
712
  component("overlay.drawerWidth", value("500px"), "Drawer panel width."),
700
713
  component("overlay.enter", ref("motion.standard"), "Overlay entrance."),
701
- component("overlay.exit", ref("motion.fast"), "Overlay exit.")
714
+ component("overlay.exit", ref("motion.exit"), "Overlay exit.")
702
715
  ];
703
716
  var HEADING_MIN_PX = FONT_SIZE_PX.xl * 1.2;
704
717
  var HEADING_MAX_PX = FONT_SIZE_PX.xl * 1.6;
@@ -826,6 +839,59 @@ var componentTokens = [
826
839
  ...workbench
827
840
  ];
828
841
 
842
+ // src/oklab.ts
843
+ var HEX = /^#([0-9a-f]{6})$/i;
844
+ function parseHex(hex) {
845
+ const match = HEX.exec(hex);
846
+ if (match === null) throw new Error(`oklab: expected #rrggbb, got "${hex}"`);
847
+ const digits = match[1];
848
+ return [0, 2, 4].map((offset) => Number.parseInt(digits.slice(offset, offset + 2), 16) / 255);
849
+ }
850
+ var toLinear = (channel) => channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
851
+ var toGamma = (channel) => channel <= 31308e-7 ? 12.92 * channel : 1.055 * channel ** (1 / 2.4) - 0.055;
852
+ var clamp = (channel) => Math.min(1, Math.max(0, channel));
853
+ function toOklab(hex) {
854
+ const [r, g, b] = parseHex(hex).map(toLinear);
855
+ const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
856
+ const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
857
+ const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
858
+ return [
859
+ 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,
860
+ 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,
861
+ 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s
862
+ ];
863
+ }
864
+ function fromOklab([lightness, a, b]) {
865
+ const l = (lightness + 0.3963377774 * a + 0.2158037573 * b) ** 3;
866
+ const m = (lightness - 0.1055613458 * a - 0.0638541728 * b) ** 3;
867
+ const s = (lightness - 0.0894841775 * a - 1.291485548 * b) ** 3;
868
+ const linear = [
869
+ 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
870
+ -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
871
+ -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s
872
+ ];
873
+ return `#${linear.map((channel) => Math.round(clamp(toGamma(clamp(channel))) * 255).toString(16).padStart(2, "0")).join("")}`;
874
+ }
875
+ function mixOklab(foreground, background, weight) {
876
+ if (!(weight >= 0 && weight <= 1)) throw new Error(`oklab: weight must be within [0, 1], got ${weight}`);
877
+ const front = toOklab(foreground);
878
+ const back = toOklab(background);
879
+ return fromOklab(front.map((channel, index) => channel * weight + back[index] * (1 - weight)));
880
+ }
881
+ var TONE_WEIGHTS = {
882
+ background: 0.04,
883
+ border: 0.14,
884
+ backgroundHover: 0.12,
885
+ borderHover: 0.45
886
+ };
887
+ function toneValues(tones, surfaceRaised) {
888
+ const out = {};
889
+ for (const tone2 of Object.keys(tones)) {
890
+ for (const [state, weight] of Object.entries(TONE_WEIGHTS)) out[`tone.${tone2}.${state}`] = mixOklab(tones[tone2], surfaceRaised, weight);
891
+ }
892
+ return out;
893
+ }
894
+
829
895
  // src/palette.dark.ts
830
896
  function darkToken(input2) {
831
897
  return { tier: "semantic", ...input2 };
@@ -1319,6 +1385,27 @@ var dataviz = [
1319
1385
  description: "Sequential distribution step 5 of 5 (most prominent), single-hue luminance ramp. Fill only; non-text 3:1 on chart surfaces (CP-115~CP-117)."
1320
1386
  })
1321
1387
  ];
1388
+ var TONE_STATE_DESCRIPTIONS = {
1389
+ background: "rest fill",
1390
+ border: "rest edge",
1391
+ backgroundHover: "hover fill",
1392
+ borderHover: "hover edge"
1393
+ };
1394
+ function valueOf(tokens, key) {
1395
+ const value2 = tokens.find((token) => token.key === key)?.value;
1396
+ if (typeof value2 !== "string") throw new Error(`palette.dark: tone base "${key}" has no literal colour value`);
1397
+ return value2;
1398
+ }
1399
+ var toneBases = { accent: valueOf(accent, "accent.DEFAULT"), danger: valueOf(status, "status.danger") };
1400
+ var tone = Object.entries(toneValues(toneBases, valueOf(surface, "surface.raised"))).map(([key, value2]) => {
1401
+ const [, toneName, state] = key.split(".");
1402
+ return darkToken({
1403
+ key,
1404
+ usage: "decorative",
1405
+ value: value2,
1406
+ description: `Secondary ${toneName}-tone button ${TONE_STATE_DESCRIPTIONS[state]}: ${Math.round(TONE_WEIGHTS[state] * 100)}% of \`${toneName === "accent" ? "accent" : "status.danger"}\` over \`surface.raised\`, mixed in OKLab at build time (CR-050).`
1407
+ });
1408
+ });
1322
1409
  var darkPalette = [
1323
1410
  ...surface,
1324
1411
  ...text,
@@ -1330,11 +1417,12 @@ var darkPalette = [
1330
1417
  ...fontFamily,
1331
1418
  ...elevation,
1332
1419
  ...interaction,
1420
+ ...tone,
1333
1421
  ...dataviz
1334
1422
  ];
1335
1423
 
1336
1424
  // src/palette.light.ts
1337
- var values = {
1425
+ var baseValues = {
1338
1426
  "surface.base": "#e8ecf2",
1339
1427
  "surface.canvas": "#eef1f6",
1340
1428
  "surface.subtle": "#f3f6f9",
@@ -1404,6 +1492,13 @@ var values = {
1404
1492
  "dataviz.sequential.4": "#4539cd",
1405
1493
  "dataviz.sequential.5": "#3329a4"
1406
1494
  };
1495
+ var values = {
1496
+ ...baseValues,
1497
+ ...toneValues(
1498
+ { accent: baseValues["accent.DEFAULT"], danger: baseValues["status.danger"] },
1499
+ baseValues["surface.raised"]
1500
+ )
1501
+ };
1407
1502
  var lightAdditions = [];
1408
1503
  function derivePalette(base, overrides, additions = []) {
1409
1504
  const baseKeys = new Set(base.map((token) => token.key));
@@ -1535,7 +1630,15 @@ var nonColour = [
1535
1630
  primitive("curve.24", "24px", "Corner radius step."),
1536
1631
  primitive("ease.entrance", "cubic-bezier(0.2, 0, 0, 1)", "Entrance and state-change easing."),
1537
1632
  primitive("ease.overshoot", "cubic-bezier(0.34, 1.56, 0.64, 1)", "Toggle settle easing."),
1538
- primitive("ease.linear", "linear", "Constant-rate motion: spinners and marquees.")
1633
+ primitive("ease.linear", "linear", "Constant-rate motion: spinners and marquees."),
1634
+ // CR-047: exits accelerate away, large surfaces decelerate hard, and settles follow a sampled spring.
1635
+ primitive("ease.exit", "cubic-bezier(0.4, 0, 1, 1)", "Exit easing: accelerates out of view."),
1636
+ primitive("ease.emphasized", "cubic-bezier(0.05, 0.7, 0.1, 1)", "Emphasized deceleration for large surfaces and hero entrances."),
1637
+ primitive(
1638
+ "ease.spring",
1639
+ "linear(0, 0.075 5%, 0.242 10%, 0.435 15%, 0.616 20%, 0.766 25%, 0.878 30%, 0.967 36%, 1.015 42%, 1.037 50%, 1.033 60%, 1.012 75%, 1)",
1640
+ "Damped spring (ratio 0.72, ~4% overshoot) sampled into linear(); entrances only."
1641
+ )
1539
1642
  ];
1540
1643
  var primitiveTokens = [
1541
1644
  ...ink,
@@ -1588,7 +1691,7 @@ function tokensForTheme(theme) {
1588
1691
  // src/contrast/color.ts
1589
1692
  var HEX_SOURCE = "#([0-9a-f]{3,8})\\b";
1590
1693
  var FUNCTIONAL_SOURCE = "\\b(rgba?|hsla?)\\(\\s*([^()]*)\\)";
1591
- var clamp = (value2, low, high) => Math.min(Math.max(value2, low), high);
1694
+ var clamp2 = (value2, low, high) => Math.min(Math.max(value2, low), high);
1592
1695
  function fromHex(digits) {
1593
1696
  const byte = (pair2) => parseInt(pair2.length === 1 ? pair2 + pair2 : pair2, 16);
1594
1697
  if (digits.length === 3 || digits.length === 4) {
@@ -1612,14 +1715,14 @@ function argumentsOf(body) {
1612
1715
  function toAlpha(raw) {
1613
1716
  if (raw === void 0) return 1;
1614
1717
  const value2 = raw.endsWith("%") ? Number(raw.slice(0, -1)) / 100 : Number(raw);
1615
- return Number.isFinite(value2) ? clamp(value2, 0, 1) : 1;
1718
+ return Number.isFinite(value2) ? clamp2(value2, 0, 1) : 1;
1616
1719
  }
1617
1720
  function fromRgb(body) {
1618
1721
  const parts = argumentsOf(body);
1619
1722
  if (parts.length < 3) return void 0;
1620
1723
  const channel = (raw) => {
1621
1724
  const value2 = raw.endsWith("%") ? Number(raw.slice(0, -1)) / 100 * 255 : Number(raw);
1622
- return Number.isFinite(value2) ? clamp(Math.round(value2), 0, 255) : Number.NaN;
1725
+ return Number.isFinite(value2) ? clamp2(Math.round(value2), 0, 255) : Number.NaN;
1623
1726
  };
1624
1727
  const r = channel(parts[0]);
1625
1728
  const g = channel(parts[1]);
@@ -1634,10 +1737,10 @@ function fromHsl(body) {
1634
1737
  const saturation = Number(parts[1].replace(/%$/, "")) / 100;
1635
1738
  const lightness = Number(parts[2].replace(/%$/, "")) / 100;
1636
1739
  if (![hue, saturation, lightness].every((value2) => Number.isFinite(value2))) return void 0;
1637
- const chroma = (1 - Math.abs(2 * clamp(lightness, 0, 1) - 1)) * clamp(saturation, 0, 1);
1740
+ const chroma = (1 - Math.abs(2 * clamp2(lightness, 0, 1) - 1)) * clamp2(saturation, 0, 1);
1638
1741
  const sextant = (hue % 360 + 360) % 360 / 60;
1639
1742
  const secondary = chroma * (1 - Math.abs(sextant % 2 - 1));
1640
- const lift = clamp(lightness, 0, 1) - chroma / 2;
1743
+ const lift = clamp2(lightness, 0, 1) - chroma / 2;
1641
1744
  const wheel = [
1642
1745
  [chroma, secondary, 0],
1643
1746
  [secondary, chroma, 0],
@@ -1647,7 +1750,7 @@ function fromHsl(body) {
1647
1750
  [chroma, 0, secondary]
1648
1751
  ];
1649
1752
  const [r, g, b] = wheel[Math.floor(sextant) % 6];
1650
- const channel = (raw) => clamp(Math.round((raw + lift) * 255), 0, 255);
1753
+ const channel = (raw) => clamp2(Math.round((raw + lift) * 255), 0, 255);
1651
1754
  return { r: channel(r), g: channel(g), b: channel(b), alpha: toAlpha(parts[3]) };
1652
1755
  }
1653
1756
  function parseFunctional(name, body) {
@@ -10,11 +10,11 @@
10
10
  "nonText": 3
11
11
  },
12
12
  "summary": {
13
- "declaredPairs": 116,
14
- "checks": 232,
15
- "passed": 232,
13
+ "declaredPairs": 120,
14
+ "checks": 240,
15
+ "passed": 240,
16
16
  "failed": 0,
17
- "excludedTokens": 236,
17
+ "excludedTokens": 249,
18
18
  "forbiddenPairs": 2
19
19
  },
20
20
  "results": [
@@ -1526,6 +1526,58 @@
1526
1526
  "ratio": 10.836,
1527
1527
  "pass": true
1528
1528
  },
1529
+ {
1530
+ "id": "CP-118",
1531
+ "theme": "dark",
1532
+ "foreground": "text.primary",
1533
+ "background": "tone.accent.background",
1534
+ "foregroundValue": "#f4f7fb",
1535
+ "backgroundValue": "#172131",
1536
+ "compositedForeground": "#f4f7fb",
1537
+ "usage": "body",
1538
+ "threshold": 4.5,
1539
+ "ratio": 15.0532,
1540
+ "pass": true
1541
+ },
1542
+ {
1543
+ "id": "CP-119",
1544
+ "theme": "dark",
1545
+ "foreground": "text.primary",
1546
+ "background": "tone.accent.backgroundHover",
1547
+ "foregroundValue": "#f4f7fb",
1548
+ "backgroundValue": "#1d2840",
1549
+ "compositedForeground": "#f4f7fb",
1550
+ "usage": "body",
1551
+ "threshold": 4.5,
1552
+ "ratio": 13.6691,
1553
+ "pass": true
1554
+ },
1555
+ {
1556
+ "id": "CP-120",
1557
+ "theme": "dark",
1558
+ "foreground": "text.primary",
1559
+ "background": "tone.danger.background",
1560
+ "foregroundValue": "#f4f7fb",
1561
+ "backgroundValue": "#1d202c",
1562
+ "compositedForeground": "#f4f7fb",
1563
+ "usage": "body",
1564
+ "threshold": 4.5,
1565
+ "ratio": 15.0893,
1566
+ "pass": true
1567
+ },
1568
+ {
1569
+ "id": "CP-121",
1570
+ "theme": "dark",
1571
+ "foreground": "text.primary",
1572
+ "background": "tone.danger.backgroundHover",
1573
+ "foregroundValue": "#f4f7fb",
1574
+ "backgroundValue": "#2d252f",
1575
+ "compositedForeground": "#f4f7fb",
1576
+ "usage": "body",
1577
+ "threshold": 4.5,
1578
+ "ratio": 13.79,
1579
+ "pass": true
1580
+ },
1529
1581
  {
1530
1582
  "id": "CP-001",
1531
1583
  "theme": "light",
@@ -3033,6 +3085,58 @@
3033
3085
  "threshold": 3,
3034
3086
  "ratio": 10.2529,
3035
3087
  "pass": true
3088
+ },
3089
+ {
3090
+ "id": "CP-118",
3091
+ "theme": "light",
3092
+ "foreground": "text.primary",
3093
+ "background": "tone.accent.background",
3094
+ "foregroundValue": "#0c121c",
3095
+ "backgroundValue": "#f3f6fc",
3096
+ "compositedForeground": "#0c121c",
3097
+ "usage": "body",
3098
+ "threshold": 4.5,
3099
+ "ratio": 17.3371,
3100
+ "pass": true
3101
+ },
3102
+ {
3103
+ "id": "CP-119",
3104
+ "theme": "light",
3105
+ "foreground": "text.primary",
3106
+ "background": "tone.accent.backgroundHover",
3107
+ "foregroundValue": "#0c121c",
3108
+ "backgroundValue": "#e4e9fa",
3109
+ "compositedForeground": "#0c121c",
3110
+ "usage": "body",
3111
+ "threshold": 4.5,
3112
+ "ratio": 15.4924,
3113
+ "pass": true
3114
+ },
3115
+ {
3116
+ "id": "CP-120",
3117
+ "theme": "light",
3118
+ "foreground": "text.primary",
3119
+ "background": "tone.danger.background",
3120
+ "foregroundValue": "#0c121c",
3121
+ "backgroundValue": "#fbf4f4",
3122
+ "compositedForeground": "#0c121c",
3123
+ "usage": "body",
3124
+ "threshold": 4.5,
3125
+ "ratio": 17.292,
3126
+ "pass": true
3127
+ },
3128
+ {
3129
+ "id": "CP-121",
3130
+ "theme": "light",
3131
+ "foreground": "text.primary",
3132
+ "background": "tone.danger.backgroundHover",
3133
+ "foregroundValue": "#0c121c",
3134
+ "backgroundValue": "#f9e4e2",
3135
+ "compositedForeground": "#0c121c",
3136
+ "usage": "body",
3137
+ "threshold": 4.5,
3138
+ "ratio": 15.3929,
3139
+ "pass": true
3036
3140
  }
3037
3141
  ],
3038
3142
  "exclusions": [
@@ -3176,6 +3280,46 @@
3176
3280
  "usage": "decorative",
3177
3281
  "reason": "Policy-blocked fill. Contrast-exempt as a fill; checked beneath the label (5.27:1)."
3178
3282
  },
3283
+ {
3284
+ "key": "tone.accent.background",
3285
+ "usage": "decorative",
3286
+ "reason": "Secondary accent-tone button rest fill: 4% of `accent` over `surface.raised`, mixed in OKLab at build time (CR-050)."
3287
+ },
3288
+ {
3289
+ "key": "tone.accent.border",
3290
+ "usage": "decorative",
3291
+ "reason": "Secondary accent-tone button rest edge: 14% of `accent` over `surface.raised`, mixed in OKLab at build time (CR-050)."
3292
+ },
3293
+ {
3294
+ "key": "tone.accent.backgroundHover",
3295
+ "usage": "decorative",
3296
+ "reason": "Secondary accent-tone button hover fill: 12% of `accent` over `surface.raised`, mixed in OKLab at build time (CR-050)."
3297
+ },
3298
+ {
3299
+ "key": "tone.accent.borderHover",
3300
+ "usage": "decorative",
3301
+ "reason": "Secondary accent-tone button hover edge: 45% of `accent` over `surface.raised`, mixed in OKLab at build time (CR-050)."
3302
+ },
3303
+ {
3304
+ "key": "tone.danger.background",
3305
+ "usage": "decorative",
3306
+ "reason": "Secondary danger-tone button rest fill: 4% of `status.danger` over `surface.raised`, mixed in OKLab at build time (CR-050)."
3307
+ },
3308
+ {
3309
+ "key": "tone.danger.border",
3310
+ "usage": "decorative",
3311
+ "reason": "Secondary danger-tone button rest edge: 14% of `status.danger` over `surface.raised`, mixed in OKLab at build time (CR-050)."
3312
+ },
3313
+ {
3314
+ "key": "tone.danger.backgroundHover",
3315
+ "usage": "decorative",
3316
+ "reason": "Secondary danger-tone button hover fill: 12% of `status.danger` over `surface.raised`, mixed in OKLab at build time (CR-050)."
3317
+ },
3318
+ {
3319
+ "key": "tone.danger.borderHover",
3320
+ "usage": "decorative",
3321
+ "reason": "Secondary danger-tone button hover edge: 45% of `status.danger` over `surface.raised`, mixed in OKLab at build time (CR-050)."
3322
+ },
3179
3323
  {
3180
3324
  "key": "font.size.2xs",
3181
3325
  "usage": "decorative",
@@ -3396,6 +3540,31 @@
3396
3540
  "usage": "decorative",
3397
3541
  "reason": "One revolution of the indeterminate spinner."
3398
3542
  },
3543
+ {
3544
+ "key": "motion.instant",
3545
+ "usage": "decorative",
3546
+ "reason": "Press feedback and pointer-tracking highlights."
3547
+ },
3548
+ {
3549
+ "key": "motion.exit",
3550
+ "usage": "decorative",
3551
+ "reason": "Overlay, popover and drawer exits."
3552
+ },
3553
+ {
3554
+ "key": "motion.slow",
3555
+ "usage": "decorative",
3556
+ "reason": "Drawers and other large surfaces entering."
3557
+ },
3558
+ {
3559
+ "key": "motion.spring",
3560
+ "usage": "decorative",
3561
+ "reason": "Spring settle for dialogs, popovers and checked indicators (entrances only)."
3562
+ },
3563
+ {
3564
+ "key": "motion.stagger",
3565
+ "usage": "decorative",
3566
+ "reason": "Delay step between items of a staged entrance; a duration, never an easing."
3567
+ },
3399
3568
  {
3400
3569
  "key": "button.minHeight",
3401
3570
  "usage": "decorative",
package/dist/index.js CHANGED
@@ -103,6 +103,20 @@ var tokens = {
103
103
  disabled: "var(--cdt-state-disabled)",
104
104
  disabledPolicy: "var(--cdt-state-disabled-policy)"
105
105
  },
106
+ tone: {
107
+ accent: {
108
+ background: "var(--cdt-tone-accent-background)",
109
+ border: "var(--cdt-tone-accent-border)",
110
+ backgroundHover: "var(--cdt-tone-accent-background-hover)",
111
+ borderHover: "var(--cdt-tone-accent-border-hover)"
112
+ },
113
+ danger: {
114
+ background: "var(--cdt-tone-danger-background)",
115
+ border: "var(--cdt-tone-danger-border)",
116
+ backgroundHover: "var(--cdt-tone-danger-background-hover)",
117
+ borderHover: "var(--cdt-tone-danger-border-hover)"
118
+ }
119
+ },
106
120
  dataviz: {
107
121
  series: {
108
122
  "1": "var(--cdt-dataviz-series-1)",
@@ -169,7 +183,12 @@ var tokens = {
169
183
  fast: "var(--cdt-motion-fast)",
170
184
  standard: "var(--cdt-motion-standard)",
171
185
  bounce: "var(--cdt-motion-bounce)",
172
- spin: "var(--cdt-motion-spin)"
186
+ spin: "var(--cdt-motion-spin)",
187
+ instant: "var(--cdt-motion-instant)",
188
+ exit: "var(--cdt-motion-exit)",
189
+ slow: "var(--cdt-motion-slow)",
190
+ spring: "var(--cdt-motion-spring)",
191
+ stagger: "var(--cdt-motion-stagger)"
173
192
  },
174
193
  button: {
175
194
  minHeight: "var(--cdt-button-min-height)",
package/dist/tokens.css CHANGED
@@ -69,6 +69,15 @@
69
69
  --cdt-state-disabled: #18202c;
70
70
  --cdt-state-disabled-policy: #422006;
71
71
 
72
+ --cdt-tone-accent-background: #172131;
73
+ --cdt-tone-accent-border: #1f2944;
74
+ --cdt-tone-accent-background-hover: #1d2840;
75
+ --cdt-tone-accent-border-hover: #394682;
76
+ --cdt-tone-danger-background: #1d202c;
77
+ --cdt-tone-danger-border: #312630;
78
+ --cdt-tone-danger-background-hover: #2d252f;
79
+ --cdt-tone-danger-border-hover: #72363a;
80
+
72
81
  --cdt-dataviz-series-1: #e88171;
73
82
  --cdt-dataviz-series-2: #1db198;
74
83
  --cdt-dataviz-series-3: #e979ad;
@@ -145,6 +154,11 @@
145
154
  --cdt-motion-standard: 240ms cubic-bezier(0.2, 0, 0, 1);
146
155
  --cdt-motion-bounce: 300ms cubic-bezier(0.34, 1.56, 0.64, 1);
147
156
  --cdt-motion-spin: 1000ms linear;
157
+ --cdt-motion-instant: 90ms cubic-bezier(0.2, 0, 0, 1);
158
+ --cdt-motion-exit: 160ms cubic-bezier(0.4, 0, 1, 1);
159
+ --cdt-motion-slow: 420ms cubic-bezier(0.05, 0.7, 0.1, 1);
160
+ --cdt-motion-spring: 520ms linear(0, 0.075 5%, 0.242 10%, 0.435 15%, 0.616 20%, 0.766 25%, 0.878 30%, 0.967 36%, 1.015 42%, 1.037 50%, 1.033 60%, 1.012 75%, 1);
161
+ --cdt-motion-stagger: 45ms;
148
162
 
149
163
  --cdt-button-min-height: 40px;
150
164
  --cdt-button-min-height-compact: 42px;
@@ -302,7 +316,7 @@
302
316
  --cdt-overlay-drawer-background: #141d2a;
303
317
  --cdt-overlay-drawer-width: 500px;
304
318
  --cdt-overlay-enter: 240ms cubic-bezier(0.2, 0, 0, 1);
305
- --cdt-overlay-exit: 140ms cubic-bezier(0.2, 0, 0, 1);
319
+ --cdt-overlay-exit: 160ms cubic-bezier(0.4, 0, 1, 1);
306
320
 
307
321
  --cdt-page-heading-size: clamp(24px, 3vw, 32px);
308
322
  --cdt-page-heading-line-height: 1.16;
@@ -422,6 +436,15 @@
422
436
  --cdt-state-disabled: #e2e8f0;
423
437
  --cdt-state-disabled-policy: #fef3c7;
424
438
 
439
+ --cdt-tone-accent-background: #f3f6fc;
440
+ --cdt-tone-accent-border: #e0e6fa;
441
+ --cdt-tone-accent-background-hover: #e4e9fa;
442
+ --cdt-tone-accent-border-hover: #a7b5ef;
443
+ --cdt-tone-danger-background: #fbf4f4;
444
+ --cdt-tone-danger-border: #f9e0dd;
445
+ --cdt-tone-danger-background-hover: #f9e4e2;
446
+ --cdt-tone-danger-border-hover: #eea39a;
447
+
425
448
  --cdt-dataviz-series-1: #d45946;
426
449
  --cdt-dataviz-series-2: #228f7d;
427
450
  --cdt-dataviz-series-3: #d54e8d;
@@ -498,6 +521,11 @@
498
521
  --cdt-motion-standard: 240ms cubic-bezier(0.2, 0, 0, 1);
499
522
  --cdt-motion-bounce: 300ms cubic-bezier(0.34, 1.56, 0.64, 1);
500
523
  --cdt-motion-spin: 1000ms linear;
524
+ --cdt-motion-instant: 90ms cubic-bezier(0.2, 0, 0, 1);
525
+ --cdt-motion-exit: 160ms cubic-bezier(0.4, 0, 1, 1);
526
+ --cdt-motion-slow: 420ms cubic-bezier(0.05, 0.7, 0.1, 1);
527
+ --cdt-motion-spring: 520ms linear(0, 0.075 5%, 0.242 10%, 0.435 15%, 0.616 20%, 0.766 25%, 0.878 30%, 0.967 36%, 1.015 42%, 1.037 50%, 1.033 60%, 1.012 75%, 1);
528
+ --cdt-motion-stagger: 45ms;
501
529
 
502
530
  --cdt-button-min-height: 40px;
503
531
  --cdt-button-min-height-compact: 42px;
@@ -655,7 +683,7 @@
655
683
  --cdt-overlay-drawer-background: #fbfcfd;
656
684
  --cdt-overlay-drawer-width: 500px;
657
685
  --cdt-overlay-enter: 240ms cubic-bezier(0.2, 0, 0, 1);
658
- --cdt-overlay-exit: 140ms cubic-bezier(0.2, 0, 0, 1);
686
+ --cdt-overlay-exit: 160ms cubic-bezier(0.4, 0, 1, 1);
659
687
 
660
688
  --cdt-page-heading-size: clamp(24px, 3vw, 32px);
661
689
  --cdt-page-heading-line-height: 1.16;
@@ -776,6 +804,15 @@
776
804
  --cdt-state-disabled: #e2e8f0;
777
805
  --cdt-state-disabled-policy: #fef3c7;
778
806
 
807
+ --cdt-tone-accent-background: #f3f6fc;
808
+ --cdt-tone-accent-border: #e0e6fa;
809
+ --cdt-tone-accent-background-hover: #e4e9fa;
810
+ --cdt-tone-accent-border-hover: #a7b5ef;
811
+ --cdt-tone-danger-background: #fbf4f4;
812
+ --cdt-tone-danger-border: #f9e0dd;
813
+ --cdt-tone-danger-background-hover: #f9e4e2;
814
+ --cdt-tone-danger-border-hover: #eea39a;
815
+
779
816
  --cdt-dataviz-series-1: #d45946;
780
817
  --cdt-dataviz-series-2: #228f7d;
781
818
  --cdt-dataviz-series-3: #d54e8d;
@@ -852,6 +889,11 @@
852
889
  --cdt-motion-standard: 240ms cubic-bezier(0.2, 0, 0, 1);
853
890
  --cdt-motion-bounce: 300ms cubic-bezier(0.34, 1.56, 0.64, 1);
854
891
  --cdt-motion-spin: 1000ms linear;
892
+ --cdt-motion-instant: 90ms cubic-bezier(0.2, 0, 0, 1);
893
+ --cdt-motion-exit: 160ms cubic-bezier(0.4, 0, 1, 1);
894
+ --cdt-motion-slow: 420ms cubic-bezier(0.05, 0.7, 0.1, 1);
895
+ --cdt-motion-spring: 520ms linear(0, 0.075 5%, 0.242 10%, 0.435 15%, 0.616 20%, 0.766 25%, 0.878 30%, 0.967 36%, 1.015 42%, 1.037 50%, 1.033 60%, 1.012 75%, 1);
896
+ --cdt-motion-stagger: 45ms;
855
897
 
856
898
  --cdt-button-min-height: 40px;
857
899
  --cdt-button-min-height-compact: 42px;
@@ -1009,7 +1051,7 @@
1009
1051
  --cdt-overlay-drawer-background: #fbfcfd;
1010
1052
  --cdt-overlay-drawer-width: 500px;
1011
1053
  --cdt-overlay-enter: 240ms cubic-bezier(0.2, 0, 0, 1);
1012
- --cdt-overlay-exit: 140ms cubic-bezier(0.2, 0, 0, 1);
1054
+ --cdt-overlay-exit: 160ms cubic-bezier(0.4, 0, 1, 1);
1013
1055
 
1014
1056
  --cdt-page-heading-size: clamp(24px, 3vw, 32px);
1015
1057
  --cdt-page-heading-line-height: 1.16;
package/dist/tokens.d.ts CHANGED
@@ -105,6 +105,20 @@ declare const tokens: {
105
105
  readonly disabled: "var(--cdt-state-disabled)";
106
106
  readonly disabledPolicy: "var(--cdt-state-disabled-policy)";
107
107
  };
108
+ readonly tone: {
109
+ readonly accent: {
110
+ readonly background: "var(--cdt-tone-accent-background)";
111
+ readonly border: "var(--cdt-tone-accent-border)";
112
+ readonly backgroundHover: "var(--cdt-tone-accent-background-hover)";
113
+ readonly borderHover: "var(--cdt-tone-accent-border-hover)";
114
+ };
115
+ readonly danger: {
116
+ readonly background: "var(--cdt-tone-danger-background)";
117
+ readonly border: "var(--cdt-tone-danger-border)";
118
+ readonly backgroundHover: "var(--cdt-tone-danger-background-hover)";
119
+ readonly borderHover: "var(--cdt-tone-danger-border-hover)";
120
+ };
121
+ };
108
122
  readonly dataviz: {
109
123
  readonly series: {
110
124
  readonly "1": "var(--cdt-dataviz-series-1)";
@@ -172,6 +186,11 @@ declare const tokens: {
172
186
  readonly standard: "var(--cdt-motion-standard)";
173
187
  readonly bounce: "var(--cdt-motion-bounce)";
174
188
  readonly spin: "var(--cdt-motion-spin)";
189
+ readonly instant: "var(--cdt-motion-instant)";
190
+ readonly exit: "var(--cdt-motion-exit)";
191
+ readonly slow: "var(--cdt-motion-slow)";
192
+ readonly spring: "var(--cdt-motion-spring)";
193
+ readonly stagger: "var(--cdt-motion-stagger)";
175
194
  };
176
195
  readonly button: {
177
196
  readonly minHeight: "var(--cdt-button-min-height)";
package/dist/tokens.js CHANGED
@@ -99,6 +99,20 @@ var tokens = {
99
99
  disabled: "var(--cdt-state-disabled)",
100
100
  disabledPolicy: "var(--cdt-state-disabled-policy)"
101
101
  },
102
+ tone: {
103
+ accent: {
104
+ background: "var(--cdt-tone-accent-background)",
105
+ border: "var(--cdt-tone-accent-border)",
106
+ backgroundHover: "var(--cdt-tone-accent-background-hover)",
107
+ borderHover: "var(--cdt-tone-accent-border-hover)"
108
+ },
109
+ danger: {
110
+ background: "var(--cdt-tone-danger-background)",
111
+ border: "var(--cdt-tone-danger-border)",
112
+ backgroundHover: "var(--cdt-tone-danger-background-hover)",
113
+ borderHover: "var(--cdt-tone-danger-border-hover)"
114
+ }
115
+ },
102
116
  dataviz: {
103
117
  series: {
104
118
  "1": "var(--cdt-dataviz-series-1)",
@@ -165,7 +179,12 @@ var tokens = {
165
179
  fast: "var(--cdt-motion-fast)",
166
180
  standard: "var(--cdt-motion-standard)",
167
181
  bounce: "var(--cdt-motion-bounce)",
168
- spin: "var(--cdt-motion-spin)"
182
+ spin: "var(--cdt-motion-spin)",
183
+ instant: "var(--cdt-motion-instant)",
184
+ exit: "var(--cdt-motion-exit)",
185
+ slow: "var(--cdt-motion-slow)",
186
+ spring: "var(--cdt-motion-spring)",
187
+ stagger: "var(--cdt-motion-stagger)"
169
188
  },
170
189
  button: {
171
190
  minHeight: "var(--cdt-button-min-height)",
package/dist/tokens.json CHANGED
@@ -582,6 +582,94 @@
582
582
  "light": "#fef3c7"
583
583
  }
584
584
  },
585
+ {
586
+ "key": "tone.accent.background",
587
+ "cssName": "--cdt-tone-accent-background",
588
+ "tier": "semantic",
589
+ "usage": "decorative",
590
+ "description": "Secondary accent-tone button rest fill: 4% of `accent` over `surface.raised`, mixed in OKLab at build time (CR-050).",
591
+ "values": {
592
+ "dark": "#172131",
593
+ "light": "#f3f6fc"
594
+ }
595
+ },
596
+ {
597
+ "key": "tone.accent.border",
598
+ "cssName": "--cdt-tone-accent-border",
599
+ "tier": "semantic",
600
+ "usage": "decorative",
601
+ "description": "Secondary accent-tone button rest edge: 14% of `accent` over `surface.raised`, mixed in OKLab at build time (CR-050).",
602
+ "values": {
603
+ "dark": "#1f2944",
604
+ "light": "#e0e6fa"
605
+ }
606
+ },
607
+ {
608
+ "key": "tone.accent.backgroundHover",
609
+ "cssName": "--cdt-tone-accent-background-hover",
610
+ "tier": "semantic",
611
+ "usage": "decorative",
612
+ "description": "Secondary accent-tone button hover fill: 12% of `accent` over `surface.raised`, mixed in OKLab at build time (CR-050).",
613
+ "values": {
614
+ "dark": "#1d2840",
615
+ "light": "#e4e9fa"
616
+ }
617
+ },
618
+ {
619
+ "key": "tone.accent.borderHover",
620
+ "cssName": "--cdt-tone-accent-border-hover",
621
+ "tier": "semantic",
622
+ "usage": "decorative",
623
+ "description": "Secondary accent-tone button hover edge: 45% of `accent` over `surface.raised`, mixed in OKLab at build time (CR-050).",
624
+ "values": {
625
+ "dark": "#394682",
626
+ "light": "#a7b5ef"
627
+ }
628
+ },
629
+ {
630
+ "key": "tone.danger.background",
631
+ "cssName": "--cdt-tone-danger-background",
632
+ "tier": "semantic",
633
+ "usage": "decorative",
634
+ "description": "Secondary danger-tone button rest fill: 4% of `status.danger` over `surface.raised`, mixed in OKLab at build time (CR-050).",
635
+ "values": {
636
+ "dark": "#1d202c",
637
+ "light": "#fbf4f4"
638
+ }
639
+ },
640
+ {
641
+ "key": "tone.danger.border",
642
+ "cssName": "--cdt-tone-danger-border",
643
+ "tier": "semantic",
644
+ "usage": "decorative",
645
+ "description": "Secondary danger-tone button rest edge: 14% of `status.danger` over `surface.raised`, mixed in OKLab at build time (CR-050).",
646
+ "values": {
647
+ "dark": "#312630",
648
+ "light": "#f9e0dd"
649
+ }
650
+ },
651
+ {
652
+ "key": "tone.danger.backgroundHover",
653
+ "cssName": "--cdt-tone-danger-background-hover",
654
+ "tier": "semantic",
655
+ "usage": "decorative",
656
+ "description": "Secondary danger-tone button hover fill: 12% of `status.danger` over `surface.raised`, mixed in OKLab at build time (CR-050).",
657
+ "values": {
658
+ "dark": "#2d252f",
659
+ "light": "#f9e4e2"
660
+ }
661
+ },
662
+ {
663
+ "key": "tone.danger.borderHover",
664
+ "cssName": "--cdt-tone-danger-border-hover",
665
+ "tier": "semantic",
666
+ "usage": "decorative",
667
+ "description": "Secondary danger-tone button hover edge: 45% of `status.danger` over `surface.raised`, mixed in OKLab at build time (CR-050).",
668
+ "values": {
669
+ "dark": "#72363a",
670
+ "light": "#eea39a"
671
+ }
672
+ },
585
673
  {
586
674
  "key": "dataviz.series.1",
587
675
  "cssName": "--cdt-dataviz-series-1",
@@ -1357,6 +1445,61 @@
1357
1445
  "light": "1000ms linear"
1358
1446
  }
1359
1447
  },
1448
+ {
1449
+ "key": "motion.instant",
1450
+ "cssName": "--cdt-motion-instant",
1451
+ "tier": "semantic",
1452
+ "usage": "decorative",
1453
+ "description": "Press feedback and pointer-tracking highlights.",
1454
+ "values": {
1455
+ "dark": "90ms cubic-bezier(0.2, 0, 0, 1)",
1456
+ "light": "90ms cubic-bezier(0.2, 0, 0, 1)"
1457
+ }
1458
+ },
1459
+ {
1460
+ "key": "motion.exit",
1461
+ "cssName": "--cdt-motion-exit",
1462
+ "tier": "semantic",
1463
+ "usage": "decorative",
1464
+ "description": "Overlay, popover and drawer exits.",
1465
+ "values": {
1466
+ "dark": "160ms cubic-bezier(0.4, 0, 1, 1)",
1467
+ "light": "160ms cubic-bezier(0.4, 0, 1, 1)"
1468
+ }
1469
+ },
1470
+ {
1471
+ "key": "motion.slow",
1472
+ "cssName": "--cdt-motion-slow",
1473
+ "tier": "semantic",
1474
+ "usage": "decorative",
1475
+ "description": "Drawers and other large surfaces entering.",
1476
+ "values": {
1477
+ "dark": "420ms cubic-bezier(0.05, 0.7, 0.1, 1)",
1478
+ "light": "420ms cubic-bezier(0.05, 0.7, 0.1, 1)"
1479
+ }
1480
+ },
1481
+ {
1482
+ "key": "motion.spring",
1483
+ "cssName": "--cdt-motion-spring",
1484
+ "tier": "semantic",
1485
+ "usage": "decorative",
1486
+ "description": "Spring settle for dialogs, popovers and checked indicators (entrances only).",
1487
+ "values": {
1488
+ "dark": "520ms linear(0, 0.075 5%, 0.242 10%, 0.435 15%, 0.616 20%, 0.766 25%, 0.878 30%, 0.967 36%, 1.015 42%, 1.037 50%, 1.033 60%, 1.012 75%, 1)",
1489
+ "light": "520ms linear(0, 0.075 5%, 0.242 10%, 0.435 15%, 0.616 20%, 0.766 25%, 0.878 30%, 0.967 36%, 1.015 42%, 1.037 50%, 1.033 60%, 1.012 75%, 1)"
1490
+ }
1491
+ },
1492
+ {
1493
+ "key": "motion.stagger",
1494
+ "cssName": "--cdt-motion-stagger",
1495
+ "tier": "semantic",
1496
+ "usage": "decorative",
1497
+ "description": "Delay step between items of a staged entrance; a duration, never an easing.",
1498
+ "values": {
1499
+ "dark": "45ms",
1500
+ "light": "45ms"
1501
+ }
1502
+ },
1360
1503
  {
1361
1504
  "key": "button.minHeight",
1362
1505
  "cssName": "--cdt-button-min-height",
@@ -3053,10 +3196,10 @@
3053
3196
  "tier": "component",
3054
3197
  "usage": "decorative",
3055
3198
  "description": "Overlay exit.",
3056
- "alias": "motion.fast",
3199
+ "alias": "motion.exit",
3057
3200
  "values": {
3058
- "dark": "140ms cubic-bezier(0.2, 0, 0, 1)",
3059
- "light": "140ms cubic-bezier(0.2, 0, 0, 1)"
3201
+ "dark": "160ms cubic-bezier(0.4, 0, 1, 1)",
3202
+ "light": "160ms cubic-bezier(0.4, 0, 1, 1)"
3060
3203
  }
3061
3204
  },
3062
3205
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conductor-by-89soone/tokens",
3
- "version": "0.5.0",
3
+ "version": "0.6.1",
4
4
  "description": "Theme-aware design tokens and validation CLIs for Conductor.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://89sooner.github.io/design-system/",