@exxatdesignux/ui 0.2.18 → 0.2.19

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 (140) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/consumer-extras/AGENTS.md +76 -0
  3. package/consumer-extras/README.md +5 -1
  4. package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +14 -3
  5. package/consumer-extras/cursor-skills/exxat-consumer-app/SKILL.md +37 -0
  6. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +21 -6
  7. package/consumer-extras/cursor-skills/exxat-focused-workflow-page/SKILL.md +57 -0
  8. package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +4 -2
  9. package/consumer-extras/patterns/consumer-app-pattern.md +39 -0
  10. package/consumer-extras/patterns/consumer-upgrade-checklist.md +20 -0
  11. package/consumer-extras/patterns/data-views-pattern.md +40 -3
  12. package/consumer-extras/patterns/focused-workflow-page-pattern.md +84 -0
  13. package/consumer-extras/patterns/shell-surface-elevation-pattern.md +5 -3
  14. package/package.json +2 -1
  15. package/src/components/ui/button-group.tsx +81 -0
  16. package/src/components/ui/button.tsx +4 -4
  17. package/src/globals.css +7 -1858
  18. package/src/theme.css +10 -1126
  19. package/src/tokens/README.md +15 -0
  20. package/src/tokens/base.css +337 -0
  21. package/src/tokens/high-contrast.css +1195 -0
  22. package/src/tokens/layers.css +224 -0
  23. package/src/tokens/tailwind-bridge.css +118 -0
  24. package/src/tokens/themes.css +201 -0
  25. package/template/AGENTS.md +60 -22
  26. package/template/app/(app)/dashboard/loading.tsx +3 -15
  27. package/template/app/(app)/dashboard/page.tsx +2 -14
  28. package/template/app/(app)/data-list/layout.tsx +43 -0
  29. package/template/app/(app)/data-list/page.tsx +2 -2
  30. package/template/app/(app)/examples/focused-workflow/page.tsx +5 -0
  31. package/template/app/(app)/examples/page.tsx +1 -0
  32. package/template/app/(app)/loading.tsx +1 -18
  33. package/template/app/(app)/question-bank/find/page.tsx +2 -1
  34. package/template/app/(app)/question-bank/library/page.tsx +2 -1
  35. package/template/app/(app)/question-bank/list/page.tsx +2 -1
  36. package/template/app/(app)/question-bank/new/page.tsx +15 -23
  37. package/template/app/(app)/question-bank/page.tsx +2 -1
  38. package/template/app/(app)/settings/page.tsx +4 -5
  39. package/template/app/globals.css +7 -1964
  40. package/template/components/app-route-loading.tsx +14 -0
  41. package/template/components/app-sidebar.tsx +70 -55
  42. package/template/components/data-views/index.ts +37 -9
  43. package/template/components/data-views/list-page-calendar-view.tsx +593 -0
  44. package/template/components/data-views/list-page-connected-view-body.tsx +66 -0
  45. package/template/components/data-views/list-page-folder-columns-panel.tsx +345 -0
  46. package/template/components/data-views/list-page-split-hub-chrome.tsx +8 -0
  47. package/template/components/examples/focused-workflow-showcase.tsx +183 -0
  48. package/template/components/list-hub-board-view.tsx +68 -0
  49. package/template/components/list-hub-client.tsx +186 -0
  50. package/template/components/list-hub-list-view.tsx +36 -0
  51. package/template/components/list-hub-panel-activator.tsx +8 -0
  52. package/template/components/list-hub-secondary-nav.tsx +121 -0
  53. package/template/components/list-hub-table.tsx +336 -0
  54. package/template/components/new-question-composer.tsx +6 -24
  55. package/template/components/product-switcher.tsx +3 -2
  56. package/template/components/question-bank-client.tsx +4 -1
  57. package/template/components/question-bank-folder-columns-panel.tsx +104 -0
  58. package/template/components/question-bank-table.tsx +143 -485
  59. package/template/components/secondary-panel/nav-link-rows.tsx +83 -0
  60. package/template/components/secondary-panel.tsx +4 -44
  61. package/template/components/secondary-panels/list-hub-panel.tsx +39 -0
  62. package/template/components/secondary-panels/question-bank-panel.tsx +39 -0
  63. package/template/components/secondary-panels/registry.tsx +15 -0
  64. package/template/components/settings-appearance-card.tsx +3 -2
  65. package/template/components/settings-client.tsx +59 -15
  66. package/template/components/settings-form-row.tsx +9 -4
  67. package/template/components/table-properties/drawer-button.tsx +13 -0
  68. package/template/components/table-properties/drawer.tsx +65 -4
  69. package/template/components/templates/focused-workflow-layouts.tsx +448 -0
  70. package/template/components/templates/focused-workflow-page-template.tsx +69 -0
  71. package/template/components/templates/list-page.tsx +29 -5
  72. package/template/components/templates/nested-secondary-panel-shell.tsx +2 -1
  73. package/template/components/templates/page-loading-shell.tsx +262 -0
  74. package/template/components/ui/button-group.tsx +1 -0
  75. package/template/docs/consumer-app-pattern.md +39 -0
  76. package/template/docs/data-views-pattern.md +40 -3
  77. package/template/docs/drawer-vs-dialog-pattern.md +3 -1
  78. package/template/docs/focused-workflow-page-pattern.md +84 -0
  79. package/template/docs/shell-surface-elevation-pattern.md +5 -3
  80. package/template/lib/command-menu-search-data.ts +11 -27
  81. package/template/lib/data-list-display-options.ts +16 -2
  82. package/template/lib/data-list-view-registry.ts +104 -0
  83. package/template/lib/data-list-view-surface.ts +15 -1
  84. package/template/lib/data-list-view.ts +10 -1
  85. package/template/lib/data-view-dashboard-storage.ts +38 -35
  86. package/template/lib/hub-connected-view-renderers.ts +58 -0
  87. package/template/lib/list-hub-nav.ts +121 -0
  88. package/template/lib/list-hub-supported-views.ts +10 -0
  89. package/template/lib/list-page-table-properties.ts +3 -7
  90. package/template/lib/list-status-badges.ts +4 -97
  91. package/template/lib/mock/list-hub-directory.ts +27 -0
  92. package/template/lib/mock/list-hub-kpi.ts +27 -0
  93. package/template/lib/mock/navigation.tsx +1 -0
  94. package/template/lib/page-loading-variant.ts +40 -0
  95. package/template/lib/question-bank-supported-views.ts +13 -0
  96. package/template/lib/table-state-lifecycle.ts +2 -2
  97. package/template/app/(app)/data-list/[id]/page.tsx +0 -44
  98. package/template/app/(app)/data-list/new/page.tsx +0 -34
  99. package/template/components/compliance-board-view.tsx +0 -142
  100. package/template/components/compliance-client.tsx +0 -92
  101. package/template/components/compliance-list-view.tsx +0 -54
  102. package/template/components/compliance-page-header.tsx +0 -89
  103. package/template/components/compliance-table.tsx +0 -612
  104. package/template/components/data-view-dashboard-charts-compliance.tsx +0 -963
  105. package/template/components/data-view-dashboard-charts-team.tsx +0 -971
  106. package/template/components/data-view-dashboard-charts.tsx +0 -1503
  107. package/template/components/new-placement-back-btn.tsx +0 -28
  108. package/template/components/new-placement-form.tsx +0 -1068
  109. package/template/components/placement-board-card.tsx +0 -262
  110. package/template/components/placement-detail.tsx +0 -438
  111. package/template/components/placements-board-view.tsx +0 -404
  112. package/template/components/placements-client.tsx +0 -252
  113. package/template/components/placements-list-view.tsx +0 -171
  114. package/template/components/placements-page-header.tsx +0 -166
  115. package/template/components/placements-table-cells.test.tsx +0 -22
  116. package/template/components/placements-table-cells.tsx +0 -173
  117. package/template/components/placements-table-columns.tsx +0 -640
  118. package/template/components/placements-table.tsx +0 -1642
  119. package/template/components/rotations-empty-state.tsx +0 -50
  120. package/template/components/rotations-panel-activator.tsx +0 -8
  121. package/template/components/sites-all-client.tsx +0 -154
  122. package/template/components/sites-board-view.tsx +0 -67
  123. package/template/components/sites-list-view.tsx +0 -42
  124. package/template/components/sites-table.tsx +0 -382
  125. package/template/components/team-board-view.tsx +0 -122
  126. package/template/components/team-client.tsx +0 -100
  127. package/template/components/team-list-view.tsx +0 -59
  128. package/template/components/team-page-header.tsx +0 -92
  129. package/template/components/team-table.tsx +0 -693
  130. package/template/lib/data-view-dashboard-placements-layout.ts +0 -215
  131. package/template/lib/mock/compliance-kpi.ts +0 -61
  132. package/template/lib/mock/compliance.ts +0 -146
  133. package/template/lib/mock/placements-kpi.ts +0 -134
  134. package/template/lib/mock/placements.ts +0 -183
  135. package/template/lib/mock/sites-directory.ts +0 -16
  136. package/template/lib/mock/sites-kpi.ts +0 -25
  137. package/template/lib/mock/team-kpi.ts +0 -60
  138. package/template/lib/mock/team.ts +0 -118
  139. package/template/lib/placement-board-card-layout.ts +0 -79
  140. package/template/lib/placement-lifecycle.ts +0 -5
@@ -0,0 +1,1195 @@
1
+ /* ==========================================================================
2
+ HIGH CONTRAST MODE
3
+ ──────────────────────────────────────────────────────────────────────────
4
+ Three guiding principles (WCAG 1.4.6 Enhanced + research-backed UX):
5
+
6
+ 1. FORCED-COLORS APPROACH
7
+ Strip gradients, shadows, and background images.
8
+ Use borders to define shape and elevation — not fills.
9
+ Limited palette: 4–6 named tokens, nothing decorative.
10
+
11
+ 2. DON'T RELY ON COLOR ALONE
12
+ Error/warning states get a thick border AND an icon differentiator.
13
+ Charts and badges use luminance separation (grayscale steps), not hue.
14
+ Interactive state (hover / focus / active) is communicated via outline,
15
+ not background-color change alone.
16
+
17
+ 3. DARK MODE ≠ HIGH CONTRAST
18
+ Dark mode = aesthetic; uses subtle greys.
19
+ High-contrast dark = functional; uses near-black grey canvas, pure white
20
+ (#FFF), and a "hot" neon-yellow focus accent for maximum visibility.
21
+ ========================================================================== */
22
+
23
+ /* ── Light High Contrast ─────────────────────────────────────────────────── */
24
+ /* Fluent 2 / Microsoft 6-color strategy. */
25
+ /* Highlight = saturated bright brand color (follows theme hue). */
26
+ html[data-contrast="high"]:not(.dark) {
27
+ --hc-highlight: oklch(from var(--brand-color) 0.35 0.30 h);
28
+ --hc-highlight-text: oklch(1 0 0);
29
+
30
+ --background: oklch(1 0 0);
31
+ --foreground: oklch(0.14 0 0);
32
+ --card: oklch(1 0 0);
33
+ --card-foreground: oklch(0.14 0 0);
34
+ --popover: oklch(1 0 0);
35
+ --popover-foreground: oklch(0.14 0 0);
36
+ --primary: oklch(0.14 0 0);
37
+ --primary-foreground: oklch(1 0 0);
38
+ --secondary: oklch(1 0 0);
39
+ --secondary-foreground: oklch(0.14 0 0);
40
+ --muted: oklch(0.94 0 0);
41
+ --muted-foreground: oklch(0.14 0 0);
42
+ --accent: var(--hc-highlight);
43
+ --accent-foreground: var(--hc-highlight-text);
44
+ --destructive: oklch(0.45 0.24 25);
45
+ --destructive-foreground: oklch(1 0 0);
46
+ --border: oklch(0.14 0 0);
47
+ --border-control: oklch(0.14 0 0);
48
+ --border-control-3: oklch(0.14 0 0);
49
+ --border-control-35: oklch(0.14 0 0);
50
+ --control-border: oklch(0.14 0 0);
51
+ --input: oklch(0.14 0 0);
52
+ --input-background: oklch(1 0 0);
53
+ --ring: var(--hc-highlight);
54
+ --sidebar: oklch(1 0 0);
55
+ --sidebar-foreground: oklch(0.14 0 0);
56
+ --sidebar-primary: oklch(0.14 0 0);
57
+ --sidebar-primary-foreground: oklch(1 0 0);
58
+ --sidebar-accent: oklch(0.90 0 0);
59
+ --sidebar-accent-foreground: oklch(0.14 0 0);
60
+ --sidebar-border: oklch(0.14 0 0);
61
+ --sidebar-ring: var(--hc-highlight);
62
+ --sidebar-section-label-foreground: oklch(0.40 0 0);
63
+ --chart-1: oklch(0.14 0 0);
64
+ --chart-2: oklch(0.35 0 0);
65
+ --chart-3: oklch(0.55 0 0);
66
+ --chart-4: oklch(0.72 0 0);
67
+ --chart-5: oklch(0.86 0 0);
68
+ --chip-1: oklch(0.14 0 0);
69
+ --chip-2: oklch(0.14 0 0);
70
+ --chip-3: oklch(0.14 0 0);
71
+ --chip-4: oklch(0.14 0 0);
72
+ --chip-5: oklch(0.14 0 0);
73
+ --chip-destructive: oklch(0.45 0.24 25);
74
+ --interactive-hover: oklch(0.88 0 0);
75
+ --interactive-hover-foreground: oklch(0.14 0 0);
76
+ --interactive-hover-subtle: oklch(0.92 0 0);
77
+ --interactive-hover-soft: oklch(0.92 0 0);
78
+ --interactive-hover-medium: oklch(0.86 0 0);
79
+ --interactive-hover-strong: oklch(0.82 0 0);
80
+ --interactive-hover-row: oklch(0.88 0 0);
81
+ --overlay: color-mix(in oklch, var(--foreground) 18%, transparent);
82
+ --dt-row-bg: oklch(1 0 0);
83
+ --dt-row-hover: oklch(0.92 0 0);
84
+ --dt-row-selected: var(--accent);
85
+ --dt-row-selected-fg: var(--accent-foreground);
86
+ --dt-header-bg: oklch(1 0 0);
87
+ --dt-group-bg: oklch(0.92 0 0);
88
+ --dt-new-row-bg: oklch(1 0 0);
89
+ --dt-new-row-border: oklch(0.14 0 0);
90
+ }
91
+
92
+ /* ── Dark High Contrast ──────────────────────────────────────────────────── */
93
+ /* Same 6-color strategy inverted for dark canvas. */
94
+ /* Highlight = very bright saturated brand (like MS cyan but brand hue). */
95
+ html[data-contrast="high"].dark {
96
+ --hc-highlight: oklch(from var(--brand-color) 0.78 0.30 h);
97
+ --hc-highlight-text: oklch(0.08 0 0);
98
+
99
+ --background: oklch(0.14 0 0);
100
+ --foreground: oklch(0.96 0 0);
101
+ --card: oklch(0.14 0 0);
102
+ --card-foreground: oklch(0.96 0 0);
103
+ --popover: oklch(0.20 0 0);
104
+ --popover-foreground: oklch(0.96 0 0);
105
+ --primary: oklch(0.96 0 0);
106
+ --primary-foreground: oklch(0.10 0 0);
107
+ --secondary: oklch(0.14 0 0);
108
+ --secondary-foreground: oklch(0.96 0 0);
109
+ --muted: oklch(0.22 0 0);
110
+ --muted-foreground: oklch(0.96 0 0);
111
+ --accent: var(--hc-highlight);
112
+ --accent-foreground: var(--hc-highlight-text);
113
+ --destructive: oklch(0.72 0.18 18);
114
+ --destructive-foreground: oklch(0.10 0 0);
115
+ --border: oklch(0.75 0 0);
116
+ --border-control: oklch(0.75 0 0);
117
+ --border-control-3: oklch(0.75 0 0);
118
+ --border-control-35: oklch(0.75 0 0);
119
+ --control-border: oklch(0.75 0 0);
120
+ --input: oklch(0.75 0 0);
121
+ --input-background: oklch(0.14 0 0);
122
+ --ring: var(--hc-highlight);
123
+ --sidebar: oklch(0.14 0 0);
124
+ --sidebar-foreground: oklch(0.96 0 0);
125
+ --sidebar-primary: oklch(0.96 0 0);
126
+ --sidebar-primary-foreground: oklch(0.10 0 0);
127
+ --sidebar-accent: oklch(0.24 0 0);
128
+ --sidebar-accent-foreground: oklch(0.96 0 0);
129
+ --sidebar-border: oklch(0.75 0 0);
130
+ --sidebar-ring: var(--hc-highlight);
131
+ --sidebar-section-label-foreground: oklch(0.65 0 0);
132
+ --chart-1: oklch(0.96 0 0);
133
+ --chart-2: oklch(0.75 0 0);
134
+ --chart-3: oklch(0.55 0 0);
135
+ --chart-4: oklch(0.38 0 0);
136
+ --chart-5: oklch(0.22 0 0);
137
+ --chip-1: oklch(0.96 0 0);
138
+ --chip-2: oklch(0.96 0 0);
139
+ --chip-3: oklch(0.96 0 0);
140
+ --chip-4: oklch(0.96 0 0);
141
+ --chip-5: oklch(0.96 0 0);
142
+ --chip-destructive: oklch(0.72 0.18 18);
143
+ --interactive-hover: oklch(0.26 0 0);
144
+ --interactive-hover-foreground: oklch(0.96 0 0);
145
+ --interactive-hover-subtle: oklch(0.22 0 0);
146
+ --interactive-hover-soft: oklch(0.22 0 0);
147
+ --interactive-hover-medium: oklch(0.28 0 0);
148
+ --interactive-hover-strong: oklch(0.32 0 0);
149
+ --interactive-hover-row: oklch(0.26 0 0);
150
+ --overlay: color-mix(in oklch, var(--foreground) 22%, transparent);
151
+ --dt-row-bg: oklch(0.14 0 0);
152
+ --dt-row-hover: oklch(0.22 0 0);
153
+ --dt-row-selected: var(--accent);
154
+ --dt-row-selected-fg: var(--accent-foreground);
155
+ --dt-header-bg: oklch(0.14 0 0);
156
+ --dt-group-bg: oklch(0.22 0 0);
157
+ --dt-new-row-bg: oklch(0.14 0 0);
158
+ --dt-new-row-border: oklch(0.96 0 0);
159
+ }
160
+
161
+ /* Neutralize brand tint washes in HC so bg-brand-tint doesn't compete */
162
+ html:is([data-contrast="high"], [data-contrast="windows"]):not(.dark) {
163
+ --brand-tint: oklch(0.94 0 0);
164
+ --brand-tint-light: oklch(0.97 0 0);
165
+ --brand-tint-subtle: oklch(0.98 0 0);
166
+ }
167
+ html:is([data-contrast="high"], [data-contrast="windows"]).dark {
168
+ --brand-tint: oklch(0.22 0 0);
169
+ --brand-tint-light: oklch(0.18 0 0);
170
+ --brand-tint-subtle: oklch(0.16 0 0);
171
+ }
172
+
173
+ /* ── Structural rules shared by BOTH light and dark HC ──────────────────── */
174
+ /* Pattern 1: "Borders over Fills" — strip decorative chrome */
175
+ html:is([data-contrast="high"], [data-contrast="windows"]) {
176
+
177
+ /* 1a. Remove ALL box-shadows (elevation via outline, not shadow) */
178
+ & * {
179
+ box-shadow: none !important;
180
+ text-shadow: none !important;
181
+ }
182
+
183
+ /* 1b. Strip gradient fills from cards; use border to define shape */
184
+ & [data-slot="card"] {
185
+ background-image: none !important;
186
+ border: 2px solid var(--foreground) !important;
187
+ }
188
+
189
+ /* 1c. Thicker borders on all form controls (WCAG 1.4.11: 3:1 UI contrast) */
190
+ & [data-slot="input"],
191
+ & [data-slot="select-trigger"],
192
+ & [data-slot="textarea"],
193
+ & [data-slot="checkbox"],
194
+ & [data-slot="switch"] {
195
+ border-width: 2px !important;
196
+ border-color: var(--foreground) !important;
197
+ }
198
+
199
+ /* 1d. Sidebar defined by its edge border, not background colour */
200
+ & [data-slot="sidebar"] {
201
+ border-inline-end: 2px solid var(--sidebar-border) !important;
202
+ }
203
+
204
+ /* Nested secondary panel (Library rail) — border like sidebar; ring alone is invisible in HC */
205
+ & [data-slot="secondary-panel"] {
206
+ border: 2px solid var(--foreground) !important;
207
+ box-shadow: none !important;
208
+ }
209
+
210
+ /* 1e. Tab list — border not fill */
211
+ & [data-slot="tabs-list"] {
212
+ background-color: transparent !important;
213
+ border: 2px solid var(--foreground) !important;
214
+ }
215
+
216
+ /* 1f. Badge / chip — border-based; no decorative fills */
217
+ & [data-slot="badge"] {
218
+ border-width: 2px !important;
219
+ border-color: var(--foreground) !important;
220
+ background-color: var(--background) !important;
221
+ font-weight: 700 !important;
222
+ box-shadow: none !important;
223
+ outline: none !important;
224
+ color: var(--foreground) !important;
225
+ }
226
+
227
+ & [data-slot="badge"] * {
228
+ color: var(--foreground) !important;
229
+ }
230
+
231
+ /* Status chip — same treatment as Badge (border-based, no decorative fill) */
232
+ & [data-slot="status-badge"] {
233
+ border-width: 2px !important;
234
+ border-color: var(--foreground) !important;
235
+ background-color: var(--background) !important;
236
+ font-weight: 700 !important;
237
+ box-shadow: none !important;
238
+ outline: none !important;
239
+ color: var(--foreground) !important;
240
+ }
241
+
242
+ /* Sidebar wrapper is positioning-only when it wraps Badge/StatusBadge — avoid double border */
243
+ & [data-slot="sidebar-menu-badge"]:has([data-slot="badge"]),
244
+ & [data-slot="sidebar-menu-badge"]:has([data-slot="status-badge"]) {
245
+ border-width: 0 !important;
246
+ background-color: transparent !important;
247
+ box-shadow: none !important;
248
+ outline: none !important;
249
+ }
250
+
251
+ & [data-slot="view-toolbar-count"] {
252
+ border-width: 2px !important;
253
+ border-color: currentColor !important;
254
+ background-color: var(--background) !important;
255
+ font-weight: 700 !important;
256
+ color: var(--foreground) !important;
257
+ box-shadow: none !important;
258
+ outline: none !important;
259
+ }
260
+
261
+ & [data-slot="sidebar-menu-badge"]:not(:has([data-slot="badge"])):not(:has([data-slot="status-badge"])) {
262
+ border-width: 2px !important;
263
+ border-color: currentColor !important;
264
+ background-color: var(--background) !important;
265
+ font-weight: 700 !important;
266
+ color: var(--foreground) !important;
267
+ }
268
+
269
+ /* Segmented tab buttons: global HC button border + count pill border = double ring */
270
+ & button[data-slot="view-segmented-item"] {
271
+ border-width: 0 !important;
272
+ border-color: transparent !important;
273
+ }
274
+
275
+ /* Radix Tabs — active state must not rely on muted fill / pseudo underline only */
276
+ & [data-slot="tabs-trigger"] {
277
+ color: var(--foreground) !important;
278
+ opacity: 1 !important;
279
+ }
280
+
281
+ & [data-slot="tabs-trigger"][data-state="active"] {
282
+ background-color: var(--accent) !important;
283
+ color: var(--accent-foreground) !important;
284
+ outline: none !important;
285
+ font-weight: 600 !important;
286
+ }
287
+
288
+ /* KPI strip + chart card mini-metrics — force readable copy (muted grays fail in HC) */
289
+ & [data-slot="key-metrics"] :where(span, p, button, a, i, label, div) {
290
+ color: var(--foreground) !important;
291
+ }
292
+
293
+ & [data-slot="key-metrics"] :where(svg) {
294
+ color: var(--foreground) !important;
295
+ }
296
+
297
+ /* List / menu rows — Highlight brand color for selection */
298
+ & [data-slot="dropdown-menu-item"][data-highlighted],
299
+ & [data-slot="dropdown-menu-checkbox-item"][data-highlighted],
300
+ & [data-slot="dropdown-menu-radio-item"][data-highlighted],
301
+ & [data-slot="dropdown-menu-sub-trigger"][data-highlighted],
302
+ & [data-slot="select-item"][data-highlighted],
303
+ & [data-slot="command-item"][data-selected],
304
+ & [data-slot="command-item"][aria-selected="true"] {
305
+ background-color: var(--accent) !important;
306
+ color: var(--accent-foreground) !important;
307
+ }
308
+
309
+ & [data-slot="dropdown-menu-item"][data-highlighted] *,
310
+ & [data-slot="dropdown-menu-checkbox-item"][data-highlighted] *,
311
+ & [data-slot="dropdown-menu-radio-item"][data-highlighted] *,
312
+ & [data-slot="dropdown-menu-sub-trigger"][data-highlighted] *,
313
+ & [data-slot="select-item"][data-highlighted] *,
314
+ & [data-slot="command-item"][data-selected] *,
315
+ & [data-slot="command-item"][aria-selected="true"] * {
316
+ color: var(--accent-foreground) !important;
317
+ }
318
+
319
+ /* List hub views toolbar + segmented radiogroup (not Radix Tabs / tabs-list) */
320
+ & [data-slot="view-segmented-toolbar"] {
321
+ background-color: transparent !important;
322
+ border: 2px solid var(--foreground) !important;
323
+ }
324
+
325
+ & [data-slot="view-segmented-item"][aria-pressed="true"],
326
+ & [data-slot="view-segmented-item"][aria-checked="true"] {
327
+ background-color: var(--accent) !important;
328
+ color: var(--accent-foreground) !important;
329
+ outline: none !important;
330
+ }
331
+
332
+ /* Floating surfaces — portal menus, popovers, sheets, dialogs */
333
+ & [data-slot="dropdown-menu-content"],
334
+ & [data-slot="dropdown-menu-sub-content"],
335
+ & [data-slot="popover-content"],
336
+ & [data-slot="select-content"],
337
+ & [data-slot="dialog-content"],
338
+ & [data-slot="sheet-content"],
339
+ & [data-slot="drawer-content"] {
340
+ border: 2px solid var(--foreground) !important;
341
+ background-color: var(--background) !important;
342
+ color: var(--foreground) !important;
343
+ }
344
+
345
+ & [data-slot="command"] {
346
+ background-color: var(--background) !important;
347
+ color: var(--foreground) !important;
348
+ }
349
+
350
+ /* Strip conditional-formatting inline bg from table cells in HC */
351
+ & td[style*="background"] {
352
+ background: var(--dt-row-bg) !important;
353
+ }
354
+ & td.pinned-cell {
355
+ background-color: var(--dt-row-bg) !important;
356
+ }
357
+ & tr:hover td.pinned-cell,
358
+ & tr:hover td {
359
+ background-color: var(--dt-row-hover) !important;
360
+ }
361
+ & tr[data-state="selected"] td.pinned-cell,
362
+ & tr[data-state="selected"] td {
363
+ background-color: var(--dt-row-selected) !important;
364
+ color: var(--dt-row-selected-fg) !important;
365
+ }
366
+
367
+ /* Table selected rows — Highlight brand color (like MS Teams selection) */
368
+ & tr[data-state="selected"] {
369
+ background-color: var(--dt-row-selected) !important;
370
+ color: var(--dt-row-selected-fg) !important;
371
+ }
372
+ & tr[data-state="selected"] *:not([data-slot="checkbox"] *):not([data-slot="badge"] *):not([data-slot="checkbox"]):not([data-slot="badge"]) {
373
+ color: var(--accent-foreground) !important;
374
+ }
375
+ & tr[data-state="selected"] [data-slot="badge"] {
376
+ background-color: var(--accent-foreground) !important;
377
+ color: var(--accent) !important;
378
+ border-color: var(--accent-foreground) !important;
379
+ }
380
+ & tr[data-state="selected"] [data-slot="badge"] * {
381
+ color: var(--accent) !important;
382
+ }
383
+
384
+ & tr[data-state="selected"] [data-slot="checkbox"][data-state="checked"],
385
+ & tr[data-state="selected"] [data-slot="checkbox"][data-state="indeterminate"] {
386
+ background-color: var(--accent-foreground) !important;
387
+ border-color: var(--accent-foreground) !important;
388
+ color: var(--accent) !important;
389
+ }
390
+ & tr[data-state="selected"] [data-slot="checkbox"][data-state="checked"] *,
391
+ & tr[data-state="selected"] [data-slot="checkbox"][data-state="indeterminate"] * {
392
+ color: var(--accent) !important;
393
+ }
394
+ & tr[data-state="selected"] [data-slot="checkbox"]:not([data-state="checked"]):not([data-state="indeterminate"]) {
395
+ background-color: var(--accent) !important;
396
+ border-color: var(--accent-foreground) !important;
397
+ color: var(--accent-foreground) !important;
398
+ }
399
+
400
+ /* ── Pattern 2: Stronger focus ring (WCAG 2.4.11 / 2.4.12) ── */
401
+ & :focus-visible {
402
+ outline: 3px solid var(--ring) !important;
403
+ outline-offset: 3px !important;
404
+ }
405
+
406
+ /* ── Pattern 2: Error state — thick border + no colour-only signal ── */
407
+ & [aria-invalid="true"],
408
+ & [data-invalid] {
409
+ border-width: 3px !important;
410
+ border-color: var(--destructive) !important;
411
+ /* Downstream: pair with a ⚠ icon in the component for non-colour signal */
412
+ }
413
+
414
+ /* ── Pattern 3: Active nav — Highlight brand fill (like MS Teams) ── */
415
+ & [data-slot="sidebar-menu-button"][data-active="true"] {
416
+ background-color: var(--accent) !important;
417
+ color: var(--accent-foreground) !important;
418
+ outline: none !important;
419
+ }
420
+ & [data-slot="sidebar-menu-button"][data-active="true"] * {
421
+ color: var(--accent-foreground) !important;
422
+ }
423
+ & [data-slot="sidebar-menu-button"][data-active="true"] [data-slot="badge"],
424
+ & [data-slot="sidebar-menu-button"][data-active="true"] [data-slot="sidebar-menu-badge"] {
425
+ background-color: var(--accent-foreground) !important;
426
+ color: var(--accent) !important;
427
+ border-color: var(--accent-foreground) !important;
428
+ }
429
+ & [data-slot="sidebar-menu-button"][data-active="true"] [data-slot="badge"] *,
430
+ & [data-slot="sidebar-menu-button"][data-active="true"] [data-slot="sidebar-menu-badge"] * {
431
+ color: var(--accent) !important;
432
+ }
433
+ & [data-slot="toggle-group-item"][data-state="on"] {
434
+ outline: 2px solid var(--accent) !important;
435
+ outline-offset: -2px !important;
436
+ background-color: var(--accent) !important;
437
+ color: var(--accent-foreground) !important;
438
+ }
439
+
440
+ /* ── Pattern 3b: Checked checkboxes — Highlight brand fill ── */
441
+ & [data-slot="checkbox"][data-state="checked"],
442
+ & [data-slot="checkbox"][data-state="indeterminate"] {
443
+ background-color: var(--accent) !important;
444
+ border-color: var(--accent) !important;
445
+ color: var(--accent-foreground) !important;
446
+ }
447
+ & [data-slot="checkbox"][data-state="checked"] *,
448
+ & [data-slot="checkbox"][data-state="indeterminate"] * {
449
+ color: var(--accent-foreground) !important;
450
+ }
451
+
452
+ /* ── Pattern 3c: Checked radio buttons — Highlight brand fill ── */
453
+ & [data-slot="radio-group-item"][data-state="checked"] {
454
+ background-color: var(--accent) !important;
455
+ border-color: var(--accent) !important;
456
+ color: var(--accent-foreground) !important;
457
+ }
458
+ & [data-slot="radio-group-item"][data-state="checked"] [data-slot="radio-group-indicator"] span {
459
+ background-color: var(--accent-foreground) !important;
460
+ }
461
+
462
+ /* ── Pattern 3d: Toggle on state — Highlight brand fill ── */
463
+ & [data-slot="toggle"][data-state="on"] {
464
+ background-color: var(--accent) !important;
465
+ color: var(--accent-foreground) !important;
466
+ border: 2px solid var(--accent) !important;
467
+ }
468
+
469
+ /* ── Pattern 3e: Switch (toggle-switch) — visible track + knob ── */
470
+ & [role="switch"] {
471
+ border: 2px solid var(--foreground) !important;
472
+ background-color: var(--background) !important;
473
+ }
474
+ & [role="switch"][aria-checked="true"] {
475
+ background-color: var(--accent) !important;
476
+ border-color: var(--accent) !important;
477
+ }
478
+ & [role="switch"] > span {
479
+ background-color: var(--foreground) !important;
480
+ }
481
+ & [role="switch"][aria-checked="true"] > span {
482
+ background-color: var(--accent-foreground) !important;
483
+ }
484
+
485
+ /* ── Pattern 3f: Select / dropdown item focus — Highlight brand fill ── */
486
+ & [data-slot="select-item"]:focus,
487
+ & [data-slot="dropdown-menu-item"]:focus,
488
+ & [data-slot="dropdown-menu-checkbox-item"]:focus,
489
+ & [data-slot="dropdown-menu-radio-item"]:focus,
490
+ & [data-slot="dropdown-menu-sub-trigger"]:focus {
491
+ background-color: var(--accent) !important;
492
+ color: var(--accent-foreground) !important;
493
+ }
494
+ & [data-slot="select-item"]:focus *,
495
+ & [data-slot="dropdown-menu-item"]:focus *,
496
+ & [data-slot="dropdown-menu-checkbox-item"]:focus *,
497
+ & [data-slot="dropdown-menu-radio-item"]:focus *,
498
+ & [data-slot="dropdown-menu-sub-trigger"]:focus * {
499
+ color: var(--accent-foreground) !important;
500
+ }
501
+
502
+ /* ── Pattern 3g: Dropdown check / radio indicator — inherit from parent ── */
503
+ & [data-slot="dropdown-menu-checkbox-item"][data-state="checked"],
504
+ & [data-slot="dropdown-menu-radio-item"][data-state="checked"] {
505
+ font-weight: 700 !important;
506
+ }
507
+
508
+ /* ── Pattern 4: Board cards — border-defined, no decorative fills ── */
509
+ & [data-slot="board-card"] {
510
+ border: 2px solid var(--foreground) !important;
511
+ background-image: none !important;
512
+ }
513
+
514
+ /* ── Pattern 6: List hub status badges — border not fill ── */
515
+ & [data-slot="list-hub-status-badge"] {
516
+ border: 2px solid var(--foreground) !important;
517
+ background-color: var(--background) !important;
518
+ font-weight: 700 !important;
519
+ color: var(--foreground) !important;
520
+ }
521
+
522
+ /* ── Pattern 6b: List page calendar — grid head, week gutter, day cells, nav group ── */
523
+ & [data-slot="list-page-calendar"] {
524
+ border: 2px solid var(--foreground) !important;
525
+ }
526
+ & [data-slot="list-page-calendar-head"] {
527
+ border: 2px solid var(--foreground) !important;
528
+ border-top-width: 0 !important;
529
+ }
530
+ & [data-slot="list-page-calendar-head"],
531
+ & [data-slot="list-page-calendar-head-cell"] {
532
+ background-color: var(--dt-header-bg) !important;
533
+ border-color: var(--foreground) !important;
534
+ color: var(--foreground) !important;
535
+ font-weight: 700 !important;
536
+ }
537
+ & [data-slot="list-page-calendar-week"] {
538
+ background-color: var(--dt-header-bg) !important;
539
+ border-color: var(--foreground) !important;
540
+ color: var(--foreground) !important;
541
+ font-weight: 700 !important;
542
+ }
543
+ & [data-slot="list-page-calendar-day"] {
544
+ border-color: var(--foreground) !important;
545
+ background-color: var(--background) !important;
546
+ color: var(--foreground) !important;
547
+ }
548
+ & [data-slot="list-page-calendar-day"][data-today="true"] {
549
+ outline: 2px solid var(--accent) !important;
550
+ outline-offset: -2px !important;
551
+ background-color: var(--background) !important;
552
+ }
553
+ & [data-slot="list-page-calendar-day"][data-selected="true"] {
554
+ background-color: var(--accent) !important;
555
+ color: var(--accent-foreground) !important;
556
+ outline: 2px solid var(--accent) !important;
557
+ outline-offset: -2px !important;
558
+ }
559
+ & [data-slot="list-page-calendar-day"][data-selected="true"] * {
560
+ color: var(--accent-foreground) !important;
561
+ }
562
+ & [data-slot="list-page-calendar-week-row"] {
563
+ border-color: var(--foreground) !important;
564
+ }
565
+ & [data-slot="button-group"] > [data-slot="button"] {
566
+ border-width: 2px !important;
567
+ border-color: var(--foreground) !important;
568
+ border-radius: 0 !important;
569
+ }
570
+ & [data-slot="button-group"] > [data-slot="button"]:first-child {
571
+ border-radius: var(--radius-md) 0 0 var(--radius-md) !important;
572
+ }
573
+ & [data-slot="button-group"] > [data-slot="button"]:last-child {
574
+ border-radius: 0 var(--radius-md) var(--radius-md) 0 !important;
575
+ }
576
+ & [data-slot="button-group"] > [data-slot="button"]:not(:first-child) {
577
+ border-left-width: 2px !important;
578
+ margin-inline-start: -2px !important;
579
+ }
580
+
581
+ /* ── Pattern 7: Insight cards — border-based, strip gradient bg ── */
582
+ & [aria-label="Insight"],
583
+ & [data-slot="insight-card"] {
584
+ border: 2px solid var(--foreground) !important;
585
+ background-image: none !important;
586
+ background: var(--background) !important;
587
+ }
588
+
589
+ /* ── Pattern 8: Coach marks — strong border + readable text ── */
590
+ & [data-slot="coach-mark"] {
591
+ border: 2px solid var(--foreground) !important;
592
+ background: var(--background) !important;
593
+ background-color: var(--background) !important;
594
+ color: var(--foreground) !important;
595
+ background-image: none !important;
596
+ opacity: 1 !important;
597
+ }
598
+ & [data-slot="coach-mark"] *:not(button):not(button *) {
599
+ color: var(--foreground) !important;
600
+ }
601
+
602
+ /* ── Pattern 9: Avatars — thicken ring, strip blend modes, force contrast ── */
603
+ & [data-slot="avatar"] {
604
+ border: 2px solid var(--foreground) !important;
605
+ }
606
+ & [data-slot="avatar"]::after {
607
+ display: none !important;
608
+ }
609
+ & [data-slot="avatar-fallback"] {
610
+ background-color: var(--background) !important;
611
+ color: var(--foreground) !important;
612
+ }
613
+ & tr[data-state="selected"] [data-slot="avatar"] {
614
+ border-color: var(--accent-foreground) !important;
615
+ }
616
+ & tr[data-state="selected"] [data-slot="avatar-fallback"] {
617
+ background-color: var(--accent-foreground) !important;
618
+ color: var(--accent) !important;
619
+ }
620
+
621
+ /* ── Pattern 10: Breadcrumbs — ensure separators are visible ── */
622
+ & [data-slot="breadcrumb-separator"] {
623
+ color: var(--foreground) !important;
624
+ }
625
+ & [data-slot="breadcrumb-link"] {
626
+ color: var(--foreground) !important;
627
+ text-decoration: underline !important;
628
+ }
629
+ & [data-slot="breadcrumb-page"] {
630
+ color: var(--foreground) !important;
631
+ font-weight: 700 !important;
632
+ }
633
+
634
+ /* ── Pattern 11: Tooltip / popover arrow — match border ── */
635
+ & [data-slot="tooltip-content"] {
636
+ border: 2px solid var(--foreground) !important;
637
+ background-color: var(--background) !important;
638
+ color: var(--foreground) !important;
639
+ }
640
+
641
+ /* ── Pattern 12: Separator — visible in HC ── */
642
+ & [data-slot="separator"] {
643
+ background-color: var(--foreground) !important;
644
+ opacity: 1 !important;
645
+ }
646
+
647
+ /* ── Pattern 13: Strip ALL hardcoded Tailwind palette colors ──────────── */
648
+ & [data-slot="banner"],
649
+ & [data-slot="local-banner"] {
650
+ background-color: var(--background) !important;
651
+ background-image: none !important;
652
+ border: 2px solid var(--foreground) !important;
653
+ color: var(--foreground) !important;
654
+ }
655
+ & [data-slot="banner"] *,
656
+ & [data-slot="local-banner"] * {
657
+ color: var(--foreground) !important;
658
+ }
659
+
660
+ & .recharts-bar-rectangle,
661
+ & .recharts-funnel-trapezoid {
662
+ stroke: var(--background) !important;
663
+ stroke-width: 2 !important;
664
+ }
665
+
666
+ & [role="progressbar"] {
667
+ border: 1px solid var(--foreground) !important;
668
+ background-color: var(--background) !important;
669
+ }
670
+ & [role="progressbar"] > * {
671
+ background-color: var(--foreground) !important;
672
+ }
673
+
674
+ & [class*="text-emerald"],
675
+ & [class*="text-amber"],
676
+ & [class*="text-red-"],
677
+ & [class*="text-blue-"],
678
+ & [class*="text-green-"],
679
+ & [class*="text-yellow-"],
680
+ & [class*="text-slate-"],
681
+ & [class*="text-orange-"],
682
+ & [class*="text-pink-"],
683
+ & [class*="text-purple-"] {
684
+ color: var(--foreground) !important;
685
+ }
686
+
687
+ & [class*="text-brand"] {
688
+ color: var(--accent) !important;
689
+ }
690
+ & [class*="bg-brand"]:not([data-slot="coach-mark"]) {
691
+ background-color: var(--background) !important;
692
+ }
693
+ & [class*="border-brand"] {
694
+ border-color: var(--foreground) !important;
695
+ }
696
+
697
+ & [class*="bg-emerald"],
698
+ & [class*="bg-amber"],
699
+ & [class*="bg-red-"],
700
+ & [class*="bg-blue-"],
701
+ & [class*="bg-green-"],
702
+ & [class*="bg-yellow-"],
703
+ & [class*="bg-slate-"],
704
+ & [class*="bg-orange-"],
705
+ & [class*="bg-pink-"],
706
+ & [class*="bg-purple-"] {
707
+ background-color: var(--background) !important;
708
+ }
709
+
710
+ & [class*="border-emerald"],
711
+ & [class*="border-amber"],
712
+ & [class*="border-red-"],
713
+ & [class*="border-blue-"],
714
+ & [class*="border-green-"],
715
+ & [class*="border-yellow-"],
716
+ & [class*="border-slate-"],
717
+ & [class*="border-orange-"],
718
+ & [class*="border-pink-"],
719
+ & [class*="border-purple-"] {
720
+ border-color: var(--foreground) !important;
721
+ }
722
+ }
723
+
724
+ /* Coach mark HC override (top-level, outside nesting — bulletproof for portaled content) */
725
+ html:is([data-contrast="high"], [data-contrast="windows"]) [data-slot="coach-mark"] {
726
+ border: 2px solid var(--foreground) !important;
727
+ background: var(--background) !important;
728
+ background-color: var(--background) !important;
729
+ color: var(--foreground) !important;
730
+ background-image: none !important;
731
+ opacity: 1 !important;
732
+ }
733
+ html:is([data-contrast="high"], [data-contrast="windows"]) [data-slot="coach-mark"] *:not(button):not(button *) {
734
+ color: var(--foreground) !important;
735
+ }
736
+
737
+ /* ── OS-level "Increase Contrast" — macOS / iOS / Android ───────────────── */
738
+ @media (prefers-contrast: more) {
739
+ :root:not([data-contrast="off"]):not([data-contrast="windows"]) {
740
+ --foreground: oklch(0.06 0 0);
741
+ --muted-foreground: oklch(0.10 0 0);
742
+ --border: oklch(0.10 0 0);
743
+ --border-control: oklch(0.06 0 0);
744
+ --border-control-35: oklch(0.06 0 0);
745
+ --border-control-3: oklch(0.06 0 0);
746
+ --ring: oklch(0.06 0 0);
747
+ }
748
+ .dark:not([data-contrast="off"]):not([data-contrast="windows"]) {
749
+ --foreground: oklch(1 0 0);
750
+ --muted-foreground: oklch(0.88 0 0);
751
+ --border: oklch(1 0 0);
752
+ --border-control: oklch(0.88 0 0);
753
+ --border-control-35: oklch(0.88 0 0);
754
+ --border-control-3: oklch(0.88 0 0);
755
+ --ring: oklch(0.97 0.19 110); /* neon yellow on dark */
756
+ }
757
+ }
758
+
759
+ /* ── Windows Forced Colors (High Contrast Mode in OS) ───────────────────── */
760
+ /* When `forced-colors: active`, Windows REPLACES our colours entirely. */
761
+ /* Our job: map semantic roles to system palette keywords so the OS */
762
+ /* colouring makes sense, and ensure borders/outlines remain visible. */
763
+ @media (forced-colors: active) {
764
+ :root {
765
+ --border: CanvasText;
766
+ --border-control: CanvasText;
767
+ --border-control-35: CanvasText;
768
+ --border-control-3: CanvasText;
769
+ --ring: Highlight;
770
+ --destructive: LinkText;
771
+ }
772
+
773
+ /* Always show a 2px outline so focus is forced-color-safe */
774
+ :focus-visible {
775
+ outline: 2px solid Highlight !important;
776
+ outline-offset: 2px !important;
777
+ }
778
+
779
+ body {
780
+ background-color: Canvas;
781
+ color: CanvasText;
782
+ }
783
+
784
+ a { color: LinkText; }
785
+ button { border: 1px solid ButtonText !important; }
786
+
787
+ /* Cards: OS strips bg fills — add explicit border so shape is preserved */
788
+ [data-slot="card"],
789
+ .card {
790
+ border: 2px solid CanvasText !important;
791
+ }
792
+
793
+ /* Sidebar edge */
794
+ [data-slot="sidebar"] {
795
+ border-inline-end: 2px solid CanvasText !important;
796
+ }
797
+
798
+ /* Wrapper-only sidebar badge (no inner Badge) — rare; keep single ring */
799
+ [data-slot="sidebar-menu-badge"]:not(:has([data-slot="badge"])) {
800
+ border: 2px solid CanvasText !important;
801
+ background-color: Canvas !important;
802
+ color: CanvasText !important;
803
+ outline: none !important;
804
+ box-shadow: none !important;
805
+ }
806
+
807
+ /* Positioning shell around <Badge/> — do not draw a second ring */
808
+ [data-slot="sidebar-menu-badge"]:has([data-slot="badge"]) {
809
+ border: none !important;
810
+ background: transparent !important;
811
+ outline: none !important;
812
+ box-shadow: none !important;
813
+ }
814
+
815
+ [data-slot="badge"],
816
+ [data-slot="view-toolbar-count"] {
817
+ border: 2px solid CanvasText !important;
818
+ background-color: Canvas !important;
819
+ color: CanvasText !important;
820
+ outline: none !important;
821
+ box-shadow: none !important;
822
+ }
823
+
824
+ [data-slot="badge"] *,
825
+ [data-slot="view-toolbar-count"] * {
826
+ color: CanvasText !important;
827
+ }
828
+
829
+ /* Avoid button chrome + inner count pill = double border */
830
+ button[data-slot="view-segmented-item"] {
831
+ border: none !important;
832
+ }
833
+
834
+ /* Radix Tabs (ChartCard, library, etc.) — gray inactive + invisible active in OS HC */
835
+ [data-slot="tabs-list"] {
836
+ border: 2px solid CanvasText !important;
837
+ background-color: transparent !important;
838
+ }
839
+
840
+ [data-slot="tabs-trigger"] {
841
+ color: CanvasText !important;
842
+ background-color: transparent !important;
843
+ opacity: 1 !important;
844
+ }
845
+
846
+ [data-slot="tabs-trigger"][data-state="active"] {
847
+ background-color: Highlight !important;
848
+ color: HighlightText !important;
849
+ outline: none !important;
850
+ font-weight: 600 !important;
851
+ }
852
+
853
+ /* Key metrics strip — labels/values/trend icons must not stay muted */
854
+ [data-slot="key-metrics"] :where(span, p, button, a, i, label, div) {
855
+ color: CanvasText !important;
856
+ }
857
+
858
+ /* Menu / select / command palette — accent fill is often low-contrast in forced mode */
859
+ [data-slot="dropdown-menu-item"][data-highlighted]:not([data-disabled]),
860
+ [data-slot="dropdown-menu-checkbox-item"][data-highlighted]:not([data-disabled]),
861
+ [data-slot="dropdown-menu-radio-item"][data-highlighted]:not([data-disabled]),
862
+ [data-slot="dropdown-menu-sub-trigger"][data-highlighted]:not([data-disabled]),
863
+ [data-slot="select-item"][data-highlighted]:not([data-disabled]),
864
+ [data-slot="command-item"][data-selected]:not([data-disabled]),
865
+ [data-slot="command-item"][aria-selected="true"]:not([data-disabled]) {
866
+ background-color: Highlight !important;
867
+ color: HighlightText !important;
868
+ }
869
+
870
+ [data-slot="dropdown-menu-item"][data-highlighted] *,
871
+ [data-slot="dropdown-menu-checkbox-item"][data-highlighted] *,
872
+ [data-slot="dropdown-menu-radio-item"][data-highlighted] *,
873
+ [data-slot="dropdown-menu-sub-trigger"][data-highlighted] *,
874
+ [data-slot="select-item"][data-highlighted] *,
875
+ [data-slot="command-item"][data-selected] *,
876
+ [data-slot="command-item"][aria-selected="true"] * {
877
+ color: HighlightText !important;
878
+ }
879
+
880
+ /* Views toolbar (list hubs) + segmented radiogroup — selection via outline, not fill */
881
+ [data-slot="view-segmented-toolbar"] {
882
+ border: 2px solid CanvasText !important;
883
+ background: transparent !important;
884
+ }
885
+
886
+ [data-slot="view-segmented-item"] {
887
+ color: CanvasText !important;
888
+ background: transparent !important;
889
+ }
890
+
891
+ [data-slot="view-segmented-item"][aria-pressed="true"],
892
+ [data-slot="view-segmented-item"][aria-checked="true"] {
893
+ background-color: Highlight !important;
894
+ color: HighlightText !important;
895
+ outline: none !important;
896
+ }
897
+
898
+ /* Sidebar active item — Highlight brand fill */
899
+ [data-slot="sidebar-menu-button"][data-active="true"] {
900
+ background-color: Highlight !important;
901
+ color: HighlightText !important;
902
+ outline: none !important;
903
+ }
904
+ [data-slot="sidebar-menu-button"][data-active="true"] * {
905
+ color: HighlightText !important;
906
+ }
907
+ [data-slot="sidebar-menu-button"][data-active="true"] [data-slot="badge"],
908
+ [data-slot="sidebar-menu-button"][data-active="true"] [data-slot="sidebar-menu-badge"] {
909
+ background-color: HighlightText !important;
910
+ color: Highlight !important;
911
+ border-color: HighlightText !important;
912
+ }
913
+ [data-slot="sidebar-menu-button"][data-active="true"] [data-slot="badge"] *,
914
+ [data-slot="sidebar-menu-button"][data-active="true"] [data-slot="sidebar-menu-badge"] * {
915
+ color: Highlight !important;
916
+ }
917
+
918
+ /* Strip conditional-formatting inline bg in forced-colors */
919
+ td[style*="background"] {
920
+ background: Canvas !important;
921
+ }
922
+ td.pinned-cell {
923
+ background-color: Canvas !important;
924
+ }
925
+ tr:hover td,
926
+ tr:hover td.pinned-cell {
927
+ background-color: Highlight !important;
928
+ color: HighlightText !important;
929
+ }
930
+
931
+ /* Table selected rows — Highlight brand fill */
932
+ tr[data-state="selected"] {
933
+ background-color: Highlight !important;
934
+ color: HighlightText !important;
935
+ }
936
+ tr[data-state="selected"] td {
937
+ background: Highlight !important;
938
+ background-color: Highlight !important;
939
+ color: HighlightText !important;
940
+ }
941
+ tr[data-state="selected"] *:not([data-slot="checkbox"] *):not([data-slot="badge"] *):not([data-slot="checkbox"]):not([data-slot="badge"]) {
942
+ color: HighlightText !important;
943
+ }
944
+ tr[data-state="selected"] [data-slot="checkbox"][data-state="checked"],
945
+ tr[data-state="selected"] [data-slot="checkbox"][data-state="indeterminate"] {
946
+ background-color: HighlightText !important;
947
+ border-color: HighlightText !important;
948
+ color: Highlight !important;
949
+ }
950
+ tr[data-state="selected"] [data-slot="checkbox"][data-state="checked"] *,
951
+ tr[data-state="selected"] [data-slot="checkbox"][data-state="indeterminate"] * {
952
+ color: Highlight !important;
953
+ }
954
+ tr[data-state="selected"] [data-slot="checkbox"]:not([data-state="checked"]):not([data-state="indeterminate"]) {
955
+ background-color: Highlight !important;
956
+ border-color: HighlightText !important;
957
+ color: HighlightText !important;
958
+ }
959
+ tr[data-state="selected"] [data-slot="badge"] {
960
+ background-color: HighlightText !important;
961
+ color: Highlight !important;
962
+ border-color: HighlightText !important;
963
+ }
964
+ tr[data-state="selected"] [data-slot="badge"] * {
965
+ color: Highlight !important;
966
+ }
967
+ tr[data-state="selected"] [data-slot="avatar"] {
968
+ border-color: HighlightText !important;
969
+ }
970
+ tr[data-state="selected"] [data-slot="avatar-fallback"] {
971
+ background-color: HighlightText !important;
972
+ color: Highlight !important;
973
+ }
974
+ /* Badge in forced-colors — opaque canvas bg */
975
+ [data-slot="badge"] {
976
+ background-color: Canvas !important;
977
+ border-color: CanvasText !important;
978
+ color: CanvasText !important;
979
+ }
980
+
981
+ /* Checked checkboxes — Highlight fill */
982
+ [data-slot="checkbox"][data-state="checked"] *,
983
+ [data-slot="checkbox"][data-state="indeterminate"] * {
984
+ color: HighlightText !important;
985
+ }
986
+
987
+ /* Avatar in forced-colors */
988
+ [data-slot="avatar"] {
989
+ border: 2px solid CanvasText !important;
990
+ }
991
+ [data-slot="avatar"]::after {
992
+ display: none !important;
993
+ }
994
+ [data-slot="avatar-fallback"] {
995
+ background-color: Canvas !important;
996
+ color: CanvasText !important;
997
+ }
998
+
999
+ /* Checked checkboxes / radios — Highlight fill */
1000
+ [data-slot="checkbox"][data-state="checked"],
1001
+ [data-slot="checkbox"][data-state="indeterminate"] {
1002
+ background-color: Highlight !important;
1003
+ border-color: Highlight !important;
1004
+ color: HighlightText !important;
1005
+ }
1006
+ [data-slot="radio-group-item"][data-state="checked"] {
1007
+ background-color: Highlight !important;
1008
+ border-color: Highlight !important;
1009
+ }
1010
+
1011
+ /* Switch ON — Highlight fill */
1012
+ [role="switch"][aria-checked="true"] {
1013
+ background-color: Highlight !important;
1014
+ border-color: Highlight !important;
1015
+ }
1016
+ [role="switch"][aria-checked="true"] > span {
1017
+ background-color: HighlightText !important;
1018
+ }
1019
+
1020
+ /* Toggle ON — Highlight fill */
1021
+ [data-slot="toggle"][data-state="on"],
1022
+ [data-slot="toggle-group-item"][data-state="on"] {
1023
+ background-color: Highlight !important;
1024
+ color: HighlightText !important;
1025
+ border-color: Highlight !important;
1026
+ }
1027
+
1028
+ /* Progress bars — bordered track with CanvasText fill */
1029
+ [role="progressbar"] {
1030
+ border: 1px solid CanvasText !important;
1031
+ background-color: Canvas !important;
1032
+ }
1033
+ [role="progressbar"] > * {
1034
+ background-color: CanvasText !important;
1035
+ }
1036
+
1037
+ /* Portal overlays — explicit Canvas pairing (OS often strips popover fills) */
1038
+ [data-slot="dropdown-menu-content"],
1039
+ [data-slot="dropdown-menu-sub-content"],
1040
+ [data-slot="popover-content"],
1041
+ [data-slot="select-content"],
1042
+ [data-slot="dialog-content"],
1043
+ [data-slot="sheet-content"],
1044
+ [data-slot="drawer-content"] {
1045
+ border: 2px solid CanvasText !important;
1046
+ background-color: Canvas !important;
1047
+ color: CanvasText !important;
1048
+ }
1049
+
1050
+ [data-slot="command"] {
1051
+ background-color: Canvas !important;
1052
+ color: CanvasText !important;
1053
+ }
1054
+
1055
+ /* Board cards — border-defined shape when fills are stripped */
1056
+ [data-slot="board-card"] {
1057
+ border: 2px solid CanvasText !important;
1058
+ background-color: Canvas !important;
1059
+ color: CanvasText !important;
1060
+ }
1061
+
1062
+ [data-slot="secondary-panel"] {
1063
+ border: 2px solid CanvasText !important;
1064
+ background-color: Canvas !important;
1065
+ color: CanvasText !important;
1066
+ }
1067
+
1068
+ /* List hub status badges — border-only, text readable */
1069
+ [data-slot="list-hub-status-badge"] {
1070
+ border: 2px solid CanvasText !important;
1071
+ background-color: Canvas !important;
1072
+ color: CanvasText !important;
1073
+ font-weight: 700 !important;
1074
+ }
1075
+
1076
+ [data-slot="list-page-calendar"],
1077
+ [data-slot="list-page-calendar-head"],
1078
+ [data-slot="list-page-calendar-head-cell"],
1079
+ [data-slot="list-page-calendar-week"],
1080
+ [data-slot="list-page-calendar-day"],
1081
+ [data-slot="list-page-calendar-week-row"] {
1082
+ border-color: CanvasText !important;
1083
+ color: CanvasText !important;
1084
+ }
1085
+ [data-slot="list-page-calendar-head"],
1086
+ [data-slot="list-page-calendar-head-cell"],
1087
+ [data-slot="list-page-calendar-week"] {
1088
+ background-color: Canvas !important;
1089
+ font-weight: 700 !important;
1090
+ }
1091
+ [data-slot="list-page-calendar-day"] {
1092
+ background-color: Canvas !important;
1093
+ }
1094
+ [data-slot="list-page-calendar-day"][data-selected="true"] {
1095
+ background-color: Highlight !important;
1096
+ color: HighlightText !important;
1097
+ }
1098
+ [data-slot="button-group"] > [data-slot="button"] {
1099
+ border: 2px solid CanvasText !important;
1100
+ background-color: Canvas !important;
1101
+ color: CanvasText !important;
1102
+ }
1103
+
1104
+ /* Insight cards — strip gradient, add border */
1105
+ [aria-label="Insight"],
1106
+ [data-slot="insight-card"] {
1107
+ border: 2px solid CanvasText !important;
1108
+ background: Canvas !important;
1109
+ color: CanvasText !important;
1110
+ }
1111
+
1112
+ /* Coach marks / guided tours */
1113
+ [data-slot="coach-mark"] {
1114
+ border: 2px solid CanvasText !important;
1115
+ background-color: Canvas !important;
1116
+ color: CanvasText !important;
1117
+ }
1118
+ [data-slot="coach-mark"] * {
1119
+ color: CanvasText !important;
1120
+ }
1121
+
1122
+ /* Avatars — thicken existing ::after ring */
1123
+ [data-slot="avatar"]::after {
1124
+ border-width: 2px !important;
1125
+ border-color: CanvasText !important;
1126
+ }
1127
+
1128
+ /* Breadcrumbs */
1129
+ [data-slot="breadcrumb-separator"] {
1130
+ color: CanvasText !important;
1131
+ }
1132
+ [data-slot="breadcrumb-link"] {
1133
+ color: LinkText !important;
1134
+ }
1135
+ [data-slot="breadcrumb-page"] {
1136
+ color: CanvasText !important;
1137
+ font-weight: 700 !important;
1138
+ }
1139
+
1140
+ /* Tooltip */
1141
+ [data-slot="tooltip-content"] {
1142
+ border: 2px solid CanvasText !important;
1143
+ background-color: Canvas !important;
1144
+ color: CanvasText !important;
1145
+ }
1146
+
1147
+ /* Export drawer */
1148
+ [data-slot="export-drawer"] {
1149
+ border: 2px solid CanvasText !important;
1150
+ background-color: Canvas !important;
1151
+ color: CanvasText !important;
1152
+ }
1153
+
1154
+ /* Separators */
1155
+ [data-slot="separator"] {
1156
+ background-color: CanvasText !important;
1157
+ opacity: 1 !important;
1158
+ }
1159
+
1160
+ /* Charts — forced-colors strips SVG fills; add stroke as fallback */
1161
+ svg path, svg rect, svg circle {
1162
+ forced-color-adjust: none;
1163
+ }
1164
+
1165
+ /* Recharts radial bars, lines, and area — explicit stroke fallbacks */
1166
+ .recharts-radial-bar-sector,
1167
+ .recharts-line-curve,
1168
+ .recharts-area-curve {
1169
+ forced-color-adjust: none;
1170
+ stroke: CanvasText !important;
1171
+ }
1172
+
1173
+ .recharts-radial-bar-background-sector {
1174
+ forced-color-adjust: none;
1175
+ fill: Canvas !important;
1176
+ stroke: GrayText !important;
1177
+ }
1178
+
1179
+ .recharts-cartesian-axis-tick-value {
1180
+ fill: CanvasText !important;
1181
+ }
1182
+
1183
+ .recharts-cartesian-grid line {
1184
+ stroke: GrayText !important;
1185
+ }
1186
+
1187
+ .recharts-legend-item-text {
1188
+ color: CanvasText !important;
1189
+ }
1190
+
1191
+ .recharts-tooltip-wrapper {
1192
+ border: 2px solid CanvasText !important;
1193
+ background-color: Canvas !important;
1194
+ }
1195
+ }