@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
|
@@ -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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
52
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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:
|
|
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:
|
|
69
|
-
height:
|
|
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
|
|
package/src/components/index.css
CHANGED
|
@@ -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 === */
|
package/src/components/input.css
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
174
|
-
|
|
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-
|
|
178
|
-
padding-
|
|
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-
|
|
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-
|
|
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-
|
|
205
|
+
margin-block-start: var(--ds-space-6);
|
|
198
206
|
}
|
|
199
207
|
|
|
200
208
|
.ds-form__actions {
|
|
201
|
-
margin-
|
|
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
|
-
|
|
214
|
-
|
|
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-
|
|
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:
|
|
241
|
-
height:
|
|
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
|
}
|
package/src/components/kbd.css
CHANGED
|
@@ -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-
|
|
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;
|
package/src/components/modal.css
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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;
|
package/src/components/nav.css
CHANGED
|
@@ -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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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">‹</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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
94
|
-
|
|
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-
|
|
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-
|
|
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
|
}
|