@bkstg/design-systems 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/package.json +1 -1
  2. package/tether/latest/README.md +44 -0
  3. package/tether/latest/charts-core.mjs +349 -0
  4. package/tether/latest/charts.js +58 -0
  5. package/tether/latest/motion.js +168 -0
  6. package/tether/latest/react/ActivityFeed.jsx +18 -0
  7. package/tether/latest/react/Alert.jsx +28 -0
  8. package/tether/latest/react/Annotations.jsx +24 -0
  9. package/tether/latest/react/AppShell.jsx +87 -0
  10. package/tether/latest/react/Avatar.jsx +19 -0
  11. package/tether/latest/react/Badge.jsx +14 -0
  12. package/tether/latest/react/Banner.jsx +17 -0
  13. package/tether/latest/react/Breadcrumbs.jsx +23 -0
  14. package/tether/latest/react/Button.jsx +31 -0
  15. package/tether/latest/react/ButtonGroup.jsx +29 -0
  16. package/tether/latest/react/Calendar.jsx +57 -0
  17. package/tether/latest/react/CardHeader.jsx +14 -0
  18. package/tether/latest/react/Chart.jsx +42 -0
  19. package/tether/latest/react/Chat.jsx +34 -0
  20. package/tether/latest/react/Checkbox.jsx +32 -0
  21. package/tether/latest/react/CodeSnippet.jsx +17 -0
  22. package/tether/latest/react/ColorPicker.jsx +35 -0
  23. package/tether/latest/react/CommandMenu.jsx +54 -0
  24. package/tether/latest/react/DatePicker.jsx +34 -0
  25. package/tether/latest/react/DeviceFrame.jsx +12 -0
  26. package/tether/latest/react/Dialog.jsx +43 -0
  27. package/tether/latest/react/Divider.jsx +10 -0
  28. package/tether/latest/react/Editor.jsx +85 -0
  29. package/tether/latest/react/EmptyState.jsx +13 -0
  30. package/tether/latest/react/Field.jsx +32 -0
  31. package/tether/latest/react/FileUpload.jsx +38 -0
  32. package/tether/latest/react/Filters.jsx +19 -0
  33. package/tether/latest/react/Infographics.jsx +54 -0
  34. package/tether/latest/react/InlineCTA.jsx +14 -0
  35. package/tether/latest/react/LineChart.jsx +23 -0
  36. package/tether/latest/react/Marketing.jsx +161 -0
  37. package/tether/latest/react/Menu.jsx +76 -0
  38. package/tether/latest/react/Metric.jsx +28 -0
  39. package/tether/latest/react/PageHeader.jsx +22 -0
  40. package/tether/latest/react/Pagination.jsx +32 -0
  41. package/tether/latest/react/Progress.jsx +26 -0
  42. package/tether/latest/react/RadioGroup.jsx +27 -0
  43. package/tether/latest/react/Reveal.jsx +17 -0
  44. package/tether/latest/react/SectionHeader.jsx +24 -0
  45. package/tether/latest/react/Select.jsx +19 -0
  46. package/tether/latest/react/Sheet.jsx +25 -0
  47. package/tether/latest/react/SideNav.jsx +37 -0
  48. package/tether/latest/react/Skeleton.jsx +16 -0
  49. package/tether/latest/react/Slider.jsx +27 -0
  50. package/tether/latest/react/Spinner.jsx +14 -0
  51. package/tether/latest/react/Steps.jsx +22 -0
  52. package/tether/latest/react/Switch.jsx +11 -0
  53. package/tether/latest/react/Table.jsx +24 -0
  54. package/tether/latest/react/Tabs.jsx +80 -0
  55. package/tether/latest/react/Tag.jsx +34 -0
  56. package/tether/latest/react/Tooltip.jsx +25 -0
  57. package/tether/latest/react/Tree.jsx +41 -0
  58. package/tether/latest/react/VideoPlayer.jsx +57 -0
  59. package/tether/latest/react/cx.js +4 -0
  60. package/tether/latest/react/index.js +59 -0
  61. package/tether/latest/system.json +44 -0
  62. package/tether/latest/tether.css +1661 -0
  63. package/tether/latest/tether.js +703 -0
  64. package/tether/v1/README.md +44 -0
  65. package/tether/v1/charts-core.mjs +349 -0
  66. package/tether/v1/charts.js +58 -0
  67. package/tether/v1/motion.js +168 -0
  68. package/tether/v1/react/ActivityFeed.jsx +18 -0
  69. package/tether/v1/react/Alert.jsx +28 -0
  70. package/tether/v1/react/Annotations.jsx +24 -0
  71. package/tether/v1/react/AppShell.jsx +87 -0
  72. package/tether/v1/react/Avatar.jsx +19 -0
  73. package/tether/v1/react/Badge.jsx +14 -0
  74. package/tether/v1/react/Banner.jsx +17 -0
  75. package/tether/v1/react/Breadcrumbs.jsx +23 -0
  76. package/tether/v1/react/Button.jsx +31 -0
  77. package/tether/v1/react/ButtonGroup.jsx +29 -0
  78. package/tether/v1/react/Calendar.jsx +57 -0
  79. package/tether/v1/react/CardHeader.jsx +14 -0
  80. package/tether/v1/react/Chart.jsx +42 -0
  81. package/tether/v1/react/Chat.jsx +34 -0
  82. package/tether/v1/react/Checkbox.jsx +32 -0
  83. package/tether/v1/react/CodeSnippet.jsx +17 -0
  84. package/tether/v1/react/ColorPicker.jsx +35 -0
  85. package/tether/v1/react/CommandMenu.jsx +54 -0
  86. package/tether/v1/react/DatePicker.jsx +34 -0
  87. package/tether/v1/react/DeviceFrame.jsx +12 -0
  88. package/tether/v1/react/Dialog.jsx +43 -0
  89. package/tether/v1/react/Divider.jsx +10 -0
  90. package/tether/v1/react/Editor.jsx +85 -0
  91. package/tether/v1/react/EmptyState.jsx +13 -0
  92. package/tether/v1/react/Field.jsx +32 -0
  93. package/tether/v1/react/FileUpload.jsx +38 -0
  94. package/tether/v1/react/Filters.jsx +19 -0
  95. package/tether/v1/react/Infographics.jsx +54 -0
  96. package/tether/v1/react/InlineCTA.jsx +14 -0
  97. package/tether/v1/react/LineChart.jsx +23 -0
  98. package/tether/v1/react/Marketing.jsx +161 -0
  99. package/tether/v1/react/Menu.jsx +76 -0
  100. package/tether/v1/react/Metric.jsx +28 -0
  101. package/tether/v1/react/PageHeader.jsx +22 -0
  102. package/tether/v1/react/Pagination.jsx +32 -0
  103. package/tether/v1/react/Progress.jsx +26 -0
  104. package/tether/v1/react/RadioGroup.jsx +27 -0
  105. package/tether/v1/react/Reveal.jsx +17 -0
  106. package/tether/v1/react/SectionHeader.jsx +24 -0
  107. package/tether/v1/react/Select.jsx +19 -0
  108. package/tether/v1/react/Sheet.jsx +25 -0
  109. package/tether/v1/react/SideNav.jsx +37 -0
  110. package/tether/v1/react/Skeleton.jsx +16 -0
  111. package/tether/v1/react/Slider.jsx +27 -0
  112. package/tether/v1/react/Spinner.jsx +14 -0
  113. package/tether/v1/react/Steps.jsx +22 -0
  114. package/tether/v1/react/Switch.jsx +11 -0
  115. package/tether/v1/react/Table.jsx +24 -0
  116. package/tether/v1/react/Tabs.jsx +80 -0
  117. package/tether/v1/react/Tag.jsx +34 -0
  118. package/tether/v1/react/Tooltip.jsx +25 -0
  119. package/tether/v1/react/Tree.jsx +41 -0
  120. package/tether/v1/react/VideoPlayer.jsx +57 -0
  121. package/tether/v1/react/cx.js +4 -0
  122. package/tether/v1/react/index.js +59 -0
  123. package/tether/v1/system.json +44 -0
  124. package/tether/v1/tether.css +1661 -0
  125. package/tether/v1/tether.js +703 -0
@@ -0,0 +1,1661 @@
1
+ /* Tether: design system export (tether.css)
2
+ * Base: shadcn/ui. Themes: backstage + backstage-light, mode light.
3
+ * Shape standard, typeface dm, texture off, motion full. Edited tokens: 0. Type styles edited or added: 0. Custom colors: 24.
4
+ * Generated 2026-10-04 from design-system-kit (themes by Colin).
5
+ * Do not edit this file; edit the system in the workbench and export again.
6
+ * Component patterns after shadcn/ui (MIT). */
7
+
8
+ /* themes: backstage + backstage-light, mode light */
9
+ :root{
10
+ --s:#f5f2f0;
11
+ --p:#fafaf9;
12
+ --l:#E5DDD5;
13
+ --i:#232220;
14
+ --i2:#4b4a49;
15
+ --i3:#525151;
16
+ --mid:#c0cece;
17
+ --pos:#2d2d2d;
18
+ --neg:#881337;
19
+ --good:#14532d;
20
+ --warn:#713f12;
21
+ --acc:#4d6b00;
22
+ --on-accent:#f2f2ef;
23
+ --fill:#657272;
24
+ --on-fill:#fafaf9;
25
+ --danger-edge:#e3c1c9;
26
+ --warn-fill:#f4ebdc;
27
+ --data-2:#2d2d2d;
28
+ --bar-a:#8fcc75;
29
+ --bar-b:#2f8d07;
30
+ --under-a:#d99aa8;
31
+ --under-b:#881337;
32
+ --warn-hatch:#b8862b;
33
+ --field:#fafaf9;
34
+ --edge-soft:rgba(45,45,45,.12);
35
+ --ring-c:rgba(155,196,15,.40);
36
+ --top-a:#fafaf9;
37
+ --card-a:#fafaf9;
38
+ --card-b:#fafaf9;
39
+ --shadow:0 1px 2px rgba(25,25,25,.06);
40
+ --tx-k:.8;
41
+ --dept-booking-ink:#af4800;
42
+ --dept-ticketing-ink:#d20a0a;
43
+ --dept-marketing-ink:#cb1052;
44
+ --dept-sponsorship-ink:#b217bb;
45
+ --dept-creative-ink:#0063d9;
46
+ --dept-production-ink:#6e3ff7;
47
+ --dept-operations-ink:#1c736f;
48
+ --dept-relations-ink:#8a6000;
49
+ --dept-hospitality-ink:#a65000;
50
+ --dept-finance-ink:#36751a;
51
+ --dept-fnb-ink:#8f5c11;
52
+ --dept-unassigned-ink:#686868;
53
+ --series-1:#2a6fc4;
54
+ --series-2:#c9531f;
55
+ --series-3:#0f8a5f;
56
+ --series-4:#a87100;
57
+ --series-5:#c4467a;
58
+ }
59
+ html[data-mode="dark"]{
60
+ --shadow:none;
61
+ --tx-k:1;
62
+ --dept-booking-ink:#ff8835;
63
+ --dept-ticketing-ink:#f87171;
64
+ --dept-marketing-ink:#f4709f;
65
+ --dept-sponsorship-ink:#e359eb;
66
+ --dept-creative-ink:#5fa8ff;
67
+ --dept-production-ink:#a78bfa;
68
+ --dept-operations-ink:#3fd0c9;
69
+ --dept-relations-ink:#ffc94d;
70
+ --dept-hospitality-ink:#ffb066;
71
+ --dept-finance-ink:#7ed957;
72
+ --dept-fnb-ink:#e8a33d;
73
+ --dept-unassigned-ink:#8a8a8a;
74
+ --series-1:#3987e5;
75
+ --series-2:#d95926;
76
+ --series-3:#199e70;
77
+ --series-4:#c98500;
78
+ --series-5:#d55181;
79
+ --s:#1d2525;
80
+ --p:#171c1c;
81
+ --l:#353535;
82
+ --i:#ededed;
83
+ --i2:#c2c2c2;
84
+ --i3:#a3a3a3;
85
+ --mid:#2d2d2d;
86
+ --pos:#99b8b8;
87
+ --neg:#ff7a85;
88
+ --good:#6ee08a;
89
+ --warn:#f5c451;
90
+ --acc:#99b8b8;
91
+ --on-accent:#111111;
92
+ --fill:#99b8b8;
93
+ --on-fill:#111111;
94
+ --danger-edge:#4a2b2e;
95
+ --warn-fill:#2a2515;
96
+ --data-2:#d4d7cb;
97
+ --bar-a:#179915;
98
+ --bar-b:#77c176;
99
+ --under-a:#8a3f47;
100
+ --under-b:#d9626d;
101
+ --warn-hatch:#f5c451;
102
+ --field:#111111;
103
+ --edge-soft:rgba(255,255,255,.12);
104
+ --ring-c:rgba(198,241,53,.35);
105
+ --top-a:#232323;
106
+ --card-a:#232323;
107
+ --card-b:#232323;
108
+ }
109
+ html[data-mode="light"]{
110
+ --s:#f5f2f0;
111
+ --p:#fafaf9;
112
+ --l:#E5DDD5;
113
+ --i:#232220;
114
+ --i2:#4b4a49;
115
+ --i3:#525151;
116
+ --mid:#c0cece;
117
+ --pos:#2d2d2d;
118
+ --neg:#881337;
119
+ --good:#14532d;
120
+ --warn:#713f12;
121
+ --acc:#4d6b00;
122
+ --on-accent:#f2f2ef;
123
+ --fill:#657272;
124
+ --on-fill:#fafaf9;
125
+ --danger-edge:#e3c1c9;
126
+ --warn-fill:#f4ebdc;
127
+ --data-2:#2d2d2d;
128
+ --bar-a:#8fcc75;
129
+ --bar-b:#2f8d07;
130
+ --under-a:#d99aa8;
131
+ --under-b:#881337;
132
+ --warn-hatch:#b8862b;
133
+ --field:#fafaf9;
134
+ --edge-soft:rgba(45,45,45,.12);
135
+ --ring-c:rgba(155,196,15,.40);
136
+ --top-a:#fafaf9;
137
+ --card-a:#fafaf9;
138
+ --card-b:#fafaf9;
139
+ --shadow:0 1px 2px rgba(25,25,25,.06);
140
+ --tx-k:.8;
141
+ --dept-booking-ink:#af4800;
142
+ --dept-ticketing-ink:#d20a0a;
143
+ --dept-marketing-ink:#cb1052;
144
+ --dept-sponsorship-ink:#b217bb;
145
+ --dept-creative-ink:#0063d9;
146
+ --dept-production-ink:#6e3ff7;
147
+ --dept-operations-ink:#1c736f;
148
+ --dept-relations-ink:#8a6000;
149
+ --dept-hospitality-ink:#a65000;
150
+ --dept-finance-ink:#36751a;
151
+ --dept-fnb-ink:#8f5c11;
152
+ --dept-unassigned-ink:#686868;
153
+ --series-1:#2a6fc4;
154
+ --series-2:#c9531f;
155
+ --series-3:#0f8a5f;
156
+ --series-4:#a87100;
157
+ --series-5:#c4467a;
158
+ }
159
+
160
+ :root{
161
+ --font-system:ui-sans-serif,-apple-system,"Segoe UI",Roboto,sans-serif;
162
+ --font-grotesk:"Helvetica Neue",Helvetica,Arial,"Liberation Sans",sans-serif;
163
+ --font-serif:"Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua",Georgia,"Times New Roman",serif;
164
+ --font-monoface:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
165
+ --font-condensed:"Avenir Next Condensed","Arial Narrow","Roboto Condensed","Helvetica Neue",Arial,sans-serif;
166
+ --font-rounded:ui-rounded,"SF Pro Rounded","Nunito","Varela Round",system-ui,sans-serif;
167
+ --font-humanist:Seravek,"Gill Sans","Gill Sans MT",Optima,Candara,Verdana,sans-serif;
168
+ --font-dm:"DM Sans",ui-sans-serif,-apple-system,"Segoe UI",Roboto,sans-serif;
169
+ --font-dmmono:"DM Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
170
+ }
171
+ :root{
172
+ --ts-display-size:3rem; --ts-display-weight:800; --ts-display-lh:1.05; --ts-display-ls:-.03em; --ts-display-case:none; --ts-display-font:var(--font-body, var(--font-system));
173
+ --ts-h1-size:2rem; --ts-h1-weight:700; --ts-h1-lh:1.15; --ts-h1-ls:-.02em; --ts-h1-case:none; --ts-h1-font:var(--font-body, var(--font-system));
174
+ --ts-h2-size:1.5rem; --ts-h2-weight:700; --ts-h2-lh:1.2; --ts-h2-ls:-.01em; --ts-h2-case:none; --ts-h2-font:var(--font-body, var(--font-system));
175
+ --ts-h3-size:1.1rem; --ts-h3-weight:700; --ts-h3-lh:1.3; --ts-h3-ls:var(--ls-body,0); --ts-h3-case:none; --ts-h3-font:var(--font-body, var(--font-system));
176
+ --ts-lead-size:1.05rem; --ts-lead-weight:400; --ts-lead-lh:1.6; --ts-lead-ls:var(--ls-body,0); --ts-lead-case:none; --ts-lead-font:var(--font-body, var(--font-system));
177
+ --ts-body-size:15px; --ts-body-weight:400; --ts-body-lh:1.5; --ts-body-ls:var(--ls-body,0); --ts-body-case:none; --ts-body-font:var(--font-body, var(--font-system));
178
+ --ts-small-size:.875rem; --ts-small-weight:400; --ts-small-lh:1.5; --ts-small-ls:var(--ls-body,0); --ts-small-case:none; --ts-small-font:var(--font-body, var(--font-system));
179
+ --ts-caption-size:.8125rem; --ts-caption-weight:400; --ts-caption-lh:1.45; --ts-caption-ls:var(--ls-body,0); --ts-caption-case:none; --ts-caption-font:var(--font-body, var(--font-system));
180
+ --ts-label-size:.875rem; --ts-label-weight:600; --ts-label-lh:1.5; --ts-label-ls:var(--ls-body,0); --ts-label-case:none; --ts-label-font:var(--font-body, var(--font-system));
181
+ --ts-eyebrow-size:.625rem; --ts-eyebrow-weight:600; --ts-eyebrow-lh:1.2; --ts-eyebrow-ls:.14em; --ts-eyebrow-case:uppercase; --ts-eyebrow-font:var(--font-label, var(--font-body, var(--font-system)));
182
+ }
183
+ body{margin:0;background:var(--s);color:var(--i);font:var(--ts-body-weight) var(--ts-body-size)/var(--ts-body-lh) var(--ts-body-font);letter-spacing:var(--ts-body-ls);text-transform:var(--ts-body-case)}
184
+ html{font-size:calc(100% * var(--type-k, 1))}
185
+ :root{
186
+ --dept-booking:#ff8835;
187
+ --dept-booking-ink:#ff8835;
188
+ --dept-ticketing:#f87171;
189
+ --dept-ticketing-ink:#f87171;
190
+ --dept-marketing:#f4709f;
191
+ --dept-marketing-ink:#f4709f;
192
+ --dept-sponsorship:#e359eb;
193
+ --dept-sponsorship-ink:#e359eb;
194
+ --dept-creative:#5fa8ff;
195
+ --dept-creative-ink:#5fa8ff;
196
+ --dept-production:#a78bfa;
197
+ --dept-production-ink:#a78bfa;
198
+ --dept-operations:#3fd0c9;
199
+ --dept-operations-ink:#3fd0c9;
200
+ --dept-relations:#ffc94d;
201
+ --dept-relations-ink:#ffc94d;
202
+ --dept-hospitality:#ffb066;
203
+ --dept-hospitality-ink:#ffb066;
204
+ --dept-finance:#7ed957;
205
+ --dept-finance-ink:#7ed957;
206
+ --dept-fnb:#e8a33d;
207
+ --dept-fnb-ink:#e8a33d;
208
+ --dept-unassigned:#8a8a8a;
209
+ --dept-unassigned-ink:#8a8a8a;
210
+ }
211
+ html{ --font-body:var(--font-dm);
212
+ --font-label:var(--font-dmmono);
213
+ --ls-body:-.005em; }
214
+ :root{
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+ }
232
+ body::before{content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;background-repeat:repeat;opacity:calc(var(--tx-o,0) * var(--tx-k,1));background-image:none}
233
+ @media (prefers-reduced-motion: reduce){
234
+ *, *::before, *::after{animation:none!important;transition:none!important}
235
+ }
236
+
237
+ /* ── base: shadcn/ui ── */
238
+ /* bases/shadcn.css: the shadcn/ui flavor. Load after tokens.css, before components.css.
239
+ * shadcn/ui is MIT. Sizes and states follow its new-york components; colors come from the active theme.
240
+ * Every base sets the same component tokens, so any base works under the same components and React. */
241
+ :root{
242
+ /* this base's heading sizes, on the kit's type styles (tokens.css); the type editor sits on top */
243
+ --ts-display-size:3rem;
244
+ --ts-h1-size:2rem;
245
+ --ts-h2-size:1.5rem;
246
+ --base:shadcn;
247
+ /* shadcn's color names, pointed at the theme: a component written for shadcn works as-is */
248
+ --background:var(--s);
249
+ --foreground:var(--i);
250
+ --card:var(--p);
251
+ --card-foreground:var(--i);
252
+ --popover:var(--p);
253
+ --popover-foreground:var(--i);
254
+ --primary:var(--fill);
255
+ --primary-foreground:var(--on-fill);
256
+ --secondary:var(--mid);
257
+ --secondary-foreground:var(--i);
258
+ --muted:var(--mid);
259
+ --muted-foreground:var(--i3);
260
+ --accent:var(--mid);
261
+ --accent-foreground:var(--i);
262
+ --destructive:var(--neg);
263
+ --border:var(--l);
264
+ --input:var(--input-border);
265
+ --ring:var(--pos);
266
+ --radius:var(--r-md,8px);
267
+ --chart-1:var(--series-1);
268
+ --chart-2:var(--series-2);
269
+ --chart-3:var(--series-3);
270
+ --chart-4:var(--series-4);
271
+ --chart-5:var(--series-5);
272
+ /* Tailwind's shadow scale, which shadcn uses */
273
+ --shadow-xs:0 1px 2px 0 rgba(0,0,0,.05);
274
+ --shadow-sm:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);
275
+ --shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);
276
+ --shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);
277
+ --shadow-xl:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);
278
+ --shadow-2xl:0 25px 50px -12px rgba(0,0,0,.25);
279
+ }
280
+
281
+ /* Component tokens: value; then @edit type [min max step]. The workbench edits these per system. */
282
+ :root{
283
+ /* shared */
284
+ --focus-color:var(--pos);
285
+ --focus-width:2px;
286
+ --focus-offset:2px;
287
+ --disabled-opacity:.5;
288
+ /* Field edges: --i3 blended 80% toward --field, the softest blend that keeps 3:1 against every
289
+ ground in all 28 themes (check-kit.mjs measures it); 70% drops Newsprint to 2.58. */
290
+ --input-border:color-mix(in srgb,var(--i3) 80%,var(--field));
291
+
292
+ /* button: h-9, px-4, rounded-md, font-medium, shadow-xs */
293
+ --btn-radius:var(--r-md,8px);
294
+ --btn-h:36px;
295
+ --btn-pad-x:16px;
296
+ --btn-font-size:.875rem;
297
+ --btn-font-weight:500;
298
+ --btn-primary-bg:var(--fill);
299
+ --btn-primary-fg:var(--on-fill);
300
+ /* a darker edge so a light fill still shows a boundary on a light panel (lime on white is 1.31:1) */
301
+ --btn-primary-border:color-mix(in srgb,var(--on-fill) 14%,var(--fill));
302
+ --btn-primary-bg-hover:color-mix(in srgb,var(--fill) 90%,var(--on-fill));
303
+ --btn-secondary-bg:var(--p);
304
+ --btn-secondary-fg:var(--i);
305
+ --btn-secondary-border:var(--input-border);
306
+ --btn-secondary-bg-hover:var(--mid);
307
+ --btn-shadow:var(--shadow-xs);
308
+ --btn-hover-lift:0px;
309
+ --btn-press-scale:.98;
310
+ --btn-dur:150ms;
311
+ --btn-ease:ease;
312
+
313
+ /* input, textarea, select: h-9, px-3, shadow-xs, a 3px ring at half strength on focus */
314
+ --input-h:36px;
315
+ --input-pad-x:12px;
316
+ --input-radius:var(--r-md,8px);
317
+ --input-bg:var(--field);
318
+ --input-border-hover:var(--i2);
319
+ --input-shadow:var(--shadow-xs);
320
+ --input-ring:color-mix(in srgb,var(--focus-color) 50%,transparent);
321
+ --input-ring-width:3px;
322
+ --input-dur:150ms;
323
+
324
+ /* switch: 32 x 18 */
325
+ --switch-w:32px;
326
+ --switch-h:18px;
327
+ --switch-pad:1px;
328
+ --switch-off-bg:var(--field);
329
+ --switch-on-bg:var(--fill);
330
+ --switch-thumb-off:var(--i3);
331
+ --switch-thumb-on:var(--on-fill);
332
+ --switch-thumb-shadow:none;
333
+ --switch-dur:150ms;
334
+ --switch-ease:ease;
335
+
336
+ /* tabs */
337
+ --tabs-gap:2px;
338
+ --tabs-indicator:var(--pos);
339
+ --tabs-indicator-h:2px;
340
+ --tabs-pill-bg:var(--mid);
341
+ --tabs-dur:200ms;
342
+ --tabs-ease:ease-out;
343
+
344
+ /* dialog: max-w-lg, rounded-lg, shadow-lg, bg-black/50, zoom 95, 200ms */
345
+ --dialog-w:512px;
346
+ --dialog-radius:var(--r-lg,10px);
347
+ --dialog-backdrop:rgba(0,0,0,.5);
348
+ --dialog-blur:0px;
349
+ --dialog-enter-scale:.95;
350
+ --dialog-shadow:var(--shadow-lg);
351
+ --dialog-dur:200ms;
352
+ --dialog-ease:ease-out;
353
+
354
+ /* badge */
355
+ --badge-h:22px;
356
+ --badge-pad-x:8px;
357
+ --badge-radius:var(--r-sm,6px);
358
+ --badge-font-size:.75rem;
359
+ --badge-font-weight:500;
360
+ --badge-tint:14%;
361
+ --badge-neutral-bg:var(--mid);
362
+ --badge-ink:75%;
363
+
364
+ /* tag */
365
+ --tag-h:26px;
366
+ --tag-pad-x:8px;
367
+ --tag-radius:var(--r-sm,6px);
368
+ --tag-bg:var(--p);
369
+ --tag-fg:var(--i);
370
+ --tag-border:var(--input-border);
371
+
372
+ /* avatar */
373
+ --avatar-size-base:32px;
374
+ --avatar-size:var(--avatar-size-base);
375
+ --avatar-radius:999px;
376
+ --avatar-bg:var(--mid);
377
+ --avatar-fg:var(--i);
378
+ --avatar-ring:var(--p);
379
+
380
+ /* tooltip: inverted, dark on light and light on dark */
381
+ --tooltip-bg:var(--i);
382
+ --tooltip-fg:var(--s);
383
+ --tooltip-radius:6px;
384
+ --tooltip-font-size:.75rem;
385
+ --tooltip-delay:200ms;
386
+ --tooltip-dur:150ms;
387
+
388
+ /* progress: the fill is the primary color, not the button fill (lime on a pale track is about 1.1:1) */
389
+ --progress-h:8px;
390
+ --progress-radius:999px;
391
+ --progress-track:var(--mid);
392
+ --progress-fill:var(--pos);
393
+ --progress-dur:300ms;
394
+ --progress-ease:ease-out;
395
+
396
+ /* spinner */
397
+ --spinner-size:20px;
398
+ --spinner-width:2px;
399
+ --spinner-color:var(--pos);
400
+ --spinner-track:var(--mid);
401
+ --spinner-dur:800ms;
402
+
403
+ /* skeleton */
404
+ --skeleton-bg:var(--mid);
405
+ --skeleton-shine:color-mix(in srgb,var(--i) 8%,var(--mid));
406
+ --skeleton-radius:var(--r-sm,6px);
407
+ --skeleton-dur:1.6s;
408
+
409
+ /* alert */
410
+ --alert-pad:14px 16px;
411
+ --alert-radius:var(--r-lg,10px);
412
+ --alert-tint:6%;
413
+ --alert-edge:30%;
414
+
415
+ /* application navigation (sidebar) */
416
+ /* app sidebar with a flyout (ui-sidebar) */
417
+ --sidebar-w:240px;
418
+ --sidebar-rail-w:52px;
419
+ --sidebar-item-h:34px;
420
+ --sidebar-radius:var(--r-sm,8px);
421
+ --sidebar-bg:var(--p);
422
+ --sidebar-border:var(--l);
423
+ --sidebar-fg:var(--i2);
424
+ --sidebar-head-fg:var(--i3);
425
+ --sidebar-hover-bg:var(--mid);
426
+ --sidebar-hover-fg:var(--i);
427
+ --sidebar-current-bg:var(--fill);
428
+ --sidebar-current-fg:var(--on-fill);
429
+ --sidebar-scrim:rgba(0,0,0,.4);
430
+ --sidebar-dur:var(--dur-base,200ms);
431
+ --sidebar-ease:var(--ease-standard,ease);
432
+ --sidenav-w:256px;
433
+ --sidenav-bg:var(--p);
434
+ --sidenav-fg:var(--i2);
435
+ --sidenav-active-bg:var(--mid);
436
+ --sidenav-active-fg:var(--i);
437
+ --sidenav-radius:var(--r-sm,6px);
438
+
439
+ /* metric */
440
+ --metric-value-size:2rem;
441
+ --metric-value-weight:700;
442
+
443
+ /* chart: the line is the primary color, which holds 3:1 on panels in every theme */
444
+ --chart-h:180px;
445
+ --chart-line:var(--pos);
446
+ --chart-stroke:2px;
447
+ --chart-area-opacity:.12;
448
+ --chart-grid:var(--l);
449
+
450
+ /* table */
451
+ --table-radius:var(--r-md,8px);
452
+ --table-head-bg:var(--p);
453
+ --table-head-fg:var(--i2);
454
+ --table-row-hover:var(--mid);
455
+
456
+ /* checkbox and radio: size-4, rounded-[4px]; the checked box takes the primary fill */
457
+ --check-size:16px;
458
+ --check-radius:4px;
459
+ --check-on-bg:var(--fill);
460
+ --check-on-fg:var(--on-fill);
461
+ /* the checked box's edge: the fill moved toward body ink, so the box stays outlined on a panel in light and dark
462
+ themes alike (a lime fill alone is about 1.3:1 on white) */
463
+ --check-on-border:color-mix(in srgb,var(--i) 40%,var(--fill));
464
+ --radio-dot:6px;
465
+ --check-dur:120ms;
466
+ --check-ease:ease-out;
467
+
468
+ /* button group */
469
+ --btngroup-border:var(--input-border);
470
+ --btngroup-fg:var(--i2);
471
+ --btngroup-active-bg:var(--mid);
472
+ --btngroup-active-fg:var(--i);
473
+
474
+ /* dropdown menu: rounded-md, p-1, shadow-md; items px-2 py-1.5, rounded-sm */
475
+ --menu-w:200px;
476
+ --menu-radius:var(--r-md,8px);
477
+ --menu-pad:4px;
478
+ --menu-item-pad:6px 8px;
479
+ --menu-item-radius:4px;
480
+ --menu-item-hover:var(--mid);
481
+ /* a destructive item: the critical color moved a little toward body ink, so it reads at 4.5:1 when highlighted */
482
+ --menu-danger-fg:color-mix(in srgb,var(--neg) 85%,var(--i));
483
+ --menu-shadow:var(--shadow-md);
484
+ --menu-dur:120ms;
485
+
486
+ /* slider: the filled part is the primary color, which holds 3:1 on the track */
487
+ --slider-h:6px;
488
+ --slider-thumb:16px;
489
+ --slider-track:var(--mid);
490
+ --slider-fill:var(--pos);
491
+ --slider-thumb-bg:var(--p);
492
+ --slider-thumb-border:1px;
493
+ --slider-thumb-shadow:var(--shadow-sm);
494
+
495
+ /* text editor */
496
+ --editor-min-h:140px;
497
+ --editor-toolbar-bg:var(--p);
498
+ --editor-tool-on:var(--mid);
499
+
500
+ /* video player: the controls sit on the picture, so they are light on a dark scrim in every theme */
501
+ --video-radius:var(--r-lg,10px);
502
+ --video-bg:black;
503
+ --video-fg:white;
504
+ --video-scrim:rgba(0,0,0,.65);
505
+
506
+ /* empty state, inline call to action, page header, pagination */
507
+ --empty-pad:32px 16px;
508
+ --empty-icon-bg:var(--mid);
509
+ --cta-bg:color-mix(in srgb,var(--pos) 6%,var(--p));
510
+ --cta-border:var(--l);
511
+ --pagehead-title-size:var(--ts-h2-size);
512
+ --pagination-current-bg:var(--mid);
513
+
514
+ /* progress steps: done steps take the button fill, the current one rings in the primary color */
515
+ --steps-marker:26px;
516
+ --steps-done-bg:var(--fill);
517
+ --steps-done-fg:var(--on-fill);
518
+ --steps-current:var(--pos);
519
+
520
+ /* calendar and date picker */
521
+ --cal-cell:36px;
522
+ --cal-radius:var(--r-sm,6px);
523
+ --cal-selected-bg:var(--fill);
524
+ --cal-selected-fg:var(--on-fill);
525
+ --cal-today:var(--pos);
526
+
527
+ /* code snippet: a quiet panel; comments in secondary text */
528
+ --code-bg:color-mix(in srgb,var(--mid) 60%,var(--p));
529
+ --code-fg:var(--i);
530
+
531
+ /* command menu, file drop zone, filter chips, tree */
532
+ --command-w:520px;
533
+ --dropzone-border:var(--input-border);
534
+ --dropzone-active:var(--pos);
535
+ --chip-on-bg:var(--fill);
536
+ --chip-on-fg:var(--on-fill);
537
+ --tree-selected-bg:var(--mid);
538
+
539
+ /* messaging: your messages take the button fill */
540
+ --chat-h:420px;
541
+ --chat-radius:14px;
542
+ --chat-in-bg:var(--mid);
543
+ --chat-in-fg:var(--i);
544
+ --chat-out-bg:var(--fill);
545
+ --chat-out-fg:var(--on-fill);
546
+
547
+ /* slide-out panel: opens like the dialog, with its motion and backdrop */
548
+ --sheet-w:400px;
549
+
550
+ /* marketing sections: the band's padding and width, heading sizes */
551
+ --section-pad-y:64px;
552
+ --section-max:1120px;
553
+ --section-title-size:var(--ts-h1-size);
554
+ --hero-title-size:var(--ts-display-size);
555
+ /* an eyebrow over a title: the primary color moved toward body ink, so small caps hold 4.5:1 */
556
+ --eyebrow-fg:color-mix(in srgb,var(--pos) 70%,var(--i));
557
+ --mk-card-bg:var(--p);
558
+ --sitenav-bg:var(--p);
559
+ --stat-rule:var(--pos);
560
+ --quote-mark:var(--pos);
561
+ /* pricing: the featured plan's edge in the primary color, which holds 3:1 on a panel */
562
+ --plan-featured:var(--pos);
563
+ --plan-check:var(--pos);
564
+ /* call-to-action band and footer: inverted, dark on light and light on dark */
565
+ --ctaband-bg:var(--i);
566
+ --ctaband-fg:var(--s);
567
+ --footer-bg:var(--i);
568
+ --footer-fg:var(--s);
569
+ --footer-muted:color-mix(in srgb,var(--s) 72%,var(--i));
570
+
571
+ /* banners, device frames, design annotations */
572
+ --banner-bg:var(--i);
573
+ --banner-fg:var(--s);
574
+ --device-body:color-mix(in srgb,var(--i) 88%,var(--s));
575
+ --annot-bg:var(--pos);
576
+ --annot-fg:var(--s);
577
+
578
+ /* motion: the shared timing every animation reads (motion.js, the playground, and the exported GSAP and Motion code).
579
+ Colin's Motion setting decides how much of it plays: Full all of it, Calm short fades only, Still none */
580
+ --dur-fast:150ms;
581
+ --dur-base:250ms;
582
+ --dur-slow:500ms;
583
+ --ease-standard:cubic-bezier(.2,0,0,1);
584
+ --ease-enter:cubic-bezier(.16,1,.3,1);
585
+ --ease-exit:cubic-bezier(.4,0,1,1);
586
+ --motion-distance:16px;
587
+ --motion-stagger:60ms;
588
+ }
589
+
590
+
591
+ /* ── type styles: the kit's, unchanged (.ui-t-<style> in components.css applies one to any element) ── */
592
+ /* ── components ── */
593
+ /* The hidden attribute always wins. A component's own display (flex, grid ...) would otherwise override
594
+ the browser's [hidden], and a "hidden" badge or alert would still show. */
595
+ [class^="ui-"][hidden],[class*=" ui-"][hidden]{display:none!important}
596
+
597
+ /* ── ui-btn ── */
598
+ .ui-btn{
599
+ --_bg:var(--btn-secondary-bg);--_fg:var(--btn-secondary-fg);--_bd:var(--btn-secondary-border);--_bg-h:var(--btn-secondary-bg-hover);
600
+ display:inline-flex;align-items:center;justify-content:center;gap:8px;height:var(--btn-h);padding:0 var(--btn-pad-x);
601
+ font:inherit;font-size:var(--btn-font-size);font-weight:var(--btn-font-weight);line-height:1;white-space:nowrap;text-decoration:none;
602
+ color:var(--_fg);background:var(--_bg);border:1px solid var(--_bd);border-radius:var(--btn-radius);box-shadow:var(--btn-shadow);cursor:pointer;
603
+ transition:background-color var(--btn-dur) var(--btn-ease),border-color var(--btn-dur) var(--btn-ease),color var(--btn-dur) var(--btn-ease),transform var(--btn-dur) var(--btn-ease),box-shadow var(--btn-dur) var(--btn-ease);
604
+ }
605
+ .ui-btn:hover,.ui-btn.is-hover{background:var(--_bg-h);transform:translateY(calc(-1 * var(--btn-hover-lift)))}
606
+ .ui-btn:active,.ui-btn.is-active{transform:scale(var(--btn-press-scale))}
607
+ .ui-btn:focus-visible,.ui-btn.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:var(--focus-offset)}
608
+ .ui-btn:disabled,.ui-btn[aria-disabled="true"],.ui-btn.is-disabled{opacity:var(--disabled-opacity);cursor:not-allowed;transform:none;pointer-events:none}
609
+ .ui-btn svg{width:16px;height:16px;flex:none}
610
+ .ui-btn--primary{--_bg:var(--btn-primary-bg);--_fg:var(--btn-primary-fg);--_bd:var(--btn-primary-border);--_bg-h:var(--btn-primary-bg-hover)}
611
+ .ui-btn--ghost{--_bg:transparent;--_bd:transparent;--_fg:var(--i2);--_bg-h:var(--mid);box-shadow:none}
612
+ .ui-btn--ghost:hover,.ui-btn--ghost.is-hover{color:var(--i)}
613
+ /* text on a --neg fill uses the ground color: the same pair the contrast checker already holds at 4.5:1 */
614
+ .ui-btn--destructive{--_bg:var(--neg);--_fg:var(--s);--_bd:var(--neg);--_bg-h:color-mix(in srgb,var(--neg) 88%,var(--s))}
615
+ .ui-btn--link{--_bg:transparent;--_bd:transparent;--_fg:var(--pos);--_bg-h:transparent;height:auto;padding:0;box-shadow:none;text-decoration:underline;text-underline-offset:3px}
616
+ .ui-btn--sm{height:calc(var(--btn-h) - 6px);padding:0 calc(var(--btn-pad-x) - 4px);font-size:.82rem}
617
+ .ui-btn--lg{height:calc(var(--btn-h) + 8px);padding:0 calc(var(--btn-pad-x) + 6px);font-size:1rem}
618
+ .ui-btn--icon{width:var(--btn-h);padding:0}
619
+ .ui-btn[aria-busy="true"]{pointer-events:none}
620
+ .ui-btn[aria-busy="true"]::before{content:"";width:14px;height:14px;border-radius:50%;border:2px solid currentColor;border-right-color:transparent;animation:ui-spin .7s linear infinite}
621
+ @keyframes ui-spin{to{transform:rotate(360deg)}}
622
+ /* ── end ui-btn ── */
623
+
624
+ /* ── ui-input ── */
625
+ .ui-field{display:grid;gap:6px;min-width:0}
626
+ .ui-label{font-size:var(--ts-label-size);color:var(--i);font-weight:var(--ts-label-weight);line-height:var(--ts-label-lh);letter-spacing:var(--ts-label-ls);text-transform:var(--ts-label-case);font-family:var(--ts-label-font)}
627
+ .ui-hint{font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
628
+ .ui-error{font-size:var(--ts-caption-size);color:var(--neg);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
629
+ .ui-input{width:100%;box-shadow:var(--input-shadow);height:var(--input-h);padding:0 var(--input-pad-x);font-size:var(--ts-body-size);color:var(--i);background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);transition:border-color var(--input-dur) ease,box-shadow var(--input-dur) ease;font-weight:var(--ts-body-weight);line-height:var(--ts-body-lh);letter-spacing:var(--ts-body-ls);text-transform:var(--ts-body-case);font-family:var(--ts-body-font)}
630
+ .ui-input::placeholder{color:var(--i3);opacity:1}
631
+ .ui-input:hover,.ui-input.is-hover{border-color:var(--input-border-hover)}
632
+ .ui-input:focus,.ui-input.is-focus{outline:none;border-color:var(--focus-color);box-shadow:var(--input-shadow),0 0 0 var(--input-ring-width) var(--input-ring)}
633
+ .ui-input[aria-invalid="true"]{border-color:var(--neg)}
634
+ .ui-input[aria-invalid="true"]:focus{box-shadow:var(--input-shadow),0 0 0 var(--input-ring-width) color-mix(in srgb,var(--neg) 28%,transparent)}
635
+ .ui-input:disabled,.ui-input.is-disabled{opacity:var(--disabled-opacity);cursor:not-allowed}
636
+ textarea.ui-input{height:auto;min-height:96px;padding:10px var(--input-pad-x);line-height:1.5;resize:vertical}
637
+ /* ── end ui-input ── */
638
+
639
+ /* ── ui-select ── */
640
+ .ui-select{position:relative;display:block;min-width:0}
641
+ .ui-select .ui-input{appearance:none;padding-right:38px;cursor:pointer}
642
+ .ui-select::after{content:"";position:absolute;right:15px;top:50%;width:7px;height:7px;border-right:1.5px solid var(--i3);border-bottom:1.5px solid var(--i3);transform:translateY(-70%) rotate(45deg);pointer-events:none;transition:border-color var(--input-dur) ease}
643
+ .ui-select:hover::after,.ui-select:focus-within::after{border-color:var(--i)}
644
+ .ui-select option{background:var(--p);color:var(--i)}
645
+ /* ── end ui-select ── */
646
+
647
+ /* ── ui-switch ── */
648
+ .ui-switch-row{display:inline-flex;align-items:center;gap:10px;cursor:pointer;color:var(--i)}
649
+ .ui-switch{
650
+ appearance:none;flex:none;position:relative;width:var(--switch-w);height:var(--switch-h);margin:0;cursor:pointer;
651
+ background:var(--switch-off-bg);border:1px solid var(--input-border);border-radius:999px;
652
+ transition:background-color var(--switch-dur) var(--switch-ease),border-color var(--switch-dur) var(--switch-ease);
653
+ }
654
+ .ui-switch::before{
655
+ content:"";position:absolute;top:50%;left:var(--switch-pad);height:calc(var(--switch-h) - 2 * var(--switch-pad) - 2px);aspect-ratio:1;
656
+ border-radius:999px;background:var(--switch-thumb-off);box-shadow:var(--switch-thumb-shadow);transform:translateY(-50%);
657
+ transition:transform var(--switch-dur) var(--switch-ease),background-color var(--switch-dur) ease,aspect-ratio var(--switch-dur) var(--switch-ease);
658
+ }
659
+ .ui-switch:checked{background:var(--switch-on-bg);border-color:var(--switch-on-bg)}
660
+ .ui-switch:checked::before{background:var(--switch-thumb-on);transform:translate(calc(var(--switch-w) - var(--switch-h)),-50%)}
661
+ .ui-switch:active::before,.ui-switch.is-active::before{aspect-ratio:1.25}
662
+ .ui-switch:checked:active::before,.ui-switch:checked.is-active::before{transform:translate(calc(var(--switch-w) - var(--switch-h) - .25 * (var(--switch-h) - 2 * var(--switch-pad) - 2px)),-50%)}
663
+ .ui-switch:hover,.ui-switch.is-hover{border-color:var(--input-border-hover)}
664
+ .ui-switch:checked:hover,.ui-switch:checked.is-hover{border-color:var(--switch-on-bg)}
665
+ .ui-switch:focus-visible,.ui-switch.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:var(--focus-offset)}
666
+ .ui-switch:disabled,.ui-switch.is-disabled{opacity:var(--disabled-opacity);cursor:not-allowed}
667
+ /* ── end ui-switch ── */
668
+
669
+ /* ── ui-tabs ── */
670
+ .ui-tabs{display:grid;gap:14px;min-width:0}
671
+ .ui-tablist{position:relative;display:flex;gap:var(--tabs-gap);border-bottom:1px solid var(--l);overflow-x:auto;scrollbar-width:none}
672
+ .ui-tab{position:relative;z-index:1;font-size:var(--ts-small-size);font-weight:600;padding:10px 12px;border:0;background:transparent;color:var(--i3);cursor:pointer;white-space:nowrap;border-radius:var(--r-sm,8px) var(--r-sm,8px) 0 0;transition:color var(--tabs-dur) var(--tabs-ease);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
673
+ .ui-tab:hover,.ui-tab.is-hover{color:var(--i)}
674
+ .ui-tab[aria-selected="true"]{color:var(--i)}
675
+ .ui-tab:focus-visible,.ui-tab.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:calc(-1 * var(--focus-width))}
676
+ .ui-tab:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}
677
+ /* the indicator slides: components.js sets --x and --w from the selected tab */
678
+ .ui-tab-indicator{position:absolute;left:0;bottom:-1px;height:var(--tabs-indicator-h);width:var(--w,0);transform:translateX(var(--x,0));background:var(--tabs-indicator);border-radius:2px;transition:transform var(--tabs-dur) var(--tabs-ease),width var(--tabs-dur) var(--tabs-ease)}
679
+ .ui-tabs--pill .ui-tablist{border:1px solid var(--l);border-radius:var(--r-md,10px);padding:4px;background:var(--field);width:max-content;max-width:100%}
680
+ .ui-tabs--pill .ui-tab{border-radius:var(--r-sm,8px);padding:7px 14px}
681
+ .ui-tabs--pill .ui-tab-indicator{top:4px;bottom:4px;height:auto;background:var(--tabs-pill-bg);border-radius:var(--r-sm,8px);box-shadow:var(--shadow-xs)}
682
+ .ui-tabpanel{min-width:0;color:var(--i2)}
683
+ .ui-tabpanel:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:4px;border-radius:4px}
684
+ /* ── end ui-tabs ── */
685
+
686
+ /* ── ui-dialog ── */
687
+ .ui-dialog{
688
+ width:min(var(--dialog-w),calc(100vw - 32px));max-height:calc(100dvh - 48px);padding:0;overflow:auto;
689
+ color:var(--i);background:var(--p);border:1px solid var(--l);border-radius:var(--dialog-radius);box-shadow:var(--dialog-shadow);
690
+ opacity:0;transform:translateY(8px) scale(var(--dialog-enter-scale));
691
+ transition:opacity var(--dialog-dur) var(--dialog-ease),transform var(--dialog-dur) var(--dialog-ease),overlay var(--dialog-dur) allow-discrete,display var(--dialog-dur) allow-discrete;
692
+ }
693
+ .ui-dialog[open]{opacity:1;transform:none}
694
+ @starting-style{.ui-dialog[open]{opacity:0;transform:translateY(8px) scale(var(--dialog-enter-scale))}}
695
+ .ui-dialog::backdrop{background:var(--dialog-backdrop);backdrop-filter:blur(var(--dialog-blur));opacity:0;transition:opacity var(--dialog-dur) ease,overlay var(--dialog-dur) allow-discrete,display var(--dialog-dur) allow-discrete}
696
+ .ui-dialog[open]::backdrop{opacity:1}
697
+ @starting-style{.ui-dialog[open]::backdrop{opacity:0}}
698
+ html:has(.ui-dialog[open]){overflow:hidden}
699
+ .ui-dialog-head{display:flex;align-items:flex-start;gap:12px;padding:20px 20px 0}
700
+ .ui-dialog-title{flex:1;margin:0;font-size:var(--ts-h3-size);color:var(--i);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
701
+ .ui-dialog-desc{margin:6px 0 0;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
702
+ .ui-dialog-body{padding:14px 20px;color:var(--i2)}
703
+ .ui-dialog-foot{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px;padding:0 20px 20px}
704
+ .ui-dialog-close{flex:none;display:grid;place-items:center;width:32px;height:32px;margin:-6px -8px 0 0;border:0;border-radius:var(--r-sm,8px);background:transparent;color:var(--i3);cursor:pointer;transition:background-color var(--btn-dur) ease,color var(--btn-dur) ease}
705
+ .ui-dialog-close:hover{background:var(--mid);color:var(--i)}
706
+ .ui-dialog-close:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:var(--focus-offset)}
707
+ /* ── end ui-dialog ── */
708
+
709
+ /* ── ui-badge ── */
710
+ /* tones tint the panel with their own color. Text is the tone moved toward body ink (--badge-ink), which
711
+ adds contrast in light and dark alike: on the tint alone, Colin's status colors fall under 4.5:1 in
712
+ 13 themes. check-kit holds the text at 4.5:1. */
713
+ .ui-badge{--_tone:var(--i2);--_bg:var(--badge-neutral-bg);
714
+ display:inline-flex;align-items:center;gap:6px;height:var(--badge-h);padding:0 var(--badge-pad-x);font-size:var(--badge-font-size);font-weight:var(--badge-font-weight);line-height:1;white-space:nowrap;
715
+ color:color-mix(in srgb,var(--_tone) var(--badge-ink),var(--i));background:var(--_bg);border:1px solid color-mix(in srgb,var(--_tone) 30%,transparent);border-radius:var(--badge-radius)}
716
+ .ui-badge--ok{--_tone:var(--good);--_bg:color-mix(in srgb,var(--good) var(--badge-tint),var(--p))}
717
+ .ui-badge--warn{--_tone:var(--warn);--_bg:color-mix(in srgb,var(--warn) var(--badge-tint),var(--p))}
718
+ .ui-badge--critical{--_tone:var(--neg);--_bg:color-mix(in srgb,var(--neg) var(--badge-tint),var(--p))}
719
+ .ui-badge--brand{--_tone:var(--on-fill);--_bg:var(--fill);border-color:var(--fill);color:var(--on-fill)}
720
+ .ui-badge--outline{--_bg:transparent;border-color:var(--input-border)}
721
+ .ui-badge-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
722
+ /* ── end ui-badge ── */
723
+
724
+ /* ── ui-tag ── */
725
+ .ui-tags{display:flex;flex-wrap:wrap;gap:6px}
726
+ .ui-tag{display:inline-flex;align-items:center;gap:4px;height:var(--tag-h);padding:0 4px 0 var(--tag-pad-x);font-size:var(--ts-caption-size);font-weight:500;color:var(--tag-fg);background:var(--tag-bg);border:1px solid var(--tag-border);border-radius:var(--tag-radius);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
727
+ .ui-tag:not(:has(.ui-tag-remove)){padding-right:var(--tag-pad-x)}
728
+ .ui-tag-remove{display:grid;place-items:center;width:18px;height:18px;padding:0;border:0;border-radius:4px;background:transparent;color:var(--i3);cursor:pointer;transition:background-color var(--btn-dur) ease,color var(--btn-dur) ease}
729
+ .ui-tag-remove:hover,.ui-tag-remove.is-hover{background:var(--mid);color:var(--i)}
730
+ .ui-tag-remove:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:1px}
731
+ .ui-tag-remove svg{width:12px;height:12px}
732
+ /* ── end ui-tag ── */
733
+
734
+ /* ── ui-avatar ── */
735
+ .ui-avatar{position:relative;display:inline-grid;place-items:center;flex:none;width:var(--avatar-size);height:var(--avatar-size);border-radius:var(--avatar-radius);background:var(--avatar-bg);color:var(--avatar-fg);font-size:calc(var(--avatar-size) * .38);font-weight:600;line-height:1;user-select:none}
736
+ .ui-avatar img{width:100%;height:100%;object-fit:cover;border-radius:inherit}
737
+ .ui-avatar--sm{--avatar-size:calc(var(--avatar-size-base) * .75)}
738
+ .ui-avatar--lg{--avatar-size:calc(var(--avatar-size-base) * 1.25)}
739
+ .ui-avatar-status{position:absolute;right:0;bottom:0;width:30%;height:30%;min-width:8px;min-height:8px;border-radius:50%;background:var(--good);box-shadow:0 0 0 2px var(--avatar-ring)}
740
+ .ui-avatar-group{display:inline-flex}
741
+ .ui-avatar-group .ui-avatar{box-shadow:0 0 0 2px var(--avatar-ring)}
742
+ .ui-avatar-group .ui-avatar + .ui-avatar{margin-left:calc(var(--avatar-size) * -.2)}
743
+ /* ── end ui-avatar ── */
744
+
745
+ /* ── ui-tooltip ── */
746
+ /* shows on hover and on keyboard focus; Escape hides it (WCAG 1.4.13), components.js */
747
+ .ui-tooltip-wrap{position:relative;display:inline-flex}
748
+ .ui-tooltip{position:absolute;z-index:70;left:50%;bottom:calc(100% + 8px);width:max-content;max-width:240px;padding:6px 10px;font-size:var(--tooltip-font-size);font-weight:500;line-height:1.4;color:var(--tooltip-fg);background:var(--tooltip-bg);border-radius:var(--tooltip-radius);box-shadow:var(--shadow-md);pointer-events:none;
749
+ opacity:0;transform:translate(-50%,4px);transition:opacity var(--tooltip-dur) ease,transform var(--tooltip-dur) ease;transition-delay:0s}
750
+ .ui-tooltip-wrap[data-side="bottom"] .ui-tooltip{bottom:auto;top:calc(100% + 8px);transform:translate(-50%,-4px)}
751
+ .ui-tooltip-wrap:hover:not(.is-dismissed) .ui-tooltip,.ui-tooltip-wrap:focus-within:not(.is-dismissed) .ui-tooltip,.ui-tooltip-wrap.is-hover .ui-tooltip{opacity:1;transform:translate(-50%,0);transition-delay:var(--tooltip-delay)}
752
+ /* ── end ui-tooltip ── */
753
+
754
+ /* ── ui-progress ── */
755
+ .ui-progress{position:relative;width:100%;height:var(--progress-h);overflow:hidden;background:var(--progress-track);border-radius:var(--progress-radius)}
756
+ .ui-progress-bar{height:100%;width:var(--value,0%);background:var(--progress-fill);border-radius:inherit;transition:width var(--progress-dur) var(--progress-ease)}
757
+ .ui-progress--indeterminate .ui-progress-bar{width:40%;animation:ui-progress-slide 1.4s ease-in-out infinite}
758
+ @keyframes ui-progress-slide{0%{transform:translateX(-100%)}100%{transform:translateX(250%)}}
759
+ .ui-progress-label{display:flex;justify-content:space-between;font-size:var(--ts-caption-size);color:var(--i2);margin-bottom:6px;font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
760
+ /* ── end ui-progress ── */
761
+
762
+ /* ── ui-spinner ── */
763
+ .ui-spinner{display:inline-block;flex:none;width:var(--spinner-size);height:var(--spinner-size);border-radius:50%;border:var(--spinner-width) solid var(--spinner-track);border-top-color:var(--spinner-color);animation:ui-spin var(--spinner-dur) linear infinite}
764
+ .ui-spinner--sm{width:calc(var(--spinner-size) * .7);height:calc(var(--spinner-size) * .7)}
765
+ .ui-spinner--lg{width:calc(var(--spinner-size) * 1.6);height:calc(var(--spinner-size) * 1.6)}
766
+ /* text for screen readers only */
767
+ .ui-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
768
+ /* ── end ui-spinner ── */
769
+
770
+ /* ── ui-skeleton ── */
771
+ /* a placeholder while content loads; add .ambient so Colin's Calm motion level stops the shimmer */
772
+ .ui-skeleton{display:block;height:1em;border-radius:var(--skeleton-radius);background:linear-gradient(90deg,var(--skeleton-bg) 0%,var(--skeleton-shine) 50%,var(--skeleton-bg) 100%);background-size:200% 100%;animation:ui-shimmer var(--skeleton-dur) ease-in-out infinite}
773
+ .ui-skeleton--circle{border-radius:50%}
774
+ @keyframes ui-shimmer{0%{background-position:100% 0}100%{background-position:-100% 0}}
775
+ /* ── end ui-skeleton ── */
776
+
777
+ /* ── ui-alert ── */
778
+ .ui-alert{--_tone:var(--pos);
779
+ display:grid;grid-template-columns:auto 1fr auto;gap:4px 12px;align-items:start;padding:var(--alert-pad);color:var(--i);
780
+ background:color-mix(in srgb,var(--_tone) var(--alert-tint),var(--p));border:1px solid color-mix(in srgb,var(--_tone) var(--alert-edge),var(--p));border-radius:var(--alert-radius)}
781
+ .ui-alert--ok{--_tone:var(--good)}
782
+ .ui-alert--warn{--_tone:var(--warn)}
783
+ .ui-alert--critical{--_tone:var(--neg)}
784
+ .ui-alert-icon{grid-row:span 2;width:20px;height:20px;color:var(--_tone);margin-top:1px}
785
+ .ui-alert-title{margin:0;font-size:var(--ts-small-size);font-weight:700;color:var(--i);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
786
+ .ui-alert-body{grid-column:2;margin:0;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
787
+ .ui-alert-close{grid-row:1;grid-column:3;display:grid;place-items:center;width:28px;height:28px;margin:-4px -6px 0 0;border:0;border-radius:var(--r-sm,8px);background:transparent;color:var(--i3);cursor:pointer}
788
+ .ui-alert-close:hover{background:color-mix(in srgb,var(--_tone) 14%,transparent);color:var(--i)}
789
+ .ui-alert-close:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:1px}
790
+ /* an alert written without an icon uses the full width */
791
+ .ui-alert:not(:has(.ui-alert-icon)){grid-template-columns:1fr auto}
792
+ .ui-alert:not(:has(.ui-alert-icon)) .ui-alert-body{grid-column:1}
793
+ .ui-alert:not(:has(.ui-alert-icon)) .ui-alert-close{grid-column:2}
794
+ /* ── end ui-alert ── */
795
+
796
+ /* ── ui-sidenav ── */
797
+ .ui-sidenav{display:flex;flex-direction:column;gap:6px;width:var(--sidenav-w);min-height:100%;padding:16px 12px;background:var(--sidenav-bg);border-right:1px solid var(--l)}
798
+ .ui-sidenav-brand{display:flex;align-items:center;gap:10px;padding:4px 8px 10px;font-weight:700;color:var(--i)}
799
+ .ui-sidenav-list{display:grid;gap:2px;margin:0;padding:0;list-style:none}
800
+ .ui-sidenav-link{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--sidenav-radius);font-size:var(--ts-small-size);font-weight:600;color:var(--sidenav-fg);text-decoration:none;transition:background-color var(--btn-dur) ease,color var(--btn-dur) ease;line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
801
+ .ui-sidenav-link svg{width:18px;height:18px;flex:none;color:var(--i3)}
802
+ .ui-sidenav-link:hover,.ui-sidenav-link.is-hover{background:var(--mid);color:var(--i)}
803
+ .ui-sidenav-link[aria-current="page"]{background:var(--sidenav-active-bg);color:var(--sidenav-active-fg)}
804
+ .ui-sidenav-link[aria-current="page"] svg{color:var(--sidenav-active-fg)}
805
+ .ui-sidenav-link:focus-visible,.ui-sidenav-link.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:-2px}
806
+ .ui-sidenav-link .ui-badge{margin-left:auto}
807
+ .ui-sidenav-spacer{flex:1}
808
+ .ui-sidenav-user{display:flex;align-items:center;gap:10px;margin-top:6px;padding:10px;border:1px solid var(--l);border-radius:var(--sidenav-radius);min-width:0}
809
+ .ui-sidenav-user span:last-child{display:grid;min-width:0;font-size:var(--ts-caption-size);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
810
+ .ui-sidenav-user strong{color:var(--i);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
811
+ .ui-sidenav-user small{color:var(--i3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
812
+ /* ── end ui-sidenav ── */
813
+
814
+ /* ── ui-sidebar: the app sidebar with a flyout, after the BKSTG workbench's own. Wide: it collapses to an
815
+ icon rail (the toggle at the top). Narrow (the app shell .ui-app under 720px): it slides over the page as
816
+ a drawer, opened from the bar's menu button; Escape or a tap outside closes it. Sections have a tiny
817
+ heading; a group opens in place (in the rail, opening a group widens the sidebar first). The current page
818
+ uses the button fill, so it reads as the primary color in every theme. Behavior: components.js. ── */
819
+ .ui-app{container-type:inline-size;position:relative;display:flex;min-height:100%;background:var(--s)}
820
+ .ui-app-main{display:flex;flex-direction:column;flex:1;min-width:0}
821
+ .ui-app-bar{display:none;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid var(--sidebar-border);background:var(--sidebar-bg)}
822
+ .ui-sidebar{display:flex;flex-direction:column;gap:2px;flex:none;width:var(--sidebar-w);padding:8px;overflow:hidden auto;background:var(--sidebar-bg);border-right:1px solid var(--sidebar-border);transition:width var(--sidebar-dur) var(--sidebar-ease)}
823
+ .ui-sidebar[data-state="collapsed"]{width:var(--sidebar-rail-w)}
824
+ .ui-sidebar-top{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--sidebar-item-h);padding-bottom:8px;margin-bottom:4px;border-bottom:1px solid var(--sidebar-border)}
825
+ .ui-sidebar-brand{display:flex;align-items:center;gap:8px;min-width:0;padding-left:6px;font-weight:700;color:var(--i);white-space:nowrap;overflow:hidden}
826
+ .ui-sidebar-toggle,.ui-sidebar-open{display:grid;place-items:center;flex:none;width:var(--sidebar-item-h);height:var(--sidebar-item-h);padding:0;border:0;border-radius:var(--sidebar-radius);background:transparent;color:var(--sidebar-fg);cursor:pointer}
827
+ .ui-sidebar-toggle svg,.ui-sidebar-open svg{width:18px;height:18px}
828
+ .ui-sidebar-item{display:flex;align-items:center;gap:10px;width:100%;min-height:var(--sidebar-item-h);padding:0 9px;border:0;border-radius:var(--sidebar-radius);background:transparent;color:var(--sidebar-fg);font:inherit;font-size:var(--ts-small-size);font-weight:600;line-height:1.2;text-align:left;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background-color var(--sidebar-dur) var(--sidebar-ease),color var(--sidebar-dur) var(--sidebar-ease)}
829
+ .ui-sidebar-item svg{flex:none;width:18px;height:18px}
830
+ .ui-sidebar-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
831
+ .ui-sidebar-count{margin-left:auto;font-size:var(--ts-caption-size);font-weight:600}
832
+ .ui-sidebar-chev{display:grid;margin-left:auto;transition:transform var(--sidebar-dur) var(--sidebar-ease)}
833
+ .ui-sidebar-chev svg{width:14px;height:14px}
834
+ .ui-sidebar-item[aria-expanded="true"] .ui-sidebar-chev{transform:rotate(180deg)}
835
+ .ui-sidebar-item:hover,.ui-sidebar-item.is-hover,.ui-sidebar-toggle:hover,.ui-sidebar-open:hover{background:var(--sidebar-hover-bg);color:var(--sidebar-hover-fg)}
836
+ .ui-sidebar-item[aria-current="page"]{background:var(--sidebar-current-bg);color:var(--sidebar-current-fg)}
837
+ .ui-sidebar-item:focus-visible,.ui-sidebar-item.is-focus,.ui-sidebar-toggle:focus-visible,.ui-sidebar-open:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:-2px}
838
+ .ui-sidebar-group{display:grid;gap:2px}
839
+ .ui-sidebar-group-body{display:grid;gap:2px;padding:2px 0 4px 28px}
840
+ .ui-sidebar-group-body[hidden]{display:none}
841
+ .ui-sidebar-head{margin:10px 0 2px;padding:8px 9px 0;border-top:1px solid var(--sidebar-border);color:var(--sidebar-head-fg);font-size:var(--ts-eyebrow-size);font-weight:var(--ts-eyebrow-weight);line-height:var(--ts-eyebrow-lh);letter-spacing:var(--ts-eyebrow-ls);text-transform:var(--ts-eyebrow-case);font-family:var(--ts-eyebrow-font)}
842
+ .ui-sidebar-foot{display:grid;gap:2px;margin-top:auto;padding-top:8px}
843
+ /* the rail: icons only, each still named (aria-label on the link, title for a pointer) */
844
+ .ui-sidebar[data-state="collapsed"] :is(.ui-sidebar-chev,.ui-sidebar-brand,.ui-sidebar-group-body){display:none}
845
+ .ui-sidebar[data-state="collapsed"] :is(.ui-sidebar-label,.ui-sidebar-count){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
846
+ .ui-sidebar[data-state="collapsed"] .ui-sidebar-top{justify-content:center}
847
+ .ui-sidebar[data-state="collapsed"] .ui-sidebar-item{justify-content:center;width:var(--sidebar-item-h);padding:0}
848
+ .ui-sidebar[data-state="collapsed"] .ui-sidebar-head{height:0;margin:6px 0;padding:0;overflow:hidden}
849
+ /* narrow: a drawer over the page, and the bar that opens it */
850
+ @container (max-width:720px){
851
+ .ui-app-bar{display:flex}
852
+ .ui-sidebar,.ui-sidebar[data-state="collapsed"]{position:absolute;inset:0 auto 0 0;z-index:20;width:min(var(--sidebar-w),86cqw);transform:translateX(-100%);visibility:hidden;transition:transform var(--sidebar-dur) var(--sidebar-ease),visibility 0s linear var(--sidebar-dur)}
853
+ .ui-sidebar[data-state="expanded"]{transform:none;visibility:visible;box-shadow:0 0 0 100vmax var(--sidebar-scrim);transition:transform var(--sidebar-dur) var(--sidebar-ease),visibility 0s}
854
+ }
855
+ /* ── end ui-sidebar ── */
856
+
857
+ /* ── ui-metric ── */
858
+ .ui-metric{display:grid;gap:4px;min-width:0}
859
+ .ui-metric-label{font-size:var(--ts-small-size);font-weight:500;color:var(--i2);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
860
+ .ui-metric-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px}
861
+ /* proportional figures: equal-width (tabular) digits make some faces, DM Sans among them, set the comma as wide
862
+ as a digit, so 18,880 read as "18 , 880". Tables keep tabular digits, where columns need to line up. */
863
+ .ui-metric-value{font-size:var(--metric-value-size);font-weight:var(--metric-value-weight);line-height:1.1;letter-spacing:-.02em;color:var(--i);font-variant-numeric:proportional-nums}
864
+ .ui-metric-delta{display:inline-flex;align-items:center;gap:2px;font-size:var(--ts-caption-size);font-weight:600;color:var(--good);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
865
+ .ui-metric-delta--down{color:var(--neg)}
866
+ /* the change's color says good or bad, not up or down: by default up is good; goodWhen="down" (refunds, churn,
867
+ costs) flips it. The words say both: "down 2%, better" */
868
+ .ui-metric-delta--good{color:var(--good)}.ui-metric-delta--bad{color:var(--neg)}
869
+ .ui-metric-delta svg{width:16px;height:16px}
870
+ /* ── end ui-metric ── */
871
+
872
+ /* ── ui-chart ── */
873
+ /* a line chart drawn from data by components.js (data-ui-chart) or react/LineChart.jsx */
874
+ .ui-chart{position:relative;min-width:0;container-type:inline-size}
875
+ .ui-chart svg{display:block;width:100%;height:var(--chart-h);overflow:visible}
876
+ .ui-chart-grid{stroke:var(--chart-grid);stroke-width:1}
877
+ .ui-chart-area{fill:var(--chart-line);opacity:var(--chart-area-opacity)}
878
+ .ui-chart-line{fill:none;stroke:var(--chart-line);stroke-width:var(--chart-stroke);stroke-linejoin:round;stroke-linecap:round}
879
+ .ui-chart-axis{display:flex;justify-content:space-between;margin-top:8px;font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
880
+ /* a narrow chart shows every other label, so they never run together */
881
+ @container (max-width:360px){.ui-chart-axis span:nth-child(even){visibility:hidden}}
882
+ .ui-chart-marker{position:absolute;top:0;width:1px;background:var(--i3);pointer-events:none}
883
+ .ui-chart-tip{position:absolute;padding:4px 8px;font-size:var(--ts-caption-size);font-weight:600;white-space:nowrap;color:var(--tooltip-fg);background:var(--tooltip-bg);border-radius:var(--tooltip-radius);pointer-events:none;box-shadow:var(--shadow-md);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
884
+ /* ── end ui-chart ── */
885
+
886
+ /* ── ui-table ── */
887
+ .ui-table-wrap{overflow-x:auto;border:1px solid var(--l);border-radius:var(--table-radius);background:var(--p)}
888
+ .ui-table{width:100%;border-collapse:collapse;font-size:var(--ts-small-size);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
889
+ .ui-table caption{padding:14px 16px;text-align:left;font-weight:700;color:var(--i)}
890
+ .ui-table th{padding:10px 16px;text-align:left;font-size:var(--ts-caption-size);font-weight:600;color:var(--table-head-fg);background:var(--table-head-bg);border-bottom:1px solid var(--l);white-space:nowrap;line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
891
+ .ui-table td{padding:12px 16px;color:var(--i2);border-bottom:1px solid var(--l)}
892
+ .ui-table tbody tr:last-child td{border-bottom:0}
893
+ .ui-table tbody tr{transition:background-color var(--btn-dur) ease}
894
+ .ui-table tbody tr:hover,.ui-table tbody tr.is-hover{background:var(--table-row-hover)}
895
+ .ui-table td.ui-table-strong{color:var(--i);font-weight:600}
896
+ .ui-table .ui-num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
897
+ /* ── end ui-table ── */
898
+
899
+ /* ── ui-feed ── */
900
+ .ui-feed{display:grid;gap:0;margin:0;padding:0;list-style:none}
901
+ .ui-feed-item{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:12px 0;border-bottom:1px solid var(--l)}
902
+ .ui-feed-item:last-child{border-bottom:0}
903
+ .ui-feed-item > .ui-avatar{grid-row:span 2}
904
+ .ui-feed-text{margin:0;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
905
+ .ui-feed-text strong{color:var(--i);font-weight:600}
906
+ .ui-feed-time{font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
907
+ /* ── end ui-feed ── */
908
+
909
+ /* ── ui-check ── */
910
+ /* checkbox and radio: real inputs, drawn with appearance:none, so forms, Space and labels all still work */
911
+ .ui-choices{display:grid;gap:12px;margin:0;padding:0;border:0;min-width:0}
912
+ .ui-choices > legend{padding:0;margin-bottom:10px}
913
+ .ui-check-row{display:inline-flex;align-items:flex-start;gap:10px;cursor:pointer;font-size:var(--ts-small-size);color:var(--i);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
914
+ .ui-check-text{display:grid;gap:2px;min-width:0}
915
+ .ui-check-text small{font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
916
+ .ui-check,.ui-radio{
917
+ appearance:none;flex:none;display:inline-grid;place-content:center;width:var(--check-size);height:var(--check-size);margin:calc((1.45em - var(--check-size)) / 2) 0 0;
918
+ background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--check-radius);box-shadow:var(--input-shadow);cursor:pointer;
919
+ transition:background-color var(--check-dur) var(--check-ease),border-color var(--check-dur) var(--check-ease);
920
+ }
921
+ .ui-radio{border-radius:50%}
922
+ .ui-check::before,.ui-radio::before{content:"";width:calc(var(--check-size) * .62);height:calc(var(--check-size) * .62);background:var(--check-on-fg);transform:scale(0);transition:transform var(--check-dur) var(--check-ease)}
923
+ .ui-check::before{clip-path:polygon(14% 44%,0 65%,50% 100%,100% 16%,80% 0,43% 62%)}
924
+ .ui-radio::before{width:var(--radio-dot);height:var(--radio-dot);border-radius:50%}
925
+ .ui-check:checked,.ui-check:indeterminate,.ui-radio:checked{background:var(--check-on-bg);border-color:var(--check-on-border)}
926
+ .ui-check:checked::before,.ui-radio:checked::before{transform:scale(1)}
927
+ .ui-check:indeterminate::before{clip-path:inset(38% 8% round 2px);transform:scale(1)}
928
+ .ui-check:hover,.ui-check.is-hover,.ui-radio:hover,.ui-radio.is-hover{border-color:var(--input-border-hover)}
929
+ .ui-check:checked:hover,.ui-radio:checked:hover{border-color:var(--check-on-border)}
930
+ .ui-check:focus-visible,.ui-check.is-focus,.ui-radio:focus-visible,.ui-radio.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:var(--focus-offset)}
931
+ .ui-check:disabled,.ui-check.is-disabled,.ui-radio:disabled,.ui-radio.is-disabled{opacity:var(--disabled-opacity);cursor:not-allowed}
932
+ .ui-check-row:has(:disabled){cursor:not-allowed;color:var(--i3)}
933
+ /* ── end ui-check ── */
934
+
935
+ /* ── ui-btngroup ── */
936
+ /* a row of joined buttons. Toggle buttons carry aria-pressed; with data-ui-single, components.js keeps one pressed */
937
+ .ui-btngroup{display:inline-flex;max-width:100%;overflow-x:auto;scrollbar-width:none;background:var(--btn-secondary-bg);border:1px solid var(--btngroup-border);border-radius:var(--btn-radius);box-shadow:var(--btn-shadow)}
938
+ .ui-btngroup-item{
939
+ display:inline-flex;align-items:center;gap:8px;flex:none;height:calc(var(--btn-h) - 2px);padding:0 calc(var(--btn-pad-x) - 2px);
940
+ font:inherit;font-size:var(--btn-font-size);font-weight:var(--btn-font-weight);line-height:1;white-space:nowrap;color:var(--btngroup-fg);
941
+ background:transparent;border:0;border-left:1px solid var(--btngroup-border);cursor:pointer;
942
+ transition:background-color var(--btn-dur) var(--btn-ease),color var(--btn-dur) var(--btn-ease);
943
+ }
944
+ .ui-btngroup-item:first-child{border-left:0}
945
+ .ui-btngroup-item svg{width:16px;height:16px;flex:none}
946
+ .ui-btngroup-item:hover,.ui-btngroup-item.is-hover{background:var(--btn-secondary-bg-hover);color:var(--i)}
947
+ .ui-btngroup-item[aria-pressed="true"]{background:var(--btngroup-active-bg);color:var(--btngroup-active-fg)}
948
+ .ui-btngroup-item:focus-visible,.ui-btngroup-item.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:calc(-1 * var(--focus-width));position:relative}
949
+ .ui-btngroup-item:disabled,.ui-btngroup-item.is-disabled{opacity:var(--disabled-opacity);cursor:not-allowed}
950
+ /* ── end ui-btngroup ── */
951
+
952
+ /* ── ui-menu ── */
953
+ /* a dropdown menu. components.js opens it from a button with aria-haspopup="menu", moves focus with the arrow
954
+ keys, Home and End, closes on Escape, Tab or a click outside, and returns focus to the button */
955
+ .ui-menu-wrap{position:relative;display:inline-flex}
956
+ .ui-menu-trigger svg:last-child{transition:transform var(--menu-dur) ease}
957
+ .ui-menu-trigger[aria-expanded="true"] svg:last-child{transform:rotate(180deg)}
958
+ .ui-menu{
959
+ position:absolute;z-index:60;top:calc(100% + 6px);left:0;display:grid;width:max-content;min-width:max(100%,var(--menu-w));max-width:min(320px,calc(100vw - 32px));
960
+ padding:var(--menu-pad);color:var(--i);background:var(--p);border:1px solid var(--l);border-radius:var(--menu-radius);box-shadow:var(--menu-shadow);
961
+ transition:opacity var(--menu-dur) ease,transform var(--menu-dur) ease;
962
+ }
963
+ @starting-style{.ui-menu{opacity:0;transform:translateY(-4px)}}
964
+ .ui-menu-wrap[data-align="end"] .ui-menu{left:auto;right:0}
965
+ .ui-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:var(--menu-item-pad);font-size:var(--ts-small-size);text-align:left;text-decoration:none;color:var(--i);background:transparent;border:0;border-radius:var(--menu-item-radius);cursor:pointer;font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
966
+ .ui-menu-item svg{width:16px;height:16px;flex:none;color:var(--i3)}
967
+ .ui-menu-item:hover,.ui-menu-item:focus,.ui-menu-item.is-hover{background:var(--menu-item-hover);outline:none}
968
+ .ui-menu-item:focus-visible,.ui-menu-item.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:calc(-1 * var(--focus-width))}
969
+ .ui-menu-item[aria-disabled="true"]{opacity:var(--disabled-opacity);cursor:not-allowed}
970
+ .ui-menu-item--danger,.ui-menu-item--danger svg{color:var(--menu-danger-fg)}
971
+ .ui-menu-hint{margin-left:auto;padding-left:16px;font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
972
+ .ui-menu-label{padding:6px 8px 4px;font-size:var(--ts-caption-size);font-weight:600;color:var(--i3);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
973
+ .ui-menu-sep{height:1px;margin:4px calc(-1 * var(--menu-pad));background:var(--l)}
974
+ /* ── end ui-menu ── */
975
+
976
+ /* ── ui-slider ── */
977
+ /* a native range input. The filled part of the track reads --value, which components.js (or React) sets */
978
+ .ui-slider-head{display:flex;justify-content:space-between;gap:12px;margin-bottom:8px;font-size:var(--ts-small-size);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
979
+ .ui-slider-head output{color:var(--i2);font-variant-numeric:tabular-nums}
980
+ .ui-slider{
981
+ --_track:linear-gradient(to right,var(--slider-fill) var(--value,50%),var(--slider-track) var(--value,50%));
982
+ appearance:none;display:block;width:100%;height:max(var(--slider-thumb),24px);margin:0;background:transparent;cursor:pointer;
983
+ }
984
+ .ui-slider::-webkit-slider-runnable-track{height:var(--slider-h);border-radius:999px;background:var(--_track)}
985
+ .ui-slider::-moz-range-track{height:var(--slider-h);border-radius:999px;background:var(--_track)}
986
+ .ui-slider::-webkit-slider-thumb{
987
+ appearance:none;width:var(--slider-thumb);height:var(--slider-thumb);margin-top:calc((var(--slider-h) - var(--slider-thumb)) / 2);
988
+ background:var(--slider-thumb-bg);border:var(--slider-thumb-border) solid var(--slider-fill);border-radius:50%;box-shadow:var(--slider-thumb-shadow);
989
+ transition:transform var(--btn-dur) ease;
990
+ }
991
+ .ui-slider::-moz-range-thumb{box-sizing:border-box;width:var(--slider-thumb);height:var(--slider-thumb);background:var(--slider-thumb-bg);border:var(--slider-thumb-border) solid var(--slider-fill);border-radius:50%;box-shadow:var(--slider-thumb-shadow)}
992
+ .ui-slider:active::-webkit-slider-thumb{transform:scale(1.1)}
993
+ .ui-slider:focus-visible{outline:none}
994
+ .ui-slider:focus-visible::-webkit-slider-thumb{outline:var(--focus-width) solid var(--focus-color);outline-offset:var(--focus-offset)}
995
+ .ui-slider:focus-visible::-moz-range-thumb{outline:var(--focus-width) solid var(--focus-color);outline-offset:var(--focus-offset)}
996
+ .ui-slider.is-focus::-webkit-slider-thumb{outline:var(--focus-width) solid var(--focus-color);outline-offset:var(--focus-offset)}
997
+ .ui-slider:disabled,.ui-slider.is-disabled{opacity:var(--disabled-opacity);cursor:not-allowed}
998
+ .ui-slider-scale{display:flex;justify-content:space-between;margin-top:4px;font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
999
+ /* ── end ui-slider ── */
1000
+
1001
+ /* ── ui-editor ── */
1002
+ /* a rich text field: a toolbar (role="toolbar", arrow keys move between tools) over an editable area.
1003
+ components.js runs the tools with the browser's editing commands. Clean the HTML on the server before storing it. */
1004
+ .ui-editor{display:grid;min-width:0;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);box-shadow:var(--input-shadow);overflow:hidden;transition:border-color var(--input-dur) ease,box-shadow var(--input-dur) ease}
1005
+ .ui-editor:hover{border-color:var(--input-border-hover)}
1006
+ .ui-editor:focus-within{border-color:var(--focus-color);box-shadow:var(--input-shadow),0 0 0 var(--input-ring-width) var(--input-ring)}
1007
+ .ui-editor-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px;background:var(--editor-toolbar-bg);border-bottom:1px solid var(--l)}
1008
+ .ui-editor-tool{display:grid;place-items:center;width:32px;height:32px;padding:0;border:0;border-radius:var(--r-sm,6px);background:transparent;color:var(--i2);cursor:pointer;transition:background-color var(--btn-dur) ease,color var(--btn-dur) ease}
1009
+ .ui-editor-tool svg{width:16px;height:16px}
1010
+ .ui-editor-tool:hover,.ui-editor-tool.is-hover{background:var(--mid);color:var(--i)}
1011
+ .ui-editor-tool[aria-pressed="true"]{background:var(--editor-tool-on);color:var(--i)}
1012
+ .ui-editor-tool:focus-visible,.ui-editor-tool.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:-2px}
1013
+ .ui-editor-sep{width:1px;height:20px;margin:0 4px;background:var(--l)}
1014
+ .ui-editor-area{min-height:var(--editor-min-h);padding:12px var(--input-pad-x);font-size:var(--ts-body-size);line-height:1.6;color:var(--i);outline:none;overflow-wrap:anywhere;font-weight:var(--ts-body-weight);letter-spacing:var(--ts-body-ls);text-transform:var(--ts-body-case);font-family:var(--ts-body-font)}
1015
+ .ui-editor-area:empty::before{content:attr(data-placeholder);color:var(--i3)}
1016
+ .ui-editor-area > :first-child{margin-top:0}
1017
+ .ui-editor-area p{margin:0 0 .6em}
1018
+ .ui-editor-area ul,.ui-editor-area ol{margin:0 0 .6em;padding-left:1.4em}
1019
+ .ui-editor-area blockquote{margin:0 0 .6em;padding-left:12px;border-left:3px solid var(--l);color:var(--i2)}
1020
+ .ui-editor-foot{display:flex;justify-content:space-between;gap:12px;padding:6px var(--input-pad-x);font-size:var(--ts-caption-size);color:var(--i3);border-top:1px solid var(--l);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1021
+ /* ── end ui-editor ── */
1022
+
1023
+ /* ── ui-video ── */
1024
+ /* a <video> with its own controls, wired by components.js ([data-ui-video]). The controls sit on a dark scrim in
1025
+ every theme, because they sit on the picture, not on the page */
1026
+ .ui-video{position:relative;overflow:hidden;min-width:0;background:var(--video-bg);border-radius:var(--video-radius);color:var(--video-fg)}
1027
+ .ui-video video{display:block;width:100%;height:auto;aspect-ratio:16 / 9;object-fit:cover}
1028
+ .ui-video-big{position:absolute;inset:0;margin:auto;display:grid;place-items:center;width:64px;height:64px;padding:0;border:0;border-radius:50%;color:var(--video-fg);background:var(--video-scrim);cursor:pointer;transition:opacity var(--btn-dur) ease,transform var(--btn-dur) ease}
1029
+ .ui-video-big svg{width:28px;height:28px;margin-left:3px}
1030
+ .ui-video-big:hover{transform:scale(1.06)}
1031
+ .ui-video[data-playing] .ui-video-big{opacity:0;pointer-events:none}
1032
+ .ui-video-bar{position:absolute;left:0;right:0;bottom:0;display:flex;align-items:center;gap:6px;padding:24px 10px 8px;background:linear-gradient(transparent,var(--video-scrim));transition:opacity .25s ease}
1033
+ .ui-video[data-playing][data-idle] .ui-video-bar{opacity:0}
1034
+ .ui-video-btn{display:grid;place-items:center;flex:none;width:32px;height:32px;padding:0;border:0;border-radius:var(--r-sm,6px);background:transparent;color:inherit;cursor:pointer}
1035
+ .ui-video-btn svg{width:18px;height:18px}
1036
+ .ui-video-btn:hover{background:color-mix(in srgb,var(--video-fg) 18%,transparent)}
1037
+ .ui-video-big:focus-visible,.ui-video-btn:focus-visible{outline:2px solid var(--video-fg);outline-offset:1px}
1038
+ .ui-video-time{flex:none;font-size:var(--ts-caption-size);font-variant-numeric:tabular-nums;font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1039
+ .ui-video .ui-slider{--slider-track:color-mix(in srgb,var(--video-fg) 35%,transparent);--slider-fill:var(--video-fg);--slider-thumb-bg:var(--video-fg);--slider-thumb:14px;--slider-h:4px;flex:1;min-width:40px}
1040
+ .ui-video .ui-slider:focus-visible::-webkit-slider-thumb{outline-color:var(--video-fg)}
1041
+ .ui-video .ui-slider:focus-visible::-moz-range-thumb{outline-color:var(--video-fg)}
1042
+ /* ── end ui-video ── */
1043
+
1044
+ /* ── ui-breadcrumb ── */
1045
+ /* nav[aria-label] > ol: each step a link, the last one the current page (aria-current, not a link) */
1046
+ .ui-breadcrumb ol{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin:0;padding:0;list-style:none;font-size:var(--ts-caption-size);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1047
+ .ui-breadcrumb li{display:inline-flex;align-items:center;gap:6px;min-width:0;color:var(--i3)}
1048
+ .ui-breadcrumb li + li::before{content:"";width:6px;height:6px;border-right:1.5px solid var(--i3);border-top:1.5px solid var(--i3);transform:rotate(45deg);opacity:.8}
1049
+ .ui-breadcrumb a{color:var(--i2);text-decoration:none;border-radius:4px;transition:color var(--btn-dur) ease}
1050
+ .ui-breadcrumb a:hover,.ui-breadcrumb a.is-hover{color:var(--i);text-decoration:underline;text-underline-offset:3px}
1051
+ .ui-breadcrumb a:focus-visible,.ui-breadcrumb a.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:2px}
1052
+ .ui-breadcrumb [aria-current="page"]{color:var(--i);font-weight:600}
1053
+ .ui-breadcrumb svg{width:15px;height:15px;flex:none}
1054
+ /* ── end ui-breadcrumb ── */
1055
+
1056
+ /* ── ui-cardhead ── */
1057
+ .ui-cardhead{display:flex;flex-wrap:wrap;align-items:flex-start;gap:10px 16px;padding:16px 18px;border-bottom:1px solid var(--l)}
1058
+ .ui-cardhead-text{flex:1 1 200px;min-width:0}
1059
+ .ui-cardhead-title{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0;font-size:var(--ts-h3-size);color:var(--i);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1060
+ .ui-cardhead-desc{margin:4px 0 0;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1061
+ .ui-cardhead-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
1062
+ /* ── end ui-cardhead ── */
1063
+
1064
+ /* ── ui-divider ── */
1065
+ /* a rule, or a rule with a word or a button in the middle */
1066
+ .ui-divider{display:flex;align-items:center;gap:12px;margin:0;border:0;font-size:var(--ts-caption-size);font-weight:500;color:var(--i3);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1067
+ .ui-divider::before,.ui-divider::after{content:"";flex:1;height:1px;background:var(--l)}
1068
+ hr.ui-divider{display:block;height:1px;background:var(--l)}
1069
+ hr.ui-divider::before,hr.ui-divider::after{content:none}
1070
+ .ui-divider--start::before{flex:0 0 16px}
1071
+ /* ── end ui-divider ── */
1072
+
1073
+ /* ── ui-empty ── */
1074
+ .ui-empty{display:grid;justify-items:center;gap:6px;padding:var(--empty-pad);text-align:center}
1075
+ .ui-empty-icon{display:grid;place-items:center;width:48px;height:48px;margin-bottom:8px;border-radius:var(--r-md,10px);color:var(--i2);background:var(--empty-icon-bg);box-shadow:0 0 0 8px color-mix(in srgb,var(--empty-icon-bg) 45%,transparent)}
1076
+ .ui-empty-icon svg{width:22px;height:22px}
1077
+ .ui-empty-title{margin:0;font-size:var(--ts-h3-size);color:var(--i);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1078
+ .ui-empty-text{max-width:360px;margin:0;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1079
+ .ui-empty-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:12px}
1080
+ /* ── end ui-empty ── */
1081
+
1082
+ /* ── ui-cta ── */
1083
+ /* an inline call to action: a short pitch and its buttons, set off from the content around it */
1084
+ .ui-cta{display:flex;flex-wrap:wrap;align-items:center;gap:12px 20px;padding:18px 20px;color:var(--i);background:var(--cta-bg);border:1px solid var(--cta-border);border-radius:var(--r-lg,13px)}
1085
+ .ui-cta-text{flex:1 1 240px;min-width:0}
1086
+ .ui-cta-title{margin:0;font-size:var(--ts-h3-size);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1087
+ .ui-cta-body{margin:4px 0 0;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1088
+ .ui-cta-actions{display:flex;flex-wrap:wrap;gap:8px}
1089
+ .ui-cta--fill{background:var(--fill);border-color:var(--fill);color:var(--on-fill)}
1090
+ .ui-cta--fill .ui-cta-body{color:var(--on-fill);opacity:.85}
1091
+ /* ── end ui-cta ── */
1092
+
1093
+ /* ── ui-pagehead ── */
1094
+ .ui-pagehead{display:grid;gap:14px;padding-bottom:18px;border-bottom:1px solid var(--l)}
1095
+ .ui-pagehead-row{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:12px 20px}
1096
+ .ui-pagehead-text{flex:1 1 260px;min-width:0}
1097
+ .ui-pagehead-title{margin:0;font-size:var(--pagehead-title-size);color:var(--i);font-weight:var(--ts-h2-weight);line-height:var(--ts-h2-lh);letter-spacing:var(--ts-h2-ls);text-transform:var(--ts-h2-case);font-family:var(--ts-h2-font)}
1098
+ .ui-pagehead-desc{margin:6px 0 0;font-size:var(--ts-body-size);color:var(--i2);font-weight:var(--ts-body-weight);line-height:var(--ts-body-lh);letter-spacing:var(--ts-body-ls);text-transform:var(--ts-body-case);font-family:var(--ts-body-font)}
1099
+ .ui-pagehead-actions{display:flex;flex-wrap:wrap;gap:8px}
1100
+ /* ── end ui-pagehead ── */
1101
+
1102
+ /* ── ui-pagination ── */
1103
+ /* numbered pages with Previous and Next; in a narrow container the numbers give way to "Page 2 of 10" */
1104
+ .ui-pagination{display:flex;align-items:center;gap:8px;container-type:inline-size;min-width:0}
1105
+ .ui-pagination-pages{display:flex;flex:1;justify-content:center;gap:2px;margin:0;padding:0;list-style:none}
1106
+ .ui-page{display:grid;place-items:center;min-width:36px;height:36px;padding:0 8px;font-size:var(--ts-small-size);font-weight:600;color:var(--i2);background:transparent;border:0;border-radius:var(--r-sm,8px);cursor:pointer;text-decoration:none;line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1107
+ .ui-page:hover,.ui-page.is-hover{background:var(--mid);color:var(--i)}
1108
+ .ui-page[aria-current="page"]{background:var(--pagination-current-bg);color:var(--i)}
1109
+ .ui-page:focus-visible,.ui-page.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:-2px}
1110
+ .ui-page-gap{display:grid;place-items:center;min-width:28px;color:var(--i3)}
1111
+ .ui-pagination-info{display:none;flex:1;text-align:center;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1112
+ @container (max-width:460px){.ui-pagination-pages{display:none}.ui-pagination-info{display:block}}
1113
+ /* ── end ui-pagination ── */
1114
+
1115
+ /* ── ui-steps ── */
1116
+ /* ol.ui-steps > li.ui-step[data-state=complete|current|upcoming]; the current step also carries aria-current="step" */
1117
+ .ui-steps{display:flex;gap:0;margin:0;padding:0;list-style:none;counter-reset:ui-step}
1118
+ .ui-step{position:relative;flex:1;display:grid;justify-items:center;gap:4px;min-width:0;padding:0 6px;text-align:center;counter-increment:ui-step}
1119
+ .ui-step::before{content:"";position:absolute;top:calc(var(--steps-marker) / 2);left:calc(-50% + var(--steps-marker) / 2 + 6px);right:calc(50% + var(--steps-marker) / 2 + 6px);height:2px;background:var(--l);border-radius:2px}
1120
+ .ui-step:first-child::before{content:none}
1121
+ .ui-step[data-state="complete"]::before,.ui-step[data-state="current"]::before{background:var(--steps-current)}
1122
+ .ui-step-marker{display:grid;place-items:center;width:var(--steps-marker);height:var(--steps-marker);border-radius:50%;font-size:var(--ts-caption-size);font-weight:700;color:var(--i3);background:var(--p);border:2px solid var(--l);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1123
+ .ui-step-marker::before{content:counter(ui-step)}
1124
+ .ui-step[data-state="current"] .ui-step-marker{color:var(--i);border-color:var(--steps-current);box-shadow:0 0 0 4px color-mix(in srgb,var(--steps-current) 22%,transparent)}
1125
+ .ui-step[data-state="complete"] .ui-step-marker{color:var(--steps-done-fg);background:var(--steps-done-bg);border-color:var(--steps-done-bg)}
1126
+ .ui-step[data-state="complete"] .ui-step-marker::before{content:"";width:9px;height:5px;border-left:2px solid currentColor;border-bottom:2px solid currentColor;transform:translateY(-1px) rotate(-45deg)}
1127
+ .ui-step-label{font-size:var(--ts-small-size);font-weight:600;color:var(--i);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1128
+ .ui-step[data-state="upcoming"] .ui-step-label{color:var(--i2)}
1129
+ .ui-step-desc{font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1130
+ .ui-steps--vertical{flex-direction:column;gap:18px}
1131
+ .ui-steps--vertical .ui-step{grid-template-columns:auto 1fr;justify-items:start;text-align:left;column-gap:12px;padding:0}
1132
+ .ui-steps--vertical .ui-step-marker{grid-row:span 2}
1133
+ .ui-steps--vertical .ui-step::before{top:auto;bottom:calc(100% + 2px);left:calc(var(--steps-marker) / 2 - 1px);right:auto;width:2px;height:16px}
1134
+ /* ── end ui-steps ── */
1135
+
1136
+ /* ── ui-sectionhead ── */
1137
+ .ui-sectionhead{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:10px 18px;padding-bottom:14px;margin-bottom:16px;border-bottom:1px solid var(--l)}
1138
+ .ui-sectionhead-text{flex:1 1 220px;min-width:0}
1139
+ .ui-sectionhead-title{margin:0;font-size:var(--ts-h3-size);color:var(--i);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1140
+ .ui-sectionhead-desc{margin:4px 0 0;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1141
+ .ui-sectionhead-actions{display:flex;flex-wrap:wrap;gap:8px}
1142
+ /* ── end ui-sectionhead ── */
1143
+
1144
+ /* ── ui-sectionfoot ── */
1145
+ .ui-sectionfoot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 16px;padding-top:16px;margin-top:20px;border-top:1px solid var(--l)}
1146
+ .ui-sectionfoot-note{margin:0;font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1147
+ .ui-sectionfoot-actions{display:flex;flex-wrap:wrap;gap:8px;margin-left:auto}
1148
+ /* ── end ui-sectionfoot ── */
1149
+
1150
+ /* ── ui-calendar ── */
1151
+ /* a month as a grid (role="grid"): arrow keys move a day, Page Up/Down a month, Home/End the week; components.js */
1152
+ .ui-calendar{display:grid;gap:8px;width:max-content;max-width:100%;padding:12px;background:var(--p);border:1px solid var(--l);border-radius:var(--r-lg,13px)}
1153
+ .ui-calendar-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
1154
+ .ui-calendar-title{margin:0;font-size:var(--ts-body-size);font-weight:700;color:var(--i);line-height:var(--ts-body-lh);letter-spacing:var(--ts-body-ls);text-transform:var(--ts-body-case);font-family:var(--ts-body-font)}
1155
+ .ui-calendar table{border-collapse:collapse}
1156
+ .ui-calendar th{width:var(--cal-cell);height:28px;font-size:var(--ts-caption-size);font-weight:600;color:var(--i3);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1157
+ .ui-calendar td{padding:1px;text-align:center}
1158
+ .ui-day{position:relative;display:grid;place-items:center;width:var(--cal-cell);height:var(--cal-cell);padding:0;font-size:var(--ts-small-size);color:var(--i);background:transparent;border:0;border-radius:var(--cal-radius);cursor:pointer;font-variant-numeric:tabular-nums;font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1159
+ .ui-day:hover,.ui-day.is-hover{background:var(--mid)}
1160
+ .ui-day[data-outside]{color:var(--i3)}
1161
+ .ui-day[aria-current="date"]{box-shadow:inset 0 0 0 2px var(--cal-today)}
1162
+ .ui-day[aria-selected="true"]{color:var(--cal-selected-fg);background:var(--cal-selected-bg)}
1163
+ .ui-day[data-event]::after{content:"";position:absolute;bottom:4px;left:50%;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:currentColor}
1164
+ .ui-day:focus-visible,.ui-day.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:1px;z-index:1}
1165
+ .ui-day:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}
1166
+ /* ── end ui-calendar ── */
1167
+
1168
+ /* ── ui-datepicker ── */
1169
+ /* a button that shows the chosen date and opens a calendar under it; Escape or a choice closes it */
1170
+ .ui-datepicker{position:relative;display:inline-block;min-width:0}
1171
+ .ui-datepicker-btn{display:flex;align-items:center;gap:8px;width:100%;min-width:200px;text-align:left;cursor:pointer}
1172
+ .ui-datepicker-btn svg{width:16px;height:16px;flex:none;color:var(--i3)}
1173
+ .ui-datepicker-btn[data-empty]{color:var(--i3)}
1174
+ .ui-datepicker-pop{position:absolute;z-index:60;top:calc(100% + 6px);left:0;box-shadow:var(--menu-shadow)}
1175
+ .ui-datepicker[data-align="end"] .ui-datepicker-pop{left:auto;right:0}
1176
+ .ui-datepicker-pop .ui-calendar{box-shadow:none}
1177
+ /* ── end ui-datepicker ── */
1178
+
1179
+ /* ── ui-code ── */
1180
+ .ui-code{margin:0;min-width:0;overflow:hidden;background:var(--code-bg);border:1px solid var(--l);border-radius:var(--r-md,10px)}
1181
+ .ui-code-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px 6px 14px;border-bottom:1px solid var(--l)}
1182
+ .ui-code-lang{color:var(--i2);font-size:var(--ts-eyebrow-size);font-weight:var(--ts-eyebrow-weight);line-height:var(--ts-eyebrow-lh);letter-spacing:var(--ts-eyebrow-ls);text-transform:var(--ts-eyebrow-case);font-family:var(--ts-eyebrow-font)}
1183
+ .ui-code pre{margin:0;padding:14px;overflow-x:auto;font:.84rem/1.6 ui-monospace,"DM Mono",SFMono-Regular,Menlo,Consolas,monospace;color:var(--code-fg);tab-size:2}
1184
+ .ui-code .ui-code-muted{color:var(--i2)}
1185
+ /* ── end ui-code ── */
1186
+
1187
+ /* ── ui-colorpick ── */
1188
+ .ui-colorpick{display:grid;gap:10px;min-width:0}
1189
+ .ui-swatches{display:flex;flex-wrap:wrap;gap:8px}
1190
+ .ui-swatch{width:28px;height:28px;padding:0;border:2px solid var(--p);border-radius:50%;box-shadow:0 0 0 1px var(--input-border);cursor:pointer}
1191
+ .ui-swatch[aria-checked="true"]{box-shadow:0 0 0 2px var(--i)}
1192
+ .ui-swatch:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:3px}
1193
+ .ui-colorpick-row{display:flex;align-items:center;gap:8px}
1194
+ .ui-colorpick-row input[type="color"]{flex:none;width:40px;height:var(--input-h);padding:3px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);cursor:pointer}
1195
+ .ui-colorpick-row .ui-input{flex:1;min-width:0;font-family:ui-monospace,"DM Mono",SFMono-Regular,Menlo,monospace;text-transform:uppercase}
1196
+ /* ── end ui-colorpick ── */
1197
+
1198
+ /* ── ui-command ── */
1199
+ /* a command menu in a dialog: type to filter, arrows to move, Enter to run (a combobox over a listbox) */
1200
+ .ui-command{width:min(var(--command-w),calc(100vw - 32px))}
1201
+ .ui-command-search{display:flex;align-items:center;gap:10px;padding:4px 14px;border-bottom:1px solid var(--l)}
1202
+ .ui-command-search svg{width:18px;height:18px;flex:none;color:var(--i3)}
1203
+ .ui-command-search input{flex:1;min-width:0;height:48px;font-size:var(--ts-body-size);color:var(--i);background:transparent;border:0;outline:none;font-weight:var(--ts-body-weight);line-height:var(--ts-body-lh);letter-spacing:var(--ts-body-ls);text-transform:var(--ts-body-case);font-family:var(--ts-body-font)}
1204
+ .ui-command-search input::placeholder{color:var(--i3)}
1205
+ .ui-command-list{max-height:min(360px,60dvh);overflow-y:auto;padding:6px}
1206
+ .ui-command-group{padding:8px 8px 4px;font-size:var(--ts-caption-size);font-weight:600;color:var(--i3);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1207
+ .ui-command-item{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--menu-item-radius);font-size:var(--ts-small-size);color:var(--i);cursor:pointer;font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1208
+ .ui-command-item svg{width:16px;height:16px;flex:none;color:var(--i3)}
1209
+ .ui-command-item[aria-selected="true"]{background:var(--menu-item-hover)}
1210
+ .ui-command-item kbd{margin-left:auto;font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1211
+ .ui-command-empty{padding:24px;text-align:center;font-size:var(--ts-small-size);color:var(--i3);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1212
+ .ui-command-foot{display:flex;gap:14px;padding:8px 14px;font-size:var(--ts-caption-size);color:var(--i3);border-top:1px solid var(--l);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1213
+ .ui-kbd{display:inline-grid;place-items:center;min-width:20px;height:20px;padding:0 5px;font:600 .72rem/1 inherit;color:var(--i2);background:var(--mid);border:1px solid var(--l);border-radius:5px}
1214
+ /* ── end ui-command ── */
1215
+
1216
+ /* ── ui-dropzone ── */
1217
+ /* a label around a file input: click or drop; the chosen files list under it (components.js reads them, never uploads) */
1218
+ .ui-dropzone{position:relative;display:grid;justify-items:center;gap:6px;padding:24px 16px;text-align:center;color:var(--i2);background:var(--input-bg);border:1.5px dashed var(--dropzone-border);border-radius:var(--r-lg,13px);cursor:pointer;transition:border-color var(--input-dur) ease,background-color var(--input-dur) ease}
1219
+ .ui-dropzone input{position:absolute;width:1px;height:1px;opacity:0}
1220
+ .ui-dropzone:hover,.ui-dropzone.is-drag,.ui-dropzone.is-hover{border-color:var(--dropzone-active);background:color-mix(in srgb,var(--dropzone-active) 6%,var(--input-bg))}
1221
+ .ui-dropzone:focus-within,.ui-dropzone.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:2px}
1222
+ .ui-dropzone-icon{display:grid;place-items:center;width:40px;height:40px;border-radius:var(--r-md,10px);background:var(--mid);color:var(--i2)}
1223
+ .ui-dropzone-icon svg{width:20px;height:20px}
1224
+ .ui-dropzone strong{color:var(--i)}
1225
+ .ui-dropzone small{font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1226
+ .ui-files{display:grid;gap:8px;margin:10px 0 0;padding:0;list-style:none}
1227
+ .ui-file{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:4px 12px;padding:10px 12px;border:1px solid var(--l);border-radius:var(--r-md,10px);background:var(--p)}
1228
+ .ui-file > svg{grid-row:span 2;width:20px;height:20px;color:var(--i3)}
1229
+ .ui-file-name{min-width:0;overflow:hidden;font-size:var(--ts-small-size);font-weight:600;color:var(--i);white-space:nowrap;text-overflow:ellipsis;line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1230
+ .ui-file-size{grid-column:2;font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1231
+ .ui-file .ui-tag-remove{grid-row:1 / span 2;grid-column:3}
1232
+ /* ── end ui-dropzone ── */
1233
+
1234
+ /* ── ui-filters ── */
1235
+ /* a filter bar: search, chips that toggle (aria-pressed), and the active filters as removable tags */
1236
+ .ui-filters{display:grid;gap:10px;min-width:0}
1237
+ .ui-filters-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
1238
+ .ui-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;font-size:var(--ts-caption-size);font-weight:600;color:var(--i2);background:var(--p);border:1px solid var(--input-border);border-radius:999px;cursor:pointer;transition:background-color var(--btn-dur) ease,color var(--btn-dur) ease;line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1239
+ .ui-chip:hover,.ui-chip.is-hover{color:var(--i);background:var(--mid)}
1240
+ .ui-chip[aria-pressed="true"]{color:var(--chip-on-fg);background:var(--chip-on-bg);border-color:var(--chip-on-bg)}
1241
+ .ui-chip:focus-visible,.ui-chip.is-focus{outline:var(--focus-width) solid var(--focus-color);outline-offset:2px}
1242
+ .ui-chip svg{width:14px;height:14px}
1243
+ /* ── end ui-filters ── */
1244
+
1245
+ /* ── ui-chat ── */
1246
+ /* messages (role="log", read out as they arrive) and a composer; Enter sends, Shift+Enter adds a line */
1247
+ .ui-chat{display:grid;grid-template-rows:1fr auto;min-width:0;max-height:var(--chat-h);background:var(--p);border:1px solid var(--l);border-radius:var(--r-lg,13px);overflow:hidden}
1248
+ .ui-chat-log{display:grid;align-content:start;gap:12px;padding:16px;overflow-y:auto}
1249
+ .ui-msg{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 10px;max-width:80%}
1250
+ .ui-msg > .ui-avatar{grid-row:span 2;align-self:end}
1251
+ .ui-msg-bubble{padding:9px 13px;font-size:var(--ts-small-size);line-height:1.45;color:var(--chat-in-fg);background:var(--chat-in-bg);border-radius:var(--chat-radius) var(--chat-radius) var(--chat-radius) 4px;overflow-wrap:anywhere;font-weight:var(--ts-small-weight);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1252
+ .ui-msg-meta{font-size:var(--ts-caption-size);color:var(--i3);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1253
+ .ui-msg--out{justify-self:end;grid-template-columns:minmax(0,1fr)}
1254
+ .ui-msg--out .ui-msg-bubble{color:var(--chat-out-fg);background:var(--chat-out-bg);border-radius:var(--chat-radius) var(--chat-radius) 4px var(--chat-radius)}
1255
+ .ui-msg--out .ui-msg-meta{justify-self:end}
1256
+ .ui-chat-compose{display:flex;align-items:flex-end;gap:8px;padding:10px;border-top:1px solid var(--l)}
1257
+ .ui-chat-compose textarea.ui-input{min-height:40px;height:40px;max-height:120px;padding-top:9px;resize:none}
1258
+ /* ── end ui-chat ── */
1259
+
1260
+ /* ── ui-sheet ── */
1261
+ /* a slide-out panel: a <dialog> on the right edge, opened like a dialog ([data-ui-open]), Escape and the backdrop close it */
1262
+ .ui-sheet{position:fixed;inset:0 0 0 auto;width:min(var(--sheet-w),100vw);max-width:100vw;height:100dvh;max-height:100dvh;margin:0;padding:0;display:flex;flex-direction:column;color:var(--i);background:var(--p);border:0;border-left:1px solid var(--l);box-shadow:var(--dialog-shadow);
1263
+ transform:translateX(100%);transition:transform var(--dialog-dur) var(--dialog-ease),overlay var(--dialog-dur) allow-discrete,display var(--dialog-dur) allow-discrete}
1264
+ .ui-sheet:not([open]){display:none}
1265
+ .ui-sheet[open]{transform:none}
1266
+ @starting-style{.ui-sheet[open]{transform:translateX(100%)}}
1267
+ .ui-sheet::backdrop{background:var(--dialog-backdrop);opacity:0;transition:opacity var(--dialog-dur) ease,overlay var(--dialog-dur) allow-discrete,display var(--dialog-dur) allow-discrete}
1268
+ .ui-sheet[open]::backdrop{opacity:1}
1269
+ @starting-style{.ui-sheet[open]::backdrop{opacity:0}}
1270
+ .ui-sheet-head{display:flex;align-items:flex-start;gap:12px;padding:18px 20px;border-bottom:1px solid var(--l)}
1271
+ .ui-sheet-title{flex:1;margin:0;font-size:var(--ts-h3-size);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1272
+ .ui-sheet-body{flex:1;overflow-y:auto;padding:18px 20px;color:var(--i2)}
1273
+ .ui-sheet-foot{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px;padding:14px 20px;border-top:1px solid var(--l)}
1274
+ /* ── end ui-sheet ── */
1275
+
1276
+ /* ── ui-tree ── */
1277
+ /* a tree (role="tree"): Up and Down move, Right opens or steps in, Left closes or steps out, Enter selects */
1278
+ .ui-tree,.ui-tree ul{margin:0;padding:0;list-style:none}
1279
+ .ui-tree ul{padding-left:18px}
1280
+ .ui-tree [role="treeitem"]{outline:none}
1281
+ .ui-tree-row{display:flex;align-items:center;gap:6px;min-height:32px;padding:0 8px;border-radius:var(--r-sm,8px);font-size:var(--ts-small-size);color:var(--i);cursor:pointer;font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1282
+ .ui-tree-row:hover{background:var(--mid)}
1283
+ .ui-tree-row svg{width:16px;height:16px;flex:none;color:var(--i3)}
1284
+ .ui-tree-caret{display:grid;place-items:center;width:16px;height:16px;flex:none;color:var(--i3);transition:transform .15s}
1285
+ .ui-tree-caret::before{content:"";width:6px;height:6px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(-45deg)}
1286
+ [aria-expanded="true"] > .ui-tree-row .ui-tree-caret{transform:rotate(90deg)}
1287
+ .ui-tree-leaf{width:16px;flex:none}
1288
+ [aria-expanded="false"] > ul{display:none}
1289
+ [aria-selected="true"] > .ui-tree-row{color:var(--i);background:var(--tree-selected-bg);font-weight:600}
1290
+ [role="treeitem"]:focus-visible > .ui-tree-row{outline:var(--focus-width) solid var(--focus-color);outline-offset:-2px}
1291
+ /* ── end ui-tree ── */
1292
+
1293
+ /* ── ui-section ── */
1294
+ /* Marketing sections share this: a band with its own width, a heading block (eyebrow, title, lead), and layouts that
1295
+ follow the band's own width (container queries), so a section works in a narrow card and a full page alike */
1296
+ .ui-section{container-type:inline-size;padding:var(--section-pad-y) 20px;color:var(--i)}
1297
+ .ui-section-inner{max-width:var(--section-max);margin:0 auto;display:grid;gap:32px}
1298
+ .ui-section-head{display:grid;gap:10px;max-width:720px}
1299
+ .ui-section-head--center{justify-items:center;margin:0 auto;text-align:center}
1300
+ .ui-eyebrow{color:var(--eyebrow-fg);font-size:var(--ts-eyebrow-size);font-weight:var(--ts-eyebrow-weight);line-height:var(--ts-eyebrow-lh);letter-spacing:var(--ts-eyebrow-ls);text-transform:var(--ts-eyebrow-case);font-family:var(--ts-eyebrow-font)}
1301
+ .ui-section-title{margin:0;font-size:var(--section-title-size);font-weight:var(--ts-h1-weight);line-height:var(--ts-h1-lh);letter-spacing:var(--ts-h1-ls);text-transform:var(--ts-h1-case);font-family:var(--ts-h1-font)}
1302
+ .ui-section-lead{margin:0;font-size:var(--ts-lead-size);color:var(--i2);font-weight:var(--ts-lead-weight);line-height:var(--ts-lead-lh);letter-spacing:var(--ts-lead-ls);text-transform:var(--ts-lead-case);font-family:var(--ts-lead-font)}
1303
+ .ui-section--alt{background:var(--p)}
1304
+ .ui-cols{display:grid;gap:20px}
1305
+ @container (min-width:640px){.ui-cols--2,.ui-cols--3,.ui-cols--4{grid-template-columns:repeat(2,minmax(0,1fr))}}
1306
+ @container (min-width:900px){.ui-cols--3{grid-template-columns:repeat(3,minmax(0,1fr))}.ui-cols--4{grid-template-columns:repeat(4,minmax(0,1fr))}}
1307
+ .ui-mk-card{display:grid;align-content:start;gap:10px;min-width:0;padding:22px;background:var(--mk-card-bg);border:1px solid var(--l);border-radius:var(--r-lg,13px)}
1308
+ .ui-mk-card h3{margin:0;font-size:var(--ts-h3-size);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1309
+ .ui-mk-card p{margin:0;color:var(--i2);line-height:1.55}
1310
+ .ui-feature-icon{display:grid;place-items:center;width:44px;height:44px;border-radius:var(--r-md,10px);color:var(--on-fill);background:var(--fill)}
1311
+ .ui-feature-icon svg{width:22px;height:22px}
1312
+ /* an image's place, drawn from the theme until a real picture goes in */
1313
+ .ui-media{display:grid;place-items:center;min-height:120px;aspect-ratio:16/10;border-radius:var(--r-lg,13px);color:var(--i3);font-size:var(--ts-caption-size);background:linear-gradient(135deg,color-mix(in srgb,var(--pos) 22%,var(--mid)),var(--mid) 55%,color-mix(in srgb,var(--fill) 35%,var(--mid)));font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1314
+ .ui-media--square{aspect-ratio:1}
1315
+ /* ── end ui-section ── */
1316
+
1317
+ /* ── ui-sitenav ── */
1318
+ /* a site header: brand, links, actions; under 760px of its own width the links fold into a menu button */
1319
+ .ui-sitenav{container-type:inline-size;position:relative;background:var(--sitenav-bg);border-bottom:1px solid var(--l)}
1320
+ .ui-sitenav-bar{display:flex;align-items:center;gap:20px;max-width:var(--section-max);height:64px;margin:0 auto;padding:0 20px}
1321
+ .ui-sitenav-brand{display:flex;align-items:center;gap:9px;font-weight:800;letter-spacing:-.01em;color:var(--i);text-decoration:none}
1322
+ .ui-sitenav-links{display:flex;gap:2px;margin:0;padding:0;list-style:none}
1323
+ .ui-sitenav-links a{display:block;padding:8px 12px;border-radius:var(--r-sm,8px);font-size:var(--ts-small-size);font-weight:600;color:var(--i2);text-decoration:none;line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1324
+ .ui-sitenav-links a:hover,.ui-sitenav-links a[aria-current="page"]{color:var(--i);background:var(--mid)}
1325
+ .ui-sitenav-links a:focus-visible,.ui-sitenav-toggle:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:2px}
1326
+ .ui-sitenav-actions{display:flex;gap:8px;margin-left:auto}
1327
+ .ui-sitenav-toggle{display:none}
1328
+ .ui-sitenav-panel{display:grid;gap:4px;padding:8px 16px 16px;border-top:1px solid var(--l)}
1329
+ .ui-sitenav-panel[hidden]{display:none}
1330
+ .ui-sitenav-panel a{padding:12px 8px;border-radius:var(--r-sm,8px);font-weight:600;color:var(--i);text-decoration:none}
1331
+ .ui-sitenav-panel a:hover{background:var(--mid)}
1332
+ @container (max-width:760px){.ui-sitenav-links,.ui-sitenav-actions{display:none}.ui-sitenav-toggle{display:inline-flex;margin-left:auto}}
1333
+ @container (min-width:761px){.ui-sitenav-panel{display:none!important}}
1334
+ /* ── end ui-sitenav ── */
1335
+
1336
+ /* ── ui-hero ── */
1337
+ .ui-hero{display:grid;gap:28px;align-items:center}
1338
+ .ui-hero-text{display:grid;gap:16px;justify-items:start}
1339
+ .ui-hero-title{margin:0;font-size:var(--hero-title-size);font-weight:var(--ts-display-weight);line-height:var(--ts-display-lh);letter-spacing:var(--ts-display-ls);text-transform:var(--ts-display-case);font-family:var(--ts-display-font)}
1340
+ .ui-hero-lead{margin:0;max-width:560px;font-size:calc(var(--ts-lead-size) * 1.1);color:var(--i2);font-weight:var(--ts-lead-weight);line-height:var(--ts-lead-lh);letter-spacing:var(--ts-lead-ls);text-transform:var(--ts-lead-case);font-family:var(--ts-lead-font)}
1341
+ .ui-hero-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:6px}
1342
+ .ui-hero--center{justify-items:center;text-align:center}
1343
+ .ui-hero--center .ui-hero-text{justify-items:center}
1344
+ @container (min-width:900px){.ui-hero--split{grid-template-columns:1.1fr 1fr}}
1345
+ @container (max-width:480px){.ui-hero-title{font-size:calc(var(--hero-title-size) * .72)}}
1346
+ /* ── end ui-hero ── */
1347
+
1348
+ /* ── ui-stats ── */
1349
+ .ui-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px}
1350
+ @container (min-width:760px){.ui-stats{grid-template-columns:repeat(4,minmax(0,1fr))}}
1351
+ .ui-stat{display:grid;gap:4px;padding-left:16px;border-left:3px solid var(--stat-rule)}
1352
+ .ui-stat-value{font-size:var(--section-title-size);font-weight:800;letter-spacing:-.02em;color:var(--i);font-variant-numeric:proportional-nums}
1353
+ .ui-stat-label{font-weight:600;color:var(--i)}
1354
+ .ui-stat-note{font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1355
+ /* ── end ui-stats ── */
1356
+
1357
+ /* ── ui-logocloud ── */
1358
+ .ui-logocloud{display:grid;gap:18px;justify-items:center;text-align:center}
1359
+ .ui-logocloud p{margin:0;font-size:var(--ts-small-size);font-weight:600;color:var(--i2);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1360
+ .ui-logocloud ul{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:18px 34px;margin:0;padding:0;list-style:none;color:var(--i2)}
1361
+ .ui-logocloud li{display:flex;align-items:center;gap:8px;font-weight:700;font-size:var(--ts-lead-size)}
1362
+ /* ── end ui-logocloud ── */
1363
+
1364
+ /* ── ui-quote ── */
1365
+ .ui-quote{display:grid;gap:18px;margin:0;padding:24px;background:var(--mk-card-bg);border:1px solid var(--l);border-radius:var(--r-lg,13px)}
1366
+ .ui-quote blockquote{position:relative;margin:0;padding-top:28px;font-size:calc(var(--ts-lead-size) * 1.05);line-height:1.55;color:var(--i)}
1367
+ .ui-quote blockquote::before{content:"\201C";position:absolute;top:-14px;left:-2px;font:800 3.6rem/1 Georgia,serif;color:var(--quote-mark)}
1368
+ .ui-quote figcaption{display:flex;align-items:center;gap:12px}
1369
+ .ui-quote figcaption span{display:grid;font-size:var(--ts-small-size);color:var(--i2)}
1370
+ .ui-quote figcaption strong{color:var(--i)}
1371
+ .ui-quote--large blockquote{font-size:var(--ts-h2-size);font-weight:600;letter-spacing:-.01em}
1372
+ /* ── end ui-quote ── */
1373
+
1374
+ /* ── ui-person ── */
1375
+ .ui-person{display:grid;gap:10px;min-width:0;text-align:left}
1376
+ .ui-person h3{margin:4px 0 0;font-size:var(--ts-h3-size);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1377
+ .ui-person p{margin:0;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1378
+ .ui-person .ui-person-role{color:var(--eyebrow-fg);font-weight:600}
1379
+ /* ── end ui-person ── */
1380
+
1381
+ /* ── ui-post ── */
1382
+ .ui-post{display:grid;gap:12px;min-width:0;color:inherit;text-decoration:none}
1383
+ .ui-post-meta{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;font-size:var(--ts-caption-size);color:var(--i2);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1384
+ .ui-post h3{margin:0;font-size:var(--ts-h3-size);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1385
+ .ui-post p{margin:0;color:var(--i2);line-height:1.55}
1386
+ .ui-post:hover h3{text-decoration:underline;text-underline-offset:3px}
1387
+ .ui-post:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:4px;border-radius:var(--r-lg,13px)}
1388
+ /* ── end ui-post ── */
1389
+
1390
+ /* ── ui-jobs ── */
1391
+ .ui-jobs{display:grid;margin:0;padding:0;list-style:none;border-top:1px solid var(--l)}
1392
+ .ui-job{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;padding:18px 0;border-bottom:1px solid var(--l)}
1393
+ .ui-job-title{flex:1 1 240px;min-width:0;display:grid;gap:4px}
1394
+ .ui-job-title a{font-weight:700;color:var(--i);text-decoration:none}
1395
+ .ui-job-title a:hover{text-decoration:underline;text-underline-offset:3px}
1396
+ .ui-job-title a:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:2px}
1397
+ .ui-job-title span{font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1398
+ .ui-job-tags{display:flex;flex-wrap:wrap;gap:6px}
1399
+ /* ── end ui-jobs ── */
1400
+
1401
+ /* ── ui-faq ── */
1402
+ /* native <details>: no script, the keyboard and screen readers already know it */
1403
+ .ui-faq{display:grid;border-top:1px solid var(--l)}
1404
+ .ui-faq details{border-bottom:1px solid var(--l)}
1405
+ .ui-faq summary{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:18px 2px;font-weight:700;color:var(--i);cursor:pointer;list-style:none}
1406
+ .ui-faq summary::-webkit-details-marker{display:none}
1407
+ .ui-faq summary::after{content:"";flex:none;width:9px;height:9px;border-right:2px solid var(--i2);border-bottom:2px solid var(--i2);transform:rotate(45deg);transition:transform var(--btn-dur) ease}
1408
+ .ui-faq details[open] summary::after{transform:rotate(-135deg)}
1409
+ .ui-faq summary:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:2px;border-radius:4px}
1410
+ .ui-faq details > div{padding:0 2px 18px;color:var(--i2);line-height:1.6}
1411
+ /* ── end ui-faq ── */
1412
+
1413
+ /* ── ui-pricing ── */
1414
+ .ui-plans{display:grid;gap:18px;align-items:stretch}
1415
+ @container (min-width:760px){.ui-plans{grid-template-columns:repeat(3,minmax(0,1fr))}}
1416
+ .ui-plan{display:grid;grid-template-rows:auto auto auto 1fr auto;gap:14px;min-width:0;padding:24px;background:var(--mk-card-bg);border:1px solid var(--l);border-radius:var(--r-lg,13px)}
1417
+ .ui-plan--featured{border:2px solid var(--plan-featured);box-shadow:var(--shadow-lg)}
1418
+ .ui-plan h3{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0;font-size:var(--ts-h3-size);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1419
+ .ui-plan-price{display:flex;align-items:baseline;gap:6px}
1420
+ .ui-plan-price strong{font-size:2.4rem;font-weight:800;letter-spacing:-.03em;color:var(--i)}
1421
+ .ui-plan-price span{color:var(--i2)}
1422
+ .ui-plan > p{margin:0;color:var(--i2)}
1423
+ .ui-plan ul{display:grid;align-content:start;gap:10px;margin:0;padding:0;list-style:none;color:var(--i)}
1424
+ .ui-plan li{display:flex;gap:10px;align-items:flex-start}
1425
+ .ui-plan li::before{content:"";flex:none;width:12px;height:7px;margin-top:6px;border-left:2px solid var(--plan-check);border-bottom:2px solid var(--plan-check);transform:rotate(-45deg)}
1426
+ .ui-plan .ui-btn{width:100%}
1427
+ /* ── end ui-pricing ── */
1428
+
1429
+ /* ── ui-cta-band ── */
1430
+ .ui-cta-band{display:grid;gap:18px;padding:40px 28px;text-align:center;justify-items:center;color:var(--ctaband-fg);background:var(--ctaband-bg);border-radius:var(--r-lg,13px)}
1431
+ .ui-cta-band h2{margin:0;font-size:var(--section-title-size);font-weight:800;letter-spacing:-.02em;line-height:1.15}
1432
+ .ui-cta-band p{margin:0;max-width:560px;font-size:var(--ts-lead-size);opacity:.85;font-weight:var(--ts-lead-weight);line-height:var(--ts-lead-lh);letter-spacing:var(--ts-lead-ls);text-transform:var(--ts-lead-case);font-family:var(--ts-lead-font)}
1433
+ .ui-cta-band .ui-btn{--btn-secondary-bg:transparent;--btn-secondary-fg:var(--ctaband-fg);--btn-secondary-border:color-mix(in srgb,var(--ctaband-fg) 50%,transparent);--btn-secondary-bg-hover:color-mix(in srgb,var(--ctaband-fg) 12%,transparent)}
1434
+ .ui-cta-band .ui-btn--primary{--btn-primary-bg:var(--ctaband-fg);--btn-primary-fg:var(--ctaband-bg);--btn-primary-border:var(--ctaband-fg);--btn-primary-bg-hover:color-mix(in srgb,var(--ctaband-fg) 88%,var(--ctaband-bg))}
1435
+ .ui-cta-band .ui-hero-actions{justify-content:center}
1436
+ /* ── end ui-cta-band ── */
1437
+
1438
+ /* ── ui-newsletter ── */
1439
+ .ui-newsletter{display:grid;gap:18px;align-items:center}
1440
+ @container (min-width:760px){.ui-newsletter{grid-template-columns:1fr minmax(0,420px)}}
1441
+ .ui-newsletter form{display:grid;gap:8px}
1442
+ .ui-newsletter-row{display:flex;flex-wrap:wrap;gap:8px}
1443
+ .ui-newsletter-row .ui-input{flex:1 1 200px;width:auto}
1444
+ .ui-newsletter small{font-size:var(--ts-caption-size);color:var(--i2);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1445
+ /* ── end ui-newsletter ── */
1446
+
1447
+ /* ── ui-contact ── */
1448
+ .ui-contact{display:grid;gap:28px}
1449
+ @container (min-width:860px){.ui-contact{grid-template-columns:minmax(0,1fr) minmax(0,1.2fr)}}
1450
+ .ui-contact-ways{display:grid;gap:20px;margin:0;padding:0;list-style:none}
1451
+ .ui-contact-ways li{display:grid;grid-template-columns:auto 1fr;gap:2px 14px}
1452
+ .ui-contact-ways .ui-feature-icon{grid-row:span 2;width:40px;height:40px}
1453
+ .ui-contact-ways strong{color:var(--i)}
1454
+ .ui-contact-ways span,.ui-contact-ways a{color:var(--i2)}
1455
+ .ui-contact form{display:grid;gap:14px}
1456
+ .ui-contact-2{display:grid;gap:14px}
1457
+ @container (min-width:520px){.ui-contact-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
1458
+ /* ── end ui-contact ── */
1459
+
1460
+ /* ── ui-prose ── */
1461
+ /* long-form text: a readable measure and rhythm for the elements an article uses */
1462
+ .ui-prose{max-width:68ch;color:var(--i2);font-size:var(--ts-lead-size);line-height:1.75;font-weight:var(--ts-lead-weight);letter-spacing:var(--ts-lead-ls);text-transform:var(--ts-lead-case);font-family:var(--ts-lead-font)}
1463
+ .ui-prose > * + *{margin-top:1.1em}
1464
+ .ui-prose h2,.ui-prose h3{margin-top:1.8em;color:var(--i);line-height:1.25;letter-spacing:-.01em}
1465
+ .ui-prose h2{font-size:var(--ts-h2-size);font-weight:var(--ts-h2-weight);line-height:var(--ts-h2-lh);letter-spacing:var(--ts-h2-ls);text-transform:var(--ts-h2-case);font-family:var(--ts-h2-font)}.ui-prose h3{font-size:var(--ts-h3-size);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1466
+ .ui-prose p,.ui-prose ul,.ui-prose ol,.ui-prose blockquote,.ui-prose figure{margin-bottom:0}
1467
+ .ui-prose a{color:var(--i);text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--pos)}
1468
+ .ui-prose strong{color:var(--i)}
1469
+ .ui-prose ul,.ui-prose ol{padding-left:1.3em}
1470
+ .ui-prose li + li{margin-top:.4em}
1471
+ .ui-prose blockquote{margin-left:0;padding-left:18px;border-left:3px solid var(--quote-mark);font-style:italic;color:var(--i)}
1472
+ .ui-prose figure{margin-left:0;margin-right:0}
1473
+ .ui-prose figcaption{margin-top:8px;font-size:var(--ts-caption-size);color:var(--i2);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1474
+ /* ── end ui-prose ── */
1475
+
1476
+ /* ── ui-footer ── */
1477
+ .ui-footer{container-type:inline-size;padding:48px 20px 28px;color:var(--footer-fg);background:var(--footer-bg)}
1478
+ .ui-footer-inner{display:grid;gap:32px;max-width:var(--section-max);margin:0 auto}
1479
+ .ui-footer-top{display:grid;gap:28px}
1480
+ @container (min-width:760px){.ui-footer-top{grid-template-columns:1.3fr repeat(3,minmax(0,1fr))}}
1481
+ .ui-footer-brand{display:grid;gap:10px;align-content:start}
1482
+ .ui-footer-brand strong{font-size:var(--ts-h3-size)}
1483
+ .ui-footer-brand p,.ui-footer small{margin:0;color:var(--footer-muted)}
1484
+ .ui-footer h2{margin:0 0 10px;color:var(--footer-muted);font-size:var(--ts-eyebrow-size);font-weight:var(--ts-eyebrow-weight);line-height:var(--ts-eyebrow-lh);letter-spacing:var(--ts-eyebrow-ls);text-transform:var(--ts-eyebrow-case);font-family:var(--ts-eyebrow-font)}
1485
+ .ui-footer ul{display:grid;gap:8px;margin:0;padding:0;list-style:none}
1486
+ .ui-footer a{color:var(--footer-fg);text-decoration:none}
1487
+ .ui-footer a:hover{text-decoration:underline;text-underline-offset:3px}
1488
+ .ui-footer a:focus-visible{outline:2px solid var(--footer-fg);outline-offset:2px;border-radius:2px}
1489
+ .ui-footer-bottom{display:flex;flex-wrap:wrap;justify-content:space-between;gap:12px;padding-top:20px;border-top:1px solid color-mix(in srgb,var(--footer-fg) 18%,transparent)}
1490
+ /* ── end ui-footer ── */
1491
+
1492
+ /* ── ui-auth ── */
1493
+ /* a sign-in or sign-up card: brand, heading, fields, one main action; password rules shown as they are met */
1494
+ .ui-auth{display:grid;gap:18px;width:min(400px,100%);margin:0 auto;padding:28px 24px;background:var(--p);border:1px solid var(--l);border-radius:var(--r-lg,13px);box-shadow:var(--shadow-sm)}
1495
+ .ui-auth-head{display:grid;gap:6px;justify-items:center;text-align:center}
1496
+ .ui-auth-head h1{margin:6px 0 0;font-size:var(--ts-h2-size);font-weight:var(--ts-h2-weight);line-height:var(--ts-h2-lh);letter-spacing:var(--ts-h2-ls);text-transform:var(--ts-h2-case);font-family:var(--ts-h2-font)}
1497
+ .ui-auth-head p{margin:0;color:var(--i2)}
1498
+ .ui-auth form{display:grid;gap:14px}
1499
+ .ui-auth .ui-btn{width:100%}
1500
+ .ui-auth-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;font-size:var(--ts-small-size);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1501
+ .ui-auth-foot{margin:0;text-align:center;font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1502
+ .ui-auth a{color:var(--i);font-weight:600;text-underline-offset:3px}
1503
+ .ui-password{position:relative}
1504
+ .ui-password .ui-input{padding-right:76px}
1505
+ .ui-password button{position:absolute;right:4px;top:50%;transform:translateY(-50%);height:calc(var(--input-h) - 8px);padding:0 10px;font-size:var(--ts-caption-size);font-weight:600;color:var(--i2);background:transparent;border:0;border-radius:var(--r-sm,8px);cursor:pointer;line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1506
+ .ui-password button:hover{background:var(--mid);color:var(--i)}
1507
+ .ui-password button:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:0}
1508
+ .ui-rules{display:grid;gap:6px;margin:0;padding:0;list-style:none;font-size:var(--ts-caption-size);color:var(--i2);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1509
+ .ui-rules li{display:flex;align-items:center;gap:8px}
1510
+ .ui-rules li::before{content:"";flex:none;width:14px;height:14px;border-radius:50%;border:1.5px solid var(--input-border)}
1511
+ .ui-rules li[data-met]{color:var(--i)}
1512
+ .ui-rules li[data-met]::before{border-color:var(--steps-done-bg);background:var(--steps-done-bg)}
1513
+ /* ── end ui-auth ── */
1514
+
1515
+ /* ── ui-toc ── */
1516
+ /* a table of contents beside long text; the section in view is marked aria-current="true" */
1517
+ .ui-toc{display:grid;gap:2px;align-content:start;font-size:var(--ts-small-size);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1518
+ .ui-toc h2{margin:0 0 6px;color:var(--i2);font-size:var(--ts-eyebrow-size);font-weight:var(--ts-eyebrow-weight);line-height:var(--ts-eyebrow-lh);letter-spacing:var(--ts-eyebrow-ls);text-transform:var(--ts-eyebrow-case);font-family:var(--ts-eyebrow-font)}
1519
+ .ui-toc a{display:block;padding:6px 10px;border-left:2px solid var(--l);color:var(--i2);text-decoration:none}
1520
+ .ui-toc a:hover{color:var(--i)}
1521
+ .ui-toc a[aria-current="true"]{color:var(--i);border-left-color:var(--steps-current);font-weight:600}
1522
+ .ui-toc a:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:2px}
1523
+ /* ── end ui-toc ── */
1524
+
1525
+ /* ── ui-banner ── */
1526
+ /* an announcement across the top of a page or section; a close button ([data-ui-banner-close]) hides it */
1527
+ .ui-banner{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:6px 14px;padding:10px 48px 10px 16px;position:relative;font-size:var(--ts-small-size);text-align:center;color:var(--banner-fg);background:var(--banner-bg);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1528
+ .ui-banner a{color:inherit;font-weight:700;text-underline-offset:3px}
1529
+ .ui-banner a:focus-visible,.ui-banner-close:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:3px}
1530
+ .ui-banner-close{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:30px;height:30px;padding:0;color:inherit;background:transparent;border:0;border-radius:var(--r-sm,8px);cursor:pointer}
1531
+ .ui-banner-close:hover{background:color-mix(in srgb,currentColor 14%,transparent)}
1532
+ .ui-banner-close svg{width:16px;height:16px}
1533
+ .ui-banner--fill{color:var(--on-fill);background:var(--fill)}
1534
+ .ui-banner--subtle{color:var(--i);background:var(--mid);border-bottom:1px solid var(--l)}
1535
+ .ui-banner--card{justify-content:flex-start;text-align:left;padding:16px 52px 16px 18px;border-radius:var(--r-lg,13px)}
1536
+ /* ── end ui-banner ── */
1537
+
1538
+ /* ── ui-device ── */
1539
+ /* frames for showing work: a browser window, a laptop and a phone; put an image or any content inside */
1540
+ .ui-device{position:relative;min-width:0;margin:0}
1541
+ .ui-device-screen{display:grid;overflow:hidden;background:var(--s)}
1542
+ .ui-device-screen > img{display:block;width:100%;height:100%;object-fit:cover;object-position:top}
1543
+ .ui-device--browser{border:1px solid var(--l);border-radius:var(--r-md,10px);overflow:hidden;background:var(--p);box-shadow:var(--shadow-lg)}
1544
+ .ui-device-chrome{display:flex;align-items:center;gap:6px;height:30px;padding:0 10px;background:var(--mid);border-bottom:1px solid var(--l)}
1545
+ .ui-device-chrome i{width:9px;height:9px;border-radius:50%;background:var(--i3);opacity:.5}
1546
+ .ui-device-chrome span{flex:1;margin-left:8px;height:16px;max-width:240px;border-radius:999px;background:var(--p)}
1547
+ .ui-device--browser .ui-device-screen{aspect-ratio:16/10}
1548
+ .ui-device--laptop .ui-device-screen{aspect-ratio:16/10;border:10px solid var(--device-body);border-bottom-width:14px;border-radius:12px 12px 0 0}
1549
+ .ui-device--laptop::after{content:"";display:block;height:12px;margin:0 -7%;background:var(--device-body);border-radius:0 0 10px 10px;box-shadow:0 8px 18px -10px rgba(0,0,0,.6)}
1550
+ .ui-device--phone{width:min(240px,100%)}
1551
+ .ui-device--phone .ui-device-screen{aspect-ratio:9/19.5;border:9px solid var(--device-body);border-radius:34px}
1552
+ .ui-device--phone::before{content:"";position:absolute;z-index:1;top:16px;left:50%;width:64px;height:16px;margin-left:-32px;border-radius:999px;background:var(--device-body)}
1553
+ .ui-device figcaption{margin-top:12px;font-size:var(--ts-caption-size);text-align:center;color:var(--i2);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1554
+ /* ── end ui-device ── */
1555
+
1556
+ /* ── ui-annot ── */
1557
+ /* design annotations: numbered pins on a picture, each matched to a note; pins are buttons that show their note */
1558
+ .ui-annot{display:grid;gap:16px;min-width:0}
1559
+ .ui-annot{grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr))}
1560
+ .ui-annot-canvas{position:relative;min-width:0}
1561
+ .ui-annot-pin{position:absolute;display:grid;place-items:center;width:26px;height:26px;margin:-13px 0 0 -13px;padding:0;font:700 .78rem/1 inherit;color:var(--annot-fg);background:var(--annot-bg);border:2px solid var(--p);border-radius:50%;box-shadow:var(--shadow-md);cursor:pointer}
1562
+ .ui-annot-pin[aria-pressed="true"]{outline:3px solid var(--annot-bg);outline-offset:2px}
1563
+ .ui-annot-pin:focus-visible{outline:var(--focus-width) solid var(--focus-color);outline-offset:2px}
1564
+ .ui-annot-notes{display:grid;gap:10px;margin:0;padding:0;list-style:none;counter-reset:annot}
1565
+ .ui-annot-notes li{display:grid;grid-template-columns:auto 1fr;gap:4px 10px;padding:10px 12px;border:1px solid var(--l);border-radius:var(--r-md,10px);background:var(--p);counter-increment:annot}
1566
+ .ui-annot-notes li::before{content:counter(annot);grid-row:span 2;display:grid;place-items:center;width:22px;height:22px;font:700 .72rem/1 inherit;color:var(--annot-fg);background:var(--annot-bg);border-radius:50%}
1567
+ .ui-annot-notes li[data-active]{border-color:var(--annot-bg);box-shadow:0 0 0 1px var(--annot-bg)}
1568
+ .ui-annot-notes strong{color:var(--i)}
1569
+ .ui-annot-notes span{font-size:var(--ts-small-size);color:var(--i2);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1570
+ /* a spec line: a measured distance between two edges */
1571
+ .ui-annot-spec{position:absolute;display:flex;align-items:center;justify-content:center;border:0 dashed var(--annot-bg);font:600 .7rem/1 ui-monospace,monospace;color:var(--annot-bg)}
1572
+ .ui-annot-spec--h{height:0;border-top-width:1.5px}
1573
+ .ui-annot-spec--v{width:0;border-left-width:1.5px}
1574
+ .ui-annot-spec span{padding:2px 5px;background:var(--p);border-radius:4px}
1575
+ /* ── end ui-annot ── */
1576
+
1577
+ /* ── ui-motion ── */
1578
+ /* motion.js reveals: an element waiting to reveal is hidden only once the script is running (html.ui-motion-ready),
1579
+ and never under Still or the device's reduce-motion setting, so nothing can stay invisible */
1580
+ html.ui-motion-ready:not([data-motion="still"]) [data-reveal]:not([data-revealed]):not([data-reveal-trigger="hover"]){opacity:0}
1581
+ @media (prefers-reduced-motion:reduce){html.ui-motion-ready [data-reveal]:not([data-revealed]){opacity:1}}
1582
+ /* split text: each piece in a clipping box, so a line or word can rise into view */
1583
+ .ui-split{display:inline-block;overflow:hidden;vertical-align:top;padding-bottom:.08em;margin-bottom:-.08em}
1584
+ .ui-split-in{display:inline-block}
1585
+ /* ── end ui-motion ── */
1586
+
1587
+ /* Type styles as classes: .ui-t-<style> gives any element one of the kit's ten styles (tokens.css --ts-*) */
1588
+ .ui-t-display{font-size:var(--ts-display-size);font-weight:var(--ts-display-weight);line-height:var(--ts-display-lh);letter-spacing:var(--ts-display-ls);text-transform:var(--ts-display-case);font-family:var(--ts-display-font)}
1589
+ .ui-t-h1{font-size:var(--ts-h1-size);font-weight:var(--ts-h1-weight);line-height:var(--ts-h1-lh);letter-spacing:var(--ts-h1-ls);text-transform:var(--ts-h1-case);font-family:var(--ts-h1-font)}
1590
+ .ui-t-h2{font-size:var(--ts-h2-size);font-weight:var(--ts-h2-weight);line-height:var(--ts-h2-lh);letter-spacing:var(--ts-h2-ls);text-transform:var(--ts-h2-case);font-family:var(--ts-h2-font)}
1591
+ .ui-t-h3{font-size:var(--ts-h3-size);font-weight:var(--ts-h3-weight);line-height:var(--ts-h3-lh);letter-spacing:var(--ts-h3-ls);text-transform:var(--ts-h3-case);font-family:var(--ts-h3-font)}
1592
+ .ui-t-lead{font-size:var(--ts-lead-size);font-weight:var(--ts-lead-weight);line-height:var(--ts-lead-lh);letter-spacing:var(--ts-lead-ls);text-transform:var(--ts-lead-case);font-family:var(--ts-lead-font)}
1593
+ .ui-t-body{font-size:var(--ts-body-size);font-weight:var(--ts-body-weight);line-height:var(--ts-body-lh);letter-spacing:var(--ts-body-ls);text-transform:var(--ts-body-case);font-family:var(--ts-body-font)}
1594
+ .ui-t-small{font-size:var(--ts-small-size);font-weight:var(--ts-small-weight);line-height:var(--ts-small-lh);letter-spacing:var(--ts-small-ls);text-transform:var(--ts-small-case);font-family:var(--ts-small-font)}
1595
+ .ui-t-caption{font-size:var(--ts-caption-size);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);letter-spacing:var(--ts-caption-ls);text-transform:var(--ts-caption-case);font-family:var(--ts-caption-font)}
1596
+ .ui-t-label{font-size:var(--ts-label-size);font-weight:var(--ts-label-weight);line-height:var(--ts-label-lh);letter-spacing:var(--ts-label-ls);text-transform:var(--ts-label-case);font-family:var(--ts-label-font)}
1597
+ .ui-t-eyebrow{font-size:var(--ts-eyebrow-size);font-weight:var(--ts-eyebrow-weight);line-height:var(--ts-eyebrow-lh);letter-spacing:var(--ts-eyebrow-ls);text-transform:var(--ts-eyebrow-case);font-family:var(--ts-eyebrow-font)}
1598
+
1599
+ /* ── ui-viz: the kit's charts (charts.js + charts-core.mjs draw them; React: Chart.jsx). Structure only: colors are
1600
+ the series (--series-1..5), the primary (--chart-line) or a tone; fills sit 2px apart in the card's color. ── */
1601
+ .ui-viz{position:relative;display:grid;gap:10px;min-width:0;margin:0;--viz-h:220px}
1602
+ .ui-viz--spark{--viz-h:40px;gap:0}
1603
+ .ui-viz--bar,.ui-viz--line,.ui-viz--area{--viz-h:220px}
1604
+ .ui-viz--horizontal{--viz-h:200px}
1605
+ .ui-viz--donut,.ui-viz--pie,.ui-viz--ring{justify-items:center}.ui-viz--donut .ui-viz-legend,.ui-viz--pie .ui-viz-legend{justify-content:center}
1606
+ .ui-viz--meter{gap:8px}
1607
+ .ui-viz--gauge{justify-items:center}.ui-viz--heatmap,.ui-viz--funnel{gap:8px}
1608
+ .ui-viz-round--gauge{margin:0 auto}.ui-viz-middle--gauge{place-content:end center;padding-bottom:2px}
1609
+ .ui-viz-cell{transition:opacity var(--dur-fast,120ms) ease}.ui-viz-plot:hover .ui-viz-cell:not(:hover){opacity:.7}
1610
+ .ui-viz-tick--strong{fill:var(--i2);font-weight:600}
1611
+ .ui-viz-ramp{display:flex;align-items:center;gap:4px;font-size:var(--ts-caption-size);color:var(--i3)}
1612
+ .ui-viz-ramp i{width:16px;height:10px;border-radius:2px}.ui-viz-ramp span:first-child{margin-right:4px}.ui-viz-ramp span:last-child{margin-left:4px}
1613
+ .ui-viz-plot{position:relative;min-width:0}
1614
+ .ui-viz-svg{display:block;max-width:100%;overflow:visible}
1615
+ .ui-viz-grid{stroke:var(--chart-grid);stroke-width:1}
1616
+ .ui-viz-tick{fill:var(--i3);font-family:var(--ts-caption-font);font-size:var(--ts-caption-size);font-weight:var(--ts-caption-weight)}
1617
+ .ui-viz-line{stroke-width:var(--chart-stroke);stroke-linejoin:round;stroke-linecap:round}
1618
+ .ui-viz--spark .ui-viz-line{stroke-width:calc(var(--chart-stroke) * .9)}
1619
+ .ui-viz-area{opacity:calc(var(--chart-area-opacity) * 1.6)}
1620
+ .ui-viz-track{stroke:var(--mid)}
1621
+ .ui-viz-trackbar{fill:var(--mid)}
1622
+ .ui-viz-cross{stroke:var(--i3);stroke-width:1;stroke-dasharray:3 3;pointer-events:none}
1623
+ .ui-viz-cross[hidden]{display:none}
1624
+ .ui-viz-plot:hover .ui-viz-bar:not(:hover),.ui-viz-plot:hover .ui-viz-seg:not(:hover),.ui-viz-plot:hover .ui-viz-sweep:not(:hover){opacity:.62}
1625
+ .ui-viz-mark{transition:opacity var(--dur-fast,120ms) ease}
1626
+ .ui-viz-round{position:relative;margin:0 auto}
1627
+ .ui-viz-middle{position:absolute;inset:0;display:grid;place-content:center;justify-items:center;gap:2px;text-align:center;pointer-events:none}
1628
+ .ui-viz-middle strong{font-size:var(--ts-h2-size);font-weight:var(--ts-h2-weight);line-height:1;letter-spacing:var(--ts-h2-ls);color:var(--i);font-variant-numeric:tabular-nums}
1629
+ .ui-viz-middle span{font-size:var(--ts-caption-size);color:var(--i3)}
1630
+ .ui-viz-legend{display:flex;flex-wrap:wrap;gap:6px 14px;margin:0;padding:0;list-style:none;font-size:var(--ts-caption-size);font-weight:var(--ts-caption-weight);line-height:var(--ts-caption-lh);color:var(--i2)}
1631
+ .ui-viz-legend li{display:flex;align-items:center;gap:6px}
1632
+ .ui-viz-key{flex:none;width:10px;height:10px;border-radius:3px}
1633
+ .ui-viz-tip{position:absolute;z-index:2;padding:4px 8px;font-size:var(--ts-caption-size);font-weight:600;line-height:var(--ts-caption-lh);white-space:nowrap;color:var(--tooltip-fg);background:var(--tooltip-bg);border-radius:var(--tooltip-radius);box-shadow:var(--shadow-md);pointer-events:none}
1634
+ .ui-viz-error{margin:0;padding:12px;border:1px dashed var(--neg);border-radius:var(--r-sm,8px);font-size:var(--ts-small-size);color:var(--neg)}
1635
+
1636
+ /* ── ui-compare: two (or more) values against each other; the first is the one that matters (primary), the rest
1637
+ are the baseline (dim ink). The difference is written out, never only drawn. ── */
1638
+ .ui-compare{display:grid;gap:10px;min-width:0}
1639
+ .ui-compare-row{display:grid;grid-template-columns:minmax(80px,auto) minmax(0,1fr) auto;align-items:center;gap:12px}
1640
+ .ui-compare-label{font-size:var(--ts-small-size);color:var(--i2)}
1641
+ .ui-compare-bar{height:10px;border-radius:999px;background:var(--mid);overflow:hidden}
1642
+ .ui-compare-bar > span{display:block;height:100%;width:var(--value,0%);border-radius:inherit;background:var(--i3)}
1643
+ .ui-compare-row:first-child .ui-compare-bar > span{background:var(--chart-line)}
1644
+ .ui-compare-value{font-weight:700;color:var(--i);font-variant-numeric:tabular-nums}
1645
+ .ui-compare-diff{margin:2px 0 0;font-size:var(--ts-caption-size);color:var(--i2)}
1646
+ /* ── ui-timeline: milestones in order; the dot and the words both say done, current or upcoming ── */
1647
+ .ui-timeline{display:grid;margin:0;padding:0;list-style:none}
1648
+ .ui-timeline-item{position:relative;display:grid;grid-template-columns:auto 1fr;gap:12px;padding:0 0 18px}
1649
+ .ui-timeline-item:not(:last-child)::before{content:"";position:absolute;left:5px;top:16px;bottom:0;width:2px;background:var(--l)}
1650
+ .ui-timeline-dot{width:12px;height:12px;margin-top:5px;border-radius:50%;border:2px solid var(--i3);background:var(--p);box-sizing:border-box}
1651
+ .ui-timeline-item[data-state="done"] .ui-timeline-dot{border-color:var(--good);background:var(--good)}
1652
+ .ui-timeline-item[data-state="current"] .ui-timeline-dot{border-color:var(--pos);background:var(--pos)}
1653
+ .ui-timeline-title{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0;font-weight:600;color:var(--i)}
1654
+ .ui-timeline-text{margin:4px 0 2px;color:var(--i2)}
1655
+ .ui-timeline-time{font-size:var(--ts-caption-size);color:var(--i3)}
1656
+ /* ── ui-statgrid: a compact grid of figures for dashboards (marketing pages use ui-stats) ── */
1657
+ .ui-statgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:1px;margin:0;overflow:hidden;background:var(--l);border:1px solid var(--l);border-radius:var(--r-lg,13px)}
1658
+ .ui-statgrid > div{display:grid;gap:4px;align-content:start;padding:14px 16px;background:var(--p)}
1659
+ .ui-statgrid dt{font-size:var(--ts-caption-size);color:var(--i2)}
1660
+ .ui-statgrid dd{margin:0;font-size:var(--ts-h2-size);font-weight:700;line-height:1.1;color:var(--i);font-variant-numeric:tabular-nums}
1661
+ .ui-statgrid small{font-size:var(--ts-caption-size);color:var(--i3)}