@digiko-npm/designsystem 0.5.0 → 0.7.2

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 (55) hide show
  1. package/README.md +7 -7
  2. package/dist/designsystem.css +1284 -474
  3. package/dist/designsystem.min.css +2 -2
  4. package/package.json +6 -1
  5. package/src/base/typography.css +8 -8
  6. package/src/components/accordion.css +21 -14
  7. package/src/components/alert.css +25 -19
  8. package/src/components/avatar.css +16 -16
  9. package/src/components/bottom-nav.css +27 -21
  10. package/src/components/breadcrumb.css +7 -0
  11. package/src/components/button.css +10 -2
  12. package/src/components/card.css +6 -42
  13. package/src/components/chip.css +10 -3
  14. package/src/components/collapsible.css +116 -0
  15. package/src/components/command.css +17 -7
  16. package/src/components/custom-select.css +123 -7
  17. package/src/components/datepicker.css +9 -9
  18. package/src/components/description-list.css +98 -0
  19. package/src/components/divider.css +1 -1
  20. package/src/components/drawer.css +28 -19
  21. package/src/components/drop-zone.css +10 -3
  22. package/src/components/dropdown.css +17 -8
  23. package/src/components/empty-state.css +3 -3
  24. package/src/components/field.css +77 -0
  25. package/src/components/icon-btn.css +12 -6
  26. package/src/components/index.css +5 -0
  27. package/src/components/input.css +26 -16
  28. package/src/components/kbd.css +1 -1
  29. package/src/components/modal.css +13 -4
  30. package/src/components/nav.css +22 -11
  31. package/src/components/pagination.css +9 -0
  32. package/src/components/popover.css +10 -10
  33. package/src/components/progress.css +2 -2
  34. package/src/components/result.css +84 -0
  35. package/src/components/search.css +24 -26
  36. package/src/components/skeleton.css +4 -4
  37. package/src/components/slider.css +13 -6
  38. package/src/components/sortable.css +9 -0
  39. package/src/components/stat-card.css +41 -0
  40. package/src/components/table.css +3 -3
  41. package/src/components/tabs.css +26 -18
  42. package/src/components/tag.css +11 -3
  43. package/src/components/timeline.css +14 -14
  44. package/src/components/toast.css +19 -7
  45. package/src/components/toggle.css +10 -2
  46. package/src/components/toolbar.css +1 -1
  47. package/src/components/tooltip.css +34 -28
  48. package/src/index.css +6 -4
  49. package/src/tokens/colors.css +18 -6
  50. package/src/tokens/spacing.css +7 -0
  51. package/src/utilities/a11y.css +102 -0
  52. package/src/utilities/index.css +1 -0
  53. package/src/utilities/layout.css +26 -26
  54. package/src/utilities/spacing.css +52 -52
  55. package/src/utilities/text.css +8 -8
@@ -1,6 +1,14 @@
1
1
  /* ==========================================================================
2
2
  Component: Dropdown
3
3
  Floating menu with surface bg, scale transition, keyboard-friendly items.
4
+
5
+ ARIA requirements (consumer responsibility):
6
+ - Trigger: aria-haspopup="true", aria-expanded="true|false"
7
+ - Menu: role="menu"
8
+ - Items: role="menuitem"
9
+ - Keyboard: ArrowUp/Down to navigate, Enter to select, Escape to close
10
+ - On open: move focus to first menu item
11
+ - On close: return focus to trigger
4
12
  ========================================================================== */
5
13
 
6
14
  .ds-dropdown {
@@ -17,8 +25,8 @@
17
25
 
18
26
  .ds-dropdown__menu {
19
27
  position: absolute;
20
- top: calc(100% + var(--ds-space-1));
21
- left: 0;
28
+ inset-block-start: calc(100% + var(--ds-space-1));
29
+ inset-inline-start: 0;
22
30
  z-index: var(--ds-z-dropdown);
23
31
  min-width: 12rem;
24
32
  padding-block: var(--ds-space-1-5);
@@ -48,14 +56,14 @@
48
56
  /* --- Alignment variants --- */
49
57
 
50
58
  .ds-dropdown__menu--right {
51
- left: auto;
52
- right: 0;
59
+ inset-inline-start: auto;
60
+ inset-inline-end: 0;
53
61
  transform-origin: top right;
54
62
  }
55
63
 
56
64
  .ds-dropdown__menu--up {
57
- top: auto;
58
- bottom: calc(100% + var(--ds-space-1));
65
+ inset-block-start: auto;
66
+ inset-block-end: calc(100% + var(--ds-space-1));
59
67
  transform-origin: bottom left;
60
68
  }
61
69
 
@@ -93,6 +101,7 @@
93
101
  .ds-dropdown__item:focus-visible {
94
102
  outline: none;
95
103
  box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
104
+ scroll-margin-block: var(--ds-space-16, 4rem);
96
105
  }
97
106
 
98
107
  .ds-dropdown__item--active {
@@ -122,7 +131,7 @@
122
131
  }
123
132
 
124
133
  .ds-dropdown__item-shortcut {
125
- margin-left: auto;
134
+ margin-inline-start: auto;
126
135
  font-size: var(--ds-text-xs);
127
136
  color: var(--ds-color-text-tertiary);
128
137
  }
@@ -132,7 +141,7 @@
132
141
  .ds-dropdown__divider {
133
142
  margin-block: var(--ds-space-1);
134
143
  border: 0;
135
- border-top: 1px solid var(--ds-color-border);
144
+ border-block-start: 1px solid var(--ds-color-border);
136
145
  }
137
146
 
138
147
  /* --- Section header --- */
@@ -17,7 +17,7 @@
17
17
  width: 3rem;
18
18
  height: 3rem;
19
19
  color: var(--ds-color-text-tertiary);
20
- margin-bottom: var(--ds-space-2);
20
+ margin-block-end: var(--ds-space-2);
21
21
  }
22
22
 
23
23
  .ds-empty-state__title {
@@ -42,7 +42,7 @@
42
42
  align-items: center;
43
43
  justify-content: center;
44
44
  gap: var(--ds-space-3);
45
- margin-top: var(--ds-space-2);
45
+ margin-block-start: var(--ds-space-2);
46
46
  }
47
47
 
48
48
  /* --- Compact variant --- */
@@ -71,5 +71,5 @@
71
71
  /* --- Left-aligned variant --- */
72
72
  .ds-empty-state--left {
73
73
  align-items: flex-start;
74
- text-align: left;
74
+ text-align: start;
75
75
  }
@@ -0,0 +1,77 @@
1
+ /* ==========================================================================
2
+ Component: Field
3
+ Unified wrapper for form fields — label + input + hint + error.
4
+ ========================================================================== */
5
+
6
+ /* ---------------------------------------------------------------------------
7
+ Container
8
+ --------------------------------------------------------------------------- */
9
+
10
+ .ds-field {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: var(--ds-space-1-5);
14
+ }
15
+
16
+ /* ---------------------------------------------------------------------------
17
+ Label
18
+ --------------------------------------------------------------------------- */
19
+
20
+ .ds-field__label {
21
+ font-family: var(--ds-font-sans);
22
+ font-size: var(--ds-text-sm);
23
+ font-weight: var(--ds-weight-medium);
24
+ color: var(--ds-color-text);
25
+ line-height: var(--ds-leading-normal);
26
+ }
27
+
28
+ /* Required asterisk */
29
+ .ds-field--required .ds-field__label::after {
30
+ content: " *";
31
+ color: var(--ds-color-error);
32
+ }
33
+
34
+ /* ---------------------------------------------------------------------------
35
+ Hint (help text below input)
36
+ --------------------------------------------------------------------------- */
37
+
38
+ .ds-field__hint {
39
+ font-size: var(--ds-text-xs);
40
+ color: var(--ds-color-text-tertiary);
41
+ line-height: var(--ds-leading-normal);
42
+ }
43
+
44
+ /* ---------------------------------------------------------------------------
45
+ Error message
46
+ --------------------------------------------------------------------------- */
47
+
48
+ .ds-field__error {
49
+ font-size: var(--ds-text-xs);
50
+ color: var(--ds-color-error);
51
+ line-height: var(--ds-leading-normal);
52
+ }
53
+
54
+ /* ---------------------------------------------------------------------------
55
+ Modifier: Horizontal layout (label left, input right)
56
+ --------------------------------------------------------------------------- */
57
+
58
+ .ds-field--horizontal {
59
+ flex-direction: row;
60
+ align-items: flex-start;
61
+ gap: var(--ds-space-4);
62
+ }
63
+
64
+ .ds-field--horizontal .ds-field__label {
65
+ flex-shrink: 0;
66
+ min-width: 8rem;
67
+ padding-block-start: var(--ds-space-2);
68
+ }
69
+
70
+ /* ---------------------------------------------------------------------------
71
+ Modifier: Disabled
72
+ --------------------------------------------------------------------------- */
73
+
74
+ .ds-field--disabled {
75
+ opacity: var(--ds-opacity-disabled);
76
+ pointer-events: none;
77
+ }
@@ -3,12 +3,17 @@
3
3
  Standalone icon button for actions, toolbar items, and table rows.
4
4
  A minimal interactive element that wraps a single icon.
5
5
 
6
+ ARIA requirements (consumer responsibility):
7
+ - Always add aria-label="[action]" (e.g., aria-label="Delete")
8
+ - Disabled: add aria-disabled="true"
9
+ - Toggle: use aria-pressed="true|false" for toggle icon buttons
10
+
6
11
  Usage:
7
- <button class="ds-icon-btn">
12
+ <button class="ds-icon-btn" aria-label="Delete">
8
13
  <svg>...</svg>
9
14
  </button>
10
- <button class="ds-icon-btn ds-icon-btn--sm">...</button>
11
- <button class="ds-icon-btn ds-icon-btn--danger">...</button>
15
+ <button class="ds-icon-btn ds-icon-btn--sm" aria-label="Edit">...</button>
16
+ <button class="ds-icon-btn ds-icon-btn--danger" aria-label="Remove">...</button>
12
17
 
13
18
  Sizes:
14
19
  .ds-icon-btn--xs — 24px (var(--ds-size-1))
@@ -47,6 +52,7 @@
47
52
  .ds-icon-btn:focus-visible {
48
53
  outline: none;
49
54
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
55
+ scroll-margin-block: var(--ds-space-16, 4rem);
50
56
  }
51
57
 
52
58
  .ds-icon-btn:disabled,
@@ -65,9 +71,9 @@
65
71
  }
66
72
 
67
73
  .ds-icon-btn--sm {
68
- width: 1.75rem;
69
- height: 1.75rem;
70
- padding: var(--ds-space-1);
74
+ width: var(--ds-size-2);
75
+ height: var(--ds-size-2);
76
+ padding: var(--ds-space-1-5);
71
77
  border-radius: var(--ds-radius-md);
72
78
  }
73
79
 
@@ -1,7 +1,9 @@
1
1
  /* === Core === */
2
2
  @import './button.css';
3
3
  @import './card.css';
4
+ @import './stat-card.css';
4
5
  @import './input.css';
6
+ @import './field.css';
5
7
  @import './badge.css';
6
8
  @import './nav.css';
7
9
  @import './modal.css';
@@ -29,6 +31,9 @@
29
31
  @import './progress.css';
30
32
  @import './drop-zone.css';
31
33
  @import './custom-select.css';
34
+ @import './collapsible.css';
35
+ @import './description-list.css';
36
+ @import './result.css';
32
37
  @import './sortable.css';
33
38
 
34
39
  /* === Tier 3 — Advanced === */
@@ -1,6 +1,13 @@
1
1
  /* ==========================================================================
2
2
  Component: Form Inputs
3
3
  Surface bg, clean borders, focus ring.
4
+
5
+ ARIA requirements (consumer responsibility):
6
+ - Input: associate with <label for="id"> or aria-label
7
+ - Error state: add aria-invalid="true" + aria-describedby pointing to error msg
8
+ - Required: add aria-required="true" or HTML required attribute
9
+ - Input group: icon is decorative (pointer-events: none), no ARIA needed
10
+ - Checkbox/radio: use native <input type="checkbox|radio"> inside <label>
4
11
  ========================================================================== */
5
12
 
6
13
  .ds-label {
@@ -8,7 +15,7 @@
8
15
  font-size: var(--ds-text-sm);
9
16
  font-weight: var(--ds-weight-medium);
10
17
  color: var(--ds-color-text-secondary);
11
- margin-bottom: var(--ds-space-1-5);
18
+ margin-block-end: var(--ds-space-1-5);
12
19
  }
13
20
 
14
21
  .ds-input,
@@ -55,6 +62,7 @@
55
62
  .ds-select:focus-visible {
56
63
  border-color: var(--ds-ring-color);
57
64
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
65
+ scroll-margin-block: var(--ds-space-16, 4rem);
58
66
  }
59
67
 
60
68
  .ds-input::placeholder,
@@ -114,7 +122,7 @@
114
122
  }
115
123
 
116
124
  .ds-select--lg {
117
- padding-right: var(--ds-space-8);
125
+ padding-inline-end: var(--ds-space-8);
118
126
  }
119
127
 
120
128
  /* Textarea */
@@ -131,7 +139,7 @@
131
139
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23a1a1aa' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
132
140
  background-repeat: no-repeat;
133
141
  background-position: right var(--ds-space-3) center;
134
- padding-right: var(--ds-space-8);
142
+ padding-inline-end: var(--ds-space-8);
135
143
  }
136
144
 
137
145
  /* --- Layout Modifiers ---
@@ -170,35 +178,35 @@
170
178
  /* --- Input Group: icon-right ---
171
179
  Move icon to the right side, flip input padding. */
172
180
  .ds-input-group--icon-right .ds-input-group__icon {
173
- left: auto;
174
- right: var(--ds-space-3);
181
+ inset-inline-start: auto;
182
+ inset-inline-end: var(--ds-space-3);
175
183
  }
176
184
  .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));
185
+ padding-inline-start: var(--ds-space-4);
186
+ padding-inline-end: calc(var(--ds-space-3) + 1rem + var(--ds-space-2));
179
187
  }
180
188
 
181
189
  /* Help text */
182
190
  .ds-help {
183
191
  font-size: var(--ds-text-xs);
184
192
  color: var(--ds-color-text-tertiary);
185
- margin-top: var(--ds-space-1-5);
193
+ margin-block-start: var(--ds-space-1-5);
186
194
  }
187
195
  .ds-help--error { color: var(--ds-color-error); }
188
196
 
189
197
  /* Form Group (legacy — prefer ds-form) */
190
- .ds-form-group { margin-bottom: var(--ds-space-4); }
198
+ .ds-form-group { margin-block-end: var(--ds-space-4); }
191
199
 
192
200
  /* --- Form Stack ---
193
201
  Vertical form layout: comfortable spacing between fields (24px),
194
202
  extra breathing room before the action area (32px).
195
203
  Use ds-form__actions on the button/submit wrapper. */
196
204
  .ds-form > * + * {
197
- margin-top: var(--ds-space-6);
205
+ margin-block-start: var(--ds-space-6);
198
206
  }
199
207
 
200
208
  .ds-form__actions {
201
- margin-top: var(--ds-space-8);
209
+ margin-block-start: var(--ds-space-8);
202
210
  }
203
211
 
204
212
  /* --- Input Group ---
@@ -210,8 +218,8 @@
210
218
 
211
219
  .ds-input-group__icon {
212
220
  position: absolute;
213
- left: var(--ds-space-3);
214
- top: 50%;
221
+ inset-inline-start: var(--ds-space-3);
222
+ inset-block-start: 50%;
215
223
  transform: translateY(-50%);
216
224
  display: flex;
217
225
  align-items: center;
@@ -221,7 +229,7 @@
221
229
  }
222
230
 
223
231
  .ds-input-group .ds-input {
224
- padding-left: calc(var(--ds-space-3) + 1rem + var(--ds-space-2));
232
+ padding-inline-start: calc(var(--ds-space-3) + 1rem + var(--ds-space-2));
225
233
  }
226
234
 
227
235
  /* Checkbox / Radio */
@@ -237,6 +245,8 @@
237
245
  .ds-checkbox input,
238
246
  .ds-radio input {
239
247
  accent-color: var(--ds-color-interactive);
240
- width: 0.875rem;
241
- height: 0.875rem;
248
+ width: 1rem;
249
+ height: 1rem;
250
+ min-width: 1.5rem; /* WCAG 2.5.8: minimum 24px target */
251
+ min-height: 1.5rem;
242
252
  }
@@ -27,7 +27,7 @@
27
27
  font-size: var(--ds-text-xs);
28
28
  background-color: var(--ds-color-bg-elevated);
29
29
  border: 1px solid var(--ds-color-border);
30
- border-bottom-width: 2px;
30
+ border-block-end-width: 2px;
31
31
  border-radius: var(--ds-radius-sm);
32
32
  color: var(--ds-color-text-secondary);
33
33
  line-height: 1;
@@ -1,6 +1,14 @@
1
1
  /* ==========================================================================
2
2
  Component: Modal
3
3
  Backdrop blur, shadow-2xl, rounded-xl. Smooth scale transition.
4
+
5
+ ARIA requirements (consumer responsibility):
6
+ - Container: role="dialog", aria-modal="true", aria-labelledby="[title-id]"
7
+ - Close button: aria-label="Close"
8
+ - Focus: trap focus inside modal when open
9
+ - Keyboard: Escape closes modal
10
+ - On open: move focus to first focusable element or close button
11
+ - On close: return focus to the element that triggered the modal
4
12
  ========================================================================== */
5
13
 
6
14
  .ds-modal {
@@ -52,7 +60,7 @@
52
60
  align-items: flex-start;
53
61
  justify-content: space-between;
54
62
  padding: var(--ds-space-4) var(--ds-space-5);
55
- border-bottom: 1px solid var(--ds-color-border);
63
+ border-block-end: 1px solid var(--ds-color-border);
56
64
  }
57
65
 
58
66
  .ds-modal__header h3 {
@@ -65,7 +73,7 @@
65
73
  .ds-modal__header p {
66
74
  font-size: var(--ds-text-sm);
67
75
  color: var(--ds-color-text-tertiary);
68
- margin-top: var(--ds-space-1);
76
+ margin-block-start: var(--ds-space-1);
69
77
  }
70
78
 
71
79
  .ds-modal__close {
@@ -85,6 +93,7 @@
85
93
  .ds-modal__close:focus-visible {
86
94
  outline: none;
87
95
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
96
+ scroll-margin-block: var(--ds-space-16, 4rem);
88
97
  }
89
98
 
90
99
  .ds-modal__body {
@@ -99,7 +108,7 @@
99
108
  justify-content: flex-end;
100
109
  gap: var(--ds-space-2);
101
110
  padding: var(--ds-space-4) var(--ds-space-5);
102
- border-top: 1px solid var(--ds-color-border);
111
+ border-block-start: 1px solid var(--ds-color-border);
103
112
  }
104
113
 
105
114
  /* Size variants */
@@ -107,7 +116,7 @@
107
116
  .ds-modal--lg .ds-modal__content { max-width: var(--ds-container-lg); }
108
117
 
109
118
  /* Fullscreen on mobile */
110
- @media (max-width: 1023px) {
119
+ @media (max-width: 1023px) /* below --ds-breakpoint-lg */ {
111
120
  .ds-modal--fullscreen-mobile .ds-modal__content {
112
121
  max-width: none;
113
122
  max-height: none;
@@ -1,20 +1,27 @@
1
1
  /* ==========================================================================
2
2
  Component: Navigation
3
3
  Fixed glass header, backdrop-blur, h-16. Clean links.
4
+
5
+ ARIA requirements (consumer responsibility):
6
+ - Nav: <nav aria-label="Main navigation"> (or aria-label="Sidebar")
7
+ - Active link: aria-current="page" on the current page link
8
+ - Mobile menu: toggle aria-expanded on hamburger button
9
+ - Mobile menu button: aria-label="Open menu" / "Close menu"
10
+ - Skip nav: add ds-skip-link before nav to skip to main content
4
11
  ========================================================================== */
5
12
 
6
13
  .ds-nav {
7
14
  position: fixed;
8
- top: 0;
9
- left: 0;
10
- right: 0;
15
+ inset-block-start: 0;
16
+ inset-inline-start: 0;
17
+ inset-inline-end: 0;
11
18
  z-index: var(--ds-z-sticky);
12
19
  display: flex;
13
20
  align-items: center;
14
21
  justify-content: space-between;
15
22
  height: 4rem;
16
23
  background-color: var(--ds-color-nav-bg);
17
- border-bottom: 1px solid var(--ds-color-nav-border);
24
+ border-block-end: 1px solid var(--ds-color-nav-border);
18
25
  backdrop-filter: blur(var(--ds-blur-lg)) saturate(1.5);
19
26
  -webkit-backdrop-filter: blur(var(--ds-blur-lg)) saturate(1.5);
20
27
  }
@@ -62,6 +69,7 @@
62
69
  .ds-nav__link:focus-visible {
63
70
  outline: none;
64
71
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
72
+ scroll-margin-block: var(--ds-space-16, 4rem);
65
73
  }
66
74
 
67
75
  .ds-nav__link--active {
@@ -96,13 +104,14 @@
96
104
  .ds-nav__icon-btn:focus-visible {
97
105
  outline: none;
98
106
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
107
+ scroll-margin-block: var(--ds-space-16, 4rem);
99
108
  }
100
109
 
101
110
  /* --- Mobile nav overlay --- */
102
111
  .ds-nav__mobile {
103
112
  overflow: hidden;
104
113
  max-height: 0;
105
- border-bottom: 0 solid var(--ds-color-nav-border);
114
+ border-block-end: 0 solid var(--ds-color-nav-border);
106
115
  background-color: var(--ds-color-nav-bg);
107
116
  backdrop-filter: blur(var(--ds-blur-lg));
108
117
  transition: all var(--ds-duration-slow) var(--ds-ease-out-expo);
@@ -110,7 +119,7 @@
110
119
 
111
120
  .ds-nav__mobile--open {
112
121
  max-height: 16rem;
113
- border-bottom-width: 1px;
122
+ border-block-end-width: 1px;
114
123
  }
115
124
 
116
125
  .ds-nav__mobile-links {
@@ -133,12 +142,12 @@
133
142
  width: 16rem;
134
143
  padding: var(--ds-space-5);
135
144
  background-color: var(--ds-color-surface);
136
- border-right: 1px solid var(--ds-color-border);
145
+ border-inline-end: 1px solid var(--ds-color-border);
137
146
  height: 100%;
138
147
  }
139
148
 
140
149
  .ds-sidebar__section {
141
- margin-bottom: var(--ds-space-6);
150
+ margin-block-end: var(--ds-space-6);
142
151
  }
143
152
 
144
153
  .ds-sidebar__title {
@@ -147,7 +156,7 @@
147
156
  text-transform: uppercase;
148
157
  letter-spacing: var(--ds-tracking-wide);
149
158
  color: var(--ds-color-text-tertiary);
150
- margin-bottom: var(--ds-space-3);
159
+ margin-block-end: var(--ds-space-3);
151
160
  }
152
161
 
153
162
  .ds-sidebar__link {
@@ -162,7 +171,7 @@
162
171
  transition: all var(--ds-duration-normal) var(--ds-ease-default);
163
172
  }
164
173
  .ds-sidebar__link + .ds-sidebar__link {
165
- margin-top: var(--ds-space-1);
174
+ margin-block-start: var(--ds-space-1);
166
175
  }
167
176
 
168
177
  @media (hover: hover) {
@@ -175,9 +184,11 @@
175
184
  .ds-sidebar__link:focus-visible {
176
185
  outline: none;
177
186
  box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
187
+ scroll-margin-block: var(--ds-space-16, 4rem);
178
188
  }
179
189
 
180
- .ds-sidebar__link--active {
190
+ .ds-sidebar__link--active,
191
+ .ds-sidebar__link--active:hover {
181
192
  color: var(--ds-color-text);
182
193
  background-color: var(--ds-color-bg-elevated);
183
194
  }
@@ -3,6 +3,13 @@
3
3
  ==========================================================================
4
4
  A row of page-number controls for navigating multi-page content.
5
5
 
6
+ ARIA requirements (consumer responsibility):
7
+ - Container: <nav aria-label="Pagination">
8
+ - Active page: aria-current="page"
9
+ - Prev/Next: aria-label="Previous page" / "Next page"
10
+ - Disabled: aria-disabled="true" on disabled prev/next buttons
11
+ - Page items: aria-label="Page [N]" (optional, number is visible)
12
+
6
13
  Usage:
7
14
  <nav class="ds-pagination" aria-label="Pagination">
8
15
  <button class="ds-pagination__prev" aria-label="Previous page">&lsaquo;</button>
@@ -59,6 +66,7 @@
59
66
  .ds-pagination__item:focus-visible {
60
67
  outline: none;
61
68
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
69
+ scroll-margin-block: var(--ds-space-16, 4rem);
62
70
  }
63
71
 
64
72
  /* ---------------------------------------------------------------------------
@@ -118,6 +126,7 @@
118
126
  .ds-pagination__next:focus-visible {
119
127
  outline: none;
120
128
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
129
+ scroll-margin-block: var(--ds-space-16, 4rem);
121
130
  }
122
131
 
123
132
  .ds-pagination__prev:disabled,
@@ -54,8 +54,8 @@
54
54
  /* Placement: bottom (default) */
55
55
  .ds-popover__content,
56
56
  .ds-popover--bottom .ds-popover__content {
57
- top: calc(100% + var(--ds-offset-md));
58
- left: 50%;
57
+ inset-block-start: calc(100% + var(--ds-offset-md));
58
+ inset-inline-start: 50%;
59
59
  transform: translateX(-50%) scale(0.96);
60
60
  }
61
61
 
@@ -66,9 +66,9 @@
66
66
 
67
67
  /* Placement: top */
68
68
  .ds-popover--top .ds-popover__content {
69
- bottom: calc(100% + var(--ds-offset-md));
70
- top: auto;
71
- left: 50%;
69
+ inset-block-end: calc(100% + var(--ds-offset-md));
70
+ inset-block-start: auto;
71
+ inset-inline-start: 50%;
72
72
  transform: translateX(-50%) scale(0.96);
73
73
  }
74
74
 
@@ -78,9 +78,9 @@
78
78
 
79
79
  /* Placement: left */
80
80
  .ds-popover--left .ds-popover__content {
81
- right: calc(100% + var(--ds-offset-md));
82
- top: 50%;
83
- left: auto;
81
+ inset-inline-end: calc(100% + var(--ds-offset-md));
82
+ inset-block-start: 50%;
83
+ inset-inline-start: auto;
84
84
  transform: translateY(-50%) scale(0.96);
85
85
  }
86
86
 
@@ -90,8 +90,8 @@
90
90
 
91
91
  /* Placement: right */
92
92
  .ds-popover--right .ds-popover__content {
93
- left: calc(100% + var(--ds-offset-md));
94
- top: 50%;
93
+ inset-inline-start: calc(100% + var(--ds-offset-md));
94
+ inset-block-start: 50%;
95
95
  transform: translateY(-50%) scale(0.96);
96
96
  }
97
97
 
@@ -43,7 +43,7 @@
43
43
  justify-content: space-between;
44
44
  font-size: var(--ds-text-xs);
45
45
  color: var(--ds-color-text-tertiary);
46
- margin-bottom: var(--ds-space-1-5);
46
+ margin-block-end: var(--ds-space-1-5);
47
47
  }
48
48
 
49
49
  /* Track */
@@ -208,7 +208,7 @@
208
208
  height: 2rem;
209
209
  min-width: auto;
210
210
  margin-inline: 0;
211
- margin-left: calc(1rem - 1px); /* center under the 2 rem indicator */
211
+ margin-inline-start: calc(1rem - 1px); /* center under the 2 rem indicator */
212
212
  margin-block: var(--ds-space-1);
213
213
  background-color: var(--ds-color-border-subtle);
214
214
  }