@assure-one/design-system 1.35.0 → 1.37.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 +52 -0
- package/codemods/README.md +155 -12
- package/codemods/lib/registry.mjs +5 -0
- package/codemods/transforms/cm-07-input-size.mjs +104 -0
- package/codemods/transforms/cm-08-search-select-to-combobox.mjs +236 -0
- package/codemods/transforms/cm-09-side-drawer-to-sheet.mjs +348 -0
- package/codemods/transforms/cm-10-date-picker-value-change.mjs +416 -0
- package/codemods/transforms/cm-13-tooltip-delay.mjs +99 -0
- package/codemods/transforms/cm-14-hidden-mirrors.mjs +2 -2
- package/dist/css/components.css +1 -1
- package/dist/css/legacy-aliases.css +25 -1
- package/dist/css/shadcn.css +2 -2
- package/dist/css/tailwind.css +9 -0
- package/dist/css/tokens.css +64 -38
- package/dist/design-system-provider-C8UlFe52.d.ts +549 -0
- package/dist/icons/index.d.ts +2 -2
- package/dist/icons/index.js +6 -2
- package/dist/icons/index.js.map +1 -1
- package/dist/{index-B3OiMlQv.d.ts → index-vztxMSfl.d.ts} +7 -4
- package/dist/index.d.ts +2259 -345
- package/dist/index.js +7229 -3057
- package/dist/index.js.map +1 -1
- package/dist/next/index.d.ts +20 -0
- package/dist/next/index.js +16 -0
- package/dist/next/index.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/{system-lyhOUTpa.d.ts → system-CyAVbHhM.d.ts} +17 -17
- package/dist/testing/index.cjs +133 -11
- package/dist/testing/index.d.cts +98 -2
- package/dist/testing/index.d.ts +98 -2
- package/dist/testing/index.js +132 -12
- package/dist/tokens/index.d.ts +1 -1
- package/dist/tokens/index.js +8 -8
- package/dist/tokens/index.js.map +1 -1
- package/docs/components.md +606 -0
- package/docs/components.registry.json +1604 -0
- package/docs/for-ai-agents.md +153 -0
- package/package.json +15 -3
package/dist/testing/index.js
CHANGED
|
@@ -310,14 +310,28 @@ function accessibleText(element) {
|
|
|
310
310
|
function isDisabled(element) {
|
|
311
311
|
return element.hasAttribute("disabled") || element.getAttribute("aria-disabled") === "true" || element.hasAttribute("data-disabled");
|
|
312
312
|
}
|
|
313
|
+
function isQueries(target) {
|
|
314
|
+
return typeof target.getByRole === "function";
|
|
315
|
+
}
|
|
313
316
|
function press(target, key) {
|
|
314
317
|
const view = target.ownerDocument.defaultView ?? window;
|
|
315
318
|
const init = { key, code: key === " " ? "Space" : key, bubbles: true, cancelable: true };
|
|
316
319
|
target.dispatchEvent(new view.KeyboardEvent("keydown", init));
|
|
317
320
|
target.dispatchEvent(new view.KeyboardEvent("keyup", init));
|
|
318
321
|
}
|
|
322
|
+
async function run(fn) {
|
|
323
|
+
const actEnvironment = globalThis.IS_REACT_ACT_ENVIRONMENT;
|
|
324
|
+
if (actEnvironment) {
|
|
325
|
+
await act(async () => {
|
|
326
|
+
await fn();
|
|
327
|
+
});
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
await fn();
|
|
331
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
332
|
+
}
|
|
319
333
|
async function flush() {
|
|
320
|
-
await
|
|
334
|
+
await run(async () => {
|
|
321
335
|
await Promise.resolve();
|
|
322
336
|
});
|
|
323
337
|
}
|
|
@@ -330,7 +344,7 @@ async function waitUntil(find, maxFlushes) {
|
|
|
330
344
|
return null;
|
|
331
345
|
}
|
|
332
346
|
function resolveTrigger(target, name, role) {
|
|
333
|
-
if (
|
|
347
|
+
if (isQueries(target)) {
|
|
334
348
|
if (name === void 0)
|
|
335
349
|
throw new Error(`A ${role} name is required when passing a query object.`);
|
|
336
350
|
return target.getByRole(role, { name });
|
|
@@ -348,8 +362,33 @@ function popupOf(trigger, role) {
|
|
|
348
362
|
}
|
|
349
363
|
return null;
|
|
350
364
|
}
|
|
365
|
+
function isTextControl(element) {
|
|
366
|
+
const tag = element.tagName;
|
|
367
|
+
return tag === "TEXTAREA" || tag === "INPUT" && !/^(checkbox|radio|file|button|submit|reset|image|hidden)$/i.test(
|
|
368
|
+
element.type
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
async function typeInto(control, text2, commit) {
|
|
372
|
+
const view = control.ownerDocument.defaultView ?? window;
|
|
373
|
+
const proto = control.tagName === "TEXTAREA" ? view.HTMLTextAreaElement.prototype : view.HTMLInputElement.prototype;
|
|
374
|
+
const setter = Object.getOwnPropertyDescriptor(proto, "value")?.set;
|
|
375
|
+
await run(() => {
|
|
376
|
+
control.focus();
|
|
377
|
+
if (setter) setter.call(control, text2);
|
|
378
|
+
else control.value = text2;
|
|
379
|
+
control.dispatchEvent(new view.Event("input", { bubbles: true }));
|
|
380
|
+
});
|
|
381
|
+
if (commit) {
|
|
382
|
+
await run(() => {
|
|
383
|
+
control.blur();
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
await flush();
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// src/testing/interactions.ts
|
|
351
390
|
async function selectOption(target, ...rest) {
|
|
352
|
-
const byQuery =
|
|
391
|
+
const byQuery = isQueries(target);
|
|
353
392
|
const label = byQuery ? rest[0] : void 0;
|
|
354
393
|
const option = byQuery ? rest[1] : rest[0];
|
|
355
394
|
const settings = (byQuery ? rest[2] : rest[1]) ?? {};
|
|
@@ -361,7 +400,7 @@ async function selectOption(target, ...rest) {
|
|
|
361
400
|
);
|
|
362
401
|
}
|
|
363
402
|
if (trigger.getAttribute("aria-expanded") !== "true") {
|
|
364
|
-
await
|
|
403
|
+
await run(() => {
|
|
365
404
|
trigger.focus();
|
|
366
405
|
press(trigger, "Enter");
|
|
367
406
|
});
|
|
@@ -376,16 +415,16 @@ async function selectOption(target, ...rest) {
|
|
|
376
415
|
const wanted = all.find((el) => matches(accessibleText(el), option));
|
|
377
416
|
if (!wanted) {
|
|
378
417
|
const available = all.map((el) => JSON.stringify(accessibleText(el))).join(", ");
|
|
379
|
-
await
|
|
418
|
+
await run(() => press(listbox, "Escape"));
|
|
380
419
|
throw new Error(
|
|
381
420
|
`selectOption: no option matches ${describe(option)}. Options: ${available || "(none)"}.`
|
|
382
421
|
);
|
|
383
422
|
}
|
|
384
423
|
if (isDisabled(wanted)) {
|
|
385
|
-
await
|
|
424
|
+
await run(() => press(listbox, "Escape"));
|
|
386
425
|
throw new Error(`selectOption: the option ${describe(option)} is disabled.`);
|
|
387
426
|
}
|
|
388
|
-
await
|
|
427
|
+
await run(() => {
|
|
389
428
|
wanted.focus();
|
|
390
429
|
press(wanted, "Enter");
|
|
391
430
|
});
|
|
@@ -394,7 +433,7 @@ async function selectOption(target, ...rest) {
|
|
|
394
433
|
throw new Error(`selectOption: the list stayed open after choosing ${describe(option)}.`);
|
|
395
434
|
}
|
|
396
435
|
async function openMenu(target, ...rest) {
|
|
397
|
-
const byQuery =
|
|
436
|
+
const byQuery = isQueries(target);
|
|
398
437
|
const name = byQuery ? rest[0] : void 0;
|
|
399
438
|
const settings = (byQuery ? rest[1] : rest[0]) ?? {};
|
|
400
439
|
const maxFlushes = settings.maxFlushes ?? 20;
|
|
@@ -405,7 +444,7 @@ async function openMenu(target, ...rest) {
|
|
|
405
444
|
);
|
|
406
445
|
}
|
|
407
446
|
if (trigger.getAttribute("aria-expanded") !== "true") {
|
|
408
|
-
await
|
|
447
|
+
await run(() => {
|
|
409
448
|
trigger.focus();
|
|
410
449
|
press(trigger, "ArrowDown");
|
|
411
450
|
});
|
|
@@ -443,17 +482,98 @@ async function openMenu(target, ...rest) {
|
|
|
443
482
|
const item = getItem(itemName);
|
|
444
483
|
if (isDisabled(item))
|
|
445
484
|
throw new Error(`openMenu: the item ${describe(itemName)} is disabled.`);
|
|
446
|
-
await
|
|
485
|
+
await run(() => {
|
|
447
486
|
item.focus();
|
|
448
487
|
press(item, "Enter");
|
|
449
488
|
});
|
|
450
489
|
await waitUntil(() => menu.isConnected ? null : true, maxFlushes);
|
|
451
490
|
},
|
|
452
491
|
async close() {
|
|
453
|
-
await
|
|
492
|
+
await run(() => press(menu, "Escape"));
|
|
454
493
|
await waitClosed("Escape");
|
|
455
494
|
}
|
|
456
495
|
};
|
|
457
496
|
}
|
|
458
497
|
|
|
459
|
-
|
|
498
|
+
// src/testing/helpers/fill-field.ts
|
|
499
|
+
var TEXT_ROLES = ["textbox", "spinbutton", "combobox"];
|
|
500
|
+
function resolveByLabel(queries, label) {
|
|
501
|
+
const errors = [];
|
|
502
|
+
for (const role of TEXT_ROLES) {
|
|
503
|
+
try {
|
|
504
|
+
return queries.getByRole(role, { name: label });
|
|
505
|
+
} catch (error) {
|
|
506
|
+
errors.push(error instanceof Error ? error.message : String(error));
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
throw new Error(
|
|
510
|
+
`fillField: no text control is labelled ${describe(label)} (looked for roles ${TEXT_ROLES.join(", ")}).
|
|
511
|
+
${errors[0] ?? ""}`
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
async function fillField(target, ...rest) {
|
|
515
|
+
const byQuery = isQueries(target);
|
|
516
|
+
const label = byQuery ? rest[0] : void 0;
|
|
517
|
+
const value = byQuery ? rest[1] : rest[0];
|
|
518
|
+
const settings = (byQuery ? rest[2] : rest[1]) ?? {};
|
|
519
|
+
const control = byQuery ? resolveByLabel(target, label) : target;
|
|
520
|
+
const name = label ?? accessibleText(control);
|
|
521
|
+
if (!isTextControl(control)) {
|
|
522
|
+
throw new Error(
|
|
523
|
+
`fillField: ${describe(name)} is a <${control.tagName.toLowerCase()}>, not a text input or textarea. Use selectOption for a Select and pickDate for a DatePicker.`
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
if (isDisabled(control)) throw new Error(`fillField: the control ${describe(name)} is disabled.`);
|
|
527
|
+
if (control.readOnly || control.getAttribute("aria-readonly") === "true") {
|
|
528
|
+
throw new Error(`fillField: the control ${describe(name)} is read-only.`);
|
|
529
|
+
}
|
|
530
|
+
await typeInto(control, value, settings.commit ?? true);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// src/testing/helpers/pick-date.ts
|
|
534
|
+
var ISO = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
535
|
+
var DEFAULT_PATTERN = "MM/DD/YYYY";
|
|
536
|
+
function looksLikePattern(text2) {
|
|
537
|
+
return !!text2 && /YYYY/.test(text2) && /MM/.test(text2) === /DD/.test(text2);
|
|
538
|
+
}
|
|
539
|
+
function formatIso(iso, pattern) {
|
|
540
|
+
const match = ISO.exec(iso);
|
|
541
|
+
if (!match) {
|
|
542
|
+
throw new Error(
|
|
543
|
+
`pickDate: expected an ISO date (YYYY-MM-DD), received ${JSON.stringify(iso)}.`
|
|
544
|
+
);
|
|
545
|
+
}
|
|
546
|
+
const [, year, month, day] = match;
|
|
547
|
+
return pattern.replace("YYYY", year).replace("MM", month).replace("DD", day);
|
|
548
|
+
}
|
|
549
|
+
async function pickDate(target, ...rest) {
|
|
550
|
+
const byQuery = isQueries(target);
|
|
551
|
+
const label = byQuery ? rest[0] : void 0;
|
|
552
|
+
const iso = byQuery ? rest[1] : rest[0];
|
|
553
|
+
const settings = (byQuery ? rest[2] : rest[1]) ?? {};
|
|
554
|
+
const input = byQuery ? target.getByRole("textbox", { name: label }) : target;
|
|
555
|
+
const name = label ?? accessibleText(input);
|
|
556
|
+
if (!isTextControl(input) || input.tagName !== "INPUT") {
|
|
557
|
+
throw new Error(
|
|
558
|
+
`pickDate: ${describe(name)} is not a DatePicker text input (a <${input.tagName.toLowerCase()}>).`
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
if (isDisabled(input))
|
|
562
|
+
throw new Error(`pickDate: the date picker ${describe(name)} is disabled.`);
|
|
563
|
+
if (input.readOnly) throw new Error(`pickDate: the date picker ${describe(name)} is read-only.`);
|
|
564
|
+
const placeholder = input.getAttribute("placeholder");
|
|
565
|
+
const pattern = settings.dateFormat ?? (looksLikePattern(placeholder) ? placeholder : DEFAULT_PATTERN);
|
|
566
|
+
const yearOnly = !/MM|DD/.test(pattern);
|
|
567
|
+
let display = "";
|
|
568
|
+
if (iso !== "") {
|
|
569
|
+
display = yearOnly ? formatIso(iso, "YYYY") : formatIso(iso, pattern);
|
|
570
|
+
}
|
|
571
|
+
await typeInto(input, display, true);
|
|
572
|
+
if (input.value !== display) {
|
|
573
|
+
throw new Error(
|
|
574
|
+
`pickDate: typed ${JSON.stringify(display)} into ${describe(name)} but it shows ${JSON.stringify(input.value)}. The picker's pattern is probably not ${JSON.stringify(pattern)}; pass { dateFormat } with the pattern the picker uses.`
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
export { createToastRecorder, fillField, installDomPolyfills, openMenu, pickDate, selectOption, withAssureDesignSystem };
|
package/dist/tokens/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { C as ColorName, R as ReferenceTokens, S as SystemTokens,
|
|
1
|
+
export { C as ColorName, R as ReferenceTokens, S as SystemTokens, f as breakpoints, c as colors, i as iconSizes, l as layout, m as motion, o as overlays, r as radii, a as reference, s as shadows, b as spacing, d as surfaces, e as systemTokens, t as typography, z as zIndex } from '../system-CyAVbHhM.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* The seed a host supplies per tenant.
|
package/dist/tokens/index.js
CHANGED
|
@@ -33,7 +33,7 @@ var colors = {
|
|
|
33
33
|
proLine: "#7b5bd8",
|
|
34
34
|
/* Disabled */
|
|
35
35
|
fgDisabled: "#a7a7ac",
|
|
36
|
-
bgDisabled: "#
|
|
36
|
+
bgDisabled: "#f1f2f6",
|
|
37
37
|
/* Status */
|
|
38
38
|
successFg: "#1f7a3d",
|
|
39
39
|
successBg: "#eaf6ee",
|
|
@@ -61,7 +61,7 @@ var typography = {
|
|
|
61
61
|
bold: 700
|
|
62
62
|
},
|
|
63
63
|
/* Universal entrance ease — applies to every motion primitive */
|
|
64
|
-
ease: "cubic-bezier(0.
|
|
64
|
+
ease: "cubic-bezier(0.25, 1, 0.5, 1)"
|
|
65
65
|
};
|
|
66
66
|
var radii = {
|
|
67
67
|
btn: "7px",
|
|
@@ -72,14 +72,14 @@ var radii = {
|
|
|
72
72
|
full: "9999px"
|
|
73
73
|
};
|
|
74
74
|
var shadows = {
|
|
75
|
-
quiet: "0 1px
|
|
76
|
-
card: "0 1px 2px rgba(16, 20, 36, 0.04), 0 4px
|
|
77
|
-
pop: "0 0 0 1px rgba(16, 20, 36, 0.
|
|
75
|
+
quiet: "0 1px 1px rgba(16, 20, 36, 0.03), 0 1px 3px rgba(16, 20, 36, 0.05)",
|
|
76
|
+
card: "0 1px 2px rgba(16, 20, 36, 0.04), 0 2px 4px -2px rgba(16, 20, 36, 0.04), 0 8px 16px -6px rgba(16, 20, 36, 0.08)",
|
|
77
|
+
pop: "0 0 0 1px rgba(16, 20, 36, 0.04), 0 2px 4px -1px rgba(16, 20, 36, 0.05), 0 6px 12px -3px rgba(16, 20, 36, 0.07), 0 16px 32px -8px rgba(16, 20, 36, 0.12)",
|
|
78
78
|
focusRing: "0 0 0 2px #ffffff, 0 0 0 4px #6c42f8"
|
|
79
79
|
};
|
|
80
80
|
var overlays = {
|
|
81
|
-
hover: "rgba(
|
|
82
|
-
active: "rgba(
|
|
81
|
+
hover: "rgba(16, 20, 36, 0.04)",
|
|
82
|
+
active: "rgba(16, 20, 36, 0.07)"
|
|
83
83
|
};
|
|
84
84
|
var layout = {
|
|
85
85
|
shellSidebarWidth: "200px",
|
|
@@ -110,7 +110,7 @@ var surfaces = {
|
|
|
110
110
|
};
|
|
111
111
|
var motion = {
|
|
112
112
|
ease: {
|
|
113
|
-
outQuart: "cubic-bezier(0.
|
|
113
|
+
outQuart: "cubic-bezier(0.25, 1, 0.5, 1)",
|
|
114
114
|
out: "cubic-bezier(0.16, 1, 0.3, 1)",
|
|
115
115
|
in: "cubic-bezier(0.7, 0, 0.84, 0)",
|
|
116
116
|
inOut: "cubic-bezier(0.65, 0, 0.35, 1)"
|
package/dist/tokens/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tokens/reference.ts","../../src/tokens/system.ts","../../src/foundation/theme/srgb.ts","../../src/foundation/theme/brand-theme.ts"],"names":[],"mappings":"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O,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACtF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,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","file":"index.js","sourcesContent":["/* GENERATED FILE — do not edit.\n * Source: tokens/src (DTCG, ADR-003).\n * Generator: tokens/build/lib/generate-ts.mjs, template tokens/build/templates/reference.ts.tmpl.\n * Change the token files and run `pnpm tokens:build`; `pnpm tokens:check`\n * fails when this file is out of date. */\n/**\n * Reference tokens — raw palette.\n *\n * Programmatic access for theme switching, Figma sync, design tools, etc.\n * Components should NOT consume these directly; use system tokens (./system.ts)\n * or the CSS variables in ./tokens.css.\n */\n\nexport const colors = {\n /* Surfaces */\n bg: \"#ffffff\",\n bg2: \"#f1f3f8\",\n bg3: \"#e7eaf1\",\n surface: \"#ffffff\",\n surface2: \"#f7f8fc\",\n\n /* Foreground */\n fg: \"#0a0a0a\",\n fg2: \"#38383b\",\n fg3: \"#5f5f64\",\n fg4: \"#6b6b70\",\n fg5: \"#9a9aa0\",\n\n /* Rules */\n rule: \"#e4e7ef\",\n ruleSoft: \"#eef0f5\",\n ruleStrong: \"#d3d8e3\",\n\n /* Accent (cyan) */\n accent: \"#6c42f8\",\n accent2: \"#5127e8\",\n accentTint: \"#efeaff\",\n accentHover: \"#5e35f2\",\n accentActive: \"#5127e8\",\n\n /* Pro (purple) */\n proBg: \"#f4f1ff\",\n proBgHover: \"#eee9ff\",\n proBgActive: \"#e4ddff\",\n proFg: \"#6c42f8\",\n proHover: \"#5e35f2\",\n proActive: \"#5127e8\",\n proDisabled: \"#b7a7f3\",\n proLine: \"#7b5bd8\",\n\n /* Disabled */\n fgDisabled: \"#a7a7ac\",\n bgDisabled: \"#f3f3f1\",\n\n /* Status */\n successFg: \"#1f7a3d\",\n successBg: \"#eaf6ee\",\n successLine: \"#c5e5cf\",\n warningFg: \"#8a4606\",\n warningBg: \"#fff3e5\",\n warningLine: \"#f5d5a8\",\n dangerFg: \"#c43838\",\n dangerBg: \"#fbeaea\",\n dangerLine: \"#ecc5c5\",\n\n /* On-brand */\n fgOnAccent: \"#ffffff\",\n fgOnPro: \"#ffffff\",\n} as const;\n\nexport const typography = {\n family: {\n display: '\"Plus Jakarta Sans\", -apple-system, system-ui, sans-serif',\n body: '\"Plus Jakarta Sans\", -apple-system, system-ui, sans-serif',\n mono: '\"Plus Jakarta Sans\", -apple-system, system-ui, sans-serif',\n },\n weight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n /* Universal entrance ease — applies to every motion primitive */\n ease: \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n} as const;\n\nexport const radii = {\n btn: \"7px\",\n input: \"7px\",\n pill: \"5px\",\n card: \"12px\",\n icon: \"4px\",\n full: \"9999px\",\n} as const;\n\nexport const shadows = {\n quiet: \"0 1px 2px rgba(16, 20, 36, 0.05)\",\n card: \"0 1px 2px rgba(16, 20, 36, 0.04), 0 4px 12px -4px rgba(16, 20, 36, 0.08)\",\n pop: \"0 0 0 1px rgba(16, 20, 36, 0.03), 0 2px 4px -1px rgba(16, 20, 36, 0.06), 0 12px 28px -6px rgba(16, 20, 36, 0.14)\",\n focusRing: \"0 0 0 2px #ffffff, 0 0 0 4px #6c42f8\",\n} as const;\n\nexport const overlays = {\n hover: \"rgba(10, 10, 10, 0.03)\",\n active: \"rgba(10, 10, 10, 0.05)\",\n} as const;\n\nexport const layout = {\n shellSidebarWidth: \"200px\",\n shellHeaderHeight: \"56px\",\n contentPad: \"32px\",\n} as const;\n\n/**\n * Spacing — 4px base scale. Components mostly use arbitrary values;\n * this scale is exposed for programmatic access (e.g. design-tool sync).\n */\nexport const spacing = {\n unit: \"4px\",\n 4: \"4px\",\n 8: \"8px\",\n 12: \"12px\",\n 16: \"16px\",\n 20: \"20px\",\n 24: \"24px\",\n 28: \"28px\",\n 32: \"32px\",\n 36: \"36px\",\n 40: \"40px\",\n 64: \"64px\",\n 80: \"80px\",\n 180: \"180px\",\n} as const;\n\n/**\n * Surface palette — the four canonical layers. Mirrors --color-bg / -2 /\n * --color-surface / --color-surface-2.\n */\nexport const surfaces = {\n bg: \"#ffffff\",\n bg2: \"#f1f3f8\",\n surface: \"#ffffff\",\n surface2: \"#f7f8fc\",\n} as const;\n\nexport const motion = {\n ease: {\n outQuart: \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n out: \"cubic-bezier(0.16, 1, 0.3, 1)\",\n in: \"cubic-bezier(0.7, 0, 0.84, 0)\",\n inOut: \"cubic-bezier(0.65, 0, 0.35, 1)\",\n },\n duration: {\n instant: \"100ms\",\n fast: \"150ms\",\n normal: \"250ms\",\n slow: \"400ms\",\n },\n} as const;\n\n/**\n * Icon boxes — the four sizes of target architecture §9.3. These are the boxes\n * the library actually draws; `Icon`'s `size` prop maps onto them (W3-18).\n */\nexport const iconSizes = {\n xs: \"12px\",\n sm: \"14px\",\n md: \"16px\",\n lg: \"20px\",\n} as const;\n\n/**\n * Global stacking layers — target architecture §21. Use them only for\n * portalled surfaces and page chrome; anything else creates a local stacking\n * context and uses small local integers.\n *\n * `popover` is the layer the CSS still spells `--z-dropdown`; the legacy name\n * keeps working and resolves to the same value.\n */\nexport const zIndex = {\n base: 0,\n sticky: 100,\n overlay: 200,\n modal: 300,\n popover: 400,\n toast: 500,\n tooltip: 600,\n} as const;\n\n/**\n * Breakpoints — Tailwind's defaults, restated so a media query built in JS\n * (`useBreakpoint`, a chart's responsive config) reads the same numbers the\n * `sm:`…`2xl:` variants do.\n */\nexport const breakpoints = {\n sm: \"40rem\",\n md: \"48rem\",\n lg: \"64rem\",\n xl: \"80rem\",\n \"2xl\": \"96rem\",\n} as const;\n\nexport const reference = {\n colors,\n typography,\n radii,\n shadows,\n overlays,\n layout,\n motion,\n spacing,\n surfaces,\n iconSizes,\n zIndex,\n breakpoints,\n} as const;\n\nexport type ReferenceTokens = typeof reference;\nexport type ColorName = keyof typeof colors;\n","/* GENERATED FILE — do not edit.\n * Source: tokens/src (DTCG, ADR-003).\n * Generator: tokens/build/lib/generate-ts.mjs, template tokens/build/templates/system.ts.tmpl.\n * Change the token files and run `pnpm tokens:build`; `pnpm tokens:check`\n * fails when this file is out of date. */\n/**\n * System tokens — suite semantic mappings as CSS variable references.\n *\n * Use these from JS (e.g. inline styles, Storybook decorators, motion configs)\n * when you can't use a Tailwind utility class. Component CSS should prefer the\n * generated utilities (`bg-bg`, `text-fg-2`, `border-rule`, `bg-pro-fg`, etc.)\n * which Tailwind 4 emits from `--color-*` tokens declared in ./tokens.css.\n *\n * Themes (.dark) re-map the underlying CSS variables; these references stay valid.\n */\n\nexport const systemTokens = {\n color: {\n /* Surfaces */\n bg: \"var(--color-bg)\",\n bg2: \"var(--color-bg-2)\",\n bg3: \"var(--color-bg-3)\",\n surface: \"var(--color-surface)\",\n surface2: \"var(--color-surface-2)\",\n\n /* Foreground */\n fg: \"var(--color-fg)\",\n fg2: \"var(--color-fg-2)\",\n fg3: \"var(--color-fg-3)\",\n fg4: \"var(--color-fg-4)\",\n fg5: \"var(--color-fg-5)\",\n\n /* Rules */\n rule: \"var(--color-rule)\",\n ruleSoft: \"var(--color-rule-soft)\",\n ruleStrong: \"var(--color-rule-strong)\",\n\n /* Accent (purple) */\n accent: \"var(--color-accent)\",\n accent2: \"var(--color-accent-2)\",\n accentTint: \"var(--color-accent-tint)\",\n accentHover: \"var(--color-accent-hover)\",\n accentActive: \"var(--color-accent-active)\",\n accentRing: \"var(--color-accent-ring)\",\n\n /* Stable cross-product CTA; deliberately independent of [data-brand]. */\n suiteAction: \"var(--color-suite-action)\",\n suiteActionHover: \"var(--color-suite-action-hover)\",\n suiteActionActive: \"var(--color-suite-action-active)\",\n fgOnSuiteAction: \"var(--color-fg-on-suite-action)\",\n\n /* Brand — ambient product family; follows the active [data-brand] scope,\n defaulting to Pro. Prefer these (and the generated bg-brand / text-brand\n / border-brand-line / text-fg-on-brand utilities) for scope-aware chrome\n so the product never appears in a class name. */\n brand: \"var(--color-brand)\",\n brandHover: \"var(--color-brand-hover)\",\n brandActive: \"var(--color-brand-active)\",\n brandDisabled: \"var(--color-brand-disabled)\",\n brandBg: \"var(--color-brand-bg)\",\n brandBgHover: \"var(--color-brand-bg-hover)\",\n brandBgActive: \"var(--color-brand-bg-active)\",\n brandLine: \"var(--color-brand-line)\",\n brandRing: \"var(--color-brand-ring)\",\n fgOnBrand: \"var(--color-fg-on-brand)\",\n\n /* Pro (purple) */\n proBg: \"var(--color-pro-bg)\",\n proBgHover: \"var(--color-pro-bg-hover)\",\n proBgActive: \"var(--color-pro-bg-active)\",\n proFg: \"var(--color-pro-fg)\",\n proHover: \"var(--color-pro-hover)\",\n proActive: \"var(--color-pro-active)\",\n proDisabled: \"var(--color-pro-disabled)\",\n proLine: \"var(--color-pro-line)\",\n proRing: \"var(--color-pro-ring)\",\n auditFg: \"var(--color-audit-fg)\",\n auditHover: \"var(--color-audit-hover)\",\n auditActive: \"var(--color-audit-active)\",\n auditDisabled: \"var(--color-audit-disabled)\",\n auditBg: \"var(--color-audit-bg)\",\n auditBgHover: \"var(--color-audit-bg-hover)\",\n auditBgActive: \"var(--color-audit-bg-active)\",\n auditLine: \"var(--color-audit-line)\",\n auditRing: \"var(--color-audit-ring)\",\n booksFg: \"var(--color-books-fg)\",\n booksHover: \"var(--color-books-hover)\",\n booksActive: \"var(--color-books-active)\",\n booksDisabled: \"var(--color-books-disabled)\",\n booksBg: \"var(--color-books-bg)\",\n booksBgHover: \"var(--color-books-bg-hover)\",\n booksBgActive: \"var(--color-books-bg-active)\",\n booksLine: \"var(--color-books-line)\",\n booksRing: \"var(--color-books-ring)\",\n taxFg: \"var(--color-tax-fg)\",\n taxHover: \"var(--color-tax-hover)\",\n taxActive: \"var(--color-tax-active)\",\n taxDisabled: \"var(--color-tax-disabled)\",\n taxBg: \"var(--color-tax-bg)\",\n taxBgHover: \"var(--color-tax-bg-hover)\",\n taxBgActive: \"var(--color-tax-bg-active)\",\n taxLine: \"var(--color-tax-line)\",\n taxRing: \"var(--color-tax-ring)\",\n\n /* On-brand — text/icon color on a filled brand/product surface */\n fgOnAccent: \"var(--color-fg-on-accent)\",\n fgOnPro: \"var(--color-fg-on-pro)\",\n fgOnAudit: \"var(--color-fg-on-audit)\",\n fgOnBooks: \"var(--color-fg-on-books)\",\n fgOnTax: \"var(--color-fg-on-tax)\",\n\n /* Disabled */\n fgDisabled: \"var(--color-fg-disabled)\",\n bgDisabled: \"var(--color-bg-disabled)\",\n\n /* Overlays */\n overlayHover: \"var(--color-overlay-hover)\",\n overlayActive: \"var(--color-overlay-active)\",\n\n /* Status */\n successFg: \"var(--color-success-fg)\",\n successBg: \"var(--color-success-bg)\",\n successLine: \"var(--color-success-line)\",\n warningFg: \"var(--color-warning-fg)\",\n warningBg: \"var(--color-warning-bg)\",\n warningLine: \"var(--color-warning-line)\",\n dangerFg: \"var(--color-danger-fg)\",\n dangerBg: \"var(--color-danger-bg)\",\n dangerLine: \"var(--color-danger-line)\",\n\n /* Data-viz — chart series ramp + area gradient stops */\n chart1: \"var(--color-chart-1)\",\n chart2: \"var(--color-chart-2)\",\n chart3: \"var(--color-chart-3)\",\n chart4: \"var(--color-chart-4)\",\n chartLine: \"var(--color-chart-line)\",\n chartAreaFrom: \"var(--color-chart-area-from)\",\n chartAreaTo: \"var(--color-chart-area-to)\",\n\n /* Practice service tones — fill + track tint */\n serviceTax: \"var(--color-service-tax)\",\n serviceTaxBg: \"var(--color-service-tax-bg)\",\n serviceAudit: \"var(--color-service-audit)\",\n serviceAuditBg: \"var(--color-service-audit-bg)\",\n serviceAccounting: \"var(--color-service-accounting)\",\n serviceAccountingBg: \"var(--color-service-accounting-bg)\",\n },\n\n /** Ordered chart series ramp — index a series by position, cycle with `% 4`. */\n chart: [\n \"var(--color-chart-1)\",\n \"var(--color-chart-2)\",\n \"var(--color-chart-3)\",\n \"var(--color-chart-4)\",\n ],\n\n gradient: {\n brand: \"var(--gradient-brand)\",\n pro: \"var(--gradient-pro)\",\n audit: \"var(--gradient-audit)\",\n books: \"var(--gradient-books)\",\n tax: \"var(--gradient-tax)\",\n },\n\n shadow: {\n quiet: \"var(--shadow-quiet)\",\n card: \"var(--shadow-card)\",\n pop: \"var(--shadow-pop)\",\n focusRing: \"var(--shadow-focus-ring)\",\n xs: \"var(--shadow-xs)\",\n sm: \"var(--shadow-sm)\",\n md: \"var(--shadow-md)\",\n lg: \"var(--shadow-lg)\",\n xl: \"var(--shadow-xl)\",\n \"2xl\": \"var(--shadow-2xl)\",\n },\n\n radius: {\n btn: \"var(--radius-btn)\",\n input: \"var(--radius-input)\",\n pill: \"var(--radius-pill)\",\n card: \"var(--radius-card)\",\n icon: \"var(--radius-icon)\",\n full: \"var(--radius-full)\",\n },\n\n type: {\n family: {\n display: \"var(--font-display)\",\n body: \"var(--font-body)\",\n mono: \"var(--font-mono)\",\n },\n weight: {\n regular: \"var(--font-weight-regular)\",\n medium: \"var(--font-weight-medium)\",\n semibold: \"var(--font-weight-semibold)\",\n bold: \"var(--font-weight-bold)\",\n },\n },\n\n motion: {\n ease: {\n outQuart: \"var(--ease-out-quart)\",\n out: \"var(--ease-out)\",\n in: \"var(--ease-in)\",\n inOut: \"var(--ease-in-out)\",\n },\n duration: {\n instant: \"var(--duration-instant)\",\n fast: \"var(--duration-fast)\",\n normal: \"var(--duration-normal)\",\n slow: \"var(--duration-slow)\",\n },\n semantic: {\n duration: {\n press: \"var(--motion-duration-press)\",\n feedback: \"var(--motion-duration-feedback)\",\n overlay: \"var(--motion-duration-overlay)\",\n spatial: \"var(--motion-duration-spatial)\",\n deliberate: \"var(--motion-duration-deliberate)\",\n },\n ease: {\n enter: \"var(--motion-ease-enter)\",\n exit: \"var(--motion-ease-exit)\",\n move: \"var(--motion-ease-move)\",\n },\n },\n },\n\n /**\n * Control sizing (amendment A1, W2-03). One outer height per size name, with\n * the padding, gap, label size and glyph size derived from it.\n *\n * **Nothing reads these yet** and the numbers are gated on decision D5\n * (implementation plan §3) — what each control renders *today* is in\n * `docs/design-system/control-sizes.md`, and W2-05 is the task that unifies\n * them. Referencing the scale here is also what keeps the custom properties\n * in the published stylesheet, so `[data-ds-density=\"compact\"]` has something\n * to re-point.\n */\n control: {\n height: {\n xs: \"var(--control-height-xs)\",\n sm: \"var(--control-height-sm)\",\n md: \"var(--control-height-md)\",\n lg: \"var(--control-height-lg)\",\n xl: \"var(--control-height-xl)\",\n },\n paddingX: {\n xs: \"var(--control-padding-x-xs)\",\n sm: \"var(--control-padding-x-sm)\",\n md: \"var(--control-padding-x-md)\",\n lg: \"var(--control-padding-x-lg)\",\n xl: \"var(--control-padding-x-xl)\",\n },\n gap: {\n xs: \"var(--control-gap-xs)\",\n sm: \"var(--control-gap-sm)\",\n md: \"var(--control-gap-md)\",\n lg: \"var(--control-gap-lg)\",\n xl: \"var(--control-gap-xl)\",\n },\n fontSize: {\n xs: \"var(--control-font-size-xs)\",\n sm: \"var(--control-font-size-sm)\",\n md: \"var(--control-font-size-md)\",\n lg: \"var(--control-font-size-lg)\",\n xl: \"var(--control-font-size-xl)\",\n },\n icon: {\n xs: \"var(--control-icon-xs)\",\n sm: \"var(--control-icon-sm)\",\n md: \"var(--control-icon-md)\",\n lg: \"var(--control-icon-lg)\",\n xl: \"var(--control-icon-xl)\",\n },\n },\n\n layout: {\n shellSidebarWidth: \"var(--shell-sidebar-w)\",\n shellSidebarRailWidth: \"var(--shell-sidebar-w-rail)\",\n shellHeaderHeight: \"var(--shell-header-h)\",\n contentPad: \"var(--content-pad)\",\n },\n\n z: {\n base: \"var(--z-base)\",\n dropdown: \"var(--z-dropdown)\",\n sticky: \"var(--z-sticky)\",\n overlay: \"var(--z-overlay)\",\n modal: \"var(--z-modal)\",\n toast: \"var(--z-toast)\",\n tooltip: \"var(--z-tooltip)\",\n },\n} as const;\n\nexport type SystemTokens = typeof systemTokens;\n","/**\n * sRGB colour arithmetic for the runtime brand contract (W1-20).\n *\n * Everything here is integer or IEEE-754 arithmetic over committed constants.\n * In particular the sRGB transfer function is a **committed lookup table**\n * rather than a call to `Math.pow`: `Math.pow` is implementation-approximated,\n * so two engines may return doubles that differ in the last bit, and a\n * comparison sitting exactly on a contrast threshold could then resolve one way\n * in Node and the other way in a browser. Addition, multiplication, division\n * and `Math.round` are exactly specified, so with the table as the only source\n * of transferred values every result below is bit-identical on every conforming\n * engine (amendment A3 — SSR determinism).\n *\n * `__tests__/srgb.test.ts` checks the table against the formula, so the\n * constants stay auditable.\n */\n\n/** A colour as three integer sRGB channels, 0–255. */\nexport type Rgb = readonly [number, number, number];\n\n/**\n * The sRGB transfer function applied to each of the 256 channel bytes, scaled\n * by 1e6 and rounded to the nearest integer. Index = channel byte.\n *\n * Six decimal places is far finer than the two the WCAG contrast thresholds are\n * quoted to — the worst-case effect on a ratio is about 2e-5 — and keeps the\n * table small enough to ship on a data entry point.\n */\nconst SRGB_TO_LINEAR_1E6: readonly number[] = [\n 0, 304, 607, 911, 1214, 1518, 1821, 2125, 2428, 2732, 3035, 3347, 3677, 4025, 4391, 4777, 5182,\n 5605, 6049, 6512, 6995, 7499, 8023, 8568, 9134, 9721, 10330, 10960, 11612, 12286, 12983, 13702,\n 14444, 15209, 15996, 16807, 17642, 18500, 19382, 20289, 21219, 22174, 23153, 24158, 25187, 26241,\n 27321, 28426, 29557, 30713, 31896, 33105, 34340, 35601, 36889, 38204, 39546, 40915, 42311, 43735,\n 45186, 46665, 48172, 49707, 51269, 52861, 54480, 56128, 57805, 59511, 61246, 63010, 64803, 66626,\n 68478, 70360, 72272, 74214, 76185, 78187, 80220, 82283, 84376, 86500, 88656, 90842, 93059, 95307,\n 97587, 99899, 102242, 104616, 107023, 109462, 111932, 114435, 116971, 119538, 122139, 124772,\n 127438, 130136, 132868, 135633, 138432, 141263, 144128, 147027, 149960, 152926, 155926, 158961,\n 162029, 165132, 168269, 171441, 174647, 177888, 181164, 184475, 187821, 191202, 194618, 198069,\n 201556, 205079, 208637, 212231, 215861, 219526, 223228, 226966, 230740, 234551, 238398, 242281,\n 246201, 250158, 254152, 258183, 262251, 266356, 270498, 274677, 278894, 283149, 287441, 291771,\n 296138, 300544, 304987, 309469, 313989, 318547, 323143, 327778, 332452, 337164, 341914, 346704,\n 351533, 356400, 361307, 366253, 371238, 376262, 381326, 386429, 391572, 396755, 401978, 407240,\n 412543, 417885, 423268, 428690, 434154, 439657, 445201, 450786, 456411, 462077, 467784, 473531,\n 479320, 485150, 491021, 496933, 502886, 508881, 514918, 520996, 527115, 533276, 539479, 545724,\n 552011, 558340, 564712, 571125, 577580, 584078, 590619, 597202, 603827, 610496, 617207, 623960,\n 630757, 637597, 644480, 651406, 658375, 665387, 672443, 679542, 686685, 693872, 701102, 708376,\n 715694, 723055, 730461, 737910, 745404, 752942, 760525, 768151, 775822, 783538, 791298, 799103,\n 806952, 814847, 822786, 830770, 838799, 846873, 854993, 863157, 871367, 879622, 887923, 896269,\n 904661, 913099, 921582, 930111, 938686, 947307, 955973, 964686, 973445, 982251, 991102, 1000000,\n];\n\nconst HEX_3 = /^#[0-9a-fA-F]{3}$/;\nconst HEX_6 = /^#[0-9a-fA-F]{6}$/;\nconst HEX_DIGITS = \"0123456789abcdef\";\n\n/** `#rgb` and `#rrggbb`, in either case. Returns `null` for anything else. */\nexport function parseHexColor(value: string): Rgb | null {\n if (HEX_6.test(value)) {\n const n = Number.parseInt(value.slice(1), 16);\n return [(n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff];\n }\n if (HEX_3.test(value)) {\n const n = Number.parseInt(value.slice(1), 16);\n const r = (n >> 8) & 0xf;\n const g = (n >> 4) & 0xf;\n const b = n & 0xf;\n return [r * 17, g * 17, b * 17];\n }\n return null;\n}\n\n/** Lower-case `#rrggbb`. Built by table lookup so no locale or `toString`\n * radix behaviour can enter the output. */\nexport function formatHexColor([r, g, b]: Rgb): string {\n const byte = (v: number) => HEX_DIGITS[(v >> 4) & 0xf] + HEX_DIGITS[v & 0xf];\n return `#${byte(r)}${byte(g)}${byte(b)}`;\n}\n\n/** WCAG relative luminance, from the committed transfer table. */\nexport function relativeLuminance([r, g, b]: Rgb): number {\n const lr = SRGB_TO_LINEAR_1E6[r] / 1e6;\n const lg = SRGB_TO_LINEAR_1E6[g] / 1e6;\n const lb = SRGB_TO_LINEAR_1E6[b] / 1e6;\n return 0.2126 * lr + 0.7152 * lg + 0.0722 * lb;\n}\n\n/** WCAG 2.2 contrast ratio between two opaque colours (1–21). */\nexport function contrastRatio(a: Rgb, b: Rgb): number {\n const la = relativeLuminance(a);\n const lb = relativeLuminance(b);\n const lighter = la > lb ? la : lb;\n const darker = la > lb ? lb : la;\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * `color-mix(in srgb, <a> <percent>%, <b>)` evaluated on integer channels.\n * `percent` is an integer 0–100; sRGB mixing is a straight interpolation in the\n * gamma-encoded space, which is what the browser does for `in srgb`.\n */\nexport function mixSrgb(a: Rgb, b: Rgb, percent: number): Rgb {\n const mix = (x: number, y: number) => Math.round((x * percent + y * (100 - percent)) / 100);\n return [mix(a[0], b[0]), mix(a[1], b[1]), mix(a[2], b[2])];\n}\n\nexport const WHITE: Rgb = [255, 255, 255];\nexport const BLACK: Rgb = [0, 0, 0];\n\n/**\n * Pure black or pure white, whichever has more contrast against `fill`.\n *\n * The two endpoints cross over at a luminance of about 0.1791, where both reach\n * 4.58:1, so the winner is **always** at or above 4.58:1 — WCAG 2.2 AA for\n * normal text (4.5:1) with margin, for every possible fill. Any near-black ink\n * short of `#000000` loses that property, which is why this returns the\n * extremes rather than a token value.\n */\nexport function readableInk(fill: Rgb): Rgb {\n return contrastRatio(BLACK, fill) >= contrastRatio(WHITE, fill) ? BLACK : WHITE;\n}\n\n/**\n * The least-darkened mix of `colour` towards black that reaches `minRatio`\n * against `against`, searched over the 101 integer mix percentages from 100\n * (untouched) downwards. 0% is black, so the search terminates whenever\n * `against` is light enough for black to pass — true for every background this\n * module uses.\n */\nexport function darkenUntilContrast(colour: Rgb, against: Rgb, minRatio: number): Rgb {\n for (let percent = 100; percent >= 0; percent -= 1) {\n const candidate = mixSrgb(colour, BLACK, percent);\n if (contrastRatio(candidate, against) >= minRatio) return candidate;\n }\n return BLACK;\n}\n","/**\n * `createBrandTheme()` — the runtime brand contract (W1-20, experimental).\n *\n * A white-label host has one or two colours per tenant and needs the design\n * system's brand family to follow them. Today that is done by writing the\n * design system's *legacy* variable names from application code (Assure\n * Portal's `src/lib/brand-theme.ts` writes about thirty of them onto `<body>`),\n * which couples the application to names the design system owns and gives no\n * guarantee that the result is legible.\n *\n * This function is the supported replacement: a validated seed in, a plain\n * object of `--ds-*` custom properties out, to spread into a `style` attribute\n * on whatever element scopes the brand (target architecture §12.1 rule 6 (iv)).\n *\n * Contract:\n *\n * - **Pure.** No `document`, no `window`, no clock, no randomness, no module\n * state. The same seed always yields the same object.\n * - **SSR-deterministic** (amendment A3). Every number comes from integer\n * arithmetic over a committed transfer table (`./srgb`), so server-rendered\n * markup and the first client render agree byte for byte. Asserted in Node\n * (`__tests__/brand-theme.test.ts`) and in a real browser\n * (`tests/browser/brand-theme-ssr-determinism.test.ts`) against the same\n * committed vectors.\n * - **Legible.** The fills are clamped to at least 3:1 against the light canvas\n * (WCAG 2.2 SC 1.4.11, non-text contrast), and every foreground the function\n * emits reaches at least 4.5:1 against the fill it sits on (SC 1.4.3 AA).\n * - **Shaped like a built-in brand.** The ramp uses the same percentages as the\n * generated `[data-ds-brand]` scopes in `css/tokens.css`, and the steps that\n * depend on the colour scheme stay as `color-mix(… var(--ds-color-content))`\n * exactly as those scopes do, so a runtime brand keeps working in dark mode.\n *\n * @experimental The seed shape is gated by decision D7 (white-label scope:\n * brand, plus optional accent). It may change while D7 is open.\n */\nimport {\n BLACK,\n WHITE,\n contrastRatio,\n darkenUntilContrast,\n formatHexColor,\n mixSrgb,\n parseHexColor,\n readableInk,\n type Rgb,\n} from \"./srgb\";\n\n/**\n * The seed a host supplies per tenant.\n *\n * @experimental Gated by decision D7.\n */\nexport interface BrandThemeSeed {\n /**\n * The brand fill, as `#rgb` or `#rrggbb`. Drives the `action.brand` family,\n * the focus ring and the brand gradient.\n */\n brand: string;\n /**\n * An optional second hue for the `action.accent` family, as `#rgb` or\n * `#rrggbb`. `undefined` or `null` means \"the same as `brand`\", which is what\n * the built-in `[data-ds-brand]` scopes do.\n */\n accent?: string | null;\n}\n\n/** Every custom property `createBrandTheme()` sets, in output order. */\nexport const BRAND_THEME_PROPERTIES = [\n \"--ds-color-action-brand-bg\",\n \"--ds-color-action-brand-bg-hover\",\n \"--ds-color-action-brand-bg-active\",\n \"--ds-color-action-brand-bg-disabled\",\n \"--ds-color-action-brand-subtle-bg\",\n \"--ds-color-action-brand-subtle-bg-hover\",\n \"--ds-color-action-brand-subtle-bg-active\",\n \"--ds-color-action-brand-border\",\n \"--ds-color-action-brand-ring\",\n \"--ds-color-action-brand-fg\",\n \"--ds-color-action-accent-bg\",\n \"--ds-color-action-accent-bg-strong\",\n \"--ds-color-action-accent-bg-hover\",\n \"--ds-color-action-accent-bg-active\",\n \"--ds-color-action-accent-subtle-bg\",\n \"--ds-color-action-accent-ring\",\n \"--ds-color-action-accent-fg\",\n \"--ds-color-border-focus\",\n \"--ds-focus-ring-color\",\n \"--ds-focus-ring-border\",\n \"--ds-gradient-brand\",\n \"--ds-compat-color-brand-soft\",\n \"--ds-compat-color-brand-soft-foreground\",\n] as const;\n\n/** One of the custom properties `createBrandTheme()` sets. */\nexport type BrandThemeProperty = (typeof BRAND_THEME_PROPERTIES)[number];\n\n/**\n * The style object `createBrandTheme()` returns: every property of\n * {@link BRAND_THEME_PROPERTIES} with a CSS value.\n *\n * React types `style` as `CSSProperties`, which has no index signature for\n * custom properties, so spread it or cast it at the call site:\n * `style={{ ...createBrandTheme(seed) }}`.\n *\n * @experimental Gated by decision D7.\n */\nexport type BrandTheme = { readonly [P in BrandThemeProperty]: string };\n\n/** Minimum contrast a fill must reach against the light canvas (SC 1.4.11). */\nconst MIN_FILL_CONTRAST = 3;\n/** Minimum contrast a foreground must reach against its fill (SC 1.4.3 AA). */\nconst MIN_TEXT_CONTRAST = 4.5;\n\n/** The light canvas (`--ds-color-canvas`), the surface a fill sits on. */\nconst CANVAS: Rgb = WHITE;\n\n/**\n * Ramp percentages, copied from the generated brand scopes in\n * `tokens/build/generate-ds-css.mjs`, so a runtime brand and a built-in one are\n * the same shape.\n */\nconst RAMP = {\n hover: 88,\n active: 74,\n disabled: 42,\n subtle: 8,\n subtleHover: 13,\n subtleActive: 20,\n border: 45,\n ring: 20,\n /** The soft tint and its ink, which the app-vocabulary bridge reads. */\n soft: 12,\n softInk: 68,\n} as const;\n\n/** `color-mix(in srgb, <colour> <percent>%, var(--ds-color-content))` — the\n * scheme-aware steps, left unresolved exactly as the built-in scopes leave\n * them, so a runtime brand still darkens in light mode and lightens in dark. */\nconst towardsInk = (colour: string, percent: number) =>\n `color-mix(in srgb, ${colour} ${percent}%, var(--ds-color-content))`;\n\n/** `color-mix(in srgb, <colour> <percent>%, transparent)`. */\nconst towardsTransparent = (colour: string, percent: number) =>\n `color-mix(in srgb, ${colour} ${percent}%, transparent)`;\n\nconst ACCEPTED = '#rgb or #rrggbb, for example \"#6c42f8\"';\nconst SEED_KEYS = new Set([\"brand\", \"accent\"]);\n\nfunction describe(value: unknown): string {\n if (typeof value === \"string\") return JSON.stringify(value);\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"an array\";\n return typeof value;\n}\n\nfunction readColour(key: \"brand\" | \"accent\", value: unknown): Rgb {\n if (typeof value !== \"string\") {\n throw new TypeError(\n `createBrandTheme: \"${key}\" must be a hex colour string (${ACCEPTED}), received ${describe(value)}.`,\n );\n }\n const rgb = parseHexColor(value);\n if (!rgb) {\n throw new TypeError(\n `createBrandTheme: \"${key}\" must be a hex colour (${ACCEPTED}), received ${describe(value)}. ` +\n \"Named colours, rgb()/hsl() and eight-digit hex with alpha are not accepted — a brand seed must be opaque and unambiguous.\",\n );\n }\n return rgb;\n}\n\nfunction validateSeed(seed: BrandThemeSeed): void {\n if (seed === null || typeof seed !== \"object\" || Array.isArray(seed)) {\n throw new TypeError(\n `createBrandTheme: expected a seed object with a \"brand\" colour, received ${describe(seed)}.`,\n );\n }\n const unknown = Object.keys(seed).filter((key) => !SEED_KEYS.has(key));\n if (unknown.length) {\n throw new TypeError(\n `createBrandTheme: unknown seed ${unknown.length === 1 ? \"key\" : \"keys\"} ${unknown\n .map((key) => JSON.stringify(key))\n .join(\", \")}. The seed accepts \"brand\" and an optional \"accent\" (decision D7).`,\n );\n }\n}\n\n/**\n * Clamp a seed so it reads as a UI fill: at least 3:1 against the light canvas\n * (WCAG 2.2 SC 1.4.11). A seed that already passes is returned untouched, so\n * the common case is exact — `createBrandTheme({ brand: \"#6c42f8\" })` emits\n * `#6c42f8`. A pale seed is darkened by the smallest whole-percent mix towards\n * black that passes, which keeps the hue and gives up only lightness.\n */\nfunction clampFill(seed: Rgb): Rgb {\n if (contrastRatio(seed, CANVAS) >= MIN_FILL_CONTRAST) return seed;\n return darkenUntilContrast(seed, CANVAS, MIN_FILL_CONTRAST);\n}\n\n/**\n * Turn a tenant's colours into the design system's brand and accent tokens.\n *\n * ```tsx\n * const theme = createBrandTheme({ brand: firm.primaryColor, accent: firm.accentColor });\n * return <div style={{ ...theme }}>{children}</div>;\n * ```\n *\n * Apply it to the element that scopes the brand — `<body>` for a whole-tenant\n * theme, a wrapper for a preview. The properties are the same ones a built-in\n * `[data-ds-brand]` scope declares, so anything reading them (every design\n * system component, and any application CSS reading `--ds-*`) follows.\n *\n * @param seed - `brand`, and optionally `accent` (decision D7).\n * @returns A frozen object of custom property names to CSS values.\n * @throws TypeError when the seed is not an object, carries an unknown key, or\n * a colour is missing or not `#rgb`/`#rrggbb`.\n *\n * @experimental Gated by decision D7. The property set may grow, and the seed\n * shape may change, until D7 is resolved.\n */\nexport function createBrandTheme(seed: BrandThemeSeed): BrandTheme {\n validateSeed(seed);\n const brandSeed = readColour(\"brand\", seed.brand);\n const accentSeed =\n seed.accent === undefined || seed.accent === null\n ? brandSeed\n : readColour(\"accent\", seed.accent);\n\n const brand = clampFill(brandSeed);\n const accent = clampFill(accentSeed);\n const brandHex = formatHexColor(brand);\n const accentHex = formatHexColor(accent);\n\n const soft = mixSrgb(brand, WHITE, RAMP.soft);\n const softInk = darkenUntilContrast(mixSrgb(brand, BLACK, RAMP.softInk), soft, MIN_TEXT_CONTRAST);\n\n return Object.freeze({\n \"--ds-color-action-brand-bg\": brandHex,\n \"--ds-color-action-brand-bg-hover\": towardsInk(brandHex, RAMP.hover),\n \"--ds-color-action-brand-bg-active\": towardsInk(brandHex, RAMP.active),\n \"--ds-color-action-brand-bg-disabled\": formatHexColor(mixSrgb(brand, WHITE, RAMP.disabled)),\n \"--ds-color-action-brand-subtle-bg\": formatHexColor(mixSrgb(brand, WHITE, RAMP.subtle)),\n \"--ds-color-action-brand-subtle-bg-hover\": formatHexColor(\n mixSrgb(brand, WHITE, RAMP.subtleHover),\n ),\n \"--ds-color-action-brand-subtle-bg-active\": formatHexColor(\n mixSrgb(brand, WHITE, RAMP.subtleActive),\n ),\n \"--ds-color-action-brand-border\": formatHexColor(mixSrgb(brand, WHITE, RAMP.border)),\n \"--ds-color-action-brand-ring\": towardsTransparent(brandHex, RAMP.ring),\n \"--ds-color-action-brand-fg\": formatHexColor(readableInk(brand)),\n \"--ds-color-action-accent-bg\": accentHex,\n \"--ds-color-action-accent-bg-strong\": towardsInk(accentHex, RAMP.active),\n \"--ds-color-action-accent-bg-hover\": towardsInk(accentHex, RAMP.hover),\n \"--ds-color-action-accent-bg-active\": towardsInk(accentHex, RAMP.active),\n \"--ds-color-action-accent-subtle-bg\": formatHexColor(mixSrgb(accent, WHITE, RAMP.subtle)),\n \"--ds-color-action-accent-ring\": towardsTransparent(accentHex, RAMP.ring),\n \"--ds-color-action-accent-fg\": formatHexColor(readableInk(accent)),\n \"--ds-color-border-focus\": accentHex,\n \"--ds-focus-ring-color\": towardsTransparent(brandHex, RAMP.ring),\n \"--ds-focus-ring-border\": brandHex,\n \"--ds-gradient-brand\": `linear-gradient(135deg, ${brandHex}, ${towardsInk(brandHex, RAMP.hover)})`,\n \"--ds-compat-color-brand-soft\": formatHexColor(soft),\n \"--ds-compat-color-brand-soft-foreground\": formatHexColor(softInk),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/tokens/reference.ts","../../src/tokens/system.ts","../../src/foundation/theme/srgb.ts","../../src/foundation/theme/brand-theme.ts"],"names":[],"mappings":"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O,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACtF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,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","file":"index.js","sourcesContent":["/* GENERATED FILE — do not edit.\n * Source: tokens/src (DTCG, ADR-003).\n * Generator: tokens/build/lib/generate-ts.mjs, template tokens/build/templates/reference.ts.tmpl.\n * Change the token files and run `pnpm tokens:build`; `pnpm tokens:check`\n * fails when this file is out of date. */\n/**\n * Reference tokens — raw palette.\n *\n * Programmatic access for theme switching, Figma sync, design tools, etc.\n * Components should NOT consume these directly; use system tokens (./system.ts)\n * or the CSS variables in ./tokens.css.\n */\n\nexport const colors = {\n /* Surfaces */\n bg: \"#ffffff\",\n bg2: \"#f1f3f8\",\n bg3: \"#e7eaf1\",\n surface: \"#ffffff\",\n surface2: \"#f7f8fc\",\n\n /* Foreground */\n fg: \"#0a0a0a\",\n fg2: \"#38383b\",\n fg3: \"#5f5f64\",\n fg4: \"#6b6b70\",\n fg5: \"#9a9aa0\",\n\n /* Rules */\n rule: \"#e4e7ef\",\n ruleSoft: \"#eef0f5\",\n ruleStrong: \"#d3d8e3\",\n\n /* Accent (cyan) */\n accent: \"#6c42f8\",\n accent2: \"#5127e8\",\n accentTint: \"#efeaff\",\n accentHover: \"#5e35f2\",\n accentActive: \"#5127e8\",\n\n /* Pro (purple) */\n proBg: \"#f4f1ff\",\n proBgHover: \"#eee9ff\",\n proBgActive: \"#e4ddff\",\n proFg: \"#6c42f8\",\n proHover: \"#5e35f2\",\n proActive: \"#5127e8\",\n proDisabled: \"#b7a7f3\",\n proLine: \"#7b5bd8\",\n\n /* Disabled */\n fgDisabled: \"#a7a7ac\",\n bgDisabled: \"#f1f2f6\",\n\n /* Status */\n successFg: \"#1f7a3d\",\n successBg: \"#eaf6ee\",\n successLine: \"#c5e5cf\",\n warningFg: \"#8a4606\",\n warningBg: \"#fff3e5\",\n warningLine: \"#f5d5a8\",\n dangerFg: \"#c43838\",\n dangerBg: \"#fbeaea\",\n dangerLine: \"#ecc5c5\",\n\n /* On-brand */\n fgOnAccent: \"#ffffff\",\n fgOnPro: \"#ffffff\",\n} as const;\n\nexport const typography = {\n family: {\n display: '\"Plus Jakarta Sans\", -apple-system, system-ui, sans-serif',\n body: '\"Plus Jakarta Sans\", -apple-system, system-ui, sans-serif',\n mono: '\"Plus Jakarta Sans\", -apple-system, system-ui, sans-serif',\n },\n weight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n /* Universal entrance ease — applies to every motion primitive */\n ease: \"cubic-bezier(0.25, 1, 0.5, 1)\",\n} as const;\n\nexport const radii = {\n btn: \"7px\",\n input: \"7px\",\n pill: \"5px\",\n card: \"12px\",\n icon: \"4px\",\n full: \"9999px\",\n} as const;\n\nexport const shadows = {\n quiet: \"0 1px 1px rgba(16, 20, 36, 0.03), 0 1px 3px rgba(16, 20, 36, 0.05)\",\n card: \"0 1px 2px rgba(16, 20, 36, 0.04), 0 2px 4px -2px rgba(16, 20, 36, 0.04), 0 8px 16px -6px rgba(16, 20, 36, 0.08)\",\n pop: \"0 0 0 1px rgba(16, 20, 36, 0.04), 0 2px 4px -1px rgba(16, 20, 36, 0.05), 0 6px 12px -3px rgba(16, 20, 36, 0.07), 0 16px 32px -8px rgba(16, 20, 36, 0.12)\",\n focusRing: \"0 0 0 2px #ffffff, 0 0 0 4px #6c42f8\",\n} as const;\n\nexport const overlays = {\n hover: \"rgba(16, 20, 36, 0.04)\",\n active: \"rgba(16, 20, 36, 0.07)\",\n} as const;\n\nexport const layout = {\n shellSidebarWidth: \"200px\",\n shellHeaderHeight: \"56px\",\n contentPad: \"32px\",\n} as const;\n\n/**\n * Spacing — 4px base scale. Components mostly use arbitrary values;\n * this scale is exposed for programmatic access (e.g. design-tool sync).\n */\nexport const spacing = {\n unit: \"4px\",\n 4: \"4px\",\n 8: \"8px\",\n 12: \"12px\",\n 16: \"16px\",\n 20: \"20px\",\n 24: \"24px\",\n 28: \"28px\",\n 32: \"32px\",\n 36: \"36px\",\n 40: \"40px\",\n 64: \"64px\",\n 80: \"80px\",\n 180: \"180px\",\n} as const;\n\n/**\n * Surface palette — the four canonical layers. Mirrors --color-bg / -2 /\n * --color-surface / --color-surface-2.\n */\nexport const surfaces = {\n bg: \"#ffffff\",\n bg2: \"#f1f3f8\",\n surface: \"#ffffff\",\n surface2: \"#f7f8fc\",\n} as const;\n\nexport const motion = {\n ease: {\n outQuart: \"cubic-bezier(0.25, 1, 0.5, 1)\",\n out: \"cubic-bezier(0.16, 1, 0.3, 1)\",\n in: \"cubic-bezier(0.7, 0, 0.84, 0)\",\n inOut: \"cubic-bezier(0.65, 0, 0.35, 1)\",\n },\n duration: {\n instant: \"100ms\",\n fast: \"150ms\",\n normal: \"250ms\",\n slow: \"400ms\",\n },\n} as const;\n\n/**\n * Icon boxes — the four sizes of target architecture §9.3. These are the boxes\n * the library actually draws; `Icon`'s `size` prop maps onto them (W3-18).\n */\nexport const iconSizes = {\n xs: \"12px\",\n sm: \"14px\",\n md: \"16px\",\n lg: \"20px\",\n} as const;\n\n/**\n * Global stacking layers — target architecture §21. Use them only for\n * portalled surfaces and page chrome; anything else creates a local stacking\n * context and uses small local integers.\n *\n * `popover` is the layer the CSS still spells `--z-dropdown`; the legacy name\n * keeps working and resolves to the same value.\n */\nexport const zIndex = {\n base: 0,\n sticky: 100,\n overlay: 200,\n modal: 300,\n popover: 400,\n toast: 500,\n tooltip: 600,\n} as const;\n\n/**\n * Breakpoints — Tailwind's defaults, restated so a media query built in JS\n * (`useBreakpoint`, a chart's responsive config) reads the same numbers the\n * `sm:`…`2xl:` variants do.\n */\nexport const breakpoints = {\n sm: \"40rem\",\n md: \"48rem\",\n lg: \"64rem\",\n xl: \"80rem\",\n \"2xl\": \"96rem\",\n} as const;\n\nexport const reference = {\n colors,\n typography,\n radii,\n shadows,\n overlays,\n layout,\n motion,\n spacing,\n surfaces,\n iconSizes,\n zIndex,\n breakpoints,\n} as const;\n\nexport type ReferenceTokens = typeof reference;\nexport type ColorName = keyof typeof colors;\n","/* GENERATED FILE — do not edit.\n * Source: tokens/src (DTCG, ADR-003).\n * Generator: tokens/build/lib/generate-ts.mjs, template tokens/build/templates/system.ts.tmpl.\n * Change the token files and run `pnpm tokens:build`; `pnpm tokens:check`\n * fails when this file is out of date. */\n/**\n * System tokens — suite semantic mappings as CSS variable references.\n *\n * Use these from JS (e.g. inline styles, Storybook decorators, motion configs)\n * when you can't use a Tailwind utility class. Component CSS should prefer the\n * generated utilities (`bg-bg`, `text-fg-2`, `border-rule`, `bg-pro-fg`, etc.)\n * which Tailwind 4 emits from `--color-*` tokens declared in ./tokens.css.\n *\n * Themes (.dark) re-map the underlying CSS variables; these references stay valid.\n */\n\nexport const systemTokens = {\n color: {\n /* Surfaces */\n bg: \"var(--color-bg)\",\n bg2: \"var(--color-bg-2)\",\n bg3: \"var(--color-bg-3)\",\n surface: \"var(--color-surface)\",\n surface2: \"var(--color-surface-2)\",\n\n /* Foreground */\n fg: \"var(--color-fg)\",\n fg2: \"var(--color-fg-2)\",\n fg3: \"var(--color-fg-3)\",\n fg4: \"var(--color-fg-4)\",\n fg5: \"var(--color-fg-5)\",\n\n /* Rules */\n rule: \"var(--color-rule)\",\n ruleSoft: \"var(--color-rule-soft)\",\n ruleStrong: \"var(--color-rule-strong)\",\n\n /* Accent (purple) */\n accent: \"var(--color-accent)\",\n accent2: \"var(--color-accent-2)\",\n accentTint: \"var(--color-accent-tint)\",\n accentHover: \"var(--color-accent-hover)\",\n accentActive: \"var(--color-accent-active)\",\n accentRing: \"var(--color-accent-ring)\",\n\n /* Stable cross-product CTA; deliberately independent of [data-brand]. */\n suiteAction: \"var(--color-suite-action)\",\n suiteActionHover: \"var(--color-suite-action-hover)\",\n suiteActionActive: \"var(--color-suite-action-active)\",\n fgOnSuiteAction: \"var(--color-fg-on-suite-action)\",\n\n /* Brand — ambient product family; follows the active [data-brand] scope,\n defaulting to Pro. Prefer these (and the generated bg-brand / text-brand\n / border-brand-line / text-fg-on-brand utilities) for scope-aware chrome\n so the product never appears in a class name. */\n brand: \"var(--color-brand)\",\n brandHover: \"var(--color-brand-hover)\",\n brandActive: \"var(--color-brand-active)\",\n brandDisabled: \"var(--color-brand-disabled)\",\n brandBg: \"var(--color-brand-bg)\",\n brandBgHover: \"var(--color-brand-bg-hover)\",\n brandBgActive: \"var(--color-brand-bg-active)\",\n brandLine: \"var(--color-brand-line)\",\n brandRing: \"var(--color-brand-ring)\",\n fgOnBrand: \"var(--color-fg-on-brand)\",\n\n /* Pro (purple) */\n proBg: \"var(--color-pro-bg)\",\n proBgHover: \"var(--color-pro-bg-hover)\",\n proBgActive: \"var(--color-pro-bg-active)\",\n proFg: \"var(--color-pro-fg)\",\n proHover: \"var(--color-pro-hover)\",\n proActive: \"var(--color-pro-active)\",\n proDisabled: \"var(--color-pro-disabled)\",\n proLine: \"var(--color-pro-line)\",\n proRing: \"var(--color-pro-ring)\",\n auditFg: \"var(--color-audit-fg)\",\n auditHover: \"var(--color-audit-hover)\",\n auditActive: \"var(--color-audit-active)\",\n auditDisabled: \"var(--color-audit-disabled)\",\n auditBg: \"var(--color-audit-bg)\",\n auditBgHover: \"var(--color-audit-bg-hover)\",\n auditBgActive: \"var(--color-audit-bg-active)\",\n auditLine: \"var(--color-audit-line)\",\n auditRing: \"var(--color-audit-ring)\",\n booksFg: \"var(--color-books-fg)\",\n booksHover: \"var(--color-books-hover)\",\n booksActive: \"var(--color-books-active)\",\n booksDisabled: \"var(--color-books-disabled)\",\n booksBg: \"var(--color-books-bg)\",\n booksBgHover: \"var(--color-books-bg-hover)\",\n booksBgActive: \"var(--color-books-bg-active)\",\n booksLine: \"var(--color-books-line)\",\n booksRing: \"var(--color-books-ring)\",\n taxFg: \"var(--color-tax-fg)\",\n taxHover: \"var(--color-tax-hover)\",\n taxActive: \"var(--color-tax-active)\",\n taxDisabled: \"var(--color-tax-disabled)\",\n taxBg: \"var(--color-tax-bg)\",\n taxBgHover: \"var(--color-tax-bg-hover)\",\n taxBgActive: \"var(--color-tax-bg-active)\",\n taxLine: \"var(--color-tax-line)\",\n taxRing: \"var(--color-tax-ring)\",\n\n /* On-brand — text/icon color on a filled brand/product surface */\n fgOnAccent: \"var(--color-fg-on-accent)\",\n fgOnPro: \"var(--color-fg-on-pro)\",\n fgOnAudit: \"var(--color-fg-on-audit)\",\n fgOnBooks: \"var(--color-fg-on-books)\",\n fgOnTax: \"var(--color-fg-on-tax)\",\n\n /* Disabled */\n fgDisabled: \"var(--color-fg-disabled)\",\n bgDisabled: \"var(--color-bg-disabled)\",\n\n /* Overlays */\n overlayHover: \"var(--color-overlay-hover)\",\n overlayActive: \"var(--color-overlay-active)\",\n\n /* Status */\n successFg: \"var(--color-success-fg)\",\n successBg: \"var(--color-success-bg)\",\n successLine: \"var(--color-success-line)\",\n warningFg: \"var(--color-warning-fg)\",\n warningBg: \"var(--color-warning-bg)\",\n warningLine: \"var(--color-warning-line)\",\n dangerFg: \"var(--color-danger-fg)\",\n dangerBg: \"var(--color-danger-bg)\",\n dangerLine: \"var(--color-danger-line)\",\n\n /* Data-viz — chart series ramp + area gradient stops */\n chart1: \"var(--color-chart-1)\",\n chart2: \"var(--color-chart-2)\",\n chart3: \"var(--color-chart-3)\",\n chart4: \"var(--color-chart-4)\",\n chartLine: \"var(--color-chart-line)\",\n chartAreaFrom: \"var(--color-chart-area-from)\",\n chartAreaTo: \"var(--color-chart-area-to)\",\n\n /* Practice service tones — fill + track tint */\n serviceTax: \"var(--color-service-tax)\",\n serviceTaxBg: \"var(--color-service-tax-bg)\",\n serviceAudit: \"var(--color-service-audit)\",\n serviceAuditBg: \"var(--color-service-audit-bg)\",\n serviceAccounting: \"var(--color-service-accounting)\",\n serviceAccountingBg: \"var(--color-service-accounting-bg)\",\n },\n\n /** Ordered chart series ramp — index a series by position, cycle with `% 4`. */\n chart: [\n \"var(--color-chart-1)\",\n \"var(--color-chart-2)\",\n \"var(--color-chart-3)\",\n \"var(--color-chart-4)\",\n ],\n\n gradient: {\n brand: \"var(--gradient-brand)\",\n pro: \"var(--gradient-pro)\",\n audit: \"var(--gradient-audit)\",\n books: \"var(--gradient-books)\",\n tax: \"var(--gradient-tax)\",\n },\n\n shadow: {\n quiet: \"var(--shadow-quiet)\",\n card: \"var(--shadow-card)\",\n pop: \"var(--shadow-pop)\",\n focusRing: \"var(--shadow-focus-ring)\",\n xs: \"var(--shadow-xs)\",\n sm: \"var(--shadow-sm)\",\n md: \"var(--shadow-md)\",\n lg: \"var(--shadow-lg)\",\n xl: \"var(--shadow-xl)\",\n \"2xl\": \"var(--shadow-2xl)\",\n },\n\n radius: {\n btn: \"var(--radius-btn)\",\n input: \"var(--radius-input)\",\n pill: \"var(--radius-pill)\",\n card: \"var(--radius-card)\",\n icon: \"var(--radius-icon)\",\n full: \"var(--radius-full)\",\n },\n\n type: {\n family: {\n display: \"var(--font-display)\",\n body: \"var(--font-body)\",\n mono: \"var(--font-mono)\",\n },\n weight: {\n regular: \"var(--font-weight-regular)\",\n medium: \"var(--font-weight-medium)\",\n semibold: \"var(--font-weight-semibold)\",\n bold: \"var(--font-weight-bold)\",\n },\n },\n\n motion: {\n ease: {\n outQuart: \"var(--ease-out-quart)\",\n out: \"var(--ease-out)\",\n in: \"var(--ease-in)\",\n inOut: \"var(--ease-in-out)\",\n },\n duration: {\n instant: \"var(--duration-instant)\",\n fast: \"var(--duration-fast)\",\n normal: \"var(--duration-normal)\",\n slow: \"var(--duration-slow)\",\n },\n semantic: {\n duration: {\n press: \"var(--motion-duration-press)\",\n feedback: \"var(--motion-duration-feedback)\",\n overlay: \"var(--motion-duration-overlay)\",\n spatial: \"var(--motion-duration-spatial)\",\n deliberate: \"var(--motion-duration-deliberate)\",\n },\n ease: {\n enter: \"var(--motion-ease-enter)\",\n exit: \"var(--motion-ease-exit)\",\n move: \"var(--motion-ease-move)\",\n },\n },\n },\n\n /**\n * Control sizing (amendment A1, W2-03). One outer height per size name, with\n * the padding, gap, label size and glyph size derived from it.\n *\n * **Nothing reads these yet** and the numbers are gated on decision D5\n * (implementation plan §3) — what each control renders *today* is in\n * `docs/design-system/control-sizes.md`, and W2-05 is the task that unifies\n * them. Referencing the scale here is also what keeps the custom properties\n * in the published stylesheet, so `[data-ds-density=\"compact\"]` has something\n * to re-point.\n */\n control: {\n height: {\n xs: \"var(--control-height-xs)\",\n sm: \"var(--control-height-sm)\",\n md: \"var(--control-height-md)\",\n lg: \"var(--control-height-lg)\",\n xl: \"var(--control-height-xl)\",\n },\n paddingX: {\n xs: \"var(--control-padding-x-xs)\",\n sm: \"var(--control-padding-x-sm)\",\n md: \"var(--control-padding-x-md)\",\n lg: \"var(--control-padding-x-lg)\",\n xl: \"var(--control-padding-x-xl)\",\n },\n gap: {\n xs: \"var(--control-gap-xs)\",\n sm: \"var(--control-gap-sm)\",\n md: \"var(--control-gap-md)\",\n lg: \"var(--control-gap-lg)\",\n xl: \"var(--control-gap-xl)\",\n },\n fontSize: {\n xs: \"var(--control-font-size-xs)\",\n sm: \"var(--control-font-size-sm)\",\n md: \"var(--control-font-size-md)\",\n lg: \"var(--control-font-size-lg)\",\n xl: \"var(--control-font-size-xl)\",\n },\n icon: {\n xs: \"var(--control-icon-xs)\",\n sm: \"var(--control-icon-sm)\",\n md: \"var(--control-icon-md)\",\n lg: \"var(--control-icon-lg)\",\n xl: \"var(--control-icon-xl)\",\n },\n },\n\n layout: {\n shellSidebarWidth: \"var(--shell-sidebar-w)\",\n shellSidebarRailWidth: \"var(--shell-sidebar-w-rail)\",\n shellHeaderHeight: \"var(--shell-header-h)\",\n contentPad: \"var(--content-pad)\",\n },\n\n z: {\n base: \"var(--z-base)\",\n dropdown: \"var(--z-dropdown)\",\n sticky: \"var(--z-sticky)\",\n overlay: \"var(--z-overlay)\",\n modal: \"var(--z-modal)\",\n toast: \"var(--z-toast)\",\n tooltip: \"var(--z-tooltip)\",\n },\n} as const;\n\nexport type SystemTokens = typeof systemTokens;\n","/**\n * sRGB colour arithmetic for the runtime brand contract (W1-20).\n *\n * Everything here is integer or IEEE-754 arithmetic over committed constants.\n * In particular the sRGB transfer function is a **committed lookup table**\n * rather than a call to `Math.pow`: `Math.pow` is implementation-approximated,\n * so two engines may return doubles that differ in the last bit, and a\n * comparison sitting exactly on a contrast threshold could then resolve one way\n * in Node and the other way in a browser. Addition, multiplication, division\n * and `Math.round` are exactly specified, so with the table as the only source\n * of transferred values every result below is bit-identical on every conforming\n * engine (amendment A3 — SSR determinism).\n *\n * `__tests__/srgb.test.ts` checks the table against the formula, so the\n * constants stay auditable.\n */\n\n/** A colour as three integer sRGB channels, 0–255. */\nexport type Rgb = readonly [number, number, number];\n\n/**\n * The sRGB transfer function applied to each of the 256 channel bytes, scaled\n * by 1e6 and rounded to the nearest integer. Index = channel byte.\n *\n * Six decimal places is far finer than the two the WCAG contrast thresholds are\n * quoted to — the worst-case effect on a ratio is about 2e-5 — and keeps the\n * table small enough to ship on a data entry point.\n */\nconst SRGB_TO_LINEAR_1E6: readonly number[] = [\n 0, 304, 607, 911, 1214, 1518, 1821, 2125, 2428, 2732, 3035, 3347, 3677, 4025, 4391, 4777, 5182,\n 5605, 6049, 6512, 6995, 7499, 8023, 8568, 9134, 9721, 10330, 10960, 11612, 12286, 12983, 13702,\n 14444, 15209, 15996, 16807, 17642, 18500, 19382, 20289, 21219, 22174, 23153, 24158, 25187, 26241,\n 27321, 28426, 29557, 30713, 31896, 33105, 34340, 35601, 36889, 38204, 39546, 40915, 42311, 43735,\n 45186, 46665, 48172, 49707, 51269, 52861, 54480, 56128, 57805, 59511, 61246, 63010, 64803, 66626,\n 68478, 70360, 72272, 74214, 76185, 78187, 80220, 82283, 84376, 86500, 88656, 90842, 93059, 95307,\n 97587, 99899, 102242, 104616, 107023, 109462, 111932, 114435, 116971, 119538, 122139, 124772,\n 127438, 130136, 132868, 135633, 138432, 141263, 144128, 147027, 149960, 152926, 155926, 158961,\n 162029, 165132, 168269, 171441, 174647, 177888, 181164, 184475, 187821, 191202, 194618, 198069,\n 201556, 205079, 208637, 212231, 215861, 219526, 223228, 226966, 230740, 234551, 238398, 242281,\n 246201, 250158, 254152, 258183, 262251, 266356, 270498, 274677, 278894, 283149, 287441, 291771,\n 296138, 300544, 304987, 309469, 313989, 318547, 323143, 327778, 332452, 337164, 341914, 346704,\n 351533, 356400, 361307, 366253, 371238, 376262, 381326, 386429, 391572, 396755, 401978, 407240,\n 412543, 417885, 423268, 428690, 434154, 439657, 445201, 450786, 456411, 462077, 467784, 473531,\n 479320, 485150, 491021, 496933, 502886, 508881, 514918, 520996, 527115, 533276, 539479, 545724,\n 552011, 558340, 564712, 571125, 577580, 584078, 590619, 597202, 603827, 610496, 617207, 623960,\n 630757, 637597, 644480, 651406, 658375, 665387, 672443, 679542, 686685, 693872, 701102, 708376,\n 715694, 723055, 730461, 737910, 745404, 752942, 760525, 768151, 775822, 783538, 791298, 799103,\n 806952, 814847, 822786, 830770, 838799, 846873, 854993, 863157, 871367, 879622, 887923, 896269,\n 904661, 913099, 921582, 930111, 938686, 947307, 955973, 964686, 973445, 982251, 991102, 1000000,\n];\n\nconst HEX_3 = /^#[0-9a-fA-F]{3}$/;\nconst HEX_6 = /^#[0-9a-fA-F]{6}$/;\nconst HEX_DIGITS = \"0123456789abcdef\";\n\n/** `#rgb` and `#rrggbb`, in either case. Returns `null` for anything else. */\nexport function parseHexColor(value: string): Rgb | null {\n if (HEX_6.test(value)) {\n const n = Number.parseInt(value.slice(1), 16);\n return [(n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff];\n }\n if (HEX_3.test(value)) {\n const n = Number.parseInt(value.slice(1), 16);\n const r = (n >> 8) & 0xf;\n const g = (n >> 4) & 0xf;\n const b = n & 0xf;\n return [r * 17, g * 17, b * 17];\n }\n return null;\n}\n\n/** Lower-case `#rrggbb`. Built by table lookup so no locale or `toString`\n * radix behaviour can enter the output. */\nexport function formatHexColor([r, g, b]: Rgb): string {\n const byte = (v: number) => HEX_DIGITS[(v >> 4) & 0xf] + HEX_DIGITS[v & 0xf];\n return `#${byte(r)}${byte(g)}${byte(b)}`;\n}\n\n/** WCAG relative luminance, from the committed transfer table. */\nexport function relativeLuminance([r, g, b]: Rgb): number {\n const lr = SRGB_TO_LINEAR_1E6[r] / 1e6;\n const lg = SRGB_TO_LINEAR_1E6[g] / 1e6;\n const lb = SRGB_TO_LINEAR_1E6[b] / 1e6;\n return 0.2126 * lr + 0.7152 * lg + 0.0722 * lb;\n}\n\n/** WCAG 2.2 contrast ratio between two opaque colours (1–21). */\nexport function contrastRatio(a: Rgb, b: Rgb): number {\n const la = relativeLuminance(a);\n const lb = relativeLuminance(b);\n const lighter = la > lb ? la : lb;\n const darker = la > lb ? lb : la;\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * `color-mix(in srgb, <a> <percent>%, <b>)` evaluated on integer channels.\n * `percent` is an integer 0–100; sRGB mixing is a straight interpolation in the\n * gamma-encoded space, which is what the browser does for `in srgb`.\n */\nexport function mixSrgb(a: Rgb, b: Rgb, percent: number): Rgb {\n const mix = (x: number, y: number) => Math.round((x * percent + y * (100 - percent)) / 100);\n return [mix(a[0], b[0]), mix(a[1], b[1]), mix(a[2], b[2])];\n}\n\nexport const WHITE: Rgb = [255, 255, 255];\nexport const BLACK: Rgb = [0, 0, 0];\n\n/**\n * Pure black or pure white, whichever has more contrast against `fill`.\n *\n * The two endpoints cross over at a luminance of about 0.1791, where both reach\n * 4.58:1, so the winner is **always** at or above 4.58:1 — WCAG 2.2 AA for\n * normal text (4.5:1) with margin, for every possible fill. Any near-black ink\n * short of `#000000` loses that property, which is why this returns the\n * extremes rather than a token value.\n */\nexport function readableInk(fill: Rgb): Rgb {\n return contrastRatio(BLACK, fill) >= contrastRatio(WHITE, fill) ? BLACK : WHITE;\n}\n\n/**\n * The least-darkened mix of `colour` towards black that reaches `minRatio`\n * against `against`, searched over the 101 integer mix percentages from 100\n * (untouched) downwards. 0% is black, so the search terminates whenever\n * `against` is light enough for black to pass — true for every background this\n * module uses.\n */\nexport function darkenUntilContrast(colour: Rgb, against: Rgb, minRatio: number): Rgb {\n for (let percent = 100; percent >= 0; percent -= 1) {\n const candidate = mixSrgb(colour, BLACK, percent);\n if (contrastRatio(candidate, against) >= minRatio) return candidate;\n }\n return BLACK;\n}\n","/**\n * `createBrandTheme()` — the runtime brand contract (W1-20, experimental).\n *\n * A white-label host has one or two colours per tenant and needs the design\n * system's brand family to follow them. Today that is done by writing the\n * design system's *legacy* variable names from application code (Assure\n * Portal's `src/lib/brand-theme.ts` writes about thirty of them onto `<body>`),\n * which couples the application to names the design system owns and gives no\n * guarantee that the result is legible.\n *\n * This function is the supported replacement: a validated seed in, a plain\n * object of `--ds-*` custom properties out, to spread into a `style` attribute\n * on whatever element scopes the brand (target architecture §12.1 rule 6 (iv)).\n *\n * Contract:\n *\n * - **Pure.** No `document`, no `window`, no clock, no randomness, no module\n * state. The same seed always yields the same object.\n * - **SSR-deterministic** (amendment A3). Every number comes from integer\n * arithmetic over a committed transfer table (`./srgb`), so server-rendered\n * markup and the first client render agree byte for byte. Asserted in Node\n * (`__tests__/brand-theme.test.ts`) and in a real browser\n * (`tests/browser/brand-theme-ssr-determinism.test.ts`) against the same\n * committed vectors.\n * - **Legible.** The fills are clamped to at least 3:1 against the light canvas\n * (WCAG 2.2 SC 1.4.11, non-text contrast), and every foreground the function\n * emits reaches at least 4.5:1 against the fill it sits on (SC 1.4.3 AA).\n * - **Shaped like a built-in brand.** The ramp uses the same percentages as the\n * generated `[data-ds-brand]` scopes in `css/tokens.css`, and the steps that\n * depend on the colour scheme stay as `color-mix(… var(--ds-color-content))`\n * exactly as those scopes do, so a runtime brand keeps working in dark mode.\n *\n * @experimental The seed shape is gated by decision D7 (white-label scope:\n * brand, plus optional accent). It may change while D7 is open.\n */\nimport {\n BLACK,\n WHITE,\n contrastRatio,\n darkenUntilContrast,\n formatHexColor,\n mixSrgb,\n parseHexColor,\n readableInk,\n type Rgb,\n} from \"./srgb\";\n\n/**\n * The seed a host supplies per tenant.\n *\n * @experimental Gated by decision D7.\n */\nexport interface BrandThemeSeed {\n /**\n * The brand fill, as `#rgb` or `#rrggbb`. Drives the `action.brand` family,\n * the focus ring and the brand gradient.\n */\n brand: string;\n /**\n * An optional second hue for the `action.accent` family, as `#rgb` or\n * `#rrggbb`. `undefined` or `null` means \"the same as `brand`\", which is what\n * the built-in `[data-ds-brand]` scopes do.\n */\n accent?: string | null;\n}\n\n/** Every custom property `createBrandTheme()` sets, in output order. */\nexport const BRAND_THEME_PROPERTIES = [\n \"--ds-color-action-brand-bg\",\n \"--ds-color-action-brand-bg-hover\",\n \"--ds-color-action-brand-bg-active\",\n \"--ds-color-action-brand-bg-disabled\",\n \"--ds-color-action-brand-subtle-bg\",\n \"--ds-color-action-brand-subtle-bg-hover\",\n \"--ds-color-action-brand-subtle-bg-active\",\n \"--ds-color-action-brand-border\",\n \"--ds-color-action-brand-ring\",\n \"--ds-color-action-brand-fg\",\n \"--ds-color-action-accent-bg\",\n \"--ds-color-action-accent-bg-strong\",\n \"--ds-color-action-accent-bg-hover\",\n \"--ds-color-action-accent-bg-active\",\n \"--ds-color-action-accent-subtle-bg\",\n \"--ds-color-action-accent-ring\",\n \"--ds-color-action-accent-fg\",\n \"--ds-color-border-focus\",\n \"--ds-focus-ring-color\",\n \"--ds-focus-ring-border\",\n \"--ds-gradient-brand\",\n \"--ds-compat-color-brand-soft\",\n \"--ds-compat-color-brand-soft-foreground\",\n] as const;\n\n/** One of the custom properties `createBrandTheme()` sets. */\nexport type BrandThemeProperty = (typeof BRAND_THEME_PROPERTIES)[number];\n\n/**\n * The style object `createBrandTheme()` returns: every property of\n * {@link BRAND_THEME_PROPERTIES} with a CSS value.\n *\n * React types `style` as `CSSProperties`, which has no index signature for\n * custom properties, so spread it or cast it at the call site:\n * `style={{ ...createBrandTheme(seed) }}`.\n *\n * @experimental Gated by decision D7.\n */\nexport type BrandTheme = { readonly [P in BrandThemeProperty]: string };\n\n/** Minimum contrast a fill must reach against the light canvas (SC 1.4.11). */\nconst MIN_FILL_CONTRAST = 3;\n/** Minimum contrast a foreground must reach against its fill (SC 1.4.3 AA). */\nconst MIN_TEXT_CONTRAST = 4.5;\n\n/** The light canvas (`--ds-color-canvas`), the surface a fill sits on. */\nconst CANVAS: Rgb = WHITE;\n\n/**\n * Ramp percentages, copied from the generated brand scopes in\n * `tokens/build/generate-ds-css.mjs`, so a runtime brand and a built-in one are\n * the same shape.\n */\nconst RAMP = {\n hover: 88,\n active: 74,\n disabled: 42,\n subtle: 8,\n subtleHover: 13,\n subtleActive: 20,\n border: 45,\n ring: 20,\n /** The soft tint and its ink, which the app-vocabulary bridge reads. */\n soft: 12,\n softInk: 68,\n} as const;\n\n/** `color-mix(in srgb, <colour> <percent>%, var(--ds-color-content))` — the\n * scheme-aware steps, left unresolved exactly as the built-in scopes leave\n * them, so a runtime brand still darkens in light mode and lightens in dark. */\nconst towardsInk = (colour: string, percent: number) =>\n `color-mix(in srgb, ${colour} ${percent}%, var(--ds-color-content))`;\n\n/** `color-mix(in srgb, <colour> <percent>%, transparent)`. */\nconst towardsTransparent = (colour: string, percent: number) =>\n `color-mix(in srgb, ${colour} ${percent}%, transparent)`;\n\nconst ACCEPTED = '#rgb or #rrggbb, for example \"#6c42f8\"';\nconst SEED_KEYS = new Set([\"brand\", \"accent\"]);\n\nfunction describe(value: unknown): string {\n if (typeof value === \"string\") return JSON.stringify(value);\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"an array\";\n return typeof value;\n}\n\nfunction readColour(key: \"brand\" | \"accent\", value: unknown): Rgb {\n if (typeof value !== \"string\") {\n throw new TypeError(\n `createBrandTheme: \"${key}\" must be a hex colour string (${ACCEPTED}), received ${describe(value)}.`,\n );\n }\n const rgb = parseHexColor(value);\n if (!rgb) {\n throw new TypeError(\n `createBrandTheme: \"${key}\" must be a hex colour (${ACCEPTED}), received ${describe(value)}. ` +\n \"Named colours, rgb()/hsl() and eight-digit hex with alpha are not accepted — a brand seed must be opaque and unambiguous.\",\n );\n }\n return rgb;\n}\n\nfunction validateSeed(seed: BrandThemeSeed): void {\n if (seed === null || typeof seed !== \"object\" || Array.isArray(seed)) {\n throw new TypeError(\n `createBrandTheme: expected a seed object with a \"brand\" colour, received ${describe(seed)}.`,\n );\n }\n const unknown = Object.keys(seed).filter((key) => !SEED_KEYS.has(key));\n if (unknown.length) {\n throw new TypeError(\n `createBrandTheme: unknown seed ${unknown.length === 1 ? \"key\" : \"keys\"} ${unknown\n .map((key) => JSON.stringify(key))\n .join(\", \")}. The seed accepts \"brand\" and an optional \"accent\" (decision D7).`,\n );\n }\n}\n\n/**\n * Clamp a seed so it reads as a UI fill: at least 3:1 against the light canvas\n * (WCAG 2.2 SC 1.4.11). A seed that already passes is returned untouched, so\n * the common case is exact — `createBrandTheme({ brand: \"#6c42f8\" })` emits\n * `#6c42f8`. A pale seed is darkened by the smallest whole-percent mix towards\n * black that passes, which keeps the hue and gives up only lightness.\n */\nfunction clampFill(seed: Rgb): Rgb {\n if (contrastRatio(seed, CANVAS) >= MIN_FILL_CONTRAST) return seed;\n return darkenUntilContrast(seed, CANVAS, MIN_FILL_CONTRAST);\n}\n\n/**\n * Turn a tenant's colours into the design system's brand and accent tokens.\n *\n * ```tsx\n * const theme = createBrandTheme({ brand: firm.primaryColor, accent: firm.accentColor });\n * return <div style={{ ...theme }}>{children}</div>;\n * ```\n *\n * Apply it to the element that scopes the brand — `<body>` for a whole-tenant\n * theme, a wrapper for a preview. The properties are the same ones a built-in\n * `[data-ds-brand]` scope declares, so anything reading them (every design\n * system component, and any application CSS reading `--ds-*`) follows.\n *\n * @param seed - `brand`, and optionally `accent` (decision D7).\n * @returns A frozen object of custom property names to CSS values.\n * @throws TypeError when the seed is not an object, carries an unknown key, or\n * a colour is missing or not `#rgb`/`#rrggbb`.\n *\n * @experimental Gated by decision D7. The property set may grow, and the seed\n * shape may change, until D7 is resolved.\n */\nexport function createBrandTheme(seed: BrandThemeSeed): BrandTheme {\n validateSeed(seed);\n const brandSeed = readColour(\"brand\", seed.brand);\n const accentSeed =\n seed.accent === undefined || seed.accent === null\n ? brandSeed\n : readColour(\"accent\", seed.accent);\n\n const brand = clampFill(brandSeed);\n const accent = clampFill(accentSeed);\n const brandHex = formatHexColor(brand);\n const accentHex = formatHexColor(accent);\n\n const soft = mixSrgb(brand, WHITE, RAMP.soft);\n const softInk = darkenUntilContrast(mixSrgb(brand, BLACK, RAMP.softInk), soft, MIN_TEXT_CONTRAST);\n\n return Object.freeze({\n \"--ds-color-action-brand-bg\": brandHex,\n \"--ds-color-action-brand-bg-hover\": towardsInk(brandHex, RAMP.hover),\n \"--ds-color-action-brand-bg-active\": towardsInk(brandHex, RAMP.active),\n \"--ds-color-action-brand-bg-disabled\": formatHexColor(mixSrgb(brand, WHITE, RAMP.disabled)),\n \"--ds-color-action-brand-subtle-bg\": formatHexColor(mixSrgb(brand, WHITE, RAMP.subtle)),\n \"--ds-color-action-brand-subtle-bg-hover\": formatHexColor(\n mixSrgb(brand, WHITE, RAMP.subtleHover),\n ),\n \"--ds-color-action-brand-subtle-bg-active\": formatHexColor(\n mixSrgb(brand, WHITE, RAMP.subtleActive),\n ),\n \"--ds-color-action-brand-border\": formatHexColor(mixSrgb(brand, WHITE, RAMP.border)),\n \"--ds-color-action-brand-ring\": towardsTransparent(brandHex, RAMP.ring),\n \"--ds-color-action-brand-fg\": formatHexColor(readableInk(brand)),\n \"--ds-color-action-accent-bg\": accentHex,\n \"--ds-color-action-accent-bg-strong\": towardsInk(accentHex, RAMP.active),\n \"--ds-color-action-accent-bg-hover\": towardsInk(accentHex, RAMP.hover),\n \"--ds-color-action-accent-bg-active\": towardsInk(accentHex, RAMP.active),\n \"--ds-color-action-accent-subtle-bg\": formatHexColor(mixSrgb(accent, WHITE, RAMP.subtle)),\n \"--ds-color-action-accent-ring\": towardsTransparent(accentHex, RAMP.ring),\n \"--ds-color-action-accent-fg\": formatHexColor(readableInk(accent)),\n \"--ds-color-border-focus\": accentHex,\n \"--ds-focus-ring-color\": towardsTransparent(brandHex, RAMP.ring),\n \"--ds-focus-ring-border\": brandHex,\n \"--ds-gradient-brand\": `linear-gradient(135deg, ${brandHex}, ${towardsInk(brandHex, RAMP.hover)})`,\n \"--ds-compat-color-brand-soft\": formatHexColor(soft),\n \"--ds-compat-color-brand-soft-foreground\": formatHexColor(softInk),\n });\n}\n"]}
|