@innovaccer/design-system 4.23.0 → 4.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +3 -3
  3. package/css/dist/index.css +1374 -348
  4. package/css/dist/index.css.map +1 -1
  5. package/css/src/ai-components/button.module.css +4 -24
  6. package/css/src/ai-components/chip.module.css +5 -30
  7. package/css/src/ai-components/iconButton.module.css +2 -12
  8. package/css/src/components/avatarGroup.module.css +7 -0
  9. package/css/src/components/avatarSelection.module.css +22 -0
  10. package/css/src/components/badge.module.css +3 -3
  11. package/css/src/components/button.module.css +187 -18
  12. package/css/src/components/calendar.module.css +49 -0
  13. package/css/src/components/card.module.css +14 -0
  14. package/css/src/components/chatBubble.module.css +6 -1
  15. package/css/src/components/chatInput.module.css +14 -3
  16. package/css/src/components/chip.module.css +65 -13
  17. package/css/src/components/datePicker.module.css +9 -0
  18. package/css/src/components/dateRangePicker.module.css +5 -0
  19. package/css/src/components/dropdown.module.css +7 -0
  20. package/css/src/components/dropzone.module.css +36 -0
  21. package/css/src/components/grid.module.css +29 -12
  22. package/css/src/components/horizontalNav.module.css +17 -6
  23. package/css/src/components/input.module.css +1 -0
  24. package/css/src/components/link.module.css +59 -6
  25. package/css/src/components/linkButton.module.css +82 -10
  26. package/css/src/components/listbox.module.css +85 -1
  27. package/css/src/components/metricInput.module.css +89 -35
  28. package/css/src/components/modal.module.css +8 -0
  29. package/css/src/components/pageHeader.module.css +103 -8
  30. package/css/src/components/segmentedControl.module.css +1 -1
  31. package/css/src/components/select.module.css +7 -0
  32. package/css/src/components/selectionCard.module.css +38 -0
  33. package/css/src/components/sidesheet.module.css +8 -0
  34. package/css/src/components/slider.module.css +21 -0
  35. package/css/src/components/switch.module.css +39 -0
  36. package/css/src/components/table.module.css +32 -1
  37. package/css/src/components/tabs.module.css +20 -0
  38. package/css/src/components/timePicker.module.css +4 -0
  39. package/css/src/components/toast.module.css +10 -0
  40. package/css/src/components/tooltip.module.css +1 -0
  41. package/css/src/tokens/index.css +156 -156
  42. package/css/src/utils/utility.css +4 -0
  43. package/css/src/variables/index.css +116 -1
  44. package/dist/brotli/index.js +1 -1
  45. package/dist/brotli/index.js.br +0 -0
  46. package/dist/cjs/index.js +1 -1
  47. package/dist/core/components/atoms/heading/Heading.d.ts +1 -0
  48. package/dist/core/components/atoms/link/Link.d.ts +4 -2
  49. package/dist/core/components/atoms/linkButton/LinkButton.d.ts +1 -0
  50. package/dist/core/components/atoms/message/Message.d.ts +2 -0
  51. package/dist/core/components/atoms/outsideClick/OutsideClick.d.ts +1 -0
  52. package/dist/core/components/atoms/popperWrapper/PopperWrapper.d.ts +1 -0
  53. package/dist/core/components/atoms/progressBar/ProgressBar.d.ts +2 -0
  54. package/dist/core/components/atoms/progressRing/ProgressRing.d.ts +3 -0
  55. package/dist/core/components/atoms/segmentedControl/SegmentedControl.d.ts +2 -0
  56. package/dist/core/components/atoms/subheading/Subheading.d.ts +1 -0
  57. package/dist/core/components/atoms/text/Text.d.ts +1 -0
  58. package/dist/core/components/atoms/toast/Toast.d.ts +3 -0
  59. package/dist/core/components/molecules/chat/Chat.d.ts +3 -0
  60. package/dist/core/components/molecules/chat/chatBubble/IncomingBubble.d.ts +1 -0
  61. package/dist/core/components/molecules/chat/chatBubble/OutgoingBubble.d.ts +1 -0
  62. package/dist/core/components/molecules/chat/chatInput/ChatInput.d.ts +1 -0
  63. package/dist/core/components/molecules/chat/unreadMessage/UnreadMessage.d.ts +3 -0
  64. package/dist/core/components/molecules/dropzone/Dropzone.d.ts +1 -0
  65. package/dist/core/components/molecules/editableInput/EditableInput.d.ts +4 -0
  66. package/dist/core/components/molecules/emptyState/EmptyState.d.ts +1 -0
  67. package/dist/core/components/molecules/emptyState/EmptyStateTitle.d.ts +1 -0
  68. package/dist/core/components/molecules/inputMask/InputMask.d.ts +1 -0
  69. package/dist/core/components/molecules/modal/ModalHeader.d.ts +1 -0
  70. package/dist/core/components/molecules/overlayHeader/OverlayHeader.d.ts +1 -0
  71. package/dist/core/components/molecules/popover/Popover.d.ts +1 -0
  72. package/dist/core/components/organisms/grid/Grid.d.ts +1 -0
  73. package/dist/core/components/organisms/grid/GridContext.d.ts +1 -0
  74. package/dist/core/components/organisms/grid/VirtualList.d.ts +1 -0
  75. package/dist/core/components/organisms/listbox/reorderList/Draggable.d.ts +11 -0
  76. package/dist/core/components/organisms/menu/SubMenuContext.d.ts +1 -0
  77. package/dist/core/components/organisms/pageHeader/utils.d.ts +9 -9
  78. package/dist/core/components/organisms/textField/TextFieldCommon.d.ts +1 -0
  79. package/dist/core/components/organisms/verticalNav/VerticalNav.d.ts +2 -0
  80. package/dist/esm/index.js +2058 -874
  81. package/dist/gzip/index.js +1 -1
  82. package/dist/gzip/index.js.gz +0 -0
  83. package/dist/index.js +1872 -745
  84. package/dist/index.js.map +1 -1
  85. package/dist/index.umd.css +1371 -345
  86. package/dist/index.umd.js +1 -1
  87. package/dist/types/tsconfig.type.tsbuildinfo +173 -134
  88. package/package.json +1 -1
@@ -74,6 +74,11 @@
74
74
  clip-path: polygon(0 0, 100% 0, 0 100%);
75
75
  }
76
76
 
77
+ .Listbox-item--tight.Listbox-item--selected::before {
78
+ top: var(--spacing-05);
79
+ left: var(--spacing-05);
80
+ }
81
+
77
82
  .Listbox-item--selected:hover {
78
83
  background: color-mod(var(--primary-lighter) a(var(--opacity-12)));
79
84
  }
@@ -122,6 +127,11 @@
122
127
  clip-path: polygon(0 0, 100% 0, 0 100%);
123
128
  }
124
129
 
130
+ .Listbox-item--tight.Listbox-item--activated::before {
131
+ top: var(--spacing-05);
132
+ left: var(--spacing-05);
133
+ }
134
+
125
135
  /* Listbox type - description */
126
136
 
127
137
  .Listbox-item--description:focus-visible {
@@ -137,6 +147,10 @@
137
147
 
138
148
  /* Listbox type - draggable */
139
149
 
150
+ .Listbox-item--draggable:hover {
151
+ background-color: var(--secondary-lightest);
152
+ }
153
+
140
154
  .Listbox-item--draggable:focus-visible {
141
155
  outline: var(--border-width-05) solid var(--primary-focus);
142
156
  outline-offset: calc(-1 * var(--border-width-05));
@@ -144,13 +158,83 @@
144
158
 
145
159
  .Listbox-item--drag-icon {
146
160
  cursor: grab;
147
- margin-right: var(--spacing-20);
161
+ padding: var(--spacing-10);
162
+ margin-right: calc(var(--spacing-20) - var(--spacing-10));
163
+ margin-left: calc(-1 * var(--spacing-10));
164
+ border-radius: var(--border-radius-10);
165
+ transition: background-color var(--duration--moderate-01) var(--standard-productive-curve),
166
+ color var(--duration--moderate-01) var(--standard-productive-curve),
167
+ box-shadow var(--duration--moderate-01) var(--standard-productive-curve);
168
+ }
169
+
170
+ .Listbox-item--drag-icon:focus-visible {
171
+ outline: var(--border-width-05) solid var(--primary-focus);
172
+ outline-offset: var(--spacing-05);
148
173
  }
149
174
 
150
175
  .Listbox-item--drag-icon:hover {
176
+ background-color: var(--secondary);
151
177
  color: var(--inverse);
152
178
  }
153
179
 
154
180
  .Listbox-item--drag-icon:active {
181
+ background-color: var(--secondary-dark);
182
+ color: var(--primary);
183
+ }
184
+
185
+ /* Drag and reorder interaction states */
186
+
187
+ .Listbox-item--sticky-picked,
188
+ .Listbox-item--drag-picked {
189
+ background-color: var(--text-white);
190
+ box-shadow: var(--shadow-l);
191
+ rotate: 0.5deg;
192
+ cursor: grabbing;
193
+ z-index: 1000;
194
+ position: relative;
195
+ }
196
+
197
+ .Listbox-item--sticky-picked .Listbox-item--selected,
198
+ .Listbox-item--drag-picked .Listbox-item--selected {
199
+ background-color: color-mod(var(--primary-lightest) a(var(--opacity-12)));
200
+ }
201
+
202
+ .Listbox-item--sticky-picked .Listbox-item--drag-icon {
203
+ background-color: var(--primary);
204
+ color: var(--text-white);
205
+ }
206
+
207
+ .Listbox-item--drag-picked .Listbox-item--drag-icon {
208
+ background-color: var(--primary-ultra-light);
155
209
  color: var(--primary);
210
+ box-shadow: inset 0 0 0 var(--border-width-2-5) var(--primary);
211
+ }
212
+
213
+ .Listbox-aria-live {
214
+ position: absolute;
215
+ width: var(--spacing-2-5);
216
+ height: var(--spacing-2-5);
217
+ padding: 0;
218
+ margin: calc(-1 * var(--spacing-2-5));
219
+ overflow: hidden;
220
+ clip: rect(0, 0, 0, 0);
221
+ white-space: nowrap;
222
+ border: 0;
223
+ }
224
+
225
+ @media (forced-colors: active) {
226
+ .Listbox-item--description:focus-visible {
227
+ outline: var(--border-width-05) solid Highlight;
228
+ outline-offset: calc(-1 * var(--border-width-05));
229
+ }
230
+
231
+ .Listbox-item--disabled {
232
+ opacity: 1;
233
+ color: GrayText;
234
+ }
235
+
236
+ .Listbox-item--selected::before,
237
+ .Listbox-item--activated::before {
238
+ background-color: Highlight;
239
+ }
156
240
  }
@@ -9,25 +9,21 @@
9
9
  align-items: center;
10
10
  box-sizing: border-box;
11
11
  border-radius: var(--border-radius-10);
12
- border: var(--border);
12
+ box-shadow: inset 0 0 0 var(--border-width-2-5) var(--secondary);
13
13
  background: var(--white);
14
- overflow: hidden;
15
14
  transition: var(--duration--fast-01) var(--standard-productive-curve);
16
15
  }
17
16
 
18
17
  .MetricInput--regular {
19
18
  height: var(--spacing-80);
20
- padding-left: var(--spacing-30);
21
19
  }
22
20
 
23
21
  .MetricInput--large {
24
22
  height: 40px;
25
- padding-left: var(--spacing-40);
26
23
  }
27
24
 
28
25
  .MetricInput--small {
29
26
  height: var(--spacing-60);
30
- padding-left: var(--spacing-20);
31
27
  }
32
28
 
33
29
  .MetricInput:hover {
@@ -37,9 +33,12 @@
37
33
 
38
34
  .MetricInput:focus-within {
39
35
  background: var(--white);
40
- border-color: var(--secondary);
36
+ box-shadow: inset 0 0 0 var(--border-width-2-5) var(--secondary);
37
+ }
38
+
39
+ .MetricInput:focus-within:not(:has(.MetricInput-arrowButton:focus-visible)) {
41
40
  outline: var(--border-width-05) solid var(--primary-focus);
42
- outline-offset: var(--spacing-2-5);
41
+ outline-offset: var(--spacing-05);
43
42
  }
44
43
 
45
44
  .MetricInput:focus-within .MetricInput-icon {
@@ -48,13 +47,13 @@
48
47
 
49
48
  .MetricInput--disabled {
50
49
  background: var(--secondary-lightest);
51
- border-color: var(--secondary-light);
50
+ box-shadow: inset 0 0 0 var(--border-width-2-5) var(--secondary-light);
52
51
  pointer-events: none;
53
52
  }
54
53
 
55
54
  .MetricInput--readOnly {
56
55
  background: var(--secondary-lightest);
57
- border-color: var(--secondary);
56
+ box-shadow: inset 0 0 0 var(--border-width-2-5) var(--secondary);
58
57
  pointer-events: none;
59
58
  }
60
59
 
@@ -65,19 +64,46 @@
65
64
  .MetricInput--error,
66
65
  .MetricInput--error:hover {
67
66
  background: var(--white);
68
- border-color: var(--alert);
67
+ box-shadow: inset 0 0 0 var(--border-width-2-5) var(--alert);
69
68
  }
70
69
 
71
70
  .MetricInput--error:focus-within {
72
- border-color: var(--secondary);
71
+ box-shadow: inset 0 0 0 var(--border-width-2-5) var(--secondary);
72
+ }
73
+
74
+ .MetricInput--error:focus-within:not(:has(.MetricInput-arrowButton:focus-visible)) {
73
75
  outline: var(--border-width-05) solid var(--alert);
74
- outline-offset: var(--spacing-2-5);
76
+ outline-offset: var(--spacing-05);
75
77
  }
76
78
 
77
79
  .MetricInput--error:focus-within .MetricInput-icon {
78
80
  color: var(--alert);
79
81
  }
80
82
 
83
+ /* Content wrapper — holds icon, prefix, input, suffix */
84
+ .MetricInput-content {
85
+ flex: 1;
86
+ display: flex;
87
+ align-items: center;
88
+ min-width: 0;
89
+ overflow: hidden;
90
+ }
91
+
92
+ .MetricInput-content--regular {
93
+ padding: var(--spacing-15) var(--spacing-15);
94
+ gap: var(--spacing-05);
95
+ }
96
+
97
+ .MetricInput-content--large {
98
+ padding: var(--spacing-20) var(--spacing-15);
99
+ gap: var(--spacing-15);
100
+ }
101
+
102
+ .MetricInput-content--small {
103
+ padding: var(--spacing-10) var(--spacing-15);
104
+ gap: var(--spacing-05);
105
+ }
106
+
81
107
  .MetricInput-input {
82
108
  display: flex;
83
109
  width: 100%;
@@ -141,23 +167,14 @@
141
167
  margin: 0;
142
168
  }
143
169
 
144
- .MetricInput-arrowIcons {
145
- border-left: var(--border);
146
- box-sizing: border-box;
147
- border-radius: 0;
148
- background: transparent;
149
- display: flex;
150
- flex-direction: column;
151
- height: 100%;
152
- flex-shrink: 0;
153
- overflow: hidden;
154
- }
155
-
170
+ /* Arrow buttons (decrement on left, increment on right) */
156
171
  .MetricInput-arrowButton {
157
- height: 50%;
158
- border: none;
172
+ flex-shrink: 0;
173
+ align-self: stretch;
174
+ width: var(--spacing-60);
159
175
  background: var(--secondary-light);
160
176
  color: var(--inverse);
177
+ border: none;
161
178
  cursor: pointer;
162
179
  display: flex;
163
180
  align-items: center;
@@ -165,7 +182,16 @@
165
182
  padding: 0;
166
183
  margin: 0;
167
184
  user-select: none;
168
- overflow: hidden;
185
+ }
186
+
187
+ .MetricInput-arrowButton--left {
188
+ border-right: var(--border);
189
+ border-radius: var(--border-radius-10) 0 0 var(--border-radius-10);
190
+ }
191
+
192
+ .MetricInput-arrowButton--right {
193
+ border-left: var(--border);
194
+ border-radius: 0 var(--border-radius-10) var(--border-radius-10) 0;
169
195
  }
170
196
 
171
197
  .MetricInput-arrowButton:hover {
@@ -178,14 +204,42 @@
178
204
 
179
205
  .MetricInput-arrowButton:focus {
180
206
  outline: 0;
181
- box-shadow: var(--shadow-spread) var(--secondary-shadow);
182
207
  }
183
208
 
184
- .MetricInput-arrowIcons--small,
185
- .MetricInput-arrowIcons--regular {
186
- width: 20px;
187
- }
188
-
189
- .MetricInput-arrowIcons--large {
190
- width: var(--spacing-60);
209
+ .MetricInput-arrowButton:focus-visible {
210
+ outline: var(--border-width-05) solid var(--primary-focus);
211
+ outline-offset: var(--spacing-05);
212
+ }
213
+
214
+ @media (forced-colors: active) {
215
+ /* box-shadow is stripped — restore a real border for the wrapper boundary */
216
+ .MetricInput {
217
+ border: var(--border-width-2-5) solid ButtonText;
218
+ box-shadow: none;
219
+ }
220
+
221
+ .MetricInput--disabled {
222
+ border-color: GrayText;
223
+ }
224
+
225
+ /* Wrapper focus rings */
226
+ .MetricInput:focus-within:not(:has(.MetricInput-arrowButton:focus-visible)) {
227
+ outline: var(--border-width-05) solid Highlight;
228
+ outline-offset: var(--spacing-05);
229
+ }
230
+
231
+ .MetricInput--error:focus-within:not(:has(.MetricInput-arrowButton:focus-visible)) {
232
+ outline: var(--border-width-05) solid Highlight;
233
+ outline-offset: var(--spacing-05);
234
+ }
235
+
236
+ /* Arrow button states */
237
+ .MetricInput-arrowButton:disabled {
238
+ color: GrayText;
239
+ }
240
+
241
+ .MetricInput-arrowButton:focus-visible {
242
+ outline: var(--border-width-05) solid Highlight;
243
+ outline-offset: var(--spacing-05);
244
+ }
191
245
  }
@@ -95,3 +95,11 @@
95
95
  .Modal-header [tabindex='-1']:focus {
96
96
  outline: none;
97
97
  }
98
+
99
+ @media (forced-colors: active) {
100
+ /* box-shadow is the only visual boundary; add a real border so the modal is visible */
101
+ .Modal {
102
+ border: var(--border-width-2-5) solid ButtonText;
103
+ box-shadow: none;
104
+ }
105
+ }
@@ -14,6 +14,10 @@
14
14
  border-bottom: none;
15
15
  }
16
16
 
17
+ .PageHeader-bottom--withTabs {
18
+ margin-top: var(--spacing-30);
19
+ }
20
+
17
21
  .PageHeader .Row {
18
22
  width: 100%;
19
23
  }
@@ -41,16 +45,11 @@
41
45
  }
42
46
 
43
47
  .PageHeader-navigationWrapper {
44
- margin-top: var(--spacing-10);
48
+ margin-top: var(--spacing-30);
45
49
  }
46
50
 
47
- .PageHeader .PageHeader-navigationWrapper {
48
- justify-content: center;
49
- align-items: center;
50
- margin-top: 0 !important;
51
- padding-right: var(--spacing-20);
52
- padding-left: var(--spacing-20);
53
- display: flex;
51
+ .PageHeader-navigationWrapper--noMargin {
52
+ margin-top: 0;
54
53
  }
55
54
 
56
55
  .PageHeader-title {
@@ -64,3 +63,99 @@
64
63
  justify-content: flex-end;
65
64
  padding-left: var(--spacing-20);
66
65
  }
66
+
67
+ /* =====================================================
68
+ Responsive main header row
69
+ ===================================================== */
70
+
71
+ /* Base: flex layout — used by all variants */
72
+ .PageHeader-row {
73
+ display: flex;
74
+ flex-wrap: wrap;
75
+ align-items: start;
76
+ width: 100%;
77
+ }
78
+
79
+ .PageHeader-group--title {
80
+ flex: 1 1 auto;
81
+ min-width: 0;
82
+ order: 1;
83
+ }
84
+
85
+ /* Center-nav group — navigation/stepper in center position */
86
+ .PageHeader-group--center {
87
+ flex: 0 0 auto;
88
+ display: flex;
89
+ justify-content: center;
90
+ align-items: center;
91
+ padding: 0 var(--spacing-20);
92
+ min-width: 0;
93
+ order: 2;
94
+ }
95
+
96
+ /* Actions / right-side group */
97
+ .PageHeader-group--actions {
98
+ flex: 0 0 auto;
99
+ display: flex;
100
+ flex-wrap: wrap;
101
+ justify-content: flex-end;
102
+ align-items: center;
103
+ padding-left: var(--spacing-20);
104
+ row-gap: var(--spacing-30);
105
+ order: 3;
106
+ }
107
+
108
+ /* Default (full): CSS Grid for true 3-col centering */
109
+ .PageHeader-row--withCenter {
110
+ display: grid;
111
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
112
+ align-items: start;
113
+ }
114
+
115
+ /* Ghost: center nav stays in the grid for measurement but is invisible and out of flow.
116
+ Used when collision detection moves the nav to PageHeader-bottom. */
117
+ .PageHeader-group--center--ghost {
118
+ position: absolute;
119
+ visibility: hidden;
120
+ pointer-events: none;
121
+ }
122
+
123
+ /* All stacked: flex marker on the row + full-width children */
124
+ .PageHeader-row--allStacked {
125
+ display: flex;
126
+ flex-wrap: wrap;
127
+ }
128
+
129
+ .PageHeader-group--title--stacked {
130
+ flex: 0 0 100%;
131
+ order: 1;
132
+ }
133
+
134
+ .PageHeader-group--actions--stacked {
135
+ flex: 0 0 100%;
136
+ order: 2;
137
+ padding-left: 0;
138
+ padding-top: var(--spacing-10);
139
+ justify-content: flex-start;
140
+ }
141
+
142
+ /* =====================================================
143
+ Level 1: inter-section spacing when right group wraps
144
+ ===================================================== */
145
+
146
+ /* At < 576 px, the actions group sits between title and nav/stepper/tabs.
147
+ For level 1 headers that have actions, increase the gap to 12 px so all
148
+ three sections (title, actions, nav) have consistent breathing room. */
149
+ @media (max-width: 575px) {
150
+ .PageHeader-group--actions--level1Responsive {
151
+ padding-top: var(--spacing-30);
152
+ }
153
+
154
+ .PageHeader-bottom--level1Responsive {
155
+ margin-top: var(--spacing-30);
156
+ }
157
+
158
+ .PageHeader-navigationWrapper--noMarginSm {
159
+ margin-top: 0;
160
+ }
161
+ }
@@ -97,7 +97,7 @@
97
97
  outline: none;
98
98
  }
99
99
 
100
- .SegmentedControl-segment:focus-visible:not(.SegmentedControl-segment--selected) {
100
+ .SegmentedControl-segment:focus-visible {
101
101
  outline: var(--border-width-05) solid var(--primary-focus);
102
102
  outline-offset: var(--spacing-05);
103
103
  border-radius: var(--border-radius-10);
@@ -198,3 +198,10 @@
198
198
  .Select-trigger--error {
199
199
  border: var(--border-width-2-5) solid var(--alert) !important;
200
200
  }
201
+
202
+ @media (forced-colors: active) {
203
+ .Select-input:focus-within {
204
+ outline: var(--border-width-05) solid Highlight !important;
205
+ outline-offset: var(--spacing-05);
206
+ }
207
+ }
@@ -97,3 +97,41 @@
97
97
  background-color: var(--primary-lightest);
98
98
  opacity: var(--opacity-10);
99
99
  }
100
+
101
+ @media (forced-colors: active) {
102
+ /* All states use inset box-shadow as the sole border — replace with real borders */
103
+ .Selection-card--default,
104
+ .Selection-card--default:hover,
105
+ .Selection-card--default:active,
106
+ .Selection-card--default-disabled {
107
+ border: var(--border-width-2-5) solid ButtonText;
108
+ box-shadow: none;
109
+ }
110
+
111
+ /* Interactive selected states — use Highlight to signal selection */
112
+ .Selection-card--selected,
113
+ .Selection-card--selected:hover,
114
+ .Selection-card--selected:active {
115
+ border: var(--border-width-2-5) solid Highlight;
116
+ box-shadow: none;
117
+ }
118
+
119
+ .Selection-card--selected-disabled {
120
+ border: var(--border-width-2-5) solid GrayText;
121
+ box-shadow: none;
122
+ }
123
+
124
+ .Selection-card--default:focus,
125
+ .Selection-card--default:focus-visible,
126
+ .Selection-card--selected:focus,
127
+ .Selection-card--selected:focus-visible {
128
+ outline: var(--border-width-05) solid Highlight;
129
+ outline-offset: var(--spacing-05);
130
+ box-shadow: none;
131
+ }
132
+
133
+ /* Disabled: suppress the focus indicator */
134
+ .Selection-card--disabled {
135
+ outline: none;
136
+ }
137
+ }
@@ -116,3 +116,11 @@
116
116
  .Sidesheet-header [tabindex='-1']:focus {
117
117
  outline: none;
118
118
  }
119
+
120
+ @media (forced-colors: active) {
121
+ /* box-shadow is the only visual boundary; add a real left border so the panel edge is visible */
122
+ .Sidesheet {
123
+ border-left: var(--border-width-2-5) solid ButtonText;
124
+ box-shadow: none;
125
+ }
126
+ }
@@ -134,3 +134,24 @@
134
134
  outline: none;
135
135
  box-shadow: none;
136
136
  }
137
+
138
+ @media (forced-colors: active) {
139
+ /* Handle elevation comes from box-shadow only — add a real border so it stays visible */
140
+ .Slider-handle {
141
+ border: var(--border-width-05) solid ButtonText;
142
+ box-shadow: none;
143
+ }
144
+
145
+ /* Restore focus ring on the handle (outline:none is set unconditionally) */
146
+ .Slider-handle:focus,
147
+ .Slider-handle:focus-visible {
148
+ outline: var(--border-width-05) solid Highlight;
149
+ outline-offset: var(--spacing-05);
150
+ }
151
+
152
+ /* Filled portion of the track */
153
+ .Slider-progress--inRange {
154
+ forced-color-adjust: none;
155
+ background: Highlight;
156
+ }
157
+ }
@@ -135,3 +135,42 @@
135
135
  .Switch-wrapper--checkedDisabled:before {
136
136
  border-color: transparent;
137
137
  }
138
+
139
+ @media (forced-colors: active) {
140
+ .Switch-wrapper {
141
+ outline: var(--border-width-2-5) solid ButtonText;
142
+ outline-offset: calc(-1 * var(--border-width-2-5));
143
+ box-shadow: none;
144
+ }
145
+
146
+ /* Checked (enabled) track: use Highlight to distinguish on-state */
147
+ .Switch-wrapper--checked:not(.Switch-wrapper--checkedDisabled) {
148
+ background-color: Highlight;
149
+ }
150
+
151
+ .Switch-wrapper--checkedDisabled {
152
+ background-color: ButtonFace;
153
+ outline-color: GrayText;
154
+ }
155
+
156
+ /* Thumb: box-shadow is removed in forced-colors mode — ensure the existing border is visible */
157
+ .Switch-wrapper:before {
158
+ box-shadow: none;
159
+ border-color: ButtonText;
160
+ }
161
+
162
+ /* In the checked (enabled) state the thumb border is transparent — make it contrast against the track */
163
+ .Switch-wrapper--checked:not(.Switch-wrapper--checkedDisabled):before {
164
+ border-color: HighlightText;
165
+ }
166
+
167
+ /* Checked-disabled thumb: use GrayText so it reads as disabled */
168
+ .Switch-wrapper--checkedDisabled:before {
169
+ border-color: GrayText;
170
+ }
171
+
172
+ /* Unchecked-disabled thumb */
173
+ .Switch-wrapper--disabled:before {
174
+ border-color: GrayText;
175
+ }
176
+ }
@@ -28,11 +28,42 @@
28
28
  }
29
29
 
30
30
  .Table-Header-Label--hide {
31
- animation: fadeOut var(--duration--fast-02) var(--exit-productive-curve);
31
+ animation: tableHeaderFadeOut var(--duration--fast-02) var(--exit-productive-curve);
32
32
  animation-fill-mode: forwards;
33
+ pointer-events: none;
33
34
  }
34
35
 
35
36
  .Table-Header-Label--show {
36
37
  animation: fadeIn var(--duration--moderate-01) var(--entrance-productive-curve);
37
38
  animation-fill-mode: forwards;
38
39
  }
40
+
41
+ @keyframes tableHeaderFadeOut {
42
+ from {
43
+ opacity: 1;
44
+ visibility: visible;
45
+ }
46
+ to {
47
+ opacity: 0;
48
+ visibility: hidden;
49
+ }
50
+ }
51
+
52
+ @media (prefers-reduced-motion: reduce) {
53
+ .Table-Header-Label--hide,
54
+ .Table-Header-Label--show {
55
+ animation-duration: 0.001ms;
56
+ }
57
+ }
58
+
59
+ .Table-srOnly {
60
+ position: absolute;
61
+ width: var(--spacing-2-5);
62
+ height: var(--spacing-2-5);
63
+ padding: 0;
64
+ margin: calc(-1 * var(--spacing-2-5));
65
+ overflow: hidden;
66
+ clip: rect(0, 0, 0, 0);
67
+ white-space: nowrap;
68
+ border: 0;
69
+ }
@@ -182,3 +182,23 @@
182
182
  display: flex;
183
183
  box-sizing: border-box;
184
184
  }
185
+
186
+ @media (forced-colors: active) {
187
+ /* Dismissible tab close icons have outline:none unconditionally — restore focus ring in forced-colors mode */
188
+ .DismissibleRegularTab-icon--right:focus-visible,
189
+ .DismissibleSmallTab-icon--right:focus-visible {
190
+ outline: var(--border-width-05) solid Highlight;
191
+ }
192
+
193
+ .Tab--active::after {
194
+ background-color: transparent;
195
+ border-top: var(--spacing-05) solid Highlight;
196
+ box-sizing: border-box;
197
+ }
198
+
199
+ /* Disabled tab pills use opacity — use GrayText instead */
200
+ .Tab-pills--disabled {
201
+ opacity: 1;
202
+ color: GrayText;
203
+ }
204
+ }
@@ -0,0 +1,4 @@
1
+ .TimePicker-trigger {
2
+ width: calc(var(--spacing-40) * 20);
3
+ min-width: calc(var(--spacing-40) * 16);
4
+ }
@@ -196,3 +196,13 @@
196
196
  background: var(--warning-darker);
197
197
  color: var(--text-white);
198
198
  }
199
+
200
+ @media (forced-colors: active) {
201
+ /* Close icon focus ring is conveyed via box-shadow only — replace with outline */
202
+ .Toast-close-icon:focus,
203
+ .Toast-close-icon:focus-visible {
204
+ outline: var(--border-width-05) solid Highlight;
205
+ outline-offset: var(--spacing-05);
206
+ box-shadow: none;
207
+ }
208
+ }