@assure-one/design-system 1.39.0 → 1.41.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 +48 -28
- package/codemods/README.md +24 -7
- package/codemods/lib/registry.mjs +27 -0
- package/codemods/lib/runner.mjs +8 -3
- package/codemods/run.mjs +27 -5
- package/codemods/transforms/cm-15-dom-selectors.mjs +16 -9
- package/dist/brand-scope-BOHId6BY.d.ts +58 -0
- package/dist/{brand-theme-B6rem2II.d.ts → brand-theme-ZYM867Jz.d.ts} +1 -1
- package/dist/chunk-CPOGSNXS.js +389 -0
- package/dist/chunk-CPOGSNXS.js.map +1 -0
- package/dist/chunk-EUHGZA6Q.js +313 -0
- package/dist/chunk-EUHGZA6Q.js.map +1 -0
- package/dist/chunk-KUSY7BLL.js +441 -0
- package/dist/chunk-KUSY7BLL.js.map +1 -0
- package/dist/chunk-NBI7E3VT.js +3754 -0
- package/dist/chunk-NBI7E3VT.js.map +1 -0
- package/dist/chunk-PTI4B2OI.js +5527 -0
- package/dist/chunk-PTI4B2OI.js.map +1 -0
- package/dist/chunk-X76J4QSJ.js +164 -0
- package/dist/chunk-X76J4QSJ.js.map +1 -0
- package/dist/chunk-XV2VSEA5.js +4339 -0
- package/dist/chunk-XV2VSEA5.js.map +1 -0
- package/dist/css/components.css +1 -1
- package/dist/css/legacy-aliases.css +2 -0
- package/dist/css/tailwind.css +2 -0
- package/dist/css/tokens.css +2 -0
- package/dist/data-table-view-ep8al7P9.d.ts +1132 -0
- package/dist/{design-system-provider-BM_F1C13.d.ts → design-system-provider-CfD2g2lY.d.ts} +11 -12
- package/dist/icons/index.d.ts +189 -140
- package/dist/icons/index.js +2 -1835
- package/dist/icons/index.js.map +1 -1
- package/dist/index.d.ts +374 -389
- package/dist/index.js +8688 -24271
- package/dist/index.js.map +1 -1
- package/dist/legacy/index.d.ts +1462 -7
- package/dist/legacy/index.js +5 -1
- package/dist/legacy/index.js.map +1 -1
- package/dist/next/index.d.ts +2 -2
- package/dist/styles.css +2 -1
- package/dist/suite/index.d.ts +991 -4
- package/dist/suite/index.js +6 -1
- package/dist/suite/index.js.map +1 -1
- package/dist/testing/index.cjs +3 -2
- package/dist/testing/index.js +3 -2
- package/dist/tokens/index.d.ts +1 -1
- package/dist/tokens/index.js +3 -856
- package/dist/tokens/index.js.map +1 -1
- package/dist/{types-k_kjwipx.d.ts → types-Coqw8iaS.d.ts} +28 -1
- package/docs/components.md +56 -56
- package/docs/components.registry.json +7 -7
- package/docs/for-ai-agents.md +12 -6
- package/package.json +8 -5
- package/dist/index-BAAuIQqP.d.ts +0 -2579
- package/dist/index-DxBjmBBp.d.ts +0 -1038
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { formatHexColor, mixSrgb, WHITE, darkenUntilContrast, BLACK, readableInk, parseHexColor, contrastRatio } from './chunk-EUHGZA6Q.js';
|
|
2
|
+
|
|
3
|
+
// src/tokens/system.ts
|
|
4
|
+
var systemTokens = {
|
|
5
|
+
color: {
|
|
6
|
+
/* Surfaces */
|
|
7
|
+
bg: "var(--color-bg)",
|
|
8
|
+
bg2: "var(--color-bg-2)",
|
|
9
|
+
bg3: "var(--color-bg-3)",
|
|
10
|
+
surface: "var(--color-surface)",
|
|
11
|
+
surface2: "var(--color-surface-2)",
|
|
12
|
+
/* Foreground */
|
|
13
|
+
fg: "var(--color-fg)",
|
|
14
|
+
fg2: "var(--color-fg-2)",
|
|
15
|
+
fg3: "var(--color-fg-3)",
|
|
16
|
+
fg4: "var(--color-fg-4)",
|
|
17
|
+
fg5: "var(--color-fg-5)",
|
|
18
|
+
/* Rules */
|
|
19
|
+
rule: "var(--color-rule)",
|
|
20
|
+
ruleSoft: "var(--color-rule-soft)",
|
|
21
|
+
ruleStrong: "var(--color-rule-strong)",
|
|
22
|
+
/* Accent (purple) */
|
|
23
|
+
accent: "var(--color-accent)",
|
|
24
|
+
accent2: "var(--color-accent-2)",
|
|
25
|
+
accentTint: "var(--color-accent-tint)",
|
|
26
|
+
accentHover: "var(--color-accent-hover)",
|
|
27
|
+
accentActive: "var(--color-accent-active)",
|
|
28
|
+
accentRing: "var(--color-accent-ring)",
|
|
29
|
+
/* Stable cross-product CTA; deliberately independent of [data-brand]. */
|
|
30
|
+
suiteAction: "var(--color-suite-action)",
|
|
31
|
+
suiteActionHover: "var(--color-suite-action-hover)",
|
|
32
|
+
suiteActionActive: "var(--color-suite-action-active)",
|
|
33
|
+
fgOnSuiteAction: "var(--color-fg-on-suite-action)",
|
|
34
|
+
/* Brand — ambient product family; follows the active [data-brand] scope,
|
|
35
|
+
defaulting to Pro. Prefer these (and the generated bg-brand / text-brand
|
|
36
|
+
/ border-brand-line / text-fg-on-brand utilities) for scope-aware chrome
|
|
37
|
+
so the product never appears in a class name. */
|
|
38
|
+
brand: "var(--color-brand)",
|
|
39
|
+
brandHover: "var(--color-brand-hover)",
|
|
40
|
+
brandActive: "var(--color-brand-active)",
|
|
41
|
+
brandDisabled: "var(--color-brand-disabled)",
|
|
42
|
+
brandBg: "var(--color-brand-bg)",
|
|
43
|
+
brandBgHover: "var(--color-brand-bg-hover)",
|
|
44
|
+
brandBgActive: "var(--color-brand-bg-active)",
|
|
45
|
+
brandLine: "var(--color-brand-line)",
|
|
46
|
+
brandRing: "var(--color-brand-ring)",
|
|
47
|
+
fgOnBrand: "var(--color-fg-on-brand)",
|
|
48
|
+
/* Pro (purple) */
|
|
49
|
+
proBg: "var(--color-pro-bg)",
|
|
50
|
+
proBgHover: "var(--color-pro-bg-hover)",
|
|
51
|
+
proBgActive: "var(--color-pro-bg-active)",
|
|
52
|
+
proFg: "var(--color-pro-fg)",
|
|
53
|
+
proHover: "var(--color-pro-hover)",
|
|
54
|
+
proActive: "var(--color-pro-active)",
|
|
55
|
+
proDisabled: "var(--color-pro-disabled)",
|
|
56
|
+
proLine: "var(--color-pro-line)",
|
|
57
|
+
proRing: "var(--color-pro-ring)",
|
|
58
|
+
auditFg: "var(--color-audit-fg)",
|
|
59
|
+
auditHover: "var(--color-audit-hover)",
|
|
60
|
+
auditActive: "var(--color-audit-active)",
|
|
61
|
+
auditDisabled: "var(--color-audit-disabled)",
|
|
62
|
+
auditBg: "var(--color-audit-bg)",
|
|
63
|
+
auditBgHover: "var(--color-audit-bg-hover)",
|
|
64
|
+
auditBgActive: "var(--color-audit-bg-active)",
|
|
65
|
+
auditLine: "var(--color-audit-line)",
|
|
66
|
+
auditRing: "var(--color-audit-ring)",
|
|
67
|
+
booksFg: "var(--color-books-fg)",
|
|
68
|
+
booksHover: "var(--color-books-hover)",
|
|
69
|
+
booksActive: "var(--color-books-active)",
|
|
70
|
+
booksDisabled: "var(--color-books-disabled)",
|
|
71
|
+
booksBg: "var(--color-books-bg)",
|
|
72
|
+
booksBgHover: "var(--color-books-bg-hover)",
|
|
73
|
+
booksBgActive: "var(--color-books-bg-active)",
|
|
74
|
+
booksLine: "var(--color-books-line)",
|
|
75
|
+
booksRing: "var(--color-books-ring)",
|
|
76
|
+
taxFg: "var(--color-tax-fg)",
|
|
77
|
+
taxHover: "var(--color-tax-hover)",
|
|
78
|
+
taxActive: "var(--color-tax-active)",
|
|
79
|
+
taxDisabled: "var(--color-tax-disabled)",
|
|
80
|
+
taxBg: "var(--color-tax-bg)",
|
|
81
|
+
taxBgHover: "var(--color-tax-bg-hover)",
|
|
82
|
+
taxBgActive: "var(--color-tax-bg-active)",
|
|
83
|
+
taxLine: "var(--color-tax-line)",
|
|
84
|
+
taxRing: "var(--color-tax-ring)",
|
|
85
|
+
/* On-brand — text/icon color on a filled brand/product surface */
|
|
86
|
+
fgOnAccent: "var(--color-fg-on-accent)",
|
|
87
|
+
fgOnPro: "var(--color-fg-on-pro)",
|
|
88
|
+
fgOnAudit: "var(--color-fg-on-audit)",
|
|
89
|
+
fgOnBooks: "var(--color-fg-on-books)",
|
|
90
|
+
fgOnTax: "var(--color-fg-on-tax)",
|
|
91
|
+
/* Disabled */
|
|
92
|
+
fgDisabled: "var(--color-fg-disabled)",
|
|
93
|
+
bgDisabled: "var(--color-bg-disabled)",
|
|
94
|
+
/* Overlays */
|
|
95
|
+
overlayHover: "var(--color-overlay-hover)",
|
|
96
|
+
overlayActive: "var(--color-overlay-active)",
|
|
97
|
+
/* Status */
|
|
98
|
+
successFg: "var(--color-success-fg)",
|
|
99
|
+
successBg: "var(--color-success-bg)",
|
|
100
|
+
successLine: "var(--color-success-line)",
|
|
101
|
+
warningFg: "var(--color-warning-fg)",
|
|
102
|
+
warningBg: "var(--color-warning-bg)",
|
|
103
|
+
warningLine: "var(--color-warning-line)",
|
|
104
|
+
dangerFg: "var(--color-danger-fg)",
|
|
105
|
+
dangerBg: "var(--color-danger-bg)",
|
|
106
|
+
dangerLine: "var(--color-danger-line)",
|
|
107
|
+
/* Data-viz — chart series ramp + area gradient stops */
|
|
108
|
+
chart1: "var(--color-chart-1)",
|
|
109
|
+
chart2: "var(--color-chart-2)",
|
|
110
|
+
chart3: "var(--color-chart-3)",
|
|
111
|
+
chart4: "var(--color-chart-4)",
|
|
112
|
+
chartLine: "var(--color-chart-line)",
|
|
113
|
+
chartAreaFrom: "var(--color-chart-area-from)",
|
|
114
|
+
chartAreaTo: "var(--color-chart-area-to)",
|
|
115
|
+
/* Practice service tones — fill + track tint */
|
|
116
|
+
serviceTax: "var(--color-service-tax)",
|
|
117
|
+
serviceTaxBg: "var(--color-service-tax-bg)",
|
|
118
|
+
serviceAudit: "var(--color-service-audit)",
|
|
119
|
+
serviceAuditBg: "var(--color-service-audit-bg)",
|
|
120
|
+
serviceAccounting: "var(--color-service-accounting)",
|
|
121
|
+
serviceAccountingBg: "var(--color-service-accounting-bg)"
|
|
122
|
+
},
|
|
123
|
+
/** Ordered chart series ramp — index a series by position, cycle with `% 4`. */
|
|
124
|
+
chart: [
|
|
125
|
+
"var(--color-chart-1)",
|
|
126
|
+
"var(--color-chart-2)",
|
|
127
|
+
"var(--color-chart-3)",
|
|
128
|
+
"var(--color-chart-4)"
|
|
129
|
+
],
|
|
130
|
+
gradient: {
|
|
131
|
+
brand: "var(--gradient-brand)",
|
|
132
|
+
pro: "var(--gradient-pro)",
|
|
133
|
+
audit: "var(--gradient-audit)",
|
|
134
|
+
books: "var(--gradient-books)",
|
|
135
|
+
tax: "var(--gradient-tax)"
|
|
136
|
+
},
|
|
137
|
+
shadow: {
|
|
138
|
+
quiet: "var(--shadow-quiet)",
|
|
139
|
+
card: "var(--shadow-card)",
|
|
140
|
+
pop: "var(--shadow-pop)",
|
|
141
|
+
focusRing: "var(--shadow-focus-ring)",
|
|
142
|
+
xs: "var(--shadow-xs)",
|
|
143
|
+
sm: "var(--shadow-sm)",
|
|
144
|
+
md: "var(--shadow-md)",
|
|
145
|
+
lg: "var(--shadow-lg)",
|
|
146
|
+
xl: "var(--shadow-xl)",
|
|
147
|
+
"2xl": "var(--shadow-2xl)"
|
|
148
|
+
},
|
|
149
|
+
radius: {
|
|
150
|
+
btn: "var(--radius-btn)",
|
|
151
|
+
input: "var(--radius-input)",
|
|
152
|
+
pill: "var(--radius-pill)",
|
|
153
|
+
card: "var(--radius-card)",
|
|
154
|
+
icon: "var(--radius-icon)",
|
|
155
|
+
full: "var(--radius-full)"
|
|
156
|
+
},
|
|
157
|
+
type: {
|
|
158
|
+
family: {
|
|
159
|
+
display: "var(--font-display)",
|
|
160
|
+
body: "var(--font-body)",
|
|
161
|
+
mono: "var(--font-mono)"
|
|
162
|
+
},
|
|
163
|
+
weight: {
|
|
164
|
+
regular: "var(--font-weight-regular)",
|
|
165
|
+
medium: "var(--font-weight-medium)",
|
|
166
|
+
semibold: "var(--font-weight-semibold)",
|
|
167
|
+
bold: "var(--font-weight-bold)"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
motion: {
|
|
171
|
+
ease: {
|
|
172
|
+
outQuart: "var(--ease-out-quart)",
|
|
173
|
+
out: "var(--ease-out)",
|
|
174
|
+
in: "var(--ease-in)",
|
|
175
|
+
inOut: "var(--ease-in-out)"
|
|
176
|
+
},
|
|
177
|
+
duration: {
|
|
178
|
+
instant: "var(--duration-instant)",
|
|
179
|
+
fast: "var(--duration-fast)",
|
|
180
|
+
normal: "var(--duration-normal)",
|
|
181
|
+
slow: "var(--duration-slow)"
|
|
182
|
+
},
|
|
183
|
+
semantic: {
|
|
184
|
+
duration: {
|
|
185
|
+
press: "var(--motion-duration-press)",
|
|
186
|
+
feedback: "var(--motion-duration-feedback)",
|
|
187
|
+
overlay: "var(--motion-duration-overlay)",
|
|
188
|
+
spatial: "var(--motion-duration-spatial)",
|
|
189
|
+
deliberate: "var(--motion-duration-deliberate)"
|
|
190
|
+
},
|
|
191
|
+
ease: {
|
|
192
|
+
enter: "var(--motion-ease-enter)",
|
|
193
|
+
exit: "var(--motion-ease-exit)",
|
|
194
|
+
move: "var(--motion-ease-move)"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
/**
|
|
199
|
+
* Control sizing (amendment A1, W2-03). One outer height per size name, with
|
|
200
|
+
* the padding, gap, label size and glyph size derived from it.
|
|
201
|
+
*
|
|
202
|
+
* **Nothing reads these yet** and the numbers are gated on decision D5
|
|
203
|
+
* (implementation plan §3) — what each control renders *today* is in
|
|
204
|
+
* `docs/design-system/control-sizes.md`, and W2-05 is the task that unifies
|
|
205
|
+
* them. Referencing the scale here is also what keeps the custom properties
|
|
206
|
+
* in the published stylesheet, so `[data-ds-density="compact"]` has something
|
|
207
|
+
* to re-point.
|
|
208
|
+
*/
|
|
209
|
+
control: {
|
|
210
|
+
height: {
|
|
211
|
+
xs: "var(--control-height-xs)",
|
|
212
|
+
sm: "var(--control-height-sm)",
|
|
213
|
+
md: "var(--control-height-md)",
|
|
214
|
+
lg: "var(--control-height-lg)",
|
|
215
|
+
xl: "var(--control-height-xl)"
|
|
216
|
+
},
|
|
217
|
+
paddingX: {
|
|
218
|
+
xs: "var(--control-padding-x-xs)",
|
|
219
|
+
sm: "var(--control-padding-x-sm)",
|
|
220
|
+
md: "var(--control-padding-x-md)",
|
|
221
|
+
lg: "var(--control-padding-x-lg)",
|
|
222
|
+
xl: "var(--control-padding-x-xl)"
|
|
223
|
+
},
|
|
224
|
+
gap: {
|
|
225
|
+
xs: "var(--control-gap-xs)",
|
|
226
|
+
sm: "var(--control-gap-sm)",
|
|
227
|
+
md: "var(--control-gap-md)",
|
|
228
|
+
lg: "var(--control-gap-lg)",
|
|
229
|
+
xl: "var(--control-gap-xl)"
|
|
230
|
+
},
|
|
231
|
+
fontSize: {
|
|
232
|
+
xs: "var(--control-font-size-xs)",
|
|
233
|
+
sm: "var(--control-font-size-sm)",
|
|
234
|
+
md: "var(--control-font-size-md)",
|
|
235
|
+
lg: "var(--control-font-size-lg)",
|
|
236
|
+
xl: "var(--control-font-size-xl)"
|
|
237
|
+
},
|
|
238
|
+
icon: {
|
|
239
|
+
xs: "var(--control-icon-xs)",
|
|
240
|
+
sm: "var(--control-icon-sm)",
|
|
241
|
+
md: "var(--control-icon-md)",
|
|
242
|
+
lg: "var(--control-icon-lg)",
|
|
243
|
+
xl: "var(--control-icon-xl)"
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
layout: {
|
|
247
|
+
shellSidebarWidth: "var(--shell-sidebar-w)",
|
|
248
|
+
shellSidebarRailWidth: "var(--shell-sidebar-w-rail)",
|
|
249
|
+
shellHeaderHeight: "var(--shell-header-h)",
|
|
250
|
+
contentPad: "var(--content-pad)"
|
|
251
|
+
},
|
|
252
|
+
z: {
|
|
253
|
+
base: "var(--z-base)",
|
|
254
|
+
dropdown: "var(--z-dropdown)",
|
|
255
|
+
sticky: "var(--z-sticky)",
|
|
256
|
+
overlay: "var(--z-overlay)",
|
|
257
|
+
modal: "var(--z-modal)",
|
|
258
|
+
toast: "var(--z-toast)",
|
|
259
|
+
tooltip: "var(--z-tooltip)"
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
// src/foundation/theme/brand-theme.ts
|
|
264
|
+
var BRAND_THEME_PROPERTIES = [
|
|
265
|
+
"--ds-color-action-brand-bg",
|
|
266
|
+
"--ds-color-action-brand-bg-hover",
|
|
267
|
+
"--ds-color-action-brand-bg-active",
|
|
268
|
+
"--ds-color-action-brand-bg-disabled",
|
|
269
|
+
"--ds-color-action-brand-subtle-bg",
|
|
270
|
+
"--ds-color-action-brand-subtle-bg-hover",
|
|
271
|
+
"--ds-color-action-brand-subtle-bg-active",
|
|
272
|
+
"--ds-color-action-brand-border",
|
|
273
|
+
"--ds-color-action-brand-ring",
|
|
274
|
+
"--ds-color-action-brand-fg",
|
|
275
|
+
"--ds-color-action-accent-bg",
|
|
276
|
+
"--ds-color-action-accent-bg-strong",
|
|
277
|
+
"--ds-color-action-accent-bg-hover",
|
|
278
|
+
"--ds-color-action-accent-bg-active",
|
|
279
|
+
"--ds-color-action-accent-subtle-bg",
|
|
280
|
+
"--ds-color-action-accent-ring",
|
|
281
|
+
"--ds-color-action-accent-fg",
|
|
282
|
+
"--ds-color-border-focus",
|
|
283
|
+
"--ds-focus-ring-color",
|
|
284
|
+
"--ds-focus-ring-border",
|
|
285
|
+
"--ds-gradient-brand",
|
|
286
|
+
"--ds-compat-color-brand-soft",
|
|
287
|
+
"--ds-compat-color-brand-soft-foreground"
|
|
288
|
+
];
|
|
289
|
+
var MIN_FILL_CONTRAST = 3;
|
|
290
|
+
var MIN_TEXT_CONTRAST = 4.5;
|
|
291
|
+
var CANVAS = WHITE;
|
|
292
|
+
var RAMP = {
|
|
293
|
+
hover: 88,
|
|
294
|
+
active: 74,
|
|
295
|
+
disabled: 42,
|
|
296
|
+
subtle: 8,
|
|
297
|
+
subtleHover: 13,
|
|
298
|
+
subtleActive: 20,
|
|
299
|
+
border: 45,
|
|
300
|
+
ring: 20,
|
|
301
|
+
/** The soft tint and its ink, which the app-vocabulary bridge reads. */
|
|
302
|
+
soft: 12,
|
|
303
|
+
softInk: 68
|
|
304
|
+
};
|
|
305
|
+
var towardsInk = (colour, percent) => `color-mix(in srgb, ${colour} ${percent}%, var(--ds-color-content))`;
|
|
306
|
+
var towardsTransparent = (colour, percent) => `color-mix(in srgb, ${colour} ${percent}%, transparent)`;
|
|
307
|
+
var ACCEPTED = '#rgb or #rrggbb, for example "#6c42f8"';
|
|
308
|
+
var SEED_KEYS = /* @__PURE__ */ new Set(["brand", "accent"]);
|
|
309
|
+
function describe(value) {
|
|
310
|
+
if (typeof value === "string") return JSON.stringify(value);
|
|
311
|
+
if (value === null) return "null";
|
|
312
|
+
if (Array.isArray(value)) return "an array";
|
|
313
|
+
return typeof value;
|
|
314
|
+
}
|
|
315
|
+
function readColour(key, value) {
|
|
316
|
+
if (typeof value !== "string") {
|
|
317
|
+
throw new TypeError(
|
|
318
|
+
`createBrandTheme: "${key}" must be a hex colour string (${ACCEPTED}), received ${describe(value)}.`
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
const rgb = parseHexColor(value);
|
|
322
|
+
if (!rgb) {
|
|
323
|
+
throw new TypeError(
|
|
324
|
+
`createBrandTheme: "${key}" must be a hex colour (${ACCEPTED}), received ${describe(value)}. Named colours, rgb()/hsl() and eight-digit hex with alpha are not accepted \u2014 a brand seed must be opaque and unambiguous.`
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
return rgb;
|
|
328
|
+
}
|
|
329
|
+
function validateSeed(seed) {
|
|
330
|
+
if (seed === null || typeof seed !== "object" || Array.isArray(seed)) {
|
|
331
|
+
throw new TypeError(
|
|
332
|
+
`createBrandTheme: expected a seed object with a "brand" colour, received ${describe(seed)}.`
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
const unknown = Object.keys(seed).filter((key) => !SEED_KEYS.has(key));
|
|
336
|
+
if (unknown.length) {
|
|
337
|
+
throw new TypeError(
|
|
338
|
+
`createBrandTheme: unknown seed ${unknown.length === 1 ? "key" : "keys"} ${unknown.map((key) => JSON.stringify(key)).join(", ")}. The seed accepts "brand" and an optional "accent" (decision D7).`
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
function clampFill(seed) {
|
|
343
|
+
if (contrastRatio(seed, CANVAS) >= MIN_FILL_CONTRAST) return seed;
|
|
344
|
+
return darkenUntilContrast(seed, CANVAS, MIN_FILL_CONTRAST);
|
|
345
|
+
}
|
|
346
|
+
function createBrandTheme(seed) {
|
|
347
|
+
validateSeed(seed);
|
|
348
|
+
const brandSeed = readColour("brand", seed.brand);
|
|
349
|
+
const accentSeed = seed.accent === void 0 || seed.accent === null ? brandSeed : readColour("accent", seed.accent);
|
|
350
|
+
const brand = clampFill(brandSeed);
|
|
351
|
+
const accent = clampFill(accentSeed);
|
|
352
|
+
const brandHex = formatHexColor(brand);
|
|
353
|
+
const accentHex = formatHexColor(accent);
|
|
354
|
+
const soft = mixSrgb(brand, WHITE, RAMP.soft);
|
|
355
|
+
const softInk = darkenUntilContrast(mixSrgb(brand, BLACK, RAMP.softInk), soft, MIN_TEXT_CONTRAST);
|
|
356
|
+
return Object.freeze({
|
|
357
|
+
"--ds-color-action-brand-bg": brandHex,
|
|
358
|
+
"--ds-color-action-brand-bg-hover": towardsInk(brandHex, RAMP.hover),
|
|
359
|
+
"--ds-color-action-brand-bg-active": towardsInk(brandHex, RAMP.active),
|
|
360
|
+
"--ds-color-action-brand-bg-disabled": formatHexColor(mixSrgb(brand, WHITE, RAMP.disabled)),
|
|
361
|
+
"--ds-color-action-brand-subtle-bg": formatHexColor(mixSrgb(brand, WHITE, RAMP.subtle)),
|
|
362
|
+
"--ds-color-action-brand-subtle-bg-hover": formatHexColor(
|
|
363
|
+
mixSrgb(brand, WHITE, RAMP.subtleHover)
|
|
364
|
+
),
|
|
365
|
+
"--ds-color-action-brand-subtle-bg-active": formatHexColor(
|
|
366
|
+
mixSrgb(brand, WHITE, RAMP.subtleActive)
|
|
367
|
+
),
|
|
368
|
+
"--ds-color-action-brand-border": formatHexColor(mixSrgb(brand, WHITE, RAMP.border)),
|
|
369
|
+
"--ds-color-action-brand-ring": towardsTransparent(brandHex, RAMP.ring),
|
|
370
|
+
"--ds-color-action-brand-fg": formatHexColor(readableInk(brand)),
|
|
371
|
+
"--ds-color-action-accent-bg": accentHex,
|
|
372
|
+
"--ds-color-action-accent-bg-strong": towardsInk(accentHex, RAMP.active),
|
|
373
|
+
"--ds-color-action-accent-bg-hover": towardsInk(accentHex, RAMP.hover),
|
|
374
|
+
"--ds-color-action-accent-bg-active": towardsInk(accentHex, RAMP.active),
|
|
375
|
+
"--ds-color-action-accent-subtle-bg": formatHexColor(mixSrgb(accent, WHITE, RAMP.subtle)),
|
|
376
|
+
"--ds-color-action-accent-ring": towardsTransparent(accentHex, RAMP.ring),
|
|
377
|
+
"--ds-color-action-accent-fg": formatHexColor(readableInk(accent)),
|
|
378
|
+
"--ds-color-border-focus": accentHex,
|
|
379
|
+
"--ds-focus-ring-color": towardsTransparent(brandHex, RAMP.ring),
|
|
380
|
+
"--ds-focus-ring-border": brandHex,
|
|
381
|
+
"--ds-gradient-brand": `linear-gradient(135deg, ${brandHex}, ${towardsInk(brandHex, RAMP.hover)})`,
|
|
382
|
+
"--ds-compat-color-brand-soft": formatHexColor(soft),
|
|
383
|
+
"--ds-compat-color-brand-soft-foreground": formatHexColor(softInk)
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export { BRAND_THEME_PROPERTIES, createBrandTheme, systemTokens };
|
|
388
|
+
//# sourceMappingURL=chunk-CPOGSNXS.js.map
|
|
389
|
+
//# sourceMappingURL=chunk-CPOGSNXS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tokens/system.ts","../src/foundation/theme/brand-theme.ts"],"names":[],"mappings":"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","file":"chunk-CPOGSNXS.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/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 * `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 | undefined;\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"]}
|