@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.
- package/README.md +7 -7
- package/dist/designsystem.css +1284 -474
- package/dist/designsystem.min.css +2 -2
- package/package.json +6 -1
- package/src/base/typography.css +8 -8
- package/src/components/accordion.css +21 -14
- package/src/components/alert.css +25 -19
- package/src/components/avatar.css +16 -16
- package/src/components/bottom-nav.css +27 -21
- package/src/components/breadcrumb.css +7 -0
- package/src/components/button.css +10 -2
- package/src/components/card.css +6 -42
- package/src/components/chip.css +10 -3
- package/src/components/collapsible.css +116 -0
- package/src/components/command.css +17 -7
- package/src/components/custom-select.css +123 -7
- package/src/components/datepicker.css +9 -9
- package/src/components/description-list.css +98 -0
- package/src/components/divider.css +1 -1
- package/src/components/drawer.css +28 -19
- package/src/components/drop-zone.css +10 -3
- package/src/components/dropdown.css +17 -8
- package/src/components/empty-state.css +3 -3
- package/src/components/field.css +77 -0
- package/src/components/icon-btn.css +12 -6
- package/src/components/index.css +5 -0
- package/src/components/input.css +26 -16
- package/src/components/kbd.css +1 -1
- package/src/components/modal.css +13 -4
- package/src/components/nav.css +22 -11
- package/src/components/pagination.css +9 -0
- package/src/components/popover.css +10 -10
- package/src/components/progress.css +2 -2
- package/src/components/result.css +84 -0
- package/src/components/search.css +24 -26
- package/src/components/skeleton.css +4 -4
- package/src/components/slider.css +13 -6
- package/src/components/sortable.css +9 -0
- package/src/components/stat-card.css +41 -0
- package/src/components/table.css +3 -3
- package/src/components/tabs.css +26 -18
- package/src/components/tag.css +11 -3
- package/src/components/timeline.css +14 -14
- package/src/components/toast.css +19 -7
- package/src/components/toggle.css +10 -2
- package/src/components/toolbar.css +1 -1
- package/src/components/tooltip.css +34 -28
- package/src/index.css +6 -4
- package/src/tokens/colors.css +18 -6
- package/src/tokens/spacing.css +7 -0
- package/src/utilities/a11y.css +102 -0
- package/src/utilities/index.css +1 -0
- package/src/utilities/layout.css +26 -26
- package/src/utilities/spacing.css +52 -52
- 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.
|
|
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",
|
package/src/base/typography.css
CHANGED
|
@@ -30,7 +30,7 @@ p {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
.ds-prose p + p {
|
|
33
|
-
margin-
|
|
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-
|
|
120
|
-
border-
|
|
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-
|
|
144
|
-
margin-
|
|
145
|
-
margin-
|
|
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-
|
|
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-
|
|
43
|
+
border-block-start: 1px solid var(--ds-color-border);
|
|
38
44
|
}
|
|
39
45
|
|
|
40
46
|
.ds-accordion__item:first-child {
|
|
41
|
-
border-
|
|
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:
|
|
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-
|
|
73
|
-
border-
|
|
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-
|
|
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-
|
|
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-
|
|
132
|
-
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-
|
|
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-
|
|
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-
|
|
164
|
+
margin-block-end: 0;
|
|
158
165
|
}
|
package/src/components/alert.css
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
85
|
+
margin-block-start: var(--ds-space-1);
|
|
81
86
|
}
|
|
82
87
|
|
|
83
88
|
.ds-alert__title + .ds-alert__description {
|
|
84
|
-
margin-
|
|
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-
|
|
126
|
-
border-
|
|
127
|
-
border-
|
|
128
|
-
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-
|
|
134
|
-
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-
|
|
139
|
-
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-
|
|
144
|
-
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-
|
|
149
|
-
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:
|
|
11
|
-
height:
|
|
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
|
|
34
|
-
height: 1
|
|
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:
|
|
40
|
-
height:
|
|
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:
|
|
46
|
-
height:
|
|
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:
|
|
52
|
-
height:
|
|
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:
|
|
58
|
-
height:
|
|
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-
|
|
80
|
+
margin-inline-start: -0.5rem;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
.ds-avatar-group--sm > .ds-avatar + .ds-avatar {
|
|
84
|
-
margin-
|
|
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
|
-
|
|
92
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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-
|
|
35
|
-
padding-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
min-width:
|
|
87
|
-
height:
|
|
88
|
-
padding: 0
|
|
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:
|
|
92
|
-
font-size:
|
|
93
|
-
font-weight:
|
|
94
|
-
line-height:
|
|
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:
|
|
106
|
+
font-size: var(--ds-text-2xs);
|
|
101
107
|
font-weight: var(--ds-weight-medium);
|
|
102
|
-
letter-spacing:
|
|
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-
|
|
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-
|
|
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);
|
package/src/components/card.css
CHANGED
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
.ds-card__header {
|
|
43
43
|
padding: var(--ds-space-5);
|
|
44
|
-
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-
|
|
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-
|
|
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-
|
|
93
|
-
.ds-card--flush .ds-card__footer { border-
|
|
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
|
|
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 */
|
package/src/components/chip.css
CHANGED
|
@@ -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-
|
|
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-
|
|
78
|
+
background: var(--ds-color-overlay-hover);
|
|
72
79
|
}
|