@digiko-npm/designsystem 0.3.33 → 0.4.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.
@@ -20,6 +20,13 @@
20
20
  box-shadow: var(--ds-shadow-lg);
21
21
  transform: translateY(-4px);
22
22
  }
23
+ .ds-card--interactive:focus-visible {
24
+ outline: none;
25
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
26
+ }
27
+ .ds-card--interactive:hover:focus-visible {
28
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color), var(--ds-shadow-lg);
29
+ }
23
30
 
24
31
  /* Elevated card — visible shadow */
25
32
  .ds-card--elevated {
@@ -70,6 +77,9 @@
70
77
  object-fit: cover;
71
78
  background-color: var(--ds-color-bg-elevated);
72
79
  }
80
+ .ds-card__media--square { aspect-ratio: 1; }
81
+ .ds-card__media--video { aspect-ratio: 16/9; }
82
+ .ds-card__media--auto { aspect-ratio: auto; }
73
83
 
74
84
  /* Compact */
75
85
  .ds-card--compact .ds-card__header,
@@ -145,6 +145,10 @@
145
145
  background-color: var(--ds-color-bg-elevated);
146
146
  color: var(--ds-color-text);
147
147
  }
148
+ .ds-command__item:focus-visible {
149
+ outline: none;
150
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
151
+ }
148
152
 
149
153
  /* Item icon */
150
154
  .ds-command__item-icon {
@@ -37,6 +37,12 @@
37
37
  border-color: var(--ds-color-border-hover);
38
38
  }
39
39
 
40
+ .ds-custom-select__trigger:focus-visible {
41
+ border-color: var(--ds-color-border-active);
42
+ outline: none;
43
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
44
+ }
45
+
40
46
  .ds-custom-select__trigger--open {
41
47
  border-color: var(--ds-color-border-active);
42
48
  box-shadow: inset 0 0 0 1px var(--ds-color-border-active);
@@ -200,6 +206,10 @@
200
206
  background-color: var(--ds-color-bg-elevated);
201
207
  color: var(--ds-color-text);
202
208
  }
209
+ .ds-custom-select__option:focus-visible {
210
+ outline: none;
211
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
212
+ }
203
213
 
204
214
  .ds-custom-select__option--selected {
205
215
  background-color: var(--ds-color-bg-elevated);
@@ -308,3 +318,12 @@
308
318
  border-radius: 0;
309
319
  }
310
320
  }
321
+
322
+ @media (prefers-reduced-motion: reduce) {
323
+ .ds-custom-select__panel {
324
+ animation: none;
325
+ opacity: 1;
326
+ transform: scale(1);
327
+ }
328
+ .ds-custom-select__backdrop { animation: none; opacity: 1; }
329
+ }
@@ -57,11 +57,16 @@
57
57
  line-height: 1;
58
58
  }
59
59
 
60
+ .ds-datepicker__trigger:focus-visible {
61
+ outline: none;
62
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
63
+ }
64
+
60
65
  /* Calendar panel */
61
66
  .ds-datepicker__panel {
62
67
  position: absolute;
63
68
  z-index: var(--ds-z-dropdown);
64
- top: calc(100% + 4px);
69
+ top: calc(100% + var(--ds-offset-sm));
65
70
  left: 0;
66
71
  background-color: var(--ds-color-surface);
67
72
  border: 1px solid var(--ds-color-border);
@@ -73,8 +78,8 @@
73
78
  visibility: hidden;
74
79
  transform: scale(0.96);
75
80
  transition:
76
- opacity var(--ds-duration-fast) var(--ds-ease),
77
- visibility var(--ds-duration-fast) var(--ds-ease),
81
+ opacity var(--ds-duration-fast) var(--ds-ease-default),
82
+ visibility var(--ds-duration-fast) var(--ds-ease-default),
78
83
  transform var(--ds-duration-fast) var(--ds-ease-out-expo);
79
84
  }
80
85
 
@@ -95,7 +100,7 @@
95
100
 
96
101
  .ds-datepicker__title {
97
102
  font-size: var(--ds-text-sm);
98
- font-weight: 600;
103
+ font-weight: var(--ds-weight-semibold);
99
104
  color: var(--ds-color-text);
100
105
  user-select: none;
101
106
  }
@@ -112,13 +117,17 @@
112
117
  color: var(--ds-color-text-secondary);
113
118
  cursor: pointer;
114
119
  font-size: var(--ds-text-base);
115
- transition: all var(--ds-duration-fast) var(--ds-ease);
120
+ transition: all var(--ds-duration-fast) var(--ds-ease-default);
116
121
  }
117
122
 
118
123
  .ds-datepicker__nav:hover {
119
124
  background-color: var(--ds-color-bg-elevated);
120
125
  color: var(--ds-color-text);
121
126
  }
127
+ .ds-datepicker__nav:focus-visible {
128
+ outline: none;
129
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
130
+ }
122
131
 
123
132
  /* Weekday header row */
124
133
  .ds-datepicker__weekdays {
@@ -133,7 +142,7 @@
133
142
  text-align: center;
134
143
  padding: var(--ds-space-1) 0;
135
144
  user-select: none;
136
- font-weight: 500;
145
+ font-weight: var(--ds-weight-medium);
137
146
  }
138
147
 
139
148
  /* Day grid */
@@ -155,7 +164,7 @@
155
164
  font-size: var(--ds-text-sm);
156
165
  color: var(--ds-color-text);
157
166
  cursor: pointer;
158
- transition: all var(--ds-duration-fast) var(--ds-ease);
167
+ transition: all var(--ds-duration-fast) var(--ds-ease-default);
159
168
  padding: 0;
160
169
  line-height: 1;
161
170
  user-select: none;
@@ -164,18 +173,22 @@
164
173
  .ds-datepicker__day:hover {
165
174
  background-color: var(--ds-color-bg-elevated);
166
175
  }
176
+ .ds-datepicker__day:focus-visible {
177
+ outline: none;
178
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
179
+ }
167
180
 
168
181
  /* Today — subtle ring */
169
182
  .ds-datepicker__day--today {
170
183
  box-shadow: inset 0 0 0 1px var(--ds-color-border-active);
171
- font-weight: 600;
184
+ font-weight: var(--ds-weight-semibold);
172
185
  }
173
186
 
174
187
  /* Selected — inverted fill */
175
188
  .ds-datepicker__day--selected {
176
189
  background-color: var(--ds-color-text);
177
190
  color: var(--ds-color-bg);
178
- font-weight: 600;
191
+ font-weight: var(--ds-weight-semibold);
179
192
  }
180
193
 
181
194
  .ds-datepicker__day--selected:hover {
@@ -200,14 +213,14 @@
200
213
 
201
214
  .ds-datepicker__today {
202
215
  font-size: var(--ds-text-xs);
203
- font-weight: 500;
216
+ font-weight: var(--ds-weight-medium);
204
217
  color: var(--ds-color-text-secondary);
205
218
  background: none;
206
219
  border: 1px solid var(--ds-color-border);
207
220
  border-radius: var(--ds-radius-full);
208
221
  padding: var(--ds-space-1) var(--ds-space-3);
209
222
  cursor: pointer;
210
- transition: all var(--ds-duration-fast) var(--ds-ease);
223
+ transition: all var(--ds-duration-fast) var(--ds-ease-default);
211
224
  }
212
225
 
213
226
  .ds-datepicker__today:hover {
@@ -215,6 +228,10 @@
215
228
  color: var(--ds-color-text);
216
229
  border-color: var(--ds-color-border-hover);
217
230
  }
231
+ .ds-datepicker__today:focus-visible {
232
+ outline: none;
233
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
234
+ }
218
235
 
219
236
  /* Step arrows — prev/next day buttons beside the date text */
220
237
  .ds-datepicker__step {
@@ -229,7 +246,7 @@
229
246
  color: var(--ds-color-text-tertiary);
230
247
  cursor: pointer;
231
248
  font-size: var(--ds-text-xs);
232
- transition: all var(--ds-duration-fast) var(--ds-ease);
249
+ transition: all var(--ds-duration-fast) var(--ds-ease-default);
233
250
  padding: 0;
234
251
  flex-shrink: 0;
235
252
  }
@@ -238,6 +255,10 @@
238
255
  background-color: var(--ds-color-bg-elevated);
239
256
  color: var(--ds-color-text);
240
257
  }
258
+ .ds-datepicker__step:focus-visible {
259
+ outline: none;
260
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
261
+ }
241
262
 
242
263
  /* Compact mode — for inline table cells */
243
264
  .ds-datepicker--compact .ds-datepicker__panel {
@@ -256,7 +277,7 @@
256
277
  }
257
278
 
258
279
  .ds-datepicker--compact .ds-datepicker__weekday {
259
- font-size: 0.625rem;
280
+ font-size: var(--ds-text-2xs);
260
281
  }
261
282
 
262
283
  .ds-datepicker--compact .ds-datepicker__day {
@@ -264,7 +285,7 @@
264
285
  }
265
286
 
266
287
  .ds-datepicker--compact .ds-datepicker__today {
267
- font-size: 0.625rem;
288
+ font-size: var(--ds-text-2xs);
268
289
  padding: 2px var(--ds-space-2);
269
290
  }
270
291
 
@@ -185,6 +185,10 @@
185
185
  background-color: var(--ds-color-overlay);
186
186
  color: var(--ds-color-text);
187
187
  }
188
+ .ds-drawer__close:focus-visible {
189
+ outline: none;
190
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
191
+ }
188
192
 
189
193
  /* ==========================================================================
190
194
  * Body
@@ -39,6 +39,10 @@
39
39
  transition:
40
40
  background-color var(--ds-duration-fast) var(--ds-ease-default);
41
41
  }
42
+ .ds-drop-zone:focus-visible {
43
+ outline: none;
44
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
45
+ }
42
46
 
43
47
  :root:not(.dark) .ds-drop-zone {
44
48
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25'%3E%3Crect x='1' y='1' width='99%25' height='99%25' rx='16' ry='16' fill='none' stroke='%23d4d4d8' stroke-width='2' stroke-dasharray='10 8'/%3E%3C/svg%3E");
@@ -63,6 +63,11 @@
63
63
  transform-origin: bottom right;
64
64
  }
65
65
 
66
+ /* --- Width variants --- */
67
+ .ds-dropdown__menu--sm { min-width: 8rem; }
68
+ .ds-dropdown__menu--lg { min-width: 20rem; }
69
+ .ds-dropdown__menu--auto { min-width: auto; }
70
+
66
71
  /* --- Menu item --- */
67
72
 
68
73
  .ds-dropdown__item {
@@ -85,6 +90,10 @@
85
90
  background-color: var(--ds-color-bg-elevated);
86
91
  color: var(--ds-color-text);
87
92
  }
93
+ .ds-dropdown__item:focus-visible {
94
+ outline: none;
95
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
96
+ }
88
97
 
89
98
  .ds-dropdown__item--active {
90
99
  background-color: var(--ds-color-bg-elevated);
@@ -67,3 +67,9 @@
67
67
  border: 1px solid var(--ds-color-border);
68
68
  border-radius: var(--ds-radius-xl);
69
69
  }
70
+
71
+ /* --- Left-aligned variant --- */
72
+ .ds-empty-state--left {
73
+ align-items: flex-start;
74
+ text-align: left;
75
+ }
@@ -11,10 +11,14 @@
11
11
  margin-bottom: var(--ds-space-1-5);
12
12
  }
13
13
 
14
+ .ds-input,
15
+ .ds-textarea {
16
+ width: 100%;
17
+ }
18
+
14
19
  .ds-input,
15
20
  .ds-textarea,
16
21
  .ds-select {
17
- width: 100%;
18
22
  padding: 0 var(--ds-space-4);
19
23
  font-family: var(--ds-font-sans);
20
24
  font-size: var(--ds-text-base); /* 16px — prevents iOS auto-zoom on focus */
@@ -23,7 +27,11 @@
23
27
  background-color: var(--ds-color-surface);
24
28
  border: 1px solid var(--ds-color-border);
25
29
  border-radius: var(--ds-radius-lg);
26
- transition: all var(--ds-duration-fast) var(--ds-ease-default);
30
+ outline: none;
31
+ transition:
32
+ border-color var(--ds-duration-fast) var(--ds-ease-default),
33
+ box-shadow var(--ds-duration-fast) var(--ds-ease-default),
34
+ background-color var(--ds-duration-fast) var(--ds-ease-default);
27
35
  }
28
36
 
29
37
  .ds-input,
@@ -31,18 +39,22 @@
31
39
  height: var(--ds-size-3);
32
40
  }
33
41
 
42
+ /* Hover */
34
43
  .ds-input:hover,
35
44
  .ds-textarea:hover,
36
45
  .ds-select:hover {
37
46
  border-color: var(--ds-color-border-hover);
38
47
  }
39
48
 
40
- .ds-input:focus,
41
- .ds-textarea:focus,
42
- .ds-select:focus {
43
- border-color: var(--ds-color-border-active);
44
- box-shadow: inset 0 0 0 1px var(--ds-color-border-active);
45
- outline: none;
49
+ /* Focus — box-shadow ring instead of outline.
50
+ Inputs always trigger :focus-visible (browser heuristic for text entry),
51
+ so outline creates unavoidable double-border with offset.
52
+ box-shadow follows border-radius perfectly and has no gap. */
53
+ .ds-input:focus-visible,
54
+ .ds-textarea:focus-visible,
55
+ .ds-select:focus-visible {
56
+ border-color: var(--ds-ring-color);
57
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
46
58
  }
47
59
 
48
60
  .ds-input::placeholder,
@@ -50,19 +62,32 @@
50
62
  color: var(--ds-color-text-tertiary);
51
63
  }
52
64
 
53
- /* States */
65
+ /* States — error: border + ring match the semantic color */
54
66
  .ds-input--error,
55
67
  .ds-textarea--error {
56
68
  border-color: var(--ds-color-error);
57
69
  }
58
- .ds-input--error:focus,
59
- .ds-textarea--error:focus {
60
- box-shadow: inset 0 0 0 1px var(--ds-color-error);
70
+ .ds-input--error:hover,
71
+ .ds-textarea--error:hover {
72
+ border-color: var(--ds-color-error);
73
+ }
74
+ .ds-input--error:focus-visible,
75
+ .ds-textarea--error:focus-visible {
76
+ border-color: var(--ds-color-error);
77
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-error);
61
78
  }
62
79
 
80
+ /* States — success: border + ring match the semantic color */
63
81
  .ds-input--success {
64
82
  border-color: var(--ds-color-success);
65
83
  }
84
+ .ds-input--success:hover {
85
+ border-color: var(--ds-color-success);
86
+ }
87
+ .ds-input--success:focus-visible {
88
+ border-color: var(--ds-color-success);
89
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-success);
90
+ }
66
91
 
67
92
  /* Sizes */
68
93
  .ds-input--xs,
@@ -109,6 +134,50 @@
109
134
  padding-right: var(--ds-space-8);
110
135
  }
111
136
 
137
+ /* --- Layout Modifiers ---
138
+ Override default width/display/chrome assumptions. */
139
+
140
+ /* Full width (opt-in for select, already default for input/textarea) */
141
+ .ds-select--full {
142
+ width: 100%;
143
+ }
144
+
145
+ /* Flush — naked input inside a styled container.
146
+ No border, no background, no padding, no focus ring.
147
+ The container handles visual chrome. */
148
+ .ds-input--flush {
149
+ background: transparent;
150
+ border: none;
151
+ padding: 0;
152
+ border-radius: 0;
153
+ box-shadow: none;
154
+ height: auto;
155
+ }
156
+ .ds-input--flush:hover {
157
+ border-color: transparent;
158
+ }
159
+ .ds-input--flush:focus-visible {
160
+ border-color: transparent;
161
+ box-shadow: none;
162
+ }
163
+
164
+ /* Inline — auto-width for use in flex rows */
165
+ .ds-input--inline {
166
+ width: auto;
167
+ display: inline-flex;
168
+ }
169
+
170
+ /* --- Input Group: icon-right ---
171
+ Move icon to the right side, flip input padding. */
172
+ .ds-input-group--icon-right .ds-input-group__icon {
173
+ left: auto;
174
+ right: var(--ds-space-3);
175
+ }
176
+ .ds-input-group--icon-right .ds-input {
177
+ padding-left: var(--ds-space-4);
178
+ padding-right: calc(var(--ds-space-3) + 1rem + var(--ds-space-2));
179
+ }
180
+
112
181
  /* Help text */
113
182
  .ds-help {
114
183
  font-size: var(--ds-text-xs);
@@ -12,8 +12,8 @@
12
12
  justify-content: center;
13
13
  padding: var(--ds-space-4);
14
14
  background-color: var(--ds-color-overlay);
15
- backdrop-filter: blur(4px);
16
- -webkit-backdrop-filter: blur(4px);
15
+ backdrop-filter: blur(var(--ds-blur-sm));
16
+ -webkit-backdrop-filter: blur(var(--ds-blur-sm));
17
17
  opacity: 0;
18
18
  visibility: hidden;
19
19
  transition:
@@ -82,6 +82,10 @@
82
82
  .ds-modal__close:hover {
83
83
  color: var(--ds-color-text);
84
84
  }
85
+ .ds-modal__close:focus-visible {
86
+ outline: none;
87
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
88
+ }
85
89
 
86
90
  .ds-modal__body {
87
91
  padding: var(--ds-space-5);
@@ -15,8 +15,8 @@
15
15
  height: 4rem;
16
16
  background-color: var(--ds-color-nav-bg);
17
17
  border-bottom: 1px solid var(--ds-color-nav-border);
18
- backdrop-filter: blur(20px) saturate(1.5);
19
- -webkit-backdrop-filter: blur(20px) saturate(1.5);
18
+ backdrop-filter: blur(var(--ds-blur-lg)) saturate(1.5);
19
+ -webkit-backdrop-filter: blur(var(--ds-blur-lg)) saturate(1.5);
20
20
  }
21
21
 
22
22
  .ds-nav--static {
@@ -59,6 +59,11 @@
59
59
  }
60
60
  }
61
61
 
62
+ .ds-nav__link:focus-visible {
63
+ outline: none;
64
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
65
+ }
66
+
62
67
  .ds-nav__link--active {
63
68
  color: var(--ds-color-text);
64
69
  }
@@ -88,13 +93,18 @@
88
93
  }
89
94
  }
90
95
 
96
+ .ds-nav__icon-btn:focus-visible {
97
+ outline: none;
98
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
99
+ }
100
+
91
101
  /* --- Mobile nav overlay --- */
92
102
  .ds-nav__mobile {
93
103
  overflow: hidden;
94
104
  max-height: 0;
95
105
  border-bottom: 0 solid var(--ds-color-nav-border);
96
106
  background-color: var(--ds-color-nav-bg);
97
- backdrop-filter: blur(20px);
107
+ backdrop-filter: blur(var(--ds-blur-lg));
98
108
  transition: all var(--ds-duration-slow) var(--ds-ease-out-expo);
99
109
  }
100
110
 
@@ -162,6 +172,11 @@
162
172
  }
163
173
  }
164
174
 
175
+ .ds-sidebar__link:focus-visible {
176
+ outline: none;
177
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
178
+ }
179
+
165
180
  .ds-sidebar__link--active {
166
181
  color: var(--ds-color-text);
167
182
  background-color: var(--ds-color-bg-elevated);
@@ -57,8 +57,8 @@
57
57
  }
58
58
 
59
59
  .ds-pagination__item:focus-visible {
60
- outline: var(--ds-ring-width) solid var(--ds-ring-color);
61
- outline-offset: var(--ds-ring-offset);
60
+ outline: none;
61
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
62
62
  }
63
63
 
64
64
  /* ---------------------------------------------------------------------------
@@ -116,8 +116,8 @@
116
116
 
117
117
  .ds-pagination__prev:focus-visible,
118
118
  .ds-pagination__next:focus-visible {
119
- outline: var(--ds-ring-width) solid var(--ds-ring-color);
120
- outline-offset: var(--ds-ring-offset);
119
+ outline: none;
120
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
121
121
  }
122
122
 
123
123
  .ds-pagination__prev:disabled,
@@ -54,7 +54,7 @@
54
54
  /* Placement: bottom (default) */
55
55
  .ds-popover__content,
56
56
  .ds-popover--bottom .ds-popover__content {
57
- top: calc(100% + 8px);
57
+ top: calc(100% + var(--ds-offset-md));
58
58
  left: 50%;
59
59
  transform: translateX(-50%) scale(0.96);
60
60
  }
@@ -66,7 +66,7 @@
66
66
 
67
67
  /* Placement: top */
68
68
  .ds-popover--top .ds-popover__content {
69
- bottom: calc(100% + 8px);
69
+ bottom: calc(100% + var(--ds-offset-md));
70
70
  top: auto;
71
71
  left: 50%;
72
72
  transform: translateX(-50%) scale(0.96);
@@ -78,7 +78,7 @@
78
78
 
79
79
  /* Placement: left */
80
80
  .ds-popover--left .ds-popover__content {
81
- right: calc(100% + 8px);
81
+ right: calc(100% + var(--ds-offset-md));
82
82
  top: 50%;
83
83
  left: auto;
84
84
  transform: translateY(-50%) scale(0.96);
@@ -90,7 +90,7 @@
90
90
 
91
91
  /* Placement: right */
92
92
  .ds-popover--right .ds-popover__content {
93
- left: calc(100% + 8px);
93
+ left: calc(100% + var(--ds-offset-md));
94
94
  top: 50%;
95
95
  transform: translateY(-50%) scale(0.96);
96
96
  }
@@ -94,3 +94,7 @@
94
94
  opacity: 0.4;
95
95
  }
96
96
  }
97
+
98
+ @media (prefers-reduced-motion: reduce) {
99
+ .ds-skeleton { animation: none; }
100
+ }
@@ -73,12 +73,12 @@
73
73
  /* Focus ring */
74
74
  .ds-slider input[type="range"]:focus-visible::-webkit-slider-thumb {
75
75
  outline: var(--ds-ring-width) solid var(--ds-ring-color);
76
- outline-offset: var(--ds-ring-offset);
76
+ outline-offset: 0;
77
77
  }
78
78
 
79
79
  .ds-slider input[type="range"]:focus-visible::-moz-range-thumb {
80
80
  outline: var(--ds-ring-width) solid var(--ds-ring-color);
81
- outline-offset: var(--ds-ring-offset);
81
+ outline-offset: 0;
82
82
  }
83
83
 
84
84
  /* Labels row */
@@ -31,6 +31,12 @@ tr:hover .ds-sortable__handle,
31
31
  opacity: 1;
32
32
  }
33
33
 
34
+ .ds-sortable__handle:focus-visible {
35
+ outline: none;
36
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
37
+ border-radius: var(--ds-radius-sm);
38
+ }
39
+
34
40
  tr:hover .ds-sortable__handle,
35
41
  .ds-sortable-row:hover .ds-sortable__handle {
36
42
  color: var(--ds-color-text-secondary);
@@ -106,8 +106,8 @@
106
106
  }
107
107
 
108
108
  .ds-tab:focus-visible {
109
- outline: var(--ds-ring-width) solid var(--ds-ring-color);
110
- outline-offset: var(--ds-ring-offset);
109
+ outline: none;
110
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
111
111
  border-radius: var(--ds-radius-sm);
112
112
  }
113
113
 
@@ -42,6 +42,7 @@
42
42
  /* Tags used as <button> for selection — no focus ring on click */
43
43
  button.ds-tag:focus-visible {
44
44
  outline: none;
45
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
45
46
  }
46
47
 
47
48
  /* ---------------------------------------------------------------------------
@@ -124,8 +125,8 @@ button.ds-tag:focus-visible {
124
125
  }
125
126
 
126
127
  .ds-tag__remove:focus-visible {
127
- outline: var(--ds-ring-width) solid var(--ds-ring-color);
128
- outline-offset: var(--ds-ring-offset);
128
+ outline: none;
129
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
129
130
  opacity: 1;
130
131
  }
131
132
 
@@ -35,10 +35,10 @@
35
35
  animation: ds-toast-in var(--ds-duration-slow) var(--ds-ease-out-expo) forwards;
36
36
  }
37
37
 
38
- .ds-toast--info { border-left: 3px solid var(--ds-color-info); }
39
- .ds-toast--success { border-left: 3px solid var(--ds-color-success); }
40
- .ds-toast--warning { border-left: 3px solid var(--ds-color-warning); }
41
- .ds-toast--error { border-left: 3px solid var(--ds-color-error); }
38
+ .ds-toast--info { border-left: var(--ds-accent-border-width) solid var(--ds-color-info); }
39
+ .ds-toast--success { border-left: var(--ds-accent-border-width) solid var(--ds-color-success); }
40
+ .ds-toast--warning { border-left: var(--ds-accent-border-width) solid var(--ds-color-warning); }
41
+ .ds-toast--error { border-left: var(--ds-accent-border-width) solid var(--ds-color-error); }
42
42
 
43
43
  .ds-toast__message {
44
44
  flex: 1;
@@ -55,6 +55,10 @@
55
55
  .ds-toast__close:hover {
56
56
  color: var(--ds-color-text);
57
57
  }
58
+ .ds-toast__close:focus-visible {
59
+ outline: none;
60
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
61
+ }
58
62
 
59
63
  @keyframes ds-toast-in {
60
64
  from { opacity: 0; transform: translateY(-8px); }
@@ -68,3 +72,8 @@
68
72
  @keyframes ds-toast-out {
69
73
  to { opacity: 0; transform: translateX(100%); }
70
74
  }
75
+
76
+ @media (prefers-reduced-motion: reduce) {
77
+ .ds-toast { animation: none; }
78
+ .ds-toast--exit { animation: none; opacity: 0; }
79
+ }
@@ -83,8 +83,8 @@
83
83
  --------------------------------------------------------------------------- */
84
84
 
85
85
  .ds-toggle:focus-visible {
86
- outline: var(--ds-ring-width) solid var(--ds-ring-color);
87
- outline-offset: var(--ds-ring-offset);
86
+ outline: none;
87
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
88
88
  }
89
89
 
90
90
  /* ---------------------------------------------------------------------------