okchroma 0.3.1 → 0.5.0
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/README.md +3 -3
- package/dist-lib/index.cjs +107 -69
- package/dist-lib/index.mjs +107 -69
- package/dist-lib/types/engine/collision.d.ts +3 -3
- package/dist-lib/types/engine/colorEngine.d.ts +1 -1
- package/dist-lib/types/engine/cssRender.d.ts +17 -2
- package/dist-lib/types/engine/figmaRender.d.ts +8 -3
- package/dist-lib/types/engine/requirements/spec.d.ts +2 -2
- package/dist-lib/types/engine/tokenNames.d.ts +1 -1
- package/dist-lib/types/index.d.ts +3 -3
- package/package.json +1 -1
- package/tokens/semantic.css +90 -97
package/dist-lib/index.mjs
CHANGED
|
@@ -318,7 +318,7 @@ var NEUTRAL_TINT_POINTS = {
|
|
|
318
318
|
[0.95, 0.895],
|
|
319
319
|
// paper-3 ─┘
|
|
320
320
|
[0.924, 1],
|
|
321
|
-
// wash-4 ─┐ peak: the mid-
|
|
321
|
+
// wash-4 ─┐ peak: the mid-chalk band, the neutral's most-branded moment
|
|
322
322
|
[0.892, 1],
|
|
323
323
|
// wash-5 ─┘
|
|
324
324
|
[0.852, 0.842],
|
|
@@ -326,7 +326,7 @@ var NEUTRAL_TINT_POINTS = {
|
|
|
326
326
|
[0.801, 0.653],
|
|
327
327
|
// wash-7 │
|
|
328
328
|
[0.738, 0.505],
|
|
329
|
-
//
|
|
329
|
+
// highlighter-26
|
|
330
330
|
[0.6, 0.4],
|
|
331
331
|
// knee (ex-scaffold) the drop-off: hue fades as you climb
|
|
332
332
|
[0.56, 0.347],
|
|
@@ -352,7 +352,7 @@ var NEUTRAL_TINT_POINTS = {
|
|
|
352
352
|
[0.42, 0.653],
|
|
353
353
|
// wash-7
|
|
354
354
|
[0.55, 0.505],
|
|
355
|
-
//
|
|
355
|
+
// highlighter-26
|
|
356
356
|
[0.6, 0.4],
|
|
357
357
|
// knee (ex-scaffold)
|
|
358
358
|
[0.64, 0.347],
|
|
@@ -727,18 +727,18 @@ var SHARED_NAMES = {
|
|
|
727
727
|
2: "paper-3",
|
|
728
728
|
// stop 3 renamed wash-3 → paper-3 (owner 2026-07-24, elevation round): it is a
|
|
729
729
|
// PLANE in both themes (light sink / dark pop), so it belongs to the surface band.
|
|
730
|
-
// NAME ONLY — generation is index-keyed and unchanged; the
|
|
731
|
-
// (collision.ts
|
|
730
|
+
// NAME ONLY — generation is index-keyed and unchanged; the chalk-collision machinery
|
|
731
|
+
// (collision.ts CHALK_STOPS) deliberately still spans stops 3–7. (The requirement
|
|
732
732
|
// spec's `group` label followed the band to 'paper' on 2026-08-31 — labels only,
|
|
733
733
|
// the spans never moved; see spec.ts groupOf.)
|
|
734
734
|
// Stage B (owner 2026-08-07, names only): relabeled to the ROOT_L-derived digit,
|
|
735
735
|
// paper-5 — same band, same index.
|
|
736
736
|
3: "paper-5",
|
|
737
|
-
4: "
|
|
738
|
-
5: "
|
|
739
|
-
6: "
|
|
740
|
-
7: "
|
|
741
|
-
8: "
|
|
737
|
+
4: "chalk-8",
|
|
738
|
+
5: "chalk-11",
|
|
739
|
+
6: "chalk-15",
|
|
740
|
+
7: "chalk-20",
|
|
741
|
+
8: "highlighter-26",
|
|
742
742
|
// THE PEN BAND (C49, owner 2026-08-05): the first text stop + emphasis fill (the
|
|
743
743
|
// 2026-07-29 highlight collapse — the old highlight-9 and on-highlight are
|
|
744
744
|
// deleted; this stop carries both jobs, its on-color a paper token), the between
|
|
@@ -790,13 +790,12 @@ var SYSTEM_LEAF = {
|
|
|
790
790
|
},
|
|
791
791
|
ALPHA: {
|
|
792
792
|
TRANSPARENT: "system/alpha/transparent",
|
|
793
|
-
SCRIM: "system/alpha/abs-black-060",
|
|
794
793
|
INK: "system/alpha/ink",
|
|
795
794
|
// the DIRECTIONAL ladders (owner 2026-08-31, renaming the 2026-08-18 bare rungs
|
|
796
795
|
// and the 2026-08-29 inverse ladder): away-from-bg is the page-polarity pole
|
|
797
796
|
// (black in light, white in dark), toward-bg the flipped pole — STATE LAYERS for
|
|
798
797
|
// INVERTED grounds, whose polarity is opposite the page's. (Never call toward-bg
|
|
799
|
-
// a "
|
|
798
|
+
// a "chalk": that word belongs to the tinted band stops.) The reversal lives in
|
|
800
799
|
// the engine: a consumer on an inverted ground names one token and never picks a
|
|
801
800
|
// pole. Colored fills never ride these; their states stay engine-solved stops.
|
|
802
801
|
// Rungs are two-digit percent, harmonizing with shadow-04/08/12.
|
|
@@ -809,6 +808,19 @@ var SYSTEM_LEAF = {
|
|
|
809
808
|
SHADOW_04: "system/alpha/shadow-04",
|
|
810
809
|
SHADOW_08: "system/alpha/shadow-08",
|
|
811
810
|
SHADOW_12: "system/alpha/shadow-12"
|
|
811
|
+
},
|
|
812
|
+
// the OPACITY LADDER's rows: bare numbers, never colors. `alpha` above is the group
|
|
813
|
+
// of colors that carry transparency; `opacity` is the numbers they compose with
|
|
814
|
+
// (values in cssRender OPACITY_RUNGS; the ext plugin zones these under utility/).
|
|
815
|
+
OPACITY: {
|
|
816
|
+
"004": "system/opacity/004",
|
|
817
|
+
"008": "system/opacity/008",
|
|
818
|
+
"012": "system/opacity/012",
|
|
819
|
+
"016": "system/opacity/016",
|
|
820
|
+
"024": "system/opacity/024",
|
|
821
|
+
"032": "system/opacity/032",
|
|
822
|
+
"048": "system/opacity/048",
|
|
823
|
+
"064": "system/opacity/064"
|
|
812
824
|
}
|
|
813
825
|
};
|
|
814
826
|
var SURFACE_PLANE_LAW = {
|
|
@@ -841,14 +853,14 @@ var P_FIXED = { hue: "warm-torsion", L: "fixed", chroma: "ladder" };
|
|
|
841
853
|
var P_TEXT = { hue: "warm-torsion", L: "perceptual", chroma: "brand" };
|
|
842
854
|
var S8 = { metric: "wcag", against: "paper-5", target: STOP_8_NONTEXT_CONTRAST, level: "AA" };
|
|
843
855
|
var T9 = { metric: "wcag", against: "paper-5", target: PENCIL_9_CONTRAST, level: "AA" };
|
|
844
|
-
var T10 = { metric: "wcag", against: "
|
|
856
|
+
var T10 = { metric: "wcag", against: "chalk-20", target: PEN_10_CONTRAST, level: "AA" };
|
|
845
857
|
var T11 = { metric: "wcag", against: "paper-5", target: PEN_11_CONTRAST_FLOOR, level: "AAA" };
|
|
846
858
|
var ONS = { onFill: { metric: "apca-pole", enforce: true, ratioFloor: 4.5, coEnforceLc: 65 } };
|
|
847
859
|
var LIGHT = {
|
|
848
860
|
stops: [
|
|
849
861
|
// paper-0 (paper-0 pre-Stage-B): the resolved ladder extreme — in light it genuinely is white (rootL 1.0, zero chroma)
|
|
850
862
|
{ stop: 0, rootL: 1, group: groupOf(0), produce: { hue: "warm-drift", L: "fixed", chroma: "ladder" }, satFraction: SCALE_C_LIGHT[0].sat, baseC: SCALE_C_LIGHT[0].base },
|
|
851
|
-
// paper/highlighter
|
|
863
|
+
// paper/chalk/highlighter-26: perceptual ladder/envelope blend on the geometric ROOT_L_LIGHT scaffold. Separation
|
|
852
864
|
// falls out of the shape (see above) — no min-separation require. Only stop 8 carries a require: the WCAG
|
|
853
865
|
// 3:1 vs the resolved paper-3 (paper-2) (re-solves automatically since it references paper-3 (paper-2)).
|
|
854
866
|
...[1, 2, 3, 4, 5, 6, 7, 8].map((stop) => ({
|
|
@@ -879,7 +891,7 @@ var DARK = {
|
|
|
879
891
|
// paper-0 (paper-0 pre-Stage-B): the resolved ladder extreme — one seam BELOW paper-1 (paper-1), deep and brand-tinted, never the
|
|
880
892
|
// absolute void (the old hard-coded #000000 was "too much"). Lift applies like the rest of the scale.
|
|
881
893
|
{ stop: 0, rootL: PAPER0_DARK_ROOT_L, group: groupOf(0), produce: P_LIFT, satFraction: SCALE_C_DARK[0].sat },
|
|
882
|
-
// paper/
|
|
894
|
+
// paper/chalk 1–7: perceptual on the dark scaffold. stop 8: FIXED at the hand-placed scaffold BUT with the
|
|
883
895
|
// 3:1 non-text require DECLARED (the Stage-5 flip, owner-approved) — the blue-recede failure is prevented
|
|
884
896
|
// BY RULE, not by patch. The require now genuinely PLACES the stop rather than catching a few low-luminance
|
|
885
897
|
// hues: on the delta-carry path it solves from the sentinel every time, and the old claim that "most hues
|
|
@@ -1824,7 +1836,7 @@ function p2Diff(a, b) {
|
|
|
1824
1836
|
var DEFAULT_APCA_LC_MAP = { 3: 30, 4.5: 75, 6.5: 85, 7: 90 };
|
|
1825
1837
|
function toApca(req, lcMap) {
|
|
1826
1838
|
if (req.metric !== "wcag") return req;
|
|
1827
|
-
if (req.against === "
|
|
1839
|
+
if (req.against === "chalk-20") return { metric: "apca", against: "paper-3", targetLc: 85 };
|
|
1828
1840
|
const targetLc = lcMap[req.target];
|
|
1829
1841
|
if (targetLc === void 0) throw new Error(`apca profile: no Lc mapping for wcag target ${req.target}`);
|
|
1830
1842
|
return { metric: "apca", against: req.against, targetLc };
|
|
@@ -2310,7 +2322,7 @@ function resolveRamp(hex, mode, spec, opts) {
|
|
|
2310
2322
|
if (!ref) throw new Error(`stop ${forWhom}: require against stop ${stopNum} but it is not resolved yet`);
|
|
2311
2323
|
return ref;
|
|
2312
2324
|
};
|
|
2313
|
-
const AGAINST_STOP = { "paper-1": 1, "paper-3": 2, "paper-5": 3, "
|
|
2325
|
+
const AGAINST_STOP = { "paper-1": 1, "paper-3": 2, "paper-5": 3, "chalk-20": 7 };
|
|
2314
2326
|
const declaredAnchor = (req) => req.metric === "min-separation" ? 1 : AGAINST_STOP[req.against] ?? 2;
|
|
2315
2327
|
const wcagAnchorStop = (req, stop) => stop >= 9 && declaredAnchor(req) <= 3 ? 3 : declaredAnchor(req);
|
|
2316
2328
|
const textGround = ctx.opts?.textGround?.[mode];
|
|
@@ -2424,13 +2436,13 @@ function resolveRamp(hex, mode, spec, opts) {
|
|
|
2424
2436
|
const own = contrastRatio(y2, anchorShipY);
|
|
2425
2437
|
return paperBound ? Math.min(own, contrastRatio(y2, crossBoundY)) : own;
|
|
2426
2438
|
};
|
|
2427
|
-
const
|
|
2428
|
-
const
|
|
2439
|
+
const chalkBoundY = ctx.opts?.crossChalkBoundY && sp.stop >= 10 && !textGround ? ctx.opts.crossChalkBoundY[mode] : void 0;
|
|
2440
|
+
const chalkRatio = (L) => chalkBoundY === void 0 ? Infinity : contrastRatio(shippedY(L, placed.C, placed.H), chalkBoundY);
|
|
2429
2441
|
const paperBoundY = ctx.opts?.crossPaperBoundY && sp.stop >= 8 && !textGround ? ctx.opts.crossPaperBoundY[mode] : void 0;
|
|
2430
2442
|
const paperBar = sp.stop === 8 ? STOP_8_NONTEXT_CONTRAST : sp.stop === 9 ? PENCIL_9_CONTRAST : PEN_10_CONTRAST;
|
|
2431
2443
|
const paperRatio = (L) => paperBoundY === void 0 ? Infinity : contrastRatio(shippedY(L, placed.C, placed.H), paperBoundY);
|
|
2432
2444
|
const target = sp.require.target;
|
|
2433
|
-
const clears = (L) => shipRatio(L) >= target &&
|
|
2445
|
+
const clears = (L) => shipRatio(L) >= target && chalkRatio(L) >= PEN_10_CONTRAST && paperRatio(L) >= paperBar;
|
|
2434
2446
|
if (!clears(placed.L)) {
|
|
2435
2447
|
const away = shippedY(placed.L, placed.C, placed.H) < anchorShipY ? -1 : 1;
|
|
2436
2448
|
let L2 = placed.L;
|
|
@@ -2446,7 +2458,7 @@ function resolveRamp(hex, mode, spec, opts) {
|
|
|
2446
2458
|
shipRatio(placed.L)
|
|
2447
2459
|
);
|
|
2448
2460
|
if (got < sp.require.target - 1e-3) unresolvable = `stop ${sp.stop}: contrast ${got.toFixed(2)} < required ${sp.require.target}`;
|
|
2449
|
-
else if (
|
|
2461
|
+
else if (chalkRatio(placed.L) < PEN_10_CONTRAST - 1e-3) unresolvable = `stop ${sp.stop}: contrast ${chalkRatio(placed.L).toFixed(2)} < required ${PEN_10_CONTRAST} on the worst chromatic chalk-20`;
|
|
2450
2462
|
else if (paperRatio(placed.L) < paperBar - 1e-3) unresolvable = `stop ${sp.stop}: contrast ${paperRatio(placed.L).toFixed(2)} < required ${paperBar} on the worst chromatic paper-5`;
|
|
2451
2463
|
} else if (sp.require?.metric === "apca") {
|
|
2452
2464
|
const ga = apcaGroundOf(sp.require, sp.stop);
|
|
@@ -2638,6 +2650,12 @@ function generateScale(hex, scaleName, forcedArchetype, opts) {
|
|
|
2638
2650
|
pen100Dark: penPole(dark, 1)
|
|
2639
2651
|
};
|
|
2640
2652
|
}
|
|
2653
|
+
function neutralTintHue(primaryH, source, secondaryH, customHex) {
|
|
2654
|
+
if (source === "secondary" && secondaryH !== void 0) return secondaryH;
|
|
2655
|
+
if (source === "custom" && customHex && /^#?[0-9a-fA-F]{6}$/.test(customHex))
|
|
2656
|
+
return hexToOklch(customHex.startsWith("#") ? customHex : `#${customHex}`).H;
|
|
2657
|
+
return primaryH;
|
|
2658
|
+
}
|
|
2641
2659
|
function generateNeutralScale(brandH, level = "default", contrastProfile) {
|
|
2642
2660
|
const h = (brandH % 360 + 360) % 360;
|
|
2643
2661
|
const { r, g: g2, b } = oklchToSrgbUnclamped(0.5, 6e-3, h);
|
|
@@ -2648,9 +2666,9 @@ function generateNeutralScale(brandH, level = "default", contrastProfile) {
|
|
|
2648
2666
|
chromaCurve: curve,
|
|
2649
2667
|
enforceOnFillContrast: true,
|
|
2650
2668
|
contrastProfile,
|
|
2651
|
-
// T13: the neutral's pens clear every chromatic family's
|
|
2669
|
+
// T13: the neutral's pens clear every chromatic family's chalk-20 (the symmetric
|
|
2652
2670
|
// pen guarantee); the chromatic ramps clear the neutral's through NEUTRAL_W80_WORST_SHIP_Y
|
|
2653
|
-
|
|
2671
|
+
crossChalkBoundY: CHROMATIC_W80_WORST_SHIP_Y,
|
|
2654
2672
|
crossPaperBoundY: CHROMATIC_P3_WORST_SHIP_Y
|
|
2655
2673
|
});
|
|
2656
2674
|
const asCta = (stop, src) => makeStop(stop, src.L, src.C, src.H);
|
|
@@ -2747,7 +2765,7 @@ var COLOR_WORD = {
|
|
|
2747
2765
|
[FAMILY.info]: " (blue)"
|
|
2748
2766
|
};
|
|
2749
2767
|
var PAPER = { req: "backgrounds, inverted text", theming: (f) => TINT[f], collides: true };
|
|
2750
|
-
var
|
|
2768
|
+
var CHALK = { req: "decorative borders, inverted text, illos, signal hierarchy", theming: (f) => TINT[f], collides: true };
|
|
2751
2769
|
var solved = (f) => `${TINT[f]}; re-solved to clear its floor`;
|
|
2752
2770
|
var OVERLAY = {
|
|
2753
2771
|
req: "translucent backgrounds that hold their reading on any paper",
|
|
@@ -2761,13 +2779,13 @@ var SCALE = {
|
|
|
2761
2779
|
"paper-97-overlay": OVERLAY,
|
|
2762
2780
|
"paper-5": { req: "backgrounds, inverted text", theming: (f) => `${TINT[f]}. Worst background text stops must clear.`, collides: true },
|
|
2763
2781
|
"paper-95-overlay": OVERLAY,
|
|
2764
|
-
"
|
|
2765
|
-
"
|
|
2766
|
-
"
|
|
2767
|
-
"
|
|
2782
|
+
"chalk-8": CHALK,
|
|
2783
|
+
"chalk-11": CHALK,
|
|
2784
|
+
"chalk-15": CHALK,
|
|
2785
|
+
"chalk-20": CHALK,
|
|
2768
2786
|
// ("icons" KEPT through the 2026-08-28 on-flood strip (owner): an "icon" query
|
|
2769
|
-
// landing on the
|
|
2770
|
-
"
|
|
2787
|
+
// landing on the highlighter rows is worth its ic-ON-s noise — the one surviving body carrier)
|
|
2788
|
+
"highlighter-26": { req: "focus rings, icons, large text, translucent state layers over any ground", contrast: AA_LARGE, theming: solved, collides: true },
|
|
2771
2789
|
"pencil-47": { req: "regular text, inverted backgrounds", contrast: AA_BODY, theming: solved, collides: true },
|
|
2772
2790
|
"pen-58": { req: "regular text, inverted backgrounds", contrast: AA_BODY, theming: solved, collides: true },
|
|
2773
2791
|
// ("high-emphasis" reworded 2026-08-12: the surface planes took low/high as label
|
|
@@ -2788,6 +2806,8 @@ var ABS = { req: "extreme poles for CTAs, aliased global endpoints" };
|
|
|
2788
2806
|
var OFFSET = { req: "min APCA visibility", theming: "offsets CTAs in themes where they sit close to the page" };
|
|
2789
2807
|
var OFFSET_INVERSE = { req: "state layers over inverted backgrounds", theming: "the offset ladder with its pole flipped, so inverted grounds keep the same rungs" };
|
|
2790
2808
|
var SHADOW = { req: "drop shadows" };
|
|
2809
|
+
var OPACITY_RUNG = { req: "translucency weight for any color", theming: "a bare number; a translucent row composes its color with one rung" };
|
|
2810
|
+
var OPACITY_STATE = { req: "translucency weight for any color; the state layer weight of the non-text stop over any ground", theming: "a bare number; a translucent row composes its color with one rung" };
|
|
2791
2811
|
var PLANE = (req) => ({ req, theming: "aliased to the gray ramp" });
|
|
2792
2812
|
var LINK = (state, contrast) => ({
|
|
2793
2813
|
req: "links" + state,
|
|
@@ -2809,8 +2829,17 @@ var SYSTEM = {
|
|
|
2809
2829
|
// ("companion" reworded 2026-08-28: compani-ON fed the "on" flood)
|
|
2810
2830
|
"system/abs-alt": { req: "identity seed reference", theming: "the theme\u2019s paired input, as given" },
|
|
2811
2831
|
"system/alpha/transparent": { req: "aliased off-states" },
|
|
2812
|
-
//
|
|
2813
|
-
|
|
2832
|
+
// the OPACITY LADDER: bare numbers a translucent color row composes with (the
|
|
2833
|
+
// scrim is the absolute black at the top rung). No conformance line of its own:
|
|
2834
|
+
// the state-layer claim rides the non-text stop these weights apply to
|
|
2835
|
+
"system/opacity/004": OPACITY_RUNG,
|
|
2836
|
+
"system/opacity/008": OPACITY_STATE,
|
|
2837
|
+
"system/opacity/012": OPACITY_STATE,
|
|
2838
|
+
"system/opacity/016": OPACITY_STATE,
|
|
2839
|
+
"system/opacity/024": OPACITY_STATE,
|
|
2840
|
+
"system/opacity/032": OPACITY_STATE,
|
|
2841
|
+
"system/opacity/048": OPACITY_RUNG,
|
|
2842
|
+
"system/opacity/064": OPACITY_RUNG,
|
|
2814
2843
|
// ("fills" reworded 2026-08-18: fill became a label word and is foreign here;
|
|
2815
2844
|
// "on-color" reworded 2026-08-28: the bare on fed the "on" flood)
|
|
2816
2845
|
"system/alpha/ink": { req: "soft text pole for quiet CTAs" },
|
|
@@ -2818,7 +2847,7 @@ var SYSTEM = {
|
|
|
2818
2847
|
"system/alpha/away-from-bg/08": OFFSET,
|
|
2819
2848
|
"system/alpha/away-from-bg/16": OFFSET,
|
|
2820
2849
|
// the inverse ladder: the offset rungs with the pole flipped per mode, for
|
|
2821
|
-
//
|
|
2850
|
+
// chalks and edges over inverted backgrounds ("interaction" avoided in the
|
|
2822
2851
|
// bodies: acti-ON would feed the "on" flood)
|
|
2823
2852
|
"system/alpha/toward-bg/06": OFFSET_INVERSE,
|
|
2824
2853
|
"system/alpha/toward-bg/08": OFFSET_INVERSE,
|
|
@@ -2885,15 +2914,15 @@ function checkCollision(brand, signalScale, signalDef, mode) {
|
|
|
2885
2914
|
collides: hueGate && deltaE <= threshold
|
|
2886
2915
|
};
|
|
2887
2916
|
}
|
|
2888
|
-
var
|
|
2917
|
+
var HUE_COLLISION_CHALK_DEG = 15;
|
|
2889
2918
|
var HUE_COLLISION_MIN_V = 0.5;
|
|
2890
2919
|
var SECONDARY_NOTE_MIN_V = HUE_NOISE_C / VIVID_C;
|
|
2891
|
-
var
|
|
2892
|
-
function
|
|
2920
|
+
var CHALK_STOPS = [3, 4, 5, 6, 7];
|
|
2921
|
+
function chalkProximity(brand, sig, mode) {
|
|
2893
2922
|
const b = mode === "light" ? brand.light : brand.dark;
|
|
2894
2923
|
const s = mode === "light" ? sig.light : sig.dark;
|
|
2895
2924
|
let dH = Infinity, dE = Infinity;
|
|
2896
|
-
for (const k of
|
|
2925
|
+
for (const k of CHALK_STOPS) {
|
|
2897
2926
|
const bs = b.find((x2) => x2.stop === k), ss = s.find((x2) => x2.stop === k);
|
|
2898
2927
|
if (!bs || !ss) continue;
|
|
2899
2928
|
dH = Math.min(dH, hueDistance(bs.H, ss.H));
|
|
@@ -2902,15 +2931,15 @@ function highlighterProximity(brand, sig, mode) {
|
|
|
2902
2931
|
return { dH, dE };
|
|
2903
2932
|
}
|
|
2904
2933
|
function checkHueCollision(brand, signalScale, signalDef, opts) {
|
|
2905
|
-
const l =
|
|
2906
|
-
const d =
|
|
2934
|
+
const l = chalkProximity(brand, signalScale, "light");
|
|
2935
|
+
const d = chalkProximity(brand, signalScale, "dark");
|
|
2907
2936
|
const vividness = Math.min(1, brand.brandC / VIVID_C);
|
|
2908
2937
|
return {
|
|
2909
2938
|
signal: signalDef.name,
|
|
2910
|
-
|
|
2911
|
-
|
|
2939
|
+
dHueChalk: { light: l.dH, dark: d.dH },
|
|
2940
|
+
chalkDeltaE: { light: l.dE, dark: d.dE },
|
|
2912
2941
|
vividness,
|
|
2913
|
-
collides: vividness >= (opts?.minV ?? HUE_COLLISION_MIN_V) && Math.min(l.dH, d.dH) <=
|
|
2942
|
+
collides: vividness >= (opts?.minV ?? HUE_COLLISION_MIN_V) && Math.min(l.dH, d.dH) <= HUE_COLLISION_CHALK_DEG
|
|
2914
2943
|
};
|
|
2915
2944
|
}
|
|
2916
2945
|
var YELLOW_SPLIT_H = 96;
|
|
@@ -3303,7 +3332,7 @@ function resolveTheme(input) {
|
|
|
3303
3332
|
for (const def of SIGNALS2) {
|
|
3304
3333
|
if (adoptedForSecondary.has(def.name)) continue;
|
|
3305
3334
|
const h = checkHueCollision(scale2, effectiveOf(def.name), def, { minV: SECONDARY_NOTE_MIN_V });
|
|
3306
|
-
if (h.collides) out.push(wording(def.name, Math.min(h.
|
|
3335
|
+
if (h.collides) out.push(wording(def.name, Math.min(h.chalkDeltaE.light, h.chalkDeltaE.dark)));
|
|
3307
3336
|
}
|
|
3308
3337
|
return out;
|
|
3309
3338
|
};
|
|
@@ -3353,7 +3382,7 @@ function resolveTheme(input) {
|
|
|
3353
3382
|
derived: true,
|
|
3354
3383
|
notes: [
|
|
3355
3384
|
`secondary derived from the brand color (default model, seed ${liftedHex})`,
|
|
3356
|
-
...signalNotesFor(scale2, (name, dE) => `derived secondary sits on the ${name} signal's hue (
|
|
3385
|
+
...signalNotesFor(scale2, (name, dE) => `derived secondary sits on the ${name} signal's hue (chalk \u0394E ${dE.toFixed(3)}) \u2014 it tracks the brand color`)
|
|
3357
3386
|
],
|
|
3358
3387
|
distinctness: ctaDistinctness(primary.scale, scale2)
|
|
3359
3388
|
},
|
|
@@ -3378,7 +3407,7 @@ function resolveTheme(input) {
|
|
|
3378
3407
|
derived: false,
|
|
3379
3408
|
notes: [
|
|
3380
3409
|
`secondary keeps your color through the ramp; the cta is a tint of it (tint seed ${tintedHex})`,
|
|
3381
|
-
...signalNotesFor(scale2, (name, dE) => `secondary sits on the ${name} signal's hue (
|
|
3410
|
+
...signalNotesFor(scale2, (name, dE) => `secondary sits on the ${name} signal's hue (chalk \u0394E ${dE.toFixed(3)}) \u2014 it tracks your color`)
|
|
3382
3411
|
],
|
|
3383
3412
|
distinctness: distinctness2
|
|
3384
3413
|
},
|
|
@@ -3390,7 +3419,7 @@ function resolveTheme(input) {
|
|
|
3390
3419
|
const scale = rSec.scale;
|
|
3391
3420
|
const level = "standard";
|
|
3392
3421
|
mergeSecondarySignals(scale, input.secondaryHex);
|
|
3393
|
-
const secNotes = signalNotesFor(scale, (name, dE) => `secondary reads close to the ${name} signal (
|
|
3422
|
+
const secNotes = signalNotesFor(scale, (name, dE) => `secondary reads close to the ${name} signal (chalk \u0394E ${dE.toFixed(3)}) \u2014 your color ships untouched`);
|
|
3394
3423
|
const distinctness = ctaDistinctness(primary.scale, scale);
|
|
3395
3424
|
if (distinctness.close)
|
|
3396
3425
|
notes.push(`secondary reads close to the primary (\u0394E ${Math.min(distinctness.light, distinctness.dark).toFixed(2)}) \u2014 consider a more distinct color`);
|
|
@@ -3435,21 +3464,29 @@ var OFFSET_ALPHAS = { 6: 0.06, 8: 0.08, 16: 0.16 };
|
|
|
3435
3464
|
var ctaBorderRung = (prefix) => prefix === CSS_NEUTRAL ? 8 : prefix === CSS_SECONDARY ? 6 : 16;
|
|
3436
3465
|
var offsetLeafName = (rung) => String(rung).padStart(2, "0");
|
|
3437
3466
|
var offsetVarName = (rung) => `--alpha-away-from-bg-${offsetLeafName(rung)}`;
|
|
3467
|
+
var OPACITY_RUNGS = { 4: 0.04, 8: 0.08, 12: 0.12, 16: 0.16, 24: 0.24, 32: 0.32, 48: 0.48, 64: 0.64 };
|
|
3468
|
+
var INTERACTION_RUNGS = [8, 12, 16, 24, 32];
|
|
3469
|
+
var opacityLeafName = (rung) => String(rung).padStart(3, "0");
|
|
3470
|
+
var opacityVarName = (rung) => `--opacity-${opacityLeafName(rung)}`;
|
|
3471
|
+
var opacityTokenPath = (rung) => SYSTEM_LEAF.OPACITY[opacityLeafName(rung)];
|
|
3438
3472
|
var SHADOW_ALPHAS = {
|
|
3439
|
-
4: { light:
|
|
3440
|
-
8: { light:
|
|
3441
|
-
12: { light:
|
|
3473
|
+
4: { light: OPACITY_RUNGS[4], dark: OPACITY_RUNGS[32] },
|
|
3474
|
+
8: { light: OPACITY_RUNGS[8], dark: OPACITY_RUNGS[48] },
|
|
3475
|
+
12: { light: OPACITY_RUNGS[12], dark: OPACITY_RUNGS[64] }
|
|
3442
3476
|
};
|
|
3443
|
-
var SCRIM_ALPHA =
|
|
3477
|
+
var SCRIM_ALPHA = OPACITY_RUNGS[64];
|
|
3444
3478
|
var DISABLED_OPACITY = 0.38;
|
|
3445
3479
|
var TRANSPARENT_VAR = "--alpha-transparent";
|
|
3446
3480
|
var offsetRgba = (rung, mode) => mode === "light" ? `rgba(0, 0, 0, ${OFFSET_ALPHAS[rung]})` : `rgba(255, 255, 255, ${OFFSET_ALPHAS[rung]})`;
|
|
3447
3481
|
var alphaRootVars = (mode) => [
|
|
3448
3482
|
` ${TRANSPARENT_VAR}: transparent;`,
|
|
3483
|
+
// the opacity ladder, mode-invariant like transparent; repeated in the dark block to
|
|
3484
|
+
// keep the set together
|
|
3485
|
+
...Object.keys(OPACITY_RUNGS).map(Number).map((r) => ` ${opacityVarName(r)}: ${OPACITY_RUNGS[r]};`),
|
|
3449
3486
|
...Object.keys(OFFSET_ALPHAS).map(Number).sort((a, b) => a - b).map((r) => ` ${offsetVarName(r)}: ${offsetRgba(r, mode)};`),
|
|
3450
3487
|
// the toward-bg ladder (the 2026-08-29 inverse ladder, renamed 2026-08-31): the
|
|
3451
3488
|
// same rungs, pole flipped per mode — state layers for INVERTED grounds (never
|
|
3452
|
-
// called a "
|
|
3489
|
+
// called a "chalk" — that word is the tinted band's). One spelling with the Figma
|
|
3453
3490
|
// row: --alpha-toward-bg-06 ↔ system/alpha/toward-bg/06.
|
|
3454
3491
|
...Object.keys(OFFSET_ALPHAS).map(Number).sort((a, b) => a - b).map((r) => ` --alpha-toward-bg-${offsetLeafName(r)}: ${offsetRgba(r, mode === "light" ? "dark" : "light")};`)
|
|
3455
3492
|
];
|
|
@@ -3461,7 +3498,7 @@ function ctaNeedsBorder(s, mode, page) {
|
|
|
3461
3498
|
if (!page) return false;
|
|
3462
3499
|
return ctaPageLc(s, mode, page) < CTA_BORDER_LC_FLOOR;
|
|
3463
3500
|
}
|
|
3464
|
-
function brandKindBody(prefix, s, mode, page) {
|
|
3501
|
+
function brandKindBody(prefix, s, mode, page, on = prefix === CSS_NEUTRAL ? "soft" : "solid") {
|
|
3465
3502
|
const stops = mode === "light" ? s.light : s.dark;
|
|
3466
3503
|
const f = ctaFamilyOf(s, mode);
|
|
3467
3504
|
const onCta = mode === "light" ? s.onFillTextIsWhite : s.onFillTextIsWhiteDark;
|
|
@@ -3476,14 +3513,14 @@ function brandKindBody(prefix, s, mode, page) {
|
|
|
3476
3513
|
` --${prefix}-stamp-fill-pressed: ${stopHex(f.ctaPressed)};`,
|
|
3477
3514
|
` --${prefix}-stamp-edge: var(${border ? offsetVarName(ctaBorderRung(prefix)) : TRANSPARENT_VAR});`,
|
|
3478
3515
|
// the SOFT on-cta (owner 2026-08-04: "neutral cta on's should also be the alpha"): the
|
|
3479
|
-
// neutral's cta is the scale-fed
|
|
3516
|
+
// neutral's cta is the scale-fed CHALK-level fill, the system's other quiet cta, so its
|
|
3480
3517
|
// button text takes the pole AT ALPHA like the default-model secondary's — composited
|
|
3481
3518
|
// over whatever state the fill is in, so hover/pressed carry their own legibility. Same
|
|
3482
3519
|
// register both families (SOFT_ON_CTA_ALPHA), so both alias the ONE system/alpha/ink
|
|
3483
|
-
// primitive.
|
|
3484
|
-
//
|
|
3485
|
-
//
|
|
3486
|
-
|
|
3520
|
+
// primitive. The neutral's is unconditional (the parameter default); the secondary's is
|
|
3521
|
+
// the caller's per-mode verdict. Loud fills (brand, signals, the cta escape) keep the
|
|
3522
|
+
// solid pole.
|
|
3523
|
+
on === "soft" ? ` --${prefix}-stamp-on: rgba(${onCta ? "255, 255, 255" : "0, 0, 0"}, ${SOFT_ON_CTA_ALPHA[mode]});` : ` --${prefix}-stamp-on: ${onColor(onCta)};`
|
|
3487
3524
|
];
|
|
3488
3525
|
}
|
|
3489
3526
|
function ctaFamilyOf(s, mode) {
|
|
@@ -3550,7 +3587,8 @@ function signalsCss(contrastProfile) {
|
|
|
3550
3587
|
// the system alpha variables every family's cta-border aliases (owner 2026-07-29) — this is
|
|
3551
3588
|
// the engine's one global :root, the CSS counterpart of the Figma side's system/alpha/* rows.
|
|
3552
3589
|
// Emitted in BOTH blocks because the offset rungs are scheme-DIVERGENT (black in light,
|
|
3553
|
-
// white in dark); --alpha-transparent
|
|
3590
|
+
// white in dark); --alpha-transparent and the opacity ladder (mode-invariant) repeat
|
|
3591
|
+
// harmlessly and keep the set together.
|
|
3554
3592
|
...alphaRootVars("light"),
|
|
3555
3593
|
...lightBlocks,
|
|
3556
3594
|
`}`,
|
|
@@ -3599,8 +3637,9 @@ function brandCss(slug, displayName, r, secondary, noteSuffix = "", neutralLevel
|
|
|
3599
3637
|
alias("stamp-on")
|
|
3600
3638
|
];
|
|
3601
3639
|
};
|
|
3602
|
-
const
|
|
3603
|
-
const
|
|
3640
|
+
const secondaryOn = (mode) => secondary && secondaryStyle !== "outline" && softOnCtaPasses(secondary, mode) ? "soft" : "solid";
|
|
3641
|
+
const secondaryLight = secondary ? brandKindBody(CSS_SECONDARY, secondary, "light", page.light, secondaryOn("light")) : mirrorBody(CSS_SECONDARY, "light");
|
|
3642
|
+
const secondaryDark = secondary ? brandKindBody(CSS_SECONDARY, secondary, "dark", page.dark, secondaryOn("dark")) : mirrorBody(CSS_SECONDARY, "dark");
|
|
3604
3643
|
const brandIdentity = ` --${CSS_BRAND}-identity: ${scale.identityHex};`;
|
|
3605
3644
|
const secondaryIdentity = secondary ? ` --${CSS_SECONDARY}-identity: ${secondary.identityHex};` : ` --${CSS_SECONDARY}-identity: var(--${CSS_BRAND}-identity);`;
|
|
3606
3645
|
const p0hex = (s, fallback) => s ? stopHex(s) : fallback;
|
|
@@ -3634,12 +3673,6 @@ function brandCss(slug, displayName, r, secondary, noteSuffix = "", neutralLevel
|
|
|
3634
3673
|
` --${CSS_BRAND}-stamp-on: ${onColor(esc.onFillIsWhite)};`
|
|
3635
3674
|
];
|
|
3636
3675
|
};
|
|
3637
|
-
const softOnCta = (mode) => {
|
|
3638
|
-
if (!secondary || secondaryStyle === "outline") return [];
|
|
3639
|
-
if (!softOnCtaPasses(secondary, mode)) return [];
|
|
3640
|
-
const white = mode === "light" ? secondary.onFillTextIsWhite : secondary.onFillTextIsWhiteDark;
|
|
3641
|
-
return [` --${CSS_SECONDARY}-stamp-on: rgba(${white ? "255, 255, 255" : "0, 0, 0"}, ${SOFT_ON_CTA_ALPHA[mode]});`];
|
|
3642
|
-
};
|
|
3643
3676
|
const outline = (mode) => {
|
|
3644
3677
|
if (secondaryStyle !== "outline" || !secondary) return [];
|
|
3645
3678
|
const s8 = (mode === "light" ? secondary.light : secondary.dark).find((s) => s.stop === 8);
|
|
@@ -3683,7 +3716,6 @@ function brandCss(slug, displayName, r, secondary, noteSuffix = "", neutralLevel
|
|
|
3683
3716
|
...linkInverse("light"),
|
|
3684
3717
|
brandIdentity,
|
|
3685
3718
|
...secondaryLight,
|
|
3686
|
-
...softOnCta("light"),
|
|
3687
3719
|
...outline("light"),
|
|
3688
3720
|
secondaryIdentity,
|
|
3689
3721
|
...brandKindBody(CSS_NEUTRAL, nScale, "light", page.light),
|
|
@@ -3696,7 +3728,6 @@ function brandCss(slug, displayName, r, secondary, noteSuffix = "", neutralLevel
|
|
|
3696
3728
|
...link("dark"),
|
|
3697
3729
|
...linkInverse("dark"),
|
|
3698
3730
|
...secondaryDark,
|
|
3699
|
-
...softOnCta("dark"),
|
|
3700
3731
|
...outline("dark"),
|
|
3701
3732
|
...brandKindBody(CSS_NEUTRAL, nScale, "dark", page.dark),
|
|
3702
3733
|
...effOverrides.flatMap((o) => brandKindBody(SIGNAL_EMIT_NAME[o.name], o.scale, "dark", page.dark)),
|
|
@@ -3878,7 +3909,8 @@ function themeToFigma(r, input) {
|
|
|
3878
3909
|
if (tok && "$type" in tok) putLeaf(g2, path, tok);
|
|
3879
3910
|
}
|
|
3880
3911
|
putLeaf(g2, SYSTEM_LEAF.ALPHA.TRANSPARENT, pole(true, 0));
|
|
3881
|
-
|
|
3912
|
+
for (const rung of Object.keys(OPACITY_RUNGS).map(Number))
|
|
3913
|
+
putLeaf(g2, opacityTokenPath(rung), { $type: "number", $value: OPACITY_RUNGS[rung] });
|
|
3882
3914
|
putLeaf(g2, SYSTEM_LEAF.ALPHA.INK, pole(mode === "dark", SOFT_ON_CTA_ALPHA[mode]));
|
|
3883
3915
|
putLeaf(g2, SYSTEM_LEAF.ALPHA.AWAY_FROM_BG_06, OFFSET_TOKEN(6, mode));
|
|
3884
3916
|
putLeaf(g2, SYSTEM_LEAF.ALPHA.AWAY_FROM_BG_08, OFFSET_TOKEN(8, mode));
|
|
@@ -3968,8 +4000,10 @@ export {
|
|
|
3968
4000
|
DEFAULT_LINK_HEX,
|
|
3969
4001
|
DISABLED_OPACITY,
|
|
3970
4002
|
EXT_KEY,
|
|
4003
|
+
INTERACTION_RUNGS,
|
|
3971
4004
|
MODE_SPECS,
|
|
3972
4005
|
OFFSET_ALPHAS,
|
|
4006
|
+
OPACITY_RUNGS,
|
|
3973
4007
|
OUTLINE_HOVER_ALPHA,
|
|
3974
4008
|
PAPER_0,
|
|
3975
4009
|
PEN_100,
|
|
@@ -4003,6 +4037,10 @@ export {
|
|
|
4003
4037
|
generateScale,
|
|
4004
4038
|
generateSubtleSecondary,
|
|
4005
4039
|
neutralCss,
|
|
4040
|
+
neutralTintHue,
|
|
4041
|
+
opacityLeafName,
|
|
4042
|
+
opacityTokenPath,
|
|
4043
|
+
opacityVarName,
|
|
4006
4044
|
pageStopFor,
|
|
4007
4045
|
parseToken,
|
|
4008
4046
|
resolveBrand,
|
|
@@ -15,16 +15,16 @@ export interface CollisionCheck {
|
|
|
15
15
|
}
|
|
16
16
|
export declare function stopDeltaE(s1: ColorStop, s2: ColorStop): number;
|
|
17
17
|
export declare function checkCollision(brand: GeneratedScale, signalScale: GeneratedScale, signalDef: SignalDef, mode: Mode): CollisionCheck;
|
|
18
|
-
export declare const
|
|
18
|
+
export declare const HUE_COLLISION_CHALK_DEG = 15;
|
|
19
19
|
export declare const HUE_COLLISION_MIN_V = 0.5;
|
|
20
20
|
export declare const SECONDARY_NOTE_MIN_V: number;
|
|
21
21
|
export interface HueCollisionCheck {
|
|
22
22
|
signal: SignalDef['name'];
|
|
23
|
-
|
|
23
|
+
dHueChalk: {
|
|
24
24
|
light: number;
|
|
25
25
|
dark: number;
|
|
26
26
|
};
|
|
27
|
-
|
|
27
|
+
chalkDeltaE: {
|
|
28
28
|
light: number;
|
|
29
29
|
dark: number;
|
|
30
30
|
};
|
|
@@ -17,6 +17,21 @@ export declare const ctaBorderRung: (prefix: string) => OffsetRung;
|
|
|
17
17
|
export declare const offsetLeafName: (rung: OffsetRung) => string;
|
|
18
18
|
export declare const offsetVarName: (rung: OffsetRung) => string;
|
|
19
19
|
export declare const offsetTokenPath: (rung: OffsetRung) => string;
|
|
20
|
+
export declare const OPACITY_RUNGS: {
|
|
21
|
+
readonly 4: 0.04;
|
|
22
|
+
readonly 8: 0.08;
|
|
23
|
+
readonly 12: 0.12;
|
|
24
|
+
readonly 16: 0.16;
|
|
25
|
+
readonly 24: 0.24;
|
|
26
|
+
readonly 32: 0.32;
|
|
27
|
+
readonly 48: 0.48;
|
|
28
|
+
readonly 64: 0.64;
|
|
29
|
+
};
|
|
30
|
+
export type OpacityRung = keyof typeof OPACITY_RUNGS;
|
|
31
|
+
export declare const INTERACTION_RUNGS: readonly OpacityRung[];
|
|
32
|
+
export declare const opacityLeafName: (rung: OpacityRung) => string;
|
|
33
|
+
export declare const opacityVarName: (rung: OpacityRung) => string;
|
|
34
|
+
export declare const opacityTokenPath: (rung: OpacityRung) => string;
|
|
20
35
|
export declare const SHADOW_ALPHAS: {
|
|
21
36
|
readonly 4: {
|
|
22
37
|
readonly light: 0.04;
|
|
@@ -32,14 +47,14 @@ export declare const SHADOW_ALPHAS: {
|
|
|
32
47
|
};
|
|
33
48
|
};
|
|
34
49
|
export type ShadowRung = keyof typeof SHADOW_ALPHAS;
|
|
35
|
-
export declare const SCRIM_ALPHA
|
|
50
|
+
export declare const SCRIM_ALPHA: 0.64;
|
|
36
51
|
export declare const DISABLED_OPACITY = 0.38;
|
|
37
52
|
export declare const TRANSPARENT_VAR = "--alpha-transparent";
|
|
38
53
|
export declare const offsetRgba: (rung: OffsetRung, mode: "light" | "dark") => string;
|
|
39
54
|
export declare const alphaRootVars: (mode: "light" | "dark") => string[];
|
|
40
55
|
export declare function ctaPageLc(s: GeneratedScale, mode: 'light' | 'dark', page: ColorStop): number;
|
|
41
56
|
export declare function ctaNeedsBorder(s: GeneratedScale, mode: 'light' | 'dark', page: ColorStop | undefined): boolean;
|
|
42
|
-
export declare function brandKindBody(prefix: string, s: GeneratedScale, mode: 'light' | 'dark', page: ColorStop | undefined): string[];
|
|
57
|
+
export declare function brandKindBody(prefix: string, s: GeneratedScale, mode: 'light' | 'dark', page: ColorStop | undefined, on?: 'soft' | 'solid'): string[];
|
|
43
58
|
export declare function brandKindP3Body(prefix: string, s: GeneratedScale, mode: 'light' | 'dark'): string[];
|
|
44
59
|
export declare function neutralCss(selector: string, brandH: number, level?: NeutralLevel, contrastProfile?: ContrastProfile, ctaBorder?: boolean): string;
|
|
45
60
|
export declare function signalsCss(contrastProfile?: ContrastProfile): string;
|
|
@@ -9,11 +9,16 @@ export interface FigmaColorToken {
|
|
|
9
9
|
hex: string;
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
+
export interface FigmaNumberToken {
|
|
13
|
+
$type: 'number';
|
|
14
|
+
$value: number;
|
|
15
|
+
}
|
|
16
|
+
export type FigmaLeaf = FigmaColorToken | FigmaNumberToken;
|
|
12
17
|
export type FigmaGroup = {
|
|
13
|
-
[key: string]:
|
|
18
|
+
[key: string]: FigmaLeaf | FigmaGroup;
|
|
14
19
|
};
|
|
15
|
-
export declare function groupEntries(g: FigmaGroup): Array<[string,
|
|
16
|
-
export declare function putLeaf(g: FigmaGroup, flat: string, tok:
|
|
20
|
+
export declare function groupEntries(g: FigmaGroup): Array<[string, FigmaLeaf | FigmaGroup]>;
|
|
21
|
+
export declare function putLeaf(g: FigmaGroup, flat: string, tok: FigmaLeaf): void;
|
|
17
22
|
export interface ThemeInput {
|
|
18
23
|
secondary?: GeneratedScale | null;
|
|
19
24
|
secondaryStyle?: SecondaryStyle;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { STAMP_FILL, STAMP_FILL_HOVER, STAMP_FILL_PRESSED } from '../tokenNames';
|
|
2
|
-
export type Group = 'paper' | '
|
|
2
|
+
export type Group = 'paper' | 'chalk' | 'highlighter' | 'pencil' | 'pen';
|
|
3
3
|
export declare const textLane: (g: string) => boolean;
|
|
4
4
|
export type Producer = {
|
|
5
5
|
hue: 'warm-drift' | 'warm-torsion' | 'constant';
|
|
@@ -8,7 +8,7 @@ export type Producer = {
|
|
|
8
8
|
};
|
|
9
9
|
export type Require = {
|
|
10
10
|
metric: 'wcag';
|
|
11
|
-
against: 'paper-1' | 'paper-3' | 'paper-5' | '
|
|
11
|
+
against: 'paper-1' | 'paper-3' | 'paper-5' | 'chalk-20';
|
|
12
12
|
target: number;
|
|
13
13
|
level: 'AA' | 'AAA';
|
|
14
14
|
} | {
|
|
@@ -26,7 +26,6 @@ export declare const SYSTEM_LEAF: {
|
|
|
26
26
|
};
|
|
27
27
|
readonly ALPHA: {
|
|
28
28
|
readonly TRANSPARENT: "system/alpha/transparent";
|
|
29
|
-
readonly SCRIM: "system/alpha/abs-black-060";
|
|
30
29
|
readonly INK: "system/alpha/ink";
|
|
31
30
|
readonly AWAY_FROM_BG_06: "system/alpha/away-from-bg/06";
|
|
32
31
|
readonly AWAY_FROM_BG_08: "system/alpha/away-from-bg/08";
|
|
@@ -38,6 +37,7 @@ export declare const SYSTEM_LEAF: {
|
|
|
38
37
|
readonly SHADOW_08: "system/alpha/shadow-08";
|
|
39
38
|
readonly SHADOW_12: "system/alpha/shadow-12";
|
|
40
39
|
};
|
|
40
|
+
readonly OPACITY: Record<string, string>;
|
|
41
41
|
};
|
|
42
42
|
export declare const SURFACE_PLANE_LAW: Record<string, {
|
|
43
43
|
light: string;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { generateScale, generateNeutralScale, generateSubtleSecondary, type GeneratedScale, type ColorStop, type GenerateOptions, type NeutralLevel, type ContrastProfile, } from './engine/colorEngine';
|
|
1
|
+
export { generateScale, generateNeutralScale, generateSubtleSecondary, neutralTintHue, type NeutralSource, type GeneratedScale, type ColorStop, type GenerateOptions, type NeutralLevel, type ContrastProfile, } from './engine/colorEngine';
|
|
2
2
|
export { resolveBrand, resolveTheme, resolveLinkTrio, resolveLinkInverseTrio, DEFAULT_LINK_HEX, SIGNAL_SCALES, signalScalesFor, SECONDARY_DISTINCT_DELTA_E, SUBTLE_TINT_MULT, SUBTLE_PASTEL_K, OUTLINE_HOVER_ALPHA, type ResolvedBrand, type ResolvedTheme, type ResolvedSecondary, type SecondaryLevel, type SecondaryStyle, type SignalOverride, } from './engine/resolve';
|
|
3
|
-
export { brandCss, neutralCss, signalsCss, stopsToVars, toHex, stopHex, OFFSET_ALPHAS, SHADOW_ALPHAS, SCRIM_ALPHA, DISABLED_OPACITY, type ShadowRung, ctaNeedsBorder, ctaBorderRung, pageStopFor, } from './engine/cssRender';
|
|
3
|
+
export { brandCss, neutralCss, signalsCss, stopsToVars, toHex, stopHex, OFFSET_ALPHAS, SHADOW_ALPHAS, SCRIM_ALPHA, OPACITY_RUNGS, INTERACTION_RUNGS, opacityLeafName, opacityVarName, opacityTokenPath, type OpacityRung, DISABLED_OPACITY, type ShadowRung, ctaNeedsBorder, ctaBorderRung, pageStopFor, } from './engine/cssRender';
|
|
4
4
|
export { CSS_FAMILY } from './engine/tokenDescriptions';
|
|
5
|
-
export { themeToFigma, type FigmaGroup, type FigmaColorToken, type ThemeInput, } from './engine/figmaRender';
|
|
5
|
+
export { themeToFigma, type FigmaGroup, type FigmaColorToken, type FigmaNumberToken, type FigmaLeaf, type ThemeInput, } from './engine/figmaRender';
|
|
6
6
|
export { emitDtcgRamp, resolveDtcgRamp, parseToken, EXT_KEY, RESOLVER_ID, type DtcgRampGroup, type DtcgRequirementToken, type DtcgSeedToken, type DtcgColorValue, } from './engine/requirements/dtcg';
|
|
7
7
|
export { MODE_SPECS, type ModeSpec } from './engine/requirements/spec';
|
|
8
8
|
export { stopTokenName, tokenOrder, SCALE_STOP_COUNT, PAPER_0, PEN_100, STAMP_FILL, STAMP_FILL_HOVER, STAMP_FILL_PRESSED, STAMP_EDGE, STAMP_ON, STAMP_STATE_LEAVES, SYSTEM_LEAF, SURFACE_PLANE_LAW, } from './engine/tokenNames';
|
package/package.json
CHANGED