@juspay/svelte-ui-components 4.27.6 → 4.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +140 -36
  2. package/dist/Animations/ModalAnimation.svelte +15 -1
  3. package/dist/Animations/OverlayAnimation.svelte +7 -1
  4. package/dist/AreaChart/AreaChart.svelte +366 -85
  5. package/dist/AspectRatio/AspectRatio.svelte +51 -0
  6. package/dist/AspectRatio/AspectRatio.svelte.d.ts +3 -0
  7. package/dist/AspectRatio/properties.d.ts +27 -0
  8. package/dist/AspectRatio/properties.js +1 -0
  9. package/dist/Banner/Banner.svelte +10 -4
  10. package/dist/Banner/properties.d.ts +8 -0
  11. package/dist/BarChart/BarChart.svelte +156 -49
  12. package/dist/Book/Book.svelte +14 -1
  13. package/dist/BrandLoader/BrandLoader.svelte +76 -12
  14. package/dist/Button/Button.svelte +56 -11
  15. package/dist/Calendar/Calendar.svelte +88 -61
  16. package/dist/Card/Card.svelte +1 -1
  17. package/dist/Carousel/Carousel.svelte +6 -3
  18. package/dist/ChatComposer/ChatComposer.svelte +54 -4
  19. package/dist/ChatComposer/dictationState.d.ts +15 -0
  20. package/dist/ChatComposer/dictationState.js +9 -0
  21. package/dist/ChatComposer/properties.d.ts +28 -1
  22. package/dist/ChatMessage/ChatMessage.svelte +27 -1
  23. package/dist/CheckListItem/CheckListItem.svelte +3 -3
  24. package/dist/Checkbox/Checkbox.svelte +84 -3
  25. package/dist/Checkbox/properties.d.ts +45 -13
  26. package/dist/ChipInput/ChipInput.svelte +70 -3
  27. package/dist/ChipInput/properties.d.ts +16 -0
  28. package/dist/Choicebox/Choicebox.svelte +156 -1
  29. package/dist/Choicebox/group.d.ts +63 -0
  30. package/dist/Choicebox/group.js +127 -0
  31. package/dist/Choicebox/properties.d.ts +46 -0
  32. package/dist/ColorPicker/ColorPicker.svelte +169 -20
  33. package/dist/ColorPicker/properties.d.ts +16 -0
  34. package/dist/Combobox/Combobox.svelte +87 -25
  35. package/dist/Combobox/properties.d.ts +23 -0
  36. package/dist/CommandMenu/CommandMenu.svelte +27 -11
  37. package/dist/ContextMenu/ContextMenu.svelte +31 -37
  38. package/dist/DateRangePicker/DateRangePicker.svelte +171 -73
  39. package/dist/DeltaIndicator/DeltaIndicator.svelte +3 -3
  40. package/dist/Draggable/Draggable.svelte +12 -7
  41. package/dist/DualAxisBarChart/DualAxisBarChart.svelte +11 -4
  42. package/dist/EmptyState/EmptyState.svelte +1 -1
  43. package/dist/FileDropzoneTrigger/FileDropzoneTrigger.svelte +1 -1
  44. package/dist/FileInput/FileInput.svelte +50 -1
  45. package/dist/FileInput/properties.d.ts +7 -0
  46. package/dist/FunnelChart/FunnelChart.svelte +40 -12
  47. package/dist/FunnelChart/properties.d.ts +7 -1
  48. package/dist/Gallery/Gallery.svelte +20 -13
  49. package/dist/Gallery/properties.d.ts +8 -0
  50. package/dist/GridItem/GridItem.svelte +31 -1
  51. package/dist/HITL/HITL.svelte +35 -9
  52. package/dist/Icon/Icon.svelte +19 -3
  53. package/dist/Input/Input.svelte +24 -10
  54. package/dist/Input/properties.d.ts +37 -1
  55. package/dist/InputButton/InputButton.svelte +86 -11
  56. package/dist/InputButton/properties.d.ts +10 -1
  57. package/dist/Label/Label.svelte +54 -0
  58. package/dist/Label/Label.svelte.d.ts +3 -0
  59. package/dist/Label/properties.d.ts +26 -0
  60. package/dist/Label/properties.js +1 -0
  61. package/dist/LineChart/LineChart.svelte +385 -94
  62. package/dist/ListItem/ListItem.svelte +121 -15
  63. package/dist/Loader/Loader.svelte +22 -2
  64. package/dist/LoadingDots/LoadingDots.svelte +21 -0
  65. package/dist/MediaUpload/MediaUpload.svelte +13 -3
  66. package/dist/Menu/Menu.svelte +56 -28
  67. package/dist/Modal/Modal.svelte +77 -42
  68. package/dist/Pagination/Pagination.svelte +9 -2
  69. package/dist/Phone/Phone.svelte +4 -0
  70. package/dist/PieChart/PieChart.svelte +282 -38
  71. package/dist/PieChart/properties.d.ts +9 -0
  72. package/dist/Pill/Pill.svelte +14 -5
  73. package/dist/Progress/Progress.svelte +20 -0
  74. package/dist/Radio/Radio.svelte +58 -1
  75. package/dist/Radio/properties.d.ts +23 -0
  76. package/dist/RatingGroup/RatingGroup.svelte +283 -0
  77. package/dist/RatingGroup/RatingGroup.svelte.d.ts +4 -0
  78. package/dist/RatingGroup/properties.d.ts +73 -0
  79. package/dist/RatingGroup/properties.js +1 -0
  80. package/dist/RelativeTime/RelativeTime.svelte +1 -1
  81. package/dist/SankeyChart/SankeyChart.svelte +272 -50
  82. package/dist/SankeyChart/properties.d.ts +9 -0
  83. package/dist/Scroller/Scroller.svelte +37 -2
  84. package/dist/Select/Select.svelte +166 -46
  85. package/dist/Select/properties.d.ts +7 -0
  86. package/dist/Separator/Separator.svelte +48 -0
  87. package/dist/Separator/Separator.svelte.d.ts +3 -0
  88. package/dist/Separator/properties.d.ts +22 -0
  89. package/dist/Separator/properties.js +1 -0
  90. package/dist/Sheet/Sheet.svelte +60 -21
  91. package/dist/Shimmer/Shimmer.svelte +15 -0
  92. package/dist/Slider/Slider.svelte +87 -6
  93. package/dist/Slider/properties.d.ts +26 -0
  94. package/dist/Snippet/Snippet.svelte +4 -0
  95. package/dist/Snippet/copyState.svelte.d.ts +13 -1
  96. package/dist/Snippet/copyState.svelte.js +27 -1
  97. package/dist/Snippet/properties.d.ts +7 -0
  98. package/dist/SoundKit/SoundKit.js +9 -8
  99. package/dist/SplitInput/SplitInput.svelte +68 -2
  100. package/dist/SplitInput/properties.d.ts +23 -0
  101. package/dist/StatCard/StatCard.svelte +6 -6
  102. package/dist/Status/Status.svelte +2 -2
  103. package/dist/Stepper/Step.svelte +19 -6
  104. package/dist/Stepper/Stepper.svelte +108 -35
  105. package/dist/Table/BuiltinCell.svelte +2 -2
  106. package/dist/Table/Table.svelte +373 -55
  107. package/dist/Table/properties.d.ts +134 -3
  108. package/dist/Tabs/Tabs.svelte +263 -65
  109. package/dist/Tabs/properties.d.ts +23 -0
  110. package/dist/TaskList/TaskList.svelte +14 -5
  111. package/dist/ThemeSwitcher/ThemeSwitcher.svelte +23 -0
  112. package/dist/ThinkingIndicator/ThinkingIndicator.svelte +13 -5
  113. package/dist/Toast/Toast.svelte +27 -2
  114. package/dist/Toggle/Toggle.svelte +79 -7
  115. package/dist/Toggle/Toggle.svelte.d.ts +1 -1
  116. package/dist/Toggle/properties.d.ts +30 -7
  117. package/dist/ToolCallLog/ToolCallLog.svelte +59 -21
  118. package/dist/ToolCallLog/properties.d.ts +10 -0
  119. package/dist/Toolbar/Toolbar.svelte +1 -1
  120. package/dist/Tooltip/Tooltip.svelte +20 -2
  121. package/dist/Tooltip/tooltip-action.js +39 -4
  122. package/dist/TypewriterText/TypewriterText.svelte +34 -2
  123. package/dist/TypewriterText/properties.d.ts +18 -5
  124. package/dist/_chart/ChartContainer.svelte +12 -0
  125. package/dist/_chart/ChartTooltip.svelte +18 -4
  126. package/dist/_chart/Legend.svelte +21 -0
  127. package/dist/_chart/Legend.svelte.d.ts +15 -0
  128. package/dist/_chart/geometry.d.ts +54 -1
  129. package/dist/_chart/geometry.js +122 -14
  130. package/dist/_chart/interactions.d.ts +5 -1
  131. package/dist/_chart/interactions.js +9 -5
  132. package/dist/_chart/scales.js +16 -0
  133. package/dist/_chart/temporal.d.ts +45 -0
  134. package/dist/_chart/temporal.js +116 -0
  135. package/dist/_field/description.d.ts +50 -0
  136. package/dist/_field/description.js +51 -0
  137. package/dist/_interaction/dismissal.d.ts +67 -0
  138. package/dist/_interaction/dismissal.js +137 -0
  139. package/dist/_interaction/focus.d.ts +73 -0
  140. package/dist/_interaction/focus.js +143 -0
  141. package/dist/assets/star.svg +5 -0
  142. package/dist/index.d.ts +13 -1
  143. package/dist/index.js +21 -1
  144. package/dist/reduced-motion.svelte.d.ts +37 -0
  145. package/dist/reduced-motion.svelte.js +44 -0
  146. package/dist/styles/theme-dark.css +778 -0
  147. package/dist/types.d.ts +4 -2
  148. package/dist/utils.d.ts +62 -1
  149. package/dist/utils.js +80 -21
  150. package/dist-codemod/{bin.js → codemod/bin.js} +13 -2
  151. package/dist-codemod/{cli.js → codemod/cli.js} +48 -3
  152. package/dist-codemod/codemod/migrate-audit.js +395 -0
  153. package/dist-codemod/codemod/migration-assets/legacy-display.css +120 -0
  154. package/dist-codemod/codemod/migration-assets/legacy-palette.css +106 -0
  155. package/dist-codemod/codemod/migration-assets/wc-display.json +492 -0
  156. package/dist-codemod/migrate/analyze.js +804 -0
  157. package/dist-codemod/migrate/chart-tooltip-selector.js +301 -0
  158. package/dist-wc/index.js +13992 -4323
  159. package/package.json +13 -6
  160. package/dist/Modal/focus-trap.d.ts +0 -42
  161. package/dist/Modal/focus-trap.js +0 -57
  162. /package/dist-codemod/{legacy-pairs.js → codemod/legacy-pairs.js} +0 -0
  163. /package/dist-codemod/{transform.js → codemod/transform.js} +0 -0
  164. /package/dist-codemod/{wc-children.js → codemod/wc-children.js} +0 -0
@@ -0,0 +1,778 @@
1
+ /* ============================================================================
2
+ Dark theme for @juspay/svelte-ui-components.
3
+
4
+ Every colour in every component is authored as `var(--x, <light literal>)`,
5
+ so the library's defaults are light all the way through. The library also
6
+ ships a ThemeSwitcher that stamps data-theme="dark" on <html>. Until this
7
+ file existed those two facts did not meet: a consumer who dropped in the
8
+ switcher got a dark page with light components on it -- white table cells,
9
+ #333 labels on a near-black ground, a white Select on every route. A sweep of
10
+ 98 routes measured 1820 text instances below their WCAG threshold in dark
11
+ mode across 107 distinct classes, the worst at 1.01:1.
12
+
13
+ That was never a hundred bugs. It was one bug shaped like a hundred, and this
14
+ is the one place it gets fixed. Import it to opt a whole app into dark mode:
15
+
16
+ import '@juspay/svelte-ui-components/theme-dark.css';
17
+
18
+ Custom properties are inherited, and inheritance crosses a shadow boundary --
19
+ verified against a live sui-input, whose inner <input> repaints from a rule
20
+ set on the document root. So this file themes the <sui-*> custom elements
21
+ too, which no stylesheet could do if it had to reach them by selector.
22
+
23
+ Anything declared here must clear 4.5:1 (3:1 for large text) against the
24
+ surface it lands on; scripts/check-css-contract.js fails the build when a
25
+ component grows a light colour default with no entry here.
26
+ ============================================================================ */
27
+
28
+ /* ============================================================================
29
+ Chat family — dark theme.
30
+ The components ship light literals as their token fallbacks (the library
31
+ convention); theming is the consumer's job, and on this site that consumer
32
+ is the demo shell. Without these, dark mode renders the chat surfaces with
33
+ their light defaults — white composer on a near-black page, #27272a
34
+ responder text on #0f0f17.
35
+ ============================================================================ */
36
+ [data-theme='dark'] {
37
+ /* Table -- the component's defaults are light all the way through: white
38
+ cells, a #f9fafb header, a white search field. An earlier pass pinned the
39
+ cell background to #ffffff so its dark text stayed readable; that fixed the
40
+ contrast and left a glaring white slab sitting on a dark page. The right
41
+ lever was always these variables -- the component exposes every one of
42
+ them, nothing had ever set them. */
43
+ --table-content-background: #1a1a26;
44
+ --table-content-color: #d1d5db;
45
+ --table-header-background: #1e1e2e;
46
+ --table-header-color: #9ca3af;
47
+ --table-border: 1px solid #2a2a3c;
48
+ --table-row-border: 1px solid #232335;
49
+ --table-row-hover-background: #232335;
50
+ --table-row-alt-background: #1e1e2e;
51
+ --table-row-selected-background: #1e1b4b;
52
+ --table-col-highlight-background: #1e1b3a;
53
+ --table-summary-row-background: #1e1e2e;
54
+ --table-scroll-scrim-color: #1a1a26;
55
+
56
+ --table-search-background: #1e1e2e;
57
+ --table-search-color: #d1d5db;
58
+ --table-search-placeholder-color: #9ca3af;
59
+ --table-search-icon-color: #9ca3af;
60
+ --table-search-clear-color: #9ca3af;
61
+ --table-search-clear-hover-color: #f3f4f6;
62
+ --table-search-clear-hover-background: rgb(255 255 255 / 8%);
63
+
64
+ /* Both #6b7280, tuned for a white surface: ~3.9:1 on the dark footer and
65
+ 3.56:1 on the newly-dark cells. Theming a surface means theming what
66
+ sits on it. */
67
+ --table-paginator-range-color: #9ca3af;
68
+ --table-row-number-color: #9ca3af;
69
+
70
+ /* Mobile record cards: the per-cell label span mirrors
71
+ --table-header-color's dark value, since it is standing in for the
72
+ header text at the width where the header row itself is visually
73
+ hidden. The card border mirrors --table-border for the same reason
74
+ scripts/check-css-contract.js does not itself require it here: a
75
+ "1px solid #e5e7eb" fallback never automatically qualifies (its value
76
+ isn't a bare hex colour), but leaving it light-only would still put a
77
+ light-grey card outline on this same dark page. */
78
+ --table-mobile-label-color: #9ca3af;
79
+ --table-mobile-card-border: 1px solid #2a2a3c;
80
+ }
81
+
82
+ [data-theme='dark'] {
83
+ /* Select -- the component's own defaults are light (#ffffff trigger,
84
+ #cccccc border, #333333 text) and nothing here had ever overridden them,
85
+ so every Select on every route rendered as a white box on the dark page. */
86
+ --select-color: #d1d5db;
87
+ --select-trigger-background: #1e1e2e;
88
+ --select-trigger-border: 1px solid #2a2a3c;
89
+ --select-trigger-hover-border-color: #3f3f57;
90
+ --select-trigger-pressed-background: #252535;
91
+ --select-placeholder-color: #9ca3af;
92
+ --select-arrow-color: #9ca3af;
93
+ --select-clear-color: #9ca3af;
94
+ --select-clear-hover-background: #252535;
95
+ --select-clear-hover-color: #e5e7eb;
96
+ --select-dropdown-background: #1e1e2e;
97
+ --select-dropdown-border: 1px solid #2a2a3c;
98
+ --select-option-color: #d1d5db;
99
+ --select-option-hover-background: #252535;
100
+ --select-option-hover-color: #f3f4f6;
101
+ --select-menu-search-background: #161621;
102
+ --select-menu-search-border: 1px solid #2a2a3c;
103
+
104
+ /* Input -- same gap. */
105
+ --input-background: #1e1e2e;
106
+ --input-text-color: #d1d5db;
107
+ --input-placeholder-color: #9ca3af;
108
+ --input-border: 1px solid #2a2a3c;
109
+ --input-info-msg-text-color: #9ca3af;
110
+ --input-label-msg-text-color: #9ca3af;
111
+ }
112
+
113
+ [data-theme='dark'] {
114
+ /* ChatMessage */
115
+ --chat-message-sender-background: #e4e4e7;
116
+ --chat-message-sender-color: #18181b;
117
+ --chat-message-color: #d1d5db;
118
+ --chat-message-background: #1e1e2e;
119
+ --chat-message-header-color: #9ca3af;
120
+ --chat-message-action-color: #9ca3af;
121
+ --chat-message-action-hover-background-color: #252535;
122
+ --chat-message-code-background: rgb(255 255 255 / 8%);
123
+ --chat-message-pre-background: rgb(255 255 255 / 8%);
124
+ --chat-message-link-color: #a5b4fc;
125
+ --chat-message-error-color: #f87171;
126
+ /* Same element and same light default (#3b82f6) as
127
+ --markdown-text-focus-outline-color: the markdown renderer's table
128
+ wrapper, here inside a chat bubble. Mapped to the same dark value. */
129
+ --chat-message-table-focus-outline-color: #818cf8;
130
+
131
+ /* ChatComposer */
132
+ --chat-composer-background: #1e1e2e;
133
+ --chat-composer-border: 1px solid #2a2a3c;
134
+ --chat-composer-color: #e5e7eb;
135
+ --chat-composer-placeholder-color: #9ca3af;
136
+ --chat-composer-action-color: #9ca3af;
137
+ --chat-composer-action-hover-background-color: #252535;
138
+ --chat-composer-send-background-color: #e4e4e7;
139
+ --chat-composer-send-color: #18181b;
140
+ --chat-composer-send-hover-background-color: #d4d4d8;
141
+ --chat-composer-stop-background-color: #e4e4e7;
142
+ --chat-composer-stop-color: #18181b;
143
+ --chat-composer-voice-recording-background-color: #450a0a;
144
+ --chat-composer-voice-recording-color: #f87171;
145
+
146
+ /* ChatToolStatus */
147
+ --chat-tool-status-background: #1e1e2e;
148
+ --chat-tool-status-border: 1px solid #2a2a3c;
149
+ --chat-tool-status-color: #9ca3af;
150
+ --chat-tool-status-box-shadow: 0 6px 20px rgb(0 0 0 / 40%);
151
+
152
+ /* ChatHeader */
153
+ --chat-header-title-color: #e5e7eb;
154
+ --chat-header-subtitle-color: #9ca3af;
155
+ --chat-header-close-color: #9ca3af;
156
+ --chat-header-close-hover-background-color: #252535;
157
+
158
+ /* ChatMessageList */
159
+ --chat-message-list-jump-background-color: #1e1e2e;
160
+ --chat-message-list-jump-color: #d1d5db;
161
+ --chat-message-list-jump-hover-background-color: #252535;
162
+ --chat-message-list-jump-box-shadow: 0 4px 12px rgb(0 0 0 / 45%);
163
+
164
+ /* Chat surface + ChatBubble widget */
165
+ --chat-background: #161621;
166
+ --chat-bubble-background-color: #e4e4e7;
167
+ --chat-bubble-color: #18181b;
168
+ --chat-bubble-hover-background-color: #d4d4d8;
169
+ --chat-bubble-panel-background: #161621;
170
+
171
+ /* HITL */
172
+ --hitl-background: #1e1e2e;
173
+ --hitl-border: 1px solid #2a2a3c;
174
+ --hitl-divider-color: #2a2a3c;
175
+ --hitl-title-color: #e5e7eb;
176
+ --hitl-param-value-color: #e5e7eb;
177
+ --hitl-badge-color: #9ca3af;
178
+ --hitl-description-color: #9ca3af;
179
+ --hitl-param-label-color: #9ca3af;
180
+ --hitl-completion-background: #252535;
181
+ --hitl-approved-color: #4ade80;
182
+ --hitl-halted-color: #fbbf24;
183
+ --hitl-countdown-filter: brightness(1.6);
184
+
185
+ /* ThinkingIndicator */
186
+ --thinking-indicator-label-color: #9ca3af;
187
+ --thinking-indicator-detail-color: #9ca3af;
188
+ --thinking-indicator-arrow-color: #9ca3af;
189
+ --thinking-indicator-border-bottom: 1px solid #2a2a3c;
190
+
191
+ /* ThinkingIndicator — chip variant (mirrors ChatToolStatus above; Chat's built-in
192
+ tool-status row now renders this instead of ChatToolStatus) */
193
+ --thinking-indicator-chip-background: #1e1e2e;
194
+ --thinking-indicator-chip-border: 1px solid #2a2a3c;
195
+ --thinking-indicator-chip-color: #9ca3af;
196
+ --thinking-indicator-chip-box-shadow: 0 6px 20px rgb(0 0 0 / 40%);
197
+
198
+ /* AttachmentChipRow */
199
+ --attachment-chip-row-chip-background: #1e1e2e;
200
+ --attachment-chip-row-file-tile-background: #252535;
201
+ --attachment-chip-row-file-tile-border: 1px solid #2a2a3c;
202
+ --attachment-chip-row-file-tile-box-shadow: 0 2px 0.25rem rgb(0 0 0 / 40%);
203
+ --attachment-chip-row-file-name-color: #d1d5db;
204
+ --attachment-chip-row-file-glyph-color: #9ca3af;
205
+ --attachment-chip-row-file-glyph-fold-color: #1e1e2e;
206
+
207
+ /* Pill — dark counterparts for the semantic tones. Without these a status chip
208
+ falls back to Pill's built-in light pastels, which are unreadable on this
209
+ ground: the `ok` text #155724 on the neutral chip below is 1.74:1. Every pair
210
+ here clears WCAG AA (5.93:1 at the lowest, `muted`). The neutral chip itself
211
+ is scoped separately, below this block — see the note there. */
212
+ --pill-tone-accent-background: #11262e;
213
+ --pill-tone-accent-color: #7dd3fc;
214
+ --pill-tone-ok-background: #10281a;
215
+ --pill-tone-ok-color: #6ee7a8;
216
+ --pill-tone-warn-background: #2e2410;
217
+ --pill-tone-warn-color: #fcd34d;
218
+ --pill-tone-danger-background: #2d1416;
219
+ --pill-tone-danger-color: #fca5a5;
220
+ --pill-tone-muted-background: #252535;
221
+ --pill-tone-muted-color: #9ca3af;
222
+
223
+ /* ThinkingTrace */
224
+ --thinking-indicator-trace-connector-color: #2a2a3c;
225
+ --thinking-indicator-trace-row-color: #d1d5db;
226
+ --thinking-indicator-trace-prose-color: #9ca3af;
227
+ --thinking-indicator-trace-secondary-color: #9ca3af;
228
+ --thinking-indicator-trace-icon-color: #9ca3af;
229
+ --thinking-indicator-trace-spinner-color: #9ca3af;
230
+ --thinking-indicator-trace-spinner-track-color: #2a2a3c;
231
+ --thinking-indicator-trace-spinner-color-end: #2a2a3c;
232
+ --thinking-indicator-trace-row-hover-background: #252535;
233
+ --thinking-indicator-trace-row-selected-background: #2f2f45;
234
+ --thinking-indicator-trace-query-background: #252535;
235
+ --thinking-indicator-trace-query-color: #d1d5db;
236
+ --thinking-indicator-trace-more-color: #9ca3af;
237
+ --thinking-indicator-trace-added-color: #4ade80;
238
+ --thinking-indicator-trace-removed-color: #f87171;
239
+
240
+ /* ToolCallLog */
241
+ --tool-call-log-chip-background: #1e1e2e;
242
+ --tool-call-log-chip-border: 1px solid #2a2a3c;
243
+ --tool-call-log-chip-hover-background: #252535;
244
+ --tool-call-log-chip-open-border-color: #6366f1;
245
+ --tool-call-log-label-color: #d1d5db;
246
+ --tool-call-log-meta-color: #9ca3af;
247
+ --tool-call-log-error-background: #2a1416;
248
+ --tool-call-log-error-border-color: #7f1d1d;
249
+ --tool-call-log-error-color: #f87171;
250
+ --tool-call-log-error-hover-background: #3b1a1c;
251
+ --tool-call-log-added-background: rgb(74 222 128 / 12%);
252
+ --tool-call-log-added-color: #4ade80;
253
+ --tool-call-log-removed-background: rgb(248 113 113 / 12%);
254
+ --tool-call-log-removed-color: #f87171;
255
+ --tool-call-log-spinner-color: #9ca3af;
256
+ --tool-call-log-spinner-track-color: #2a2a3c;
257
+ --tool-call-log-popover-background: #1e1e2e;
258
+ --tool-call-log-popover-border: 1px solid #2a2a3c;
259
+ --tool-call-log-popover-color: #d1d5db;
260
+ --tool-call-log-popover-shadow: 0 8px 24px rgb(0 0 0 / 55%);
261
+
262
+ /* TaskList */
263
+ --task-list-row-color: #d1d5db;
264
+ --task-list-secondary-color: #9ca3af;
265
+ --task-list-dot-color: #4b5563;
266
+ --task-list-done-color: #9ca3af;
267
+ --task-list-error-color: #f87171;
268
+ --task-list-spinner-color: #9ca3af;
269
+ --task-list-spinner-track-color: #2a2a3c;
270
+ --task-list-retry-background: #2a1416;
271
+ --task-list-retry-color: #f87171;
272
+ --task-list-retry-hover-background: #3b1a1c;
273
+ }
274
+
275
+ /* Pill — the neutral dark chip for chat suggestion chips and composer attachment
276
+ pills, which carry no tone.
277
+
278
+ Deliberately NOT set alongside the other tokens in the block above. Pill resolves
279
+ colour as `var(--pill-background, var(--_pill-tone-background, …))`, so a bare
280
+ --pill-background on the theme root wins over the tone layer by design (see
281
+ docs/Pill.md). Set there, it silently flattened every tone="…" chip to this same
282
+ grey — all five tones rendered byte-identical in dark mode, so the Pill demo
283
+ showed five indistinguishable chips labelled Accent/Ok/Warn/Danger/Muted.
284
+
285
+ Excluding the tone classes keeps the neutral chip for the untoned pills that
286
+ wanted it, and lets the tone variables above reach the ones that carry a tone. */
287
+ [data-theme='dark'] {
288
+ /* The untoned chip. This used to be a `.pill:not(.tone-…)` selector, to stop a
289
+ bare --pill-background from flattening every toned chip to one grey. The
290
+ scoping was right and the mechanism was not: .pill sits inside <sui-pill>'s
291
+ shadow root, where a document-level descendant selector cannot reach it, so
292
+ the custom element went on painting its #e0e0e0 light default on the dark
293
+ page. Pill now exposes a neutral tier in its fallback chain that resolves
294
+ only when no tone class has set --_pill-tone-*, which says the same thing
295
+ with a token -- and tokens inherit across the boundary. */
296
+ --pill-tone-neutral-background: #252535;
297
+ --pill-tone-neutral-color: #d1d5db;
298
+ --pill-tone-neutral-hover-background: #2f2f45;
299
+ --pill-tone-neutral-hover-color: #e5e7eb;
300
+ }
301
+
302
+ /* ----------------------------------------------------------------------------
303
+ Second pass — from measurement rather than from reports.
304
+
305
+ The blocks above were written component by component as defects were noticed
306
+ by eye. This pass swept all 98 routes in BOTH themes and composited each
307
+ element's real backdrop up its ancestor chain, instead of only inspecting
308
+ elements that painted a background of their own -- which is what the earlier
309
+ sweep did, and why it was structurally unable to see text sitting on an
310
+ inherited surface. Every value here clears its WCAG threshold against the
311
+ surface the audit measured it on.
312
+ ---------------------------------------------------------------------------- */
313
+ [data-theme='dark'] {
314
+ /* Status's panel is frosted glass -- rgba(255,255,255,0.6) behind a 60px
315
+ backdrop-filter. It stayed white in dark mode with the themed light text on
316
+ it, measured at 1.02:1 from real pixels. The sweep could not count it: a
317
+ backdrop-filter means the backdrop is not one colour, so it was quarantined
318
+ as indeterminate rather than guessed at, and only a pixel check settled it.
319
+ The static lint could not see it either -- it reads hex literals, and this
320
+ default is an rgba(). Both limitations are ones those tools print about
321
+ themselves, which is the only reason this was findable at all. */
322
+ --status-panel-background: rgba(30, 30, 46, 0.6);
323
+ }
324
+
325
+ [data-theme='dark'] {
326
+ /* Banner */
327
+ --banner-color: #9ca3af;
328
+ --banner-link-color: #93c5fd;
329
+
330
+ /* Book */
331
+ --book-background: #1e1e2e;
332
+
333
+ /* Calendar */
334
+ --calendar-day-name-color: #9ca3af;
335
+ --calendar-outside-month-color: #9ca3af;
336
+
337
+ /* Checkbox */
338
+ --field-error-color: #f87171;
339
+ --field-info-color: #9ca3af;
340
+
341
+ /* Choicebox */
342
+ --choicebox-background: #1e1e2e;
343
+
344
+ /* DeltaIndicator */
345
+ --delta-indicator-negative-color: #f87171;
346
+
347
+ /* FileDropzoneTrigger */
348
+ --file-dropzone-trigger-caption-color: #cbd5e1;
349
+
350
+ /* Gauge */
351
+ --gauge-label-color: #d1d5db;
352
+
353
+ /* GridItem */
354
+ --grid-item-color: #d1d5db;
355
+
356
+ /* Input */
357
+ --input-error-msg-text-color: #f87171;
358
+
359
+ /* InputButton */
360
+ --inputbutton-external-error-color: #f87171;
361
+
362
+ /* Label */
363
+ --label-color: #d1d5db;
364
+
365
+ /* ListItem */
366
+ --list-item-center-text-color: #d1d5db;
367
+ --list-item-right-content-text-color: #d1d5db;
368
+
369
+ /* MediaUpload */
370
+ --media-upload-label-color: #d1d5db;
371
+
372
+ /* PieChart */
373
+ --chart-legend-color: #d1d5db;
374
+ --piechart-legend-more-color: #818cf8;
375
+ --piechart-legend-value-color: #d1d5db;
376
+
377
+ /* Progress */
378
+ --progress-label-color: #d1d5db;
379
+
380
+ /* ProportionBar */
381
+ --proportion-bar-legend-label-color: #9ca3af;
382
+ --proportion-bar-legend-value-color: #d1d5db;
383
+
384
+ /* Radio */
385
+ --radio-text-color: #d1d5db;
386
+
387
+ /* Select */
388
+ --select-error-message-color: #f87171;
389
+
390
+ /* Slider */
391
+ --slider-value-color: #d1d5db;
392
+
393
+ /* StatCard */
394
+ --statcard-background: #1e1e2e;
395
+ --statcard-delta-positive-color: #4ade80;
396
+
397
+ /* Status */
398
+ --status-description-font-color: #9ca3af;
399
+
400
+ /* Stepper */
401
+ --step-index-container-completed-background-color: #1a7a44;
402
+ --step-text-active-color: #818cf8;
403
+
404
+ /* Table */
405
+ --table-cell-secondary-color: #9ca3af;
406
+ --table-cell-thumb-placeholder-color: #4b5563;
407
+ --table-link-color: #60a5fa;
408
+ --table-trend-down-color: #f87171;
409
+
410
+ /* Tabs */
411
+ --tabs-section-label-color: #9ca3af;
412
+
413
+ /* Toggle */
414
+ --toggle-text-color: #d1d5db;
415
+
416
+ /* Toolbar */
417
+ --toolbar-background: #1e1e2e;
418
+
419
+ /* demo page: pill */
420
+ /* NOT --button-text-color: that is the consumer-level hook and it wins over
421
+ the variant layer by design, so setting it here flattened primary,
422
+ destructive and the rest to one grey -- #d1d5db on the destructive red at
423
+ 3.24:1. The neutral tier applies only to a button no variant has coloured. */
424
+ --button-neutral-text-color: #d1d5db;
425
+ --button-secondary-text-color: #d1d5db;
426
+ --button-secondary-border-color: #3f3f57;
427
+ --button-secondary-hover-background: #252535;
428
+ --button-ghost-text-color: #d1d5db;
429
+ --button-ghost-hover-background: #252535;
430
+ }
431
+
432
+ [data-theme='dark'] {
433
+ /* Stepper. These were selectors inside the component until they were measured
434
+ against <sui-stepper>, where they could never apply. The light rules in
435
+ Stepper.svelte and Step.svelte already read these properties; naming them
436
+ here re-points those same rules and reaches the shadow tree as well.
437
+ Contrast is against this app's #1a1a26 demo surface. */
438
+ --step-text-completed-color: #24aa5a;
439
+ --step-text-failure-color: #ef5350;
440
+ --step-text-in-progress-color: #fbbf24;
441
+ --stepper-separator-background-image-failure-color: #ef5350;
442
+ --stepper-separator-background-image-in-progress-color: #fbbf24;
443
+ }
444
+
445
+ /* ----------------------------------------------------------------------------
446
+ Third pass — completing the set.
447
+
448
+ The passes above fixed what a demo page happened to render. A static scan of
449
+ every colour default in src/lib (scripts/check-css-contract.js) found 218 more
450
+ that no page exercises: hover fills, popovers, focus rings, empty states. The
451
+ sweep could never have seen them, because nothing on screen was showing them.
452
+ ---------------------------------------------------------------------------- */
453
+ [data-theme='dark'] {
454
+ /* Avatar */
455
+ --avatar-background: #2f2f45;
456
+ --avatar-text-color: #d1d5db;
457
+
458
+ /* Banner */
459
+ --banner-background: #1e1e2e;
460
+
461
+ /* Book */
462
+ --book-dot-active-color: #818cf8;
463
+ --book-nav-color: #9ca3af;
464
+
465
+ /* BrandLoader */
466
+ --loader-dot-color: #9ca3af;
467
+ --loader-sub-text-color: #b8bcc4;
468
+ --loader-text-color: #d1d5db;
469
+
470
+ /* Browser */
471
+ --browser-addressbar-bg: #0f0f17;
472
+ --browser-addressbar-color: #9ca3af;
473
+ --browser-chrome-bg: #1e1e2e;
474
+ --browser-chrome-color: #9ca3af;
475
+ --browser-content-bg: #1a1a26;
476
+ --browser-lock-color: #9ca3af;
477
+ --browser-tab-bg: #252535;
478
+ --browser-tab-color: #d1d5db;
479
+
480
+ /* Calendar */
481
+ --calendar-background: #1e1e2e;
482
+ --calendar-cell-color: #d1d5db;
483
+ --calendar-cell-hover-background: #252535;
484
+ --calendar-focus-ring-color: #818cf8;
485
+ --calendar-header-color: #d1d5db;
486
+ --calendar-nav-button-color: #9ca3af;
487
+ --calendar-nav-button-hover-background: #252535;
488
+ --calendar-range-background: #2a2a3c;
489
+
490
+ /* Carousel */
491
+ --carousel-dot-active-color: #818cf8;
492
+
493
+ /* ChatMessage */
494
+ --chat-message-marker-color: #a78bfa;
495
+
496
+ /* Checkbox */
497
+ --checkbox-hover-border-color: #d1d5db;
498
+ --checkbox-label-color: #d1d5db;
499
+
500
+ /* ColorPicker */
501
+ --color-picker-field-background: #1e1e2e;
502
+ --color-picker-field-color: #d1d5db;
503
+ --color-picker-field-focus-border: #60a5fa;
504
+ --color-picker-label-color: #d1d5db;
505
+ --color-picker-popover-background: #1e1e2e;
506
+ --color-picker-swatch-btn-background: #1e1e2e;
507
+ --color-picker-swatch-btn-hover-background: #252535;
508
+
509
+ /* Combobox */
510
+ --combobox-action-color: #9ca3af;
511
+ --combobox-color: #d1d5db;
512
+ --combobox-create-color: #818cf8;
513
+ --combobox-dropdown-background: #1e1e2e;
514
+ --combobox-input-background: #1e1e2e;
515
+ --combobox-input-focus-border-color: #818cf8;
516
+ --combobox-limit-background: #3a2f14;
517
+ --combobox-limit-color: #fbbf24;
518
+ --combobox-option-color: #d1d5db;
519
+ --combobox-option-hover-background: #252535;
520
+ --combobox-option-selected-background: #1e1b4b;
521
+
522
+ /* CommandMenu */
523
+ --command-menu-background: #1e1e2e;
524
+ --command-menu-input-caret-color: #818cf8;
525
+ --command-menu-input-color: #d1d5db;
526
+ --command-menu-item-active-background: #252535;
527
+ --command-menu-item-active-color: #d1d5db;
528
+ --command-menu-item-color: #9ca3af;
529
+ --command-menu-kbd-background: #252535;
530
+ --command-menu-kbd-color: #9ca3af;
531
+
532
+ /* ContextMenu */
533
+ --context-menu-background-color: #1e1e2e;
534
+ --context-menu-item-color: #d1d5db;
535
+ --context-menu-item-danger-color: #f87171;
536
+ --context-menu-item-danger-focus-background-color: #33191c;
537
+ --context-menu-item-danger-hover-background-color: #3a1f22;
538
+ --context-menu-item-focus-background-color: #2a2a3c;
539
+ --context-menu-item-hover-background-color: #252535;
540
+
541
+ /* DateRangePicker */
542
+ --drp-apply-disabled-background: #3f3f4d;
543
+ --drp-apply-disabled-color: #d1d5db;
544
+ --drp-cancel-hover-background: #252535;
545
+ --drp-clear-hover-background: #252535;
546
+ --drp-date-input-background: #1e1e2e;
547
+ --drp-date-input-color: #d1d5db;
548
+ --drp-date-input-invalid-border: #f87171;
549
+ --drp-datetime-arrow-color: #9ca3af;
550
+ --drp-field-error-color: #f87171;
551
+ --drp-nav-btn-hover-background: #252535;
552
+ --drp-panel-background: #1e1e2e;
553
+ --drp-preset-hover-background: #252535;
554
+ --drp-time-field-color: #d1d5db;
555
+ --drp-time-input-background: #1e1e2e;
556
+ --drp-time-input-icon-color: #9ca3af;
557
+ --drp-time-input-invalid-border: #f87171;
558
+ --drp-time-toggle-active-color: #60a5fa;
559
+ --drp-time-toggle-background: #1a1a26;
560
+ --drp-time-toggle-color: #9ca3af;
561
+ --drp-trigger-open-border-color: #818cf8;
562
+
563
+ /* DeltaIndicator */
564
+ --delta-indicator-neutral-color: #9ca3af;
565
+ --delta-indicator-positive-color: #4ade80;
566
+
567
+ /* FileInput */
568
+ --file-input-error-color: #f87171;
569
+ --file-input-info-color: #9ca3af;
570
+
571
+ /* GridItem */
572
+ --grid-item-background-color: #252535;
573
+
574
+ /* Input */
575
+ --input-char-count-color: #9ca3af;
576
+ --input-focus-border-color: #818cf8;
577
+
578
+ /* InputButton */
579
+ --input-field-error-stroke: #f87171;
580
+ --inputbutton-mandatory-color: #f87171;
581
+
582
+ /* KeyValue */
583
+ --keyvalue-label-color: #d1d5db;
584
+ --keyvalue-value-color: #9ca3af;
585
+
586
+ /* KeyboardInput */
587
+ --keyboard-input-key-background: #1e1e2e;
588
+ --keyboard-input-key-color: #d1d5db;
589
+ --keyboard-input-separator-color: #9ca3af;
590
+
591
+ /* Label */
592
+ --label-required-color: #f87171;
593
+
594
+ /* ListItem */
595
+ --list-item-loader-background: #1a1a26;
596
+
597
+ /* MarkdownText */
598
+ --markdown-text-focus-outline-color: #818cf8;
599
+ --markdown-text-link-color: #a78bfa;
600
+
601
+ /* MediaUpload */
602
+ --media-upload-add-background-color: #1e1e2e;
603
+ /* The tile's own text, on that #1e1e2e tile. The light defaults (#6b7280 /
604
+ #9aa0a8) are tuned for a white tile and read at 3.4:1 and 3.8:1 here. */
605
+ --media-upload-add-color: #9ca3af;
606
+ --media-upload-add-hint-color: #9ca3af;
607
+ --media-upload-add-dragging-background-color: #262b4a;
608
+ --media-upload-add-dragging-color: #818cf8;
609
+ --media-upload-add-hover-background-color: #252535;
610
+ --media-upload-add-hover-color: #818cf8;
611
+ --media-upload-counter-color: #9ca3af;
612
+ --media-upload-description-color: #9ca3af;
613
+ --media-upload-error-color: #f87171;
614
+ --media-upload-file-meta-color: #9ca3af;
615
+ --media-upload-item-background-color: #1e1e2e;
616
+
617
+ /* Menu */
618
+ --menu-background-color: #1e1e2e;
619
+ --menu-item-color: #d1d5db;
620
+ --menu-item-danger-color: #f87171;
621
+ --menu-item-danger-focus-background-color: #2a1518;
622
+ --menu-item-danger-hover-background-color: #331519;
623
+ --menu-item-focus-background-color: #252535;
624
+ --menu-item-hover-background-color: #252535;
625
+
626
+ /* Modal */
627
+ --modal-content-background-color: #1e1e2e;
628
+ --modal-footer-background-color: #1a1a26;
629
+ --modal-footer-primary-button-color: #9ca3af;
630
+ --modal-footer-secondary-button-color: #9ca3af;
631
+ --modal-header-background-color: #1a1a26;
632
+
633
+ /* Pagination */
634
+ --pagination-button-hover-background: #252535;
635
+ --pagination-button-hover-color: #d1d5db;
636
+ --pagination-ellipsis-color: #9ca3af;
637
+ --pagination-load-more-hover-background: #252535;
638
+ --pagination-load-more-hover-color: #d1d5db;
639
+
640
+ /* PieChart */
641
+ --piechart-label-color: #d1d5db;
642
+
643
+ /* Pill -- deliberately NOT here. `--_pill-tone-*` is Pill's PRIVATE tone tier,
644
+ set by its own `.pill.tone-*` rules. Setting it on the theme root inherits it
645
+ into every pill, so an UNTONED pill resolved the muted tone's text colour
646
+ (#9ca3af) instead of the neutral tier's (#d1d5db) -- the background matched
647
+ only because muted and neutral share one. The neutral tokens live in their own
648
+ block further down, with the full explanation. */
649
+
650
+ /* Progress */
651
+ --progress-track-background: #2a2a3c;
652
+
653
+ /* ProportionBar */
654
+ --proportion-bar-track-bg: #2a2a3c;
655
+
656
+ /* Radio */
657
+ --radio-background: #1e1e2e;
658
+ --radio-disabled-background: #1a1a26;
659
+ --radio-selected-background: #1e1e2e;
660
+
661
+ /* SankeyChart */
662
+ --sankey-col-label-color: #9ca3af;
663
+ --sankey-label-color: #d1d5db;
664
+
665
+ /* Scroller */
666
+ --scroller-arrow-background: #1e1e2e;
667
+ --scroller-arrow-color: #d1d5db;
668
+ --scroller-arrow-hover-background: #252535;
669
+
670
+ /* Select */
671
+ --select-clear-pressed-background: #2a2a3c;
672
+ --select-menu-search-focus-border-color: #818cf8;
673
+ --select-option-pressed-background: #2a2a3c;
674
+ --select-option-selected-background: #2e304e;
675
+ --select-option-tick-color: #818cf8;
676
+ --select-pill-background: #252535;
677
+ --select-pill-color: #d1d5db;
678
+ --select-trigger-error-border-color: #f87171;
679
+ --select-trigger-focus-border-color: #818cf8;
680
+
681
+ /* Separator */
682
+ --separator-background: #2a2a3c;
683
+
684
+ /* Sheet */
685
+ --sheet-background: #1e1e2e;
686
+ --sheet-close-button-color: #9ca3af;
687
+ --sheet-close-button-hover-background: #252535;
688
+ --sheet-title-color: #e5e7eb;
689
+
690
+ /* Shimmer */
691
+ --shimmer-background: #2a2a3c;
692
+
693
+ /* Slider */
694
+ --slider-thumb-background: #d1d5db;
695
+ --slider-track-background: #2a2a3c;
696
+
697
+ /* SplitInput */
698
+ --field-group-label-color: #9ca3af;
699
+
700
+ /* StatCard */
701
+ --statcard-breakdown-heading-color: #9ca3af;
702
+ --statcard-breakdown-label-color: #9ca3af;
703
+ --statcard-delta-color: #9ca3af;
704
+ --statcard-delta-negative-color: #f87171;
705
+ --statcard-row-additional-color: #9ca3af;
706
+ --statcard-row-heading-color: #9ca3af;
707
+ --statcard-subtitle-color: #9ca3af;
708
+ --statcard-title-color: #9ca3af;
709
+ --statcard-value-warning-color: #fbbf24;
710
+
711
+ /* Stepper */
712
+ --step-index-container-muted-background-color: #2a2a3c;
713
+ --step-index-muted-color: #9ca3af;
714
+ --step-text-color: #9ca3af;
715
+ --step-text-muted-color: #9ca3af;
716
+ --step-text-pending-color: #9ca3af;
717
+ --stepper-separator-background-image-muted-color: #2a2a3c;
718
+ /* One hue, two roles -- the trap Stepper's own comments describe. These
719
+ --stepper-status-*-color values are the LABEL text, read against the dark
720
+ page, and they are also the fallback for the step circle's fill, which
721
+ carries a white number. Lifting them for the label alone put white on
722
+ #f87171 at 2.77:1, so the circle gets its own darker fill. */
723
+ --stepper-status-failure-color: #f87171;
724
+ --step-index-container-failure-background-color: #b91c1c;
725
+ --step-index-container-in-progress-background-color: #92400e;
726
+ --stepper-status-in-progress-color: #fbbf24;
727
+
728
+ /* Table */
729
+ --table-cell-icon-button-color: #9ca3af;
730
+ --table-checkbox-checked-border-color: #60a5fa;
731
+ --table-checkbox-hover-border-color: #d1d5db;
732
+ --table-checkbox-indeterminate-border-color: #60a5fa;
733
+ --table-content-border-bgcolor: #1a1a26;
734
+ --table-content-font-color: #d1d5db;
735
+ --table-filter-active-color: #60a5fa;
736
+ --table-focus-outline-color: #60a5fa;
737
+ --table-header-border-bgcolor: #1e1e2e;
738
+ --table-header-font-color: #9ca3af;
739
+ --table-inline-search-clear-color: #9ca3af;
740
+ --table-link-copy-color: #9ca3af;
741
+ --table-sort-active-color: #60a5fa;
742
+ --table-sort-hover-color: #9ca3af;
743
+ --table-toolbar-background: #1e1e2e;
744
+ --table-trend-flat-color: #9ca3af;
745
+ --table-trend-up-color: #4ade80;
746
+
747
+ /* Tabs */
748
+ --tabs-active-color: #818cf8;
749
+ --tabs-bar-background: #1e1e2e;
750
+ --tabs-hover-background: #252535;
751
+ --tabs-hover-color: #d1d5db;
752
+ --tabs-indicator-color: #818cf8;
753
+ --tabs-item-color: #9ca3af;
754
+ --tabs-item-status-default-color: #818cf8;
755
+ --tabs-item-status-error-color: #f87171;
756
+
757
+ /* ThemeSwitcher */
758
+ --theme-switcher-bg-hover: #252535;
759
+ --theme-switcher-bg-pressed: #2a2a3c;
760
+ --theme-switcher-icon-color: #9ca3af;
761
+ --theme-switcher-icon-color-active: #d1d5db;
762
+ --theme-switcher-segment-active-bg: #2a2a3c;
763
+ --theme-switcher-segment-bg: #1e1e2e;
764
+
765
+ /* ThinkingIndicator */
766
+ --thinking-indicator-elapsed-color: #9ca3af;
767
+
768
+ /* Toast */
769
+ --toast-background-color: #0369a1;
770
+ }
771
+
772
+ /* ----------------------------------------------------------------------------
773
+ Fourth pass — what was still measurably failing after the third.
774
+ ---------------------------------------------------------------------------- */
775
+ [data-theme='dark'] {
776
+ --doc-text: #d1d5db;
777
+ --doc-text-secondary: #9ca3af;
778
+ }