@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digiko-npm/designsystem",
3
- "version": "0.5.0",
3
+ "version": "0.7.2",
4
4
  "description": "Design system — installable, extensible, indestructible.",
5
5
  "main": "dist/designsystem.css",
6
6
  "style": "dist/designsystem.css",
@@ -19,14 +19,17 @@
19
19
  "./components/button": "./src/components/button.css",
20
20
  "./components/card": "./src/components/card.css",
21
21
  "./components/chip": "./src/components/chip.css",
22
+ "./components/collapsible": "./src/components/collapsible.css",
22
23
  "./components/command": "./src/components/command.css",
23
24
  "./components/custom-select": "./src/components/custom-select.css",
24
25
  "./components/datepicker": "./src/components/datepicker.css",
26
+ "./components/description-list": "./src/components/description-list.css",
25
27
  "./components/divider": "./src/components/divider.css",
26
28
  "./components/drawer": "./src/components/drawer.css",
27
29
  "./components/drop-zone": "./src/components/drop-zone.css",
28
30
  "./components/dropdown": "./src/components/dropdown.css",
29
31
  "./components/empty-state": "./src/components/empty-state.css",
32
+ "./components/field": "./src/components/field.css",
30
33
  "./components/icon-btn": "./src/components/icon-btn.css",
31
34
  "./components/input": "./src/components/input.css",
32
35
  "./components/kbd": "./src/components/kbd.css",
@@ -35,11 +38,13 @@
35
38
  "./components/pagination": "./src/components/pagination.css",
36
39
  "./components/popover": "./src/components/popover.css",
37
40
  "./components/progress": "./src/components/progress.css",
41
+ "./components/result": "./src/components/result.css",
38
42
  "./components/search": "./src/components/search.css",
39
43
  "./components/skeleton": "./src/components/skeleton.css",
40
44
  "./components/slider": "./src/components/slider.css",
41
45
  "./components/sortable": "./src/components/sortable.css",
42
46
  "./components/spinner": "./src/components/spinner.css",
47
+ "./components/stat-card": "./src/components/stat-card.css",
43
48
  "./components/table": "./src/components/table.css",
44
49
  "./components/tabs": "./src/components/tabs.css",
45
50
  "./components/tag": "./src/components/tag.css",
@@ -30,7 +30,7 @@ p {
30
30
  }
31
31
 
32
32
  .ds-prose p + p {
33
- margin-top: var(--ds-space-4);
33
+ margin-block-start: var(--ds-space-4);
34
34
  }
35
35
 
36
36
  small {
@@ -87,7 +87,7 @@ strong, b {
87
87
  @media (min-width: 768px) {
88
88
  .ds-hero-title { font-size: var(--ds-text-6xl); }
89
89
  }
90
- @media (min-width: 1024px) {
90
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
91
91
  .ds-hero-title { font-size: var(--ds-text-7xl); }
92
92
  }
93
93
 
@@ -116,8 +116,8 @@ pre code {
116
116
  }
117
117
 
118
118
  blockquote {
119
- padding-left: var(--ds-space-4);
120
- border-left: 2px solid var(--ds-color-border-hover);
119
+ padding-inline-start: var(--ds-space-4);
120
+ border-inline-start: 2px solid var(--ds-color-border-hover);
121
121
  color: var(--ds-color-text-secondary);
122
122
  }
123
123
 
@@ -140,9 +140,9 @@ hr {
140
140
  }
141
141
 
142
142
  .ds-prose ul, .ds-prose ol {
143
- padding-left: var(--ds-space-6);
144
- margin-top: var(--ds-space-2);
145
- margin-bottom: var(--ds-space-2);
143
+ padding-inline-start: var(--ds-space-6);
144
+ margin-block-start: var(--ds-space-2);
145
+ margin-block-end: var(--ds-space-2);
146
146
  }
147
147
  .ds-prose ul { list-style-type: disc; }
148
148
  .ds-prose ol { list-style-type: decimal; }
@@ -152,7 +152,7 @@ hr {
152
152
  color: var(--ds-color-text-secondary);
153
153
  }
154
154
  .ds-prose li + li {
155
- margin-top: var(--ds-space-1);
155
+ margin-block-start: var(--ds-space-1);
156
156
  }
157
157
 
158
158
  /* Tabular figures for numbers */
@@ -4,6 +4,12 @@
4
4
  A vertically stacked set of collapsible sections. Supports CSS-only
5
5
  open/close via the `.ds-accordion__item--open` modifier.
6
6
 
7
+ ARIA requirements (consumer responsibility):
8
+ - Trigger: <button> with aria-expanded="true|false"
9
+ - Trigger: aria-controls="[content-panel-id]"
10
+ - Content panel: id matching aria-controls, role="region", aria-labelledby="[trigger-id]"
11
+ - Keyboard: Enter/Space toggles section (native <button> handles this)
12
+
7
13
  Variants:
8
14
  --flush – borderless, full-bleed style
9
15
  --separated – visually detached items with individual borders
@@ -11,8 +17,8 @@
11
17
  Usage:
12
18
  <div class="ds-accordion">
13
19
  <div class="ds-accordion__item ds-accordion__item--open">
14
- <button class="ds-accordion__trigger">Section</button>
15
- <div class="ds-accordion__content">
20
+ <button class="ds-accordion__trigger" aria-expanded="true" aria-controls="panel-1">Section</button>
21
+ <div class="ds-accordion__content" id="panel-1" role="region">
16
22
  <div class="ds-accordion__body">…</div>
17
23
  </div>
18
24
  </div>
@@ -34,11 +40,11 @@
34
40
  --------------------------------------------------------------------------- */
35
41
 
36
42
  .ds-accordion__item {
37
- border-top: 1px solid var(--ds-color-border);
43
+ border-block-start: 1px solid var(--ds-color-border);
38
44
  }
39
45
 
40
46
  .ds-accordion__item:first-child {
41
- border-top: 0;
47
+ border-block-start: 0;
42
48
  }
43
49
 
44
50
  /* ---------------------------------------------------------------------------
@@ -52,7 +58,7 @@
52
58
  align-items: center;
53
59
  width: 100%;
54
60
  padding: var(--ds-space-4);
55
- text-align: left;
61
+ text-align: start;
56
62
  font-family: var(--ds-font-sans);
57
63
  font-size: var(--ds-text-sm);
58
64
  font-weight: var(--ds-weight-medium);
@@ -69,11 +75,11 @@
69
75
  display: inline-block;
70
76
  width: 0.5rem;
71
77
  height: 0.5rem;
72
- border-right: 2px solid var(--ds-color-text-secondary);
73
- border-bottom: 2px solid var(--ds-color-text-secondary);
78
+ border-inline-end: 2px solid var(--ds-color-text-secondary);
79
+ border-block-end: 2px solid var(--ds-color-text-secondary);
74
80
  transform: rotate(45deg);
75
81
  flex-shrink: 0;
76
- margin-left: var(--ds-space-3);
82
+ margin-inline-start: var(--ds-space-3);
77
83
  transition: transform var(--ds-duration-fast) var(--ds-ease-default);
78
84
  }
79
85
 
@@ -83,6 +89,7 @@
83
89
  .ds-accordion__trigger:focus-visible {
84
90
  outline: none;
85
91
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
92
+ scroll-margin-block: var(--ds-space-16, 4rem);
86
93
  }
87
94
 
88
95
  /* Open state – rotate chevron */
@@ -112,7 +119,7 @@
112
119
 
113
120
  .ds-accordion__body {
114
121
  padding: var(--ds-space-4);
115
- padding-top: 0;
122
+ padding-block-start: 0;
116
123
  font-size: var(--ds-text-sm);
117
124
  color: var(--ds-color-text-secondary);
118
125
  line-height: var(--ds-leading-relaxed);
@@ -128,12 +135,12 @@
128
135
  }
129
136
 
130
137
  .ds-accordion--flush .ds-accordion__item {
131
- border-top: 0;
132
- border-bottom: 1px solid var(--ds-color-border);
138
+ border-block-start: 0;
139
+ border-block-end: 1px solid var(--ds-color-border);
133
140
  }
134
141
 
135
142
  .ds-accordion--flush .ds-accordion__item:last-child {
136
- border-bottom: 0;
143
+ border-block-end: 0;
137
144
  }
138
145
 
139
146
  /* ==========================================================================
@@ -149,10 +156,10 @@
149
156
  .ds-accordion--separated .ds-accordion__item {
150
157
  border: 1px solid var(--ds-color-border);
151
158
  border-radius: var(--ds-radius-xl);
152
- margin-bottom: var(--ds-space-3);
159
+ margin-block-end: var(--ds-space-3);
153
160
  overflow: hidden;
154
161
  }
155
162
 
156
163
  .ds-accordion--separated .ds-accordion__item:last-child {
157
- margin-bottom: 0;
164
+ margin-block-end: 0;
158
165
  }
@@ -1,6 +1,11 @@
1
1
  /* ==========================================================================
2
2
  Component: Alert
3
3
  Contextual feedback banners with semantic variants and dismissibility.
4
+
5
+ ARIA requirements (consumer responsibility):
6
+ - Container: role="alert" (for important messages) or role="status"
7
+ - Dismissible: close button needs aria-label="Dismiss"
8
+ - For non-urgent info, use role="status" instead of role="alert"
4
9
  ========================================================================== */
5
10
 
6
11
  .ds-alert {
@@ -12,7 +17,7 @@
12
17
  border: 1px solid var(--ds-color-border);
13
18
  border-radius: var(--ds-radius-lg);
14
19
  background-color: var(--ds-color-surface);
15
- border-left: var(--ds-accent-border-width) solid var(--ds-color-border);
20
+ border-inline-start: var(--ds-accent-border-width) solid var(--ds-color-border);
16
21
  }
17
22
 
18
23
  /* --- Semantic Variants --- */
@@ -20,25 +25,25 @@
20
25
  .ds-alert--info {
21
26
  background-color: var(--ds-color-info-subtle);
22
27
  border-color: var(--ds-color-info-border);
23
- border-left-color: var(--ds-color-info);
28
+ border-inline-start-color: var(--ds-color-info);
24
29
  }
25
30
 
26
31
  .ds-alert--success {
27
32
  background-color: var(--ds-color-success-subtle);
28
33
  border-color: var(--ds-color-success-border);
29
- border-left-color: var(--ds-color-success);
34
+ border-inline-start-color: var(--ds-color-success);
30
35
  }
31
36
 
32
37
  .ds-alert--warning {
33
38
  background-color: var(--ds-color-warning-subtle);
34
39
  border-color: var(--ds-color-warning-border);
35
- border-left-color: var(--ds-color-warning);
40
+ border-inline-start-color: var(--ds-color-warning);
36
41
  }
37
42
 
38
43
  .ds-alert--error {
39
44
  background-color: var(--ds-color-error-subtle);
40
45
  border-color: var(--ds-color-error-border);
41
- border-left-color: var(--ds-color-error);
46
+ border-inline-start-color: var(--ds-color-error);
42
47
  }
43
48
 
44
49
  /* --- Icon --- */
@@ -77,11 +82,11 @@
77
82
  font-size: var(--ds-text-sm);
78
83
  line-height: var(--ds-leading-normal);
79
84
  color: var(--ds-color-text-secondary);
80
- margin-top: var(--ds-space-1);
85
+ margin-block-start: var(--ds-space-1);
81
86
  }
82
87
 
83
88
  .ds-alert__title + .ds-alert__description {
84
- margin-top: var(--ds-space-1);
89
+ margin-block-start: var(--ds-space-1);
85
90
  }
86
91
 
87
92
  /* --- Close Button --- */
@@ -109,6 +114,7 @@
109
114
  .ds-alert__close:focus-visible {
110
115
  outline: none;
111
116
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
117
+ scroll-margin-block: var(--ds-space-16, 4rem);
112
118
  }
113
119
 
114
120
  /* --- Compact Variant --- */
@@ -122,29 +128,29 @@
122
128
 
123
129
  .ds-alert--banner {
124
130
  border-radius: var(--ds-radius-none);
125
- border-left: none;
126
- border-right: none;
127
- border-top: 1px solid var(--ds-color-border);
128
- border-bottom: 1px solid var(--ds-color-border);
131
+ border-inline-start: none;
132
+ border-inline-end: none;
133
+ border-block-start: 1px solid var(--ds-color-border);
134
+ border-block-end: 1px solid var(--ds-color-border);
129
135
  width: 100%;
130
136
  }
131
137
 
132
138
  .ds-alert--banner.ds-alert--info {
133
- border-top-color: var(--ds-color-info-border);
134
- border-bottom-color: var(--ds-color-info-border);
139
+ border-block-start-color: var(--ds-color-info-border);
140
+ border-block-end-color: var(--ds-color-info-border);
135
141
  }
136
142
 
137
143
  .ds-alert--banner.ds-alert--success {
138
- border-top-color: var(--ds-color-success-border);
139
- border-bottom-color: var(--ds-color-success-border);
144
+ border-block-start-color: var(--ds-color-success-border);
145
+ border-block-end-color: var(--ds-color-success-border);
140
146
  }
141
147
 
142
148
  .ds-alert--banner.ds-alert--warning {
143
- border-top-color: var(--ds-color-warning-border);
144
- border-bottom-color: var(--ds-color-warning-border);
149
+ border-block-start-color: var(--ds-color-warning-border);
150
+ border-block-end-color: var(--ds-color-warning-border);
145
151
  }
146
152
 
147
153
  .ds-alert--banner.ds-alert--error {
148
- border-top-color: var(--ds-color-error-border);
149
- border-bottom-color: var(--ds-color-error-border);
154
+ border-block-start-color: var(--ds-color-error-border);
155
+ border-block-end-color: var(--ds-color-error-border);
150
156
  }
@@ -7,8 +7,8 @@
7
7
  display: inline-flex;
8
8
  align-items: center;
9
9
  justify-content: center;
10
- width: 2.5rem;
11
- height: 2.5rem;
10
+ width: var(--ds-size-3);
11
+ height: var(--ds-size-3);
12
12
  border-radius: var(--ds-radius-full);
13
13
  background-color: var(--ds-color-bg-elevated);
14
14
  color: var(--ds-color-text-secondary);
@@ -30,32 +30,32 @@
30
30
  /* --- Sizes --- */
31
31
 
32
32
  .ds-avatar--xs {
33
- width: 1.5rem;
34
- height: 1.5rem;
33
+ width: var(--ds-size-1);
34
+ height: var(--ds-size-1);
35
35
  font-size: var(--ds-text-xs);
36
36
  }
37
37
 
38
38
  .ds-avatar--sm {
39
- width: 2rem;
40
- height: 2rem;
39
+ width: var(--ds-size-2);
40
+ height: var(--ds-size-2);
41
41
  font-size: var(--ds-text-xs);
42
42
  }
43
43
 
44
44
  .ds-avatar--md {
45
- width: 2.5rem;
46
- height: 2.5rem;
45
+ width: var(--ds-size-3);
46
+ height: var(--ds-size-3);
47
47
  font-size: var(--ds-text-sm);
48
48
  }
49
49
 
50
50
  .ds-avatar--lg {
51
- width: 3rem;
52
- height: 3rem;
51
+ width: var(--ds-size-4);
52
+ height: var(--ds-size-4);
53
53
  font-size: var(--ds-text-base);
54
54
  }
55
55
 
56
56
  .ds-avatar--xl {
57
- width: 4rem;
58
- height: 4rem;
57
+ width: var(--ds-space-16);
58
+ height: var(--ds-space-16);
59
59
  font-size: var(--ds-text-lg);
60
60
  }
61
61
 
@@ -77,19 +77,19 @@
77
77
  }
78
78
 
79
79
  .ds-avatar-group > .ds-avatar + .ds-avatar {
80
- margin-left: -0.5rem;
80
+ margin-inline-start: -0.5rem;
81
81
  }
82
82
 
83
83
  .ds-avatar-group--sm > .ds-avatar + .ds-avatar {
84
- margin-left: -0.375rem;
84
+ margin-inline-start: -0.375rem;
85
85
  }
86
86
 
87
87
  /* --- Status indicator --- */
88
88
 
89
89
  .ds-avatar__status {
90
90
  position: absolute;
91
- bottom: 0;
92
- right: 0;
91
+ inset-block-end: 0;
92
+ inset-inline-end: 0;
93
93
  width: 0.625rem;
94
94
  height: 0.625rem;
95
95
  border-radius: var(--ds-radius-full);
@@ -3,16 +3,22 @@
3
3
  Mobile bottom navigation bar. Hidden on desktop, shown on mobile.
4
4
  Fixed to bottom with safe-area insets for notched devices.
5
5
 
6
+ ARIA requirements (consumer responsibility):
7
+ - Container: <nav aria-label="Bottom navigation">
8
+ - Active item: aria-current="page" on the current tab
9
+ - Badge: aria-label on badge parent (e.g., "Home, 3 notifications")
10
+ - Create button: aria-label="Create new"
11
+
6
12
  Usage:
7
- <nav class="ds-bottom-nav">
8
- <a href="/" class="ds-bottom-nav__item ds-bottom-nav__item--active">
13
+ <nav class="ds-bottom-nav" aria-label="Bottom navigation">
14
+ <a href="/" class="ds-bottom-nav__item ds-bottom-nav__item--active" aria-current="page">
9
15
  <span class="ds-bottom-nav__icon">
10
16
  <svg>...</svg>
11
17
  <span class="ds-bottom-nav__badge">3</span>
12
18
  </span>
13
19
  <span class="ds-bottom-nav__label">Home</span>
14
20
  </a>
15
- <button class="ds-bottom-nav__item ds-bottom-nav__item--create">
21
+ <button class="ds-bottom-nav__item ds-bottom-nav__item--create" aria-label="Create new">
16
22
  <span class="ds-bottom-nav__create-icon">+</span>
17
23
  <span class="ds-bottom-nav__label">New</span>
18
24
  </button>
@@ -26,16 +32,16 @@
26
32
  .ds-bottom-nav {
27
33
  display: none;
28
34
  position: fixed;
29
- bottom: 0;
30
- left: 0;
31
- right: 0;
35
+ inset-block-end: 0;
36
+ inset-inline-start: 0;
37
+ inset-inline-end: 0;
32
38
  z-index: var(--ds-z-dropdown);
33
39
  background: var(--ds-color-surface);
34
- border-top: 1px solid var(--ds-color-border);
35
- padding-bottom: env(safe-area-inset-bottom, 0px);
40
+ border-block-start: 1px solid var(--ds-color-border);
41
+ padding-block-end: env(safe-area-inset-bottom, 0px);
36
42
  }
37
43
 
38
- @media (max-width: 1023px) {
44
+ @media (max-width: 1023px) /* below --ds-breakpoint-lg */ {
39
45
  .ds-bottom-nav {
40
46
  display: flex;
41
47
  justify-content: space-around;
@@ -43,7 +49,7 @@
43
49
  }
44
50
  }
45
51
 
46
- @media (min-width: 1024px) {
52
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
47
53
  .ds-bottom-nav { display: none !important; }
48
54
  }
49
55
 
@@ -81,25 +87,25 @@
81
87
  /* Notification badge */
82
88
  .ds-bottom-nav__badge {
83
89
  position: absolute;
84
- top: -4px;
85
- right: -8px;
86
- min-width: 16px;
87
- height: 16px;
88
- padding: 0 4px;
90
+ inset-block-start: calc(-1 * var(--ds-space-1));
91
+ inset-inline-end: calc(-1 * var(--ds-space-2));
92
+ min-width: var(--ds-space-4);
93
+ height: var(--ds-space-4);
94
+ padding: 0 var(--ds-space-1);
89
95
  border-radius: var(--ds-radius-full);
90
96
  background: var(--ds-color-error);
91
- color: #fff;
92
- font-size: 10px;
93
- font-weight: 600;
94
- line-height: 16px;
97
+ color: var(--ds-color-on-inverted);
98
+ font-size: var(--ds-text-2xs);
99
+ font-weight: var(--ds-weight-semibold);
100
+ line-height: var(--ds-space-4);
95
101
  text-align: center;
96
102
  }
97
103
 
98
104
  /* Label */
99
105
  .ds-bottom-nav__label {
100
- font-size: 10px;
106
+ font-size: var(--ds-text-2xs);
101
107
  font-weight: var(--ds-weight-medium);
102
- letter-spacing: 0.02em;
108
+ letter-spacing: var(--ds-tracking-wide);
103
109
  }
104
110
 
105
111
  /* Create button — elevated center icon */
@@ -3,6 +3,12 @@
3
3
  ==========================================================================
4
4
  A horizontal breadcrumb trail for hierarchical navigation.
5
5
 
6
+ ARIA requirements (consumer responsibility):
7
+ - Container: <nav aria-label="Breadcrumb">
8
+ - Current page: aria-current="page" on the last item
9
+ - Links: use <a> elements for navigation
10
+ - Separator: decorative (generated via CSS ::after, not in DOM)
11
+
6
12
  Usage:
7
13
  <nav class="ds-breadcrumb" aria-label="Breadcrumb">
8
14
  <span class="ds-breadcrumb__item">
@@ -70,6 +76,7 @@
70
76
  outline: none;
71
77
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
72
78
  border-radius: var(--ds-radius-sm);
79
+ scroll-margin-block: var(--ds-space-16, 4rem);
73
80
  }
74
81
 
75
82
  /* ---------------------------------------------------------------------------
@@ -1,6 +1,13 @@
1
1
  /* ==========================================================================
2
2
  Component: Button
3
3
  Inverted primary, rounded-full CTAs, refined sizing.
4
+
5
+ ARIA requirements (consumer responsibility):
6
+ - Use <button> or <a role="button"> elements
7
+ - Disabled: add aria-disabled="true" (supported by DS styles)
8
+ - Loading: add aria-busy="true" when --loading is applied
9
+ - Icon-only: add aria-label="[action]" for screen readers
10
+ - Button groups: wrap in role="group" with aria-label
4
11
  ========================================================================== */
5
12
 
6
13
  .ds-btn {
@@ -32,6 +39,7 @@
32
39
  .ds-btn:focus-visible {
33
40
  outline: none;
34
41
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
42
+ scroll-margin-block: var(--ds-space-16, 4rem);
35
43
  }
36
44
 
37
45
  .ds-btn:disabled,
@@ -164,7 +172,7 @@
164
172
  .ds-btn-group .ds-btn { border-radius: 0; }
165
173
  .ds-btn-group .ds-btn:first-child { border-radius: var(--ds-radius-lg) 0 0 var(--ds-radius-lg); }
166
174
  .ds-btn-group .ds-btn:last-child { border-radius: 0 var(--ds-radius-lg) var(--ds-radius-lg) 0; }
167
- .ds-btn-group .ds-btn + .ds-btn { margin-left: -1px; }
175
+ .ds-btn-group .ds-btn + .ds-btn { margin-inline-start: -1px; }
168
176
 
169
177
  /* --- Loading spinner --- */
170
178
  .ds-btn--loading {
@@ -178,7 +186,7 @@
178
186
  width: 1em;
179
187
  height: 1em;
180
188
  border: 2px solid currentColor;
181
- border-right-color: transparent;
189
+ border-inline-end-color: transparent;
182
190
  border-radius: var(--ds-radius-full);
183
191
  animation: ds-btn-spin 0.6s linear infinite;
184
192
  color: var(--ds-color-on-inverted);
@@ -41,7 +41,7 @@
41
41
 
42
42
  .ds-card__header {
43
43
  padding: var(--ds-space-5);
44
- border-bottom: 1px solid var(--ds-color-border);
44
+ border-block-end: 1px solid var(--ds-color-border);
45
45
  }
46
46
 
47
47
  .ds-card__header h3,
@@ -56,7 +56,7 @@
56
56
  .ds-card__description {
57
57
  font-size: var(--ds-text-sm);
58
58
  color: var(--ds-color-text-tertiary);
59
- margin-top: var(--ds-space-1);
59
+ margin-block-start: var(--ds-space-1);
60
60
  }
61
61
 
62
62
  .ds-card__body {
@@ -65,7 +65,7 @@
65
65
 
66
66
  .ds-card__footer {
67
67
  padding: var(--ds-space-4) var(--ds-space-5);
68
- border-top: 1px solid var(--ds-color-border);
68
+ border-block-start: 1px solid var(--ds-color-border);
69
69
  display: flex;
70
70
  align-items: center;
71
71
  gap: var(--ds-space-2);
@@ -89,43 +89,7 @@
89
89
  }
90
90
 
91
91
  /* Flush — no internal dividers */
92
- .ds-card--flush .ds-card__header { border-bottom: none; }
93
- .ds-card--flush .ds-card__footer { border-top: none; }
92
+ .ds-card--flush .ds-card__header { border-block-end: none; }
93
+ .ds-card--flush .ds-card__footer { border-block-start: none; }
94
94
 
95
- /* Stat card (like StatCard component) */
96
- .ds-stat-card {
97
- background-color: var(--ds-color-surface);
98
- border: 1px solid var(--ds-color-border);
99
- border-radius: var(--ds-radius-xl);
100
- padding: var(--ds-space-5);
101
- }
102
-
103
- .ds-stat-card__label {
104
- font-size: var(--ds-text-sm);
105
- color: var(--ds-color-text-tertiary);
106
- }
107
-
108
- .ds-stat-card__value {
109
- font-family: var(--ds-font-display);
110
- font-weight: var(--ds-font-display-weight);
111
- font-size: var(--ds-text-2xl);
112
- color: var(--ds-color-text);
113
- margin-top: var(--ds-space-1);
114
- }
115
-
116
- .ds-stat-card__detail {
117
- font-size: var(--ds-text-xs);
118
- color: var(--ds-color-text-tertiary);
119
- margin-top: var(--ds-space-0-5);
120
- }
121
-
122
- .ds-stat-card__icon {
123
- width: 2.5rem;
124
- height: 2.5rem;
125
- border-radius: var(--ds-radius-xl);
126
- display: flex;
127
- align-items: center;
128
- justify-content: center;
129
- background-color: var(--ds-color-bg-elevated);
130
- color: var(--ds-color-text-secondary);
131
- }
95
+ /* Stat card extracted to stat-card.css */
@@ -3,10 +3,15 @@
3
3
  Interactive filter/sort chips with optional remove button. Distinct from
4
4
  ds-tag (which is a static label). Chips represent active filter state.
5
5
 
6
+ ARIA requirements (consumer responsibility):
7
+ - Remove button: add aria-label="Remove [filter name]"
8
+ - Logic chip (AND/OR): use aria-pressed="true|false" on <button>
9
+ - Chip group: wrap in role="group" with aria-label="Active filters"
10
+
6
11
  Usage:
7
12
  <span class="ds-chip">
8
13
  Status: Active
9
- <button class="ds-chip__remove">×</button>
14
+ <button class="ds-chip__remove" aria-label="Remove Status filter">×</button>
10
15
  </span>
11
16
  <button class="ds-chip ds-chip--logic">AND</button>
12
17
  <span class="ds-chip ds-chip--sort">Date ↑</span>
@@ -41,7 +46,7 @@
41
46
  }
42
47
 
43
48
  .ds-chip--logic:hover {
44
- background: var(--ds-color-surface-hover);
49
+ background: var(--ds-color-overlay-hover);
45
50
  }
46
51
 
47
52
  /* Sort chip (dashed border) */
@@ -56,6 +61,8 @@
56
61
  justify-content: center;
57
62
  width: 14px;
58
63
  height: 14px;
64
+ min-width: 1.5rem; /* WCAG 2.5.8: minimum 24px target */
65
+ min-height: 1.5rem;
59
66
  border: none;
60
67
  border-radius: var(--ds-radius-full);
61
68
  background: transparent;
@@ -68,5 +75,5 @@
68
75
 
69
76
  .ds-chip__remove:hover {
70
77
  color: var(--ds-color-text);
71
- background: var(--ds-color-surface-hover);
78
+ background: var(--ds-color-overlay-hover);
72
79
  }