@bkstg/design-systems 1.0.0

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