@justin_evo/evo-ui 1.2.0 → 1.2.1
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/LICENSE +21 -21
- package/README.md +70 -70
- package/dist/declarations.d.ts +6 -6
- package/package.json +52 -52
- package/src/Alert/Alert.tsx +49 -49
- package/src/AutoComplete/AutoComplete.tsx +810 -810
- package/src/Badge/Badge.tsx +53 -53
- package/src/Breadcrumb/Breadcrumb.tsx +53 -53
- package/src/Button/Button.tsx +125 -125
- package/src/Card/Card.tsx +257 -257
- package/src/Checkbox/Checkbox.tsx +59 -59
- package/src/CommandPalette/CommandPalette.tsx +185 -185
- package/src/Container/Container.tsx +31 -31
- package/src/Divider/Divider.tsx +31 -31
- package/src/Form/Form.tsx +185 -185
- package/src/Grid/Grid.tsx +66 -66
- package/src/ImageCropper/ImageCropper.tsx +911 -911
- package/src/Input/Input.tsx +74 -74
- package/src/Modal/Modal.tsx +77 -77
- package/src/Nav/Nav.tsx +708 -708
- package/src/Notification/Notification.tsx +1503 -1503
- package/src/Pagination/Pagination.tsx +76 -76
- package/src/Radio/Radio.tsx +69 -69
- package/src/RichTextArea/RichTextArea.tsx +886 -886
- package/src/Select/Select.tsx +515 -515
- package/src/Skeleton/Skeleton.tsx +70 -70
- package/src/Stack/Stack.tsx +52 -52
- package/src/Table/Table.tsx +335 -335
- package/src/Tabs/Tabs.tsx +90 -90
- package/src/Theme/ThemeProvider.tsx +253 -253
- package/src/Theme/ThemeToggle.tsx +79 -79
- package/src/Toggle/Toggle.tsx +48 -48
- package/src/Tooltip/Tooltip.tsx +38 -38
- package/src/TopNav/TopNav.tsx +1163 -1163
- package/src/TreeSelect/TreeSelect.tsx +825 -825
- package/src/css/alert.module.scss +93 -93
- package/src/css/autocomplete.module.scss +416 -416
- package/src/css/badge.module.scss +82 -82
- package/src/css/base/_color.scss +159 -159
- package/src/css/base/_theme.scss +237 -237
- package/src/css/base/_variables.scss +161 -161
- package/src/css/breadcrumb.module.scss +50 -50
- package/src/css/button.module.scss +385 -385
- package/src/css/card.module.scss +217 -217
- package/src/css/checkbox.module.scss +123 -123
- package/src/css/commandpalette.module.scss +211 -211
- package/src/css/container.module.scss +18 -18
- package/src/css/divider.module.scss +41 -41
- package/src/css/form.module.scss +245 -245
- package/src/css/imagecropper.module.scss +397 -397
- package/src/css/input.module.scss +89 -89
- package/src/css/modal.module.scss +105 -105
- package/src/css/nav.module.scss +494 -494
- package/src/css/notification.module.scss +691 -691
- package/src/css/pagination.module.scss +63 -63
- package/src/css/radio.module.scss +89 -89
- package/src/css/richtextarea.module.scss +307 -307
- package/src/css/select.module.scss +525 -525
- package/src/css/skeleton.module.scss +30 -30
- package/src/css/table.module.scss +386 -386
- package/src/css/tabs.module.scss +63 -63
- package/src/css/theme-toggle.module.scss +83 -83
- package/src/css/toggle.module.scss +54 -54
- package/src/css/tooltip.module.scss +97 -97
- package/src/css/topnav.module.scss +568 -568
- package/src/css/treeselect.module.scss +558 -558
- package/src/css/utilities/_borders.scss +111 -111
- package/src/css/utilities/_colors.scss +66 -66
- package/src/css/utilities/_effects.scss +216 -216
- package/src/css/utilities/_layout.scss +181 -181
- package/src/css/utilities/_position.scss +75 -75
- package/src/css/utilities/_sizing.scss +138 -138
- package/src/css/utilities/_spacing.scss +99 -99
- package/src/css/utilities/_typography.scss +121 -121
- package/src/css/utilities/index.scss +24 -24
- package/src/declarations.d.ts +6 -6
- package/src/index.ts +60 -60
package/src/css/nav.module.scss
CHANGED
|
@@ -1,494 +1,494 @@
|
|
|
1
|
-
@use 'base/variables' as *;
|
|
2
|
-
@use 'base/color' as *;
|
|
3
|
-
|
|
4
|
-
// ==========================================================
|
|
5
|
-
// EvoNav — compose-based sidebar / drawer.
|
|
6
|
-
// ----------------------------------------------------------
|
|
7
|
-
// Layout layers:
|
|
8
|
-
// .navContainer — the <nav> landmark
|
|
9
|
-
// .navList — top-level <ul>
|
|
10
|
-
// .navSubList — nested <ul> (uses --evo-nav-indent on rows)
|
|
11
|
-
// .navRow — shared row (button or anchor)
|
|
12
|
-
// .navGroup — group with heading
|
|
13
|
-
//
|
|
14
|
-
// Responsive:
|
|
15
|
-
// .navDesktop — inline sidebar (>= breakpoint)
|
|
16
|
-
// .navMobile — off-canvas drawer (< breakpoint, default 768)
|
|
17
|
-
//
|
|
18
|
-
// Tokens only — no raw hex. Touch targets stay >= 44px on mobile via
|
|
19
|
-
// rem-based `min-height` on rows.
|
|
20
|
-
// ==========================================================
|
|
21
|
-
|
|
22
|
-
.navContainer {
|
|
23
|
-
width: 100%;
|
|
24
|
-
font-family: $font-sans;
|
|
25
|
-
color: $color-text-secondary;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.navList {
|
|
29
|
-
list-style: none;
|
|
30
|
-
margin: 0;
|
|
31
|
-
padding: 0;
|
|
32
|
-
display: flex;
|
|
33
|
-
flex-direction: column;
|
|
34
|
-
gap: 0.125rem;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.navLi {
|
|
38
|
-
list-style: none;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// ---------- Row (button or anchor) ----------
|
|
42
|
-
|
|
43
|
-
.navRow {
|
|
44
|
-
// Stretch the click area across the row, no matter button-vs-anchor.
|
|
45
|
-
display: flex;
|
|
46
|
-
align-items: center;
|
|
47
|
-
gap: 0.625rem;
|
|
48
|
-
width: 100%;
|
|
49
|
-
padding: 0.5rem 0.75rem;
|
|
50
|
-
padding-left: calc(0.75rem + var(--evo-nav-indent, 0rem));
|
|
51
|
-
min-height: 2.25rem;
|
|
52
|
-
font-family: inherit;
|
|
53
|
-
font-size: $text-sm;
|
|
54
|
-
font-weight: 500;
|
|
55
|
-
line-height: 1.4;
|
|
56
|
-
color: $color-text-secondary;
|
|
57
|
-
background: transparent;
|
|
58
|
-
border: none;
|
|
59
|
-
border-radius: $evo-border-radius;
|
|
60
|
-
cursor: pointer;
|
|
61
|
-
text-align: left;
|
|
62
|
-
text-decoration: none;
|
|
63
|
-
transition:
|
|
64
|
-
background-color $transition-fast,
|
|
65
|
-
color $transition-fast;
|
|
66
|
-
position: relative;
|
|
67
|
-
// Ensure the focus outline isn't clipped by sibling rows.
|
|
68
|
-
outline-offset: 2px;
|
|
69
|
-
|
|
70
|
-
&:hover {
|
|
71
|
-
background-color: $color-surface-hover;
|
|
72
|
-
color: $color-text-primary;
|
|
73
|
-
|
|
74
|
-
.navIcon {
|
|
75
|
-
color: $color-text-primary;
|
|
76
|
-
transform: translateX(1px);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
&:focus-visible {
|
|
81
|
-
outline: $evo-btn-outline-width solid $evo-primary-focus;
|
|
82
|
-
outline-offset: $evo-btn-outline-offset;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
&.active {
|
|
86
|
-
background-color: $evo-primary-soft;
|
|
87
|
-
color: $evo-primary-color;
|
|
88
|
-
font-weight: 600;
|
|
89
|
-
|
|
90
|
-
.navIcon {
|
|
91
|
-
color: $evo-primary-color;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
&.disabled,
|
|
96
|
-
&[aria-disabled='true'] {
|
|
97
|
-
opacity: $evo-btn-disabled-opacity;
|
|
98
|
-
cursor: not-allowed;
|
|
99
|
-
pointer-events: none;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
.navRowTop {
|
|
104
|
-
font-weight: 500;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
.navRowSub {
|
|
108
|
-
font-weight: 400;
|
|
109
|
-
font-size: $text-sm;
|
|
110
|
-
// Tighter density for nested rows.
|
|
111
|
-
min-height: 2rem;
|
|
112
|
-
padding-top: 0.375rem;
|
|
113
|
-
padding-bottom: 0.375rem;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
.navLabel {
|
|
117
|
-
flex: 1;
|
|
118
|
-
text-align: left;
|
|
119
|
-
min-width: 0;
|
|
120
|
-
overflow: hidden;
|
|
121
|
-
text-overflow: ellipsis;
|
|
122
|
-
white-space: nowrap;
|
|
123
|
-
clip-path: inset(0 0 0 0);
|
|
124
|
-
transition:
|
|
125
|
-
opacity 200ms ease,
|
|
126
|
-
transform 220ms ease,
|
|
127
|
-
clip-path 260ms ease;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// When the rail expands, labels reveal top-to-bottom (per-row delay) and
|
|
131
|
-
// left-to-right (clip-path sweep). Only opacity/transform/clip-path transition,
|
|
132
|
-
// so the delay is invisible in the steady expanded state.
|
|
133
|
-
@for $i from 1 through 12 {
|
|
134
|
-
.navList .navLi:nth-child(#{$i}) .navLabel {
|
|
135
|
-
transition-delay: #{($i - 1) * 14}ms;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
.navIcon {
|
|
140
|
-
display: inline-flex;
|
|
141
|
-
align-items: center;
|
|
142
|
-
justify-content: center;
|
|
143
|
-
flex-shrink: 0;
|
|
144
|
-
width: 1.125rem;
|
|
145
|
-
height: 1.125rem;
|
|
146
|
-
font-size: 1rem;
|
|
147
|
-
line-height: 1;
|
|
148
|
-
color: $color-text-muted;
|
|
149
|
-
transition:
|
|
150
|
-
color $transition-fast,
|
|
151
|
-
transform $transition-fast;
|
|
152
|
-
|
|
153
|
-
svg {
|
|
154
|
-
width: 1.05rem;
|
|
155
|
-
height: 1.05rem;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
.chevron {
|
|
160
|
-
flex-shrink: 0;
|
|
161
|
-
color: $color-text-muted;
|
|
162
|
-
transition: transform $transition-fast;
|
|
163
|
-
|
|
164
|
-
&.chevronOpen {
|
|
165
|
-
transform: rotate(90deg);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
.navSubList {
|
|
170
|
-
list-style: none;
|
|
171
|
-
margin: 0.125rem 0 0;
|
|
172
|
-
padding: 0;
|
|
173
|
-
display: flex;
|
|
174
|
-
flex-direction: column;
|
|
175
|
-
gap: 0.125rem;
|
|
176
|
-
|
|
177
|
-
&[hidden] {
|
|
178
|
-
display: none;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// ---------- Group ----------
|
|
183
|
-
|
|
184
|
-
.navGroup {
|
|
185
|
-
list-style: none;
|
|
186
|
-
margin: 0.85rem 0 0;
|
|
187
|
-
padding: 0;
|
|
188
|
-
|
|
189
|
-
&:first-child {
|
|
190
|
-
margin-top: 0.25rem;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
.navGroupLabel {
|
|
195
|
-
display: flex;
|
|
196
|
-
align-items: center;
|
|
197
|
-
width: 100%;
|
|
198
|
-
font-size: $text-xs;
|
|
199
|
-
font-weight: 700;
|
|
200
|
-
text-transform: uppercase;
|
|
201
|
-
letter-spacing: 0.08em;
|
|
202
|
-
color: $color-text-muted;
|
|
203
|
-
padding: 0.4rem 0.75rem 0.3rem;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
.navGroupLabelText {
|
|
207
|
-
flex: 1;
|
|
208
|
-
min-width: 0;
|
|
209
|
-
text-align: left;
|
|
210
|
-
overflow: hidden;
|
|
211
|
-
text-overflow: ellipsis;
|
|
212
|
-
white-space: nowrap;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Collapsible group heading — same look as the static label, plus button chrome.
|
|
216
|
-
.navGroupToggle {
|
|
217
|
-
background: transparent;
|
|
218
|
-
border: none;
|
|
219
|
-
border-radius: $radius-sm;
|
|
220
|
-
cursor: pointer;
|
|
221
|
-
font-family: inherit;
|
|
222
|
-
transition: color $transition-fast;
|
|
223
|
-
|
|
224
|
-
&:hover {
|
|
225
|
-
color: $color-text-secondary;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
&:focus-visible {
|
|
229
|
-
outline: $evo-btn-outline-width solid $evo-primary-focus;
|
|
230
|
-
outline-offset: $evo-btn-outline-offset;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
.chevron {
|
|
234
|
-
margin-left: 0.4rem;
|
|
235
|
-
color: $color-text-muted;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
.navGroupCount {
|
|
240
|
-
display: inline-flex;
|
|
241
|
-
align-items: center;
|
|
242
|
-
justify-content: center;
|
|
243
|
-
min-width: 1.15rem;
|
|
244
|
-
height: 1.15rem;
|
|
245
|
-
padding: 0 0.35rem;
|
|
246
|
-
margin-left: 0.4rem;
|
|
247
|
-
font-size: 0.65rem;
|
|
248
|
-
font-weight: 600;
|
|
249
|
-
letter-spacing: 0;
|
|
250
|
-
color: $color-text-secondary;
|
|
251
|
-
background: $color-surface-hover;
|
|
252
|
-
border-radius: $radius-full;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Accordion panel — animates height via grid-template-rows (0fr <-> 1fr), no
|
|
256
|
-
// JS measuring. The inner list must clip its overflow for the collapse to read.
|
|
257
|
-
.navGroupPanel {
|
|
258
|
-
display: grid;
|
|
259
|
-
grid-template-rows: 1fr;
|
|
260
|
-
transition: grid-template-rows 260ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
261
|
-
|
|
262
|
-
&[data-open='false'] {
|
|
263
|
-
grid-template-rows: 0fr;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
> .navList {
|
|
267
|
-
min-height: 0;
|
|
268
|
-
overflow: hidden;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Rows inside the clipped panel draw their focus ring INSET, so the
|
|
272
|
-
// overflow:hidden needed for the height animation can't clip it.
|
|
273
|
-
.navRow:focus-visible {
|
|
274
|
-
outline-offset: -2px;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// ---------- Skeleton ----------
|
|
279
|
-
|
|
280
|
-
.navSkeletonItem {
|
|
281
|
-
display: flex;
|
|
282
|
-
align-items: center;
|
|
283
|
-
gap: 0.625rem;
|
|
284
|
-
padding: 0.5rem 0.75rem;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
.navSkeletonIcon {
|
|
288
|
-
width: 1.125rem;
|
|
289
|
-
height: 1.125rem;
|
|
290
|
-
border-radius: $radius-sm;
|
|
291
|
-
background: $color-skeleton-base;
|
|
292
|
-
flex-shrink: 0;
|
|
293
|
-
animation: navShimmer 1.6s ease-in-out infinite;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
.navSkeletonText {
|
|
297
|
-
height: 0.6875rem;
|
|
298
|
-
border-radius: $radius-sm;
|
|
299
|
-
background: $color-skeleton-base;
|
|
300
|
-
animation: navShimmer 1.6s ease-in-out infinite;
|
|
301
|
-
animation-delay: 0.1s;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
@keyframes navShimmer {
|
|
305
|
-
0%, 100% { opacity: 0.4; }
|
|
306
|
-
50% { opacity: 0.9; }
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
// ---------- Quick action ----------
|
|
310
|
-
|
|
311
|
-
.navQuickAction {
|
|
312
|
-
display: flex;
|
|
313
|
-
align-items: center;
|
|
314
|
-
gap: 0.625rem;
|
|
315
|
-
width: 100%;
|
|
316
|
-
padding: 0.5rem 0.75rem;
|
|
317
|
-
min-height: 2.25rem;
|
|
318
|
-
font-family: inherit;
|
|
319
|
-
font-size: $text-sm;
|
|
320
|
-
font-weight: 500;
|
|
321
|
-
color: $evo-primary-color;
|
|
322
|
-
background: $evo-primary-soft;
|
|
323
|
-
border: 1px dashed color-mix(in srgb, $evo-primary-color 35%, transparent);
|
|
324
|
-
border-radius: $radius-sm;
|
|
325
|
-
cursor: pointer;
|
|
326
|
-
transition:
|
|
327
|
-
background-color $transition-fast,
|
|
328
|
-
border-color $transition-fast;
|
|
329
|
-
|
|
330
|
-
&:hover {
|
|
331
|
-
background: color-mix(in srgb, $evo-primary-color 15%, transparent);
|
|
332
|
-
border-color: color-mix(in srgb, $evo-primary-color 55%, transparent);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
&:active {
|
|
336
|
-
background: color-mix(in srgb, $evo-primary-color 22%, transparent);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
&:focus-visible {
|
|
340
|
-
outline: $evo-btn-outline-width solid $evo-primary-focus;
|
|
341
|
-
outline-offset: $evo-btn-outline-offset;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
// ---------- Responsive: hamburger + drawer ----------
|
|
346
|
-
|
|
347
|
-
.navTrigger {
|
|
348
|
-
display: inline-flex;
|
|
349
|
-
align-items: center;
|
|
350
|
-
justify-content: center;
|
|
351
|
-
width: 2.75rem;
|
|
352
|
-
height: 2.75rem;
|
|
353
|
-
padding: 0;
|
|
354
|
-
background: transparent;
|
|
355
|
-
border: 1px solid $color-border;
|
|
356
|
-
border-radius: $radius-sm;
|
|
357
|
-
color: $color-text-primary;
|
|
358
|
-
cursor: pointer;
|
|
359
|
-
transition:
|
|
360
|
-
background-color $transition-fast,
|
|
361
|
-
border-color $transition-fast;
|
|
362
|
-
|
|
363
|
-
&:hover {
|
|
364
|
-
background-color: $color-surface-hover;
|
|
365
|
-
border-color: $color-border-strong;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
&:focus-visible {
|
|
369
|
-
outline: $evo-btn-outline-width solid $evo-primary-focus;
|
|
370
|
-
outline-offset: $evo-btn-outline-offset;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
.navBackdrop {
|
|
375
|
-
position: fixed;
|
|
376
|
-
inset: 0;
|
|
377
|
-
background: $color-backdrop;
|
|
378
|
-
z-index: 60;
|
|
379
|
-
animation: navFadeIn $transition-fast;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
// Desktop default — nav renders inline as a sidebar.
|
|
383
|
-
.navDesktop {
|
|
384
|
-
position: relative;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Mobile default — nav lives off-canvas. The trigger sits next to it
|
|
388
|
-
// (rendered by the root before the <nav>); the drawer slides in when
|
|
389
|
-
// `aria-hidden` is not set.
|
|
390
|
-
.navMobile {
|
|
391
|
-
position: fixed;
|
|
392
|
-
top: 0;
|
|
393
|
-
left: 0;
|
|
394
|
-
bottom: 0;
|
|
395
|
-
width: min(280px, 85vw);
|
|
396
|
-
padding: 1rem 0.75rem;
|
|
397
|
-
background: $color-surface-elevated;
|
|
398
|
-
border-right: 1px solid $color-border;
|
|
399
|
-
box-shadow: $shadow-lg;
|
|
400
|
-
z-index: 70;
|
|
401
|
-
transform: translateX(-100%);
|
|
402
|
-
transition: transform $transition-normal;
|
|
403
|
-
// Always allow scrolling inside the drawer; touch-action keeps native
|
|
404
|
-
// scroll smooth on mobile.
|
|
405
|
-
overflow-y: auto;
|
|
406
|
-
touch-action: pan-y;
|
|
407
|
-
|
|
408
|
-
// Slightly larger touch targets inside the drawer.
|
|
409
|
-
.navRow,
|
|
410
|
-
.navQuickAction {
|
|
411
|
-
min-height: 2.75rem;
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
.navMobile.navDrawerOpen {
|
|
416
|
-
transform: translateX(0);
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
@keyframes navFadeIn {
|
|
420
|
-
from { opacity: 0; }
|
|
421
|
-
to { opacity: 1; }
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// ---------- Collapsed (icon-only rail) ----------
|
|
425
|
-
|
|
426
|
-
.navCollapsed {
|
|
427
|
-
.navRow,
|
|
428
|
-
.navQuickAction {
|
|
429
|
-
justify-content: center;
|
|
430
|
-
gap: 0;
|
|
431
|
-
padding-left: 0.5rem;
|
|
432
|
-
padding-right: 0.5rem;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
.navLabel {
|
|
436
|
-
flex: 0;
|
|
437
|
-
opacity: 0;
|
|
438
|
-
transform: translateX(-4px);
|
|
439
|
-
clip-path: inset(0 100% 0 0);
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// Group heading text stays in the a11y tree (it names the heading) but is
|
|
443
|
-
// visually hidden; the decorative count chip is removed entirely.
|
|
444
|
-
.navGroupLabelText {
|
|
445
|
-
position: absolute;
|
|
446
|
-
width: 1px;
|
|
447
|
-
height: 1px;
|
|
448
|
-
padding: 0;
|
|
449
|
-
margin: -1px;
|
|
450
|
-
overflow: hidden;
|
|
451
|
-
clip-path: inset(50%);
|
|
452
|
-
white-space: nowrap;
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
.navGroupCount {
|
|
456
|
-
display: none;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
.navGroupLabel {
|
|
460
|
-
min-height: 0.5rem;
|
|
461
|
-
padding: 0.25rem 0;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
// Accordion is meaningless in rail mode — force panels open.
|
|
465
|
-
.navGroupPanel {
|
|
466
|
-
grid-template-rows: 1fr;
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// Collapsing fades labels out together — outrank the per-row expand stagger.
|
|
471
|
-
.navCollapsed .navList .navLi .navLabel {
|
|
472
|
-
transition-delay: 0ms;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
// ---------- Reduced motion ----------
|
|
476
|
-
|
|
477
|
-
@media (prefers-reduced-motion: reduce) {
|
|
478
|
-
.navRow,
|
|
479
|
-
.navRow .navIcon,
|
|
480
|
-
.navLabel,
|
|
481
|
-
.navGroupPanel,
|
|
482
|
-
.navGroupToggle,
|
|
483
|
-
.navQuickAction,
|
|
484
|
-
.chevron,
|
|
485
|
-
.navTrigger,
|
|
486
|
-
.navMobile {
|
|
487
|
-
transition: none;
|
|
488
|
-
}
|
|
489
|
-
.navSkeletonIcon,
|
|
490
|
-
.navSkeletonText,
|
|
491
|
-
.navBackdrop {
|
|
492
|
-
animation-duration: 0.001ms;
|
|
493
|
-
}
|
|
494
|
-
}
|
|
1
|
+
@use 'base/variables' as *;
|
|
2
|
+
@use 'base/color' as *;
|
|
3
|
+
|
|
4
|
+
// ==========================================================
|
|
5
|
+
// EvoNav — compose-based sidebar / drawer.
|
|
6
|
+
// ----------------------------------------------------------
|
|
7
|
+
// Layout layers:
|
|
8
|
+
// .navContainer — the <nav> landmark
|
|
9
|
+
// .navList — top-level <ul>
|
|
10
|
+
// .navSubList — nested <ul> (uses --evo-nav-indent on rows)
|
|
11
|
+
// .navRow — shared row (button or anchor)
|
|
12
|
+
// .navGroup — group with heading
|
|
13
|
+
//
|
|
14
|
+
// Responsive:
|
|
15
|
+
// .navDesktop — inline sidebar (>= breakpoint)
|
|
16
|
+
// .navMobile — off-canvas drawer (< breakpoint, default 768)
|
|
17
|
+
//
|
|
18
|
+
// Tokens only — no raw hex. Touch targets stay >= 44px on mobile via
|
|
19
|
+
// rem-based `min-height` on rows.
|
|
20
|
+
// ==========================================================
|
|
21
|
+
|
|
22
|
+
.navContainer {
|
|
23
|
+
width: 100%;
|
|
24
|
+
font-family: $font-sans;
|
|
25
|
+
color: $color-text-secondary;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.navList {
|
|
29
|
+
list-style: none;
|
|
30
|
+
margin: 0;
|
|
31
|
+
padding: 0;
|
|
32
|
+
display: flex;
|
|
33
|
+
flex-direction: column;
|
|
34
|
+
gap: 0.125rem;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.navLi {
|
|
38
|
+
list-style: none;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ---------- Row (button or anchor) ----------
|
|
42
|
+
|
|
43
|
+
.navRow {
|
|
44
|
+
// Stretch the click area across the row, no matter button-vs-anchor.
|
|
45
|
+
display: flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
gap: 0.625rem;
|
|
48
|
+
width: 100%;
|
|
49
|
+
padding: 0.5rem 0.75rem;
|
|
50
|
+
padding-left: calc(0.75rem + var(--evo-nav-indent, 0rem));
|
|
51
|
+
min-height: 2.25rem;
|
|
52
|
+
font-family: inherit;
|
|
53
|
+
font-size: $text-sm;
|
|
54
|
+
font-weight: 500;
|
|
55
|
+
line-height: 1.4;
|
|
56
|
+
color: $color-text-secondary;
|
|
57
|
+
background: transparent;
|
|
58
|
+
border: none;
|
|
59
|
+
border-radius: $evo-border-radius;
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
text-align: left;
|
|
62
|
+
text-decoration: none;
|
|
63
|
+
transition:
|
|
64
|
+
background-color $transition-fast,
|
|
65
|
+
color $transition-fast;
|
|
66
|
+
position: relative;
|
|
67
|
+
// Ensure the focus outline isn't clipped by sibling rows.
|
|
68
|
+
outline-offset: 2px;
|
|
69
|
+
|
|
70
|
+
&:hover {
|
|
71
|
+
background-color: $color-surface-hover;
|
|
72
|
+
color: $color-text-primary;
|
|
73
|
+
|
|
74
|
+
.navIcon {
|
|
75
|
+
color: $color-text-primary;
|
|
76
|
+
transform: translateX(1px);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
&:focus-visible {
|
|
81
|
+
outline: $evo-btn-outline-width solid $evo-primary-focus;
|
|
82
|
+
outline-offset: $evo-btn-outline-offset;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
&.active {
|
|
86
|
+
background-color: $evo-primary-soft;
|
|
87
|
+
color: $evo-primary-color;
|
|
88
|
+
font-weight: 600;
|
|
89
|
+
|
|
90
|
+
.navIcon {
|
|
91
|
+
color: $evo-primary-color;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&.disabled,
|
|
96
|
+
&[aria-disabled='true'] {
|
|
97
|
+
opacity: $evo-btn-disabled-opacity;
|
|
98
|
+
cursor: not-allowed;
|
|
99
|
+
pointer-events: none;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.navRowTop {
|
|
104
|
+
font-weight: 500;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.navRowSub {
|
|
108
|
+
font-weight: 400;
|
|
109
|
+
font-size: $text-sm;
|
|
110
|
+
// Tighter density for nested rows.
|
|
111
|
+
min-height: 2rem;
|
|
112
|
+
padding-top: 0.375rem;
|
|
113
|
+
padding-bottom: 0.375rem;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.navLabel {
|
|
117
|
+
flex: 1;
|
|
118
|
+
text-align: left;
|
|
119
|
+
min-width: 0;
|
|
120
|
+
overflow: hidden;
|
|
121
|
+
text-overflow: ellipsis;
|
|
122
|
+
white-space: nowrap;
|
|
123
|
+
clip-path: inset(0 0 0 0);
|
|
124
|
+
transition:
|
|
125
|
+
opacity 200ms ease,
|
|
126
|
+
transform 220ms ease,
|
|
127
|
+
clip-path 260ms ease;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// When the rail expands, labels reveal top-to-bottom (per-row delay) and
|
|
131
|
+
// left-to-right (clip-path sweep). Only opacity/transform/clip-path transition,
|
|
132
|
+
// so the delay is invisible in the steady expanded state.
|
|
133
|
+
@for $i from 1 through 12 {
|
|
134
|
+
.navList .navLi:nth-child(#{$i}) .navLabel {
|
|
135
|
+
transition-delay: #{($i - 1) * 14}ms;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.navIcon {
|
|
140
|
+
display: inline-flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
justify-content: center;
|
|
143
|
+
flex-shrink: 0;
|
|
144
|
+
width: 1.125rem;
|
|
145
|
+
height: 1.125rem;
|
|
146
|
+
font-size: 1rem;
|
|
147
|
+
line-height: 1;
|
|
148
|
+
color: $color-text-muted;
|
|
149
|
+
transition:
|
|
150
|
+
color $transition-fast,
|
|
151
|
+
transform $transition-fast;
|
|
152
|
+
|
|
153
|
+
svg {
|
|
154
|
+
width: 1.05rem;
|
|
155
|
+
height: 1.05rem;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.chevron {
|
|
160
|
+
flex-shrink: 0;
|
|
161
|
+
color: $color-text-muted;
|
|
162
|
+
transition: transform $transition-fast;
|
|
163
|
+
|
|
164
|
+
&.chevronOpen {
|
|
165
|
+
transform: rotate(90deg);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.navSubList {
|
|
170
|
+
list-style: none;
|
|
171
|
+
margin: 0.125rem 0 0;
|
|
172
|
+
padding: 0;
|
|
173
|
+
display: flex;
|
|
174
|
+
flex-direction: column;
|
|
175
|
+
gap: 0.125rem;
|
|
176
|
+
|
|
177
|
+
&[hidden] {
|
|
178
|
+
display: none;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// ---------- Group ----------
|
|
183
|
+
|
|
184
|
+
.navGroup {
|
|
185
|
+
list-style: none;
|
|
186
|
+
margin: 0.85rem 0 0;
|
|
187
|
+
padding: 0;
|
|
188
|
+
|
|
189
|
+
&:first-child {
|
|
190
|
+
margin-top: 0.25rem;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.navGroupLabel {
|
|
195
|
+
display: flex;
|
|
196
|
+
align-items: center;
|
|
197
|
+
width: 100%;
|
|
198
|
+
font-size: $text-xs;
|
|
199
|
+
font-weight: 700;
|
|
200
|
+
text-transform: uppercase;
|
|
201
|
+
letter-spacing: 0.08em;
|
|
202
|
+
color: $color-text-muted;
|
|
203
|
+
padding: 0.4rem 0.75rem 0.3rem;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.navGroupLabelText {
|
|
207
|
+
flex: 1;
|
|
208
|
+
min-width: 0;
|
|
209
|
+
text-align: left;
|
|
210
|
+
overflow: hidden;
|
|
211
|
+
text-overflow: ellipsis;
|
|
212
|
+
white-space: nowrap;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Collapsible group heading — same look as the static label, plus button chrome.
|
|
216
|
+
.navGroupToggle {
|
|
217
|
+
background: transparent;
|
|
218
|
+
border: none;
|
|
219
|
+
border-radius: $radius-sm;
|
|
220
|
+
cursor: pointer;
|
|
221
|
+
font-family: inherit;
|
|
222
|
+
transition: color $transition-fast;
|
|
223
|
+
|
|
224
|
+
&:hover {
|
|
225
|
+
color: $color-text-secondary;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
&:focus-visible {
|
|
229
|
+
outline: $evo-btn-outline-width solid $evo-primary-focus;
|
|
230
|
+
outline-offset: $evo-btn-outline-offset;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.chevron {
|
|
234
|
+
margin-left: 0.4rem;
|
|
235
|
+
color: $color-text-muted;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.navGroupCount {
|
|
240
|
+
display: inline-flex;
|
|
241
|
+
align-items: center;
|
|
242
|
+
justify-content: center;
|
|
243
|
+
min-width: 1.15rem;
|
|
244
|
+
height: 1.15rem;
|
|
245
|
+
padding: 0 0.35rem;
|
|
246
|
+
margin-left: 0.4rem;
|
|
247
|
+
font-size: 0.65rem;
|
|
248
|
+
font-weight: 600;
|
|
249
|
+
letter-spacing: 0;
|
|
250
|
+
color: $color-text-secondary;
|
|
251
|
+
background: $color-surface-hover;
|
|
252
|
+
border-radius: $radius-full;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Accordion panel — animates height via grid-template-rows (0fr <-> 1fr), no
|
|
256
|
+
// JS measuring. The inner list must clip its overflow for the collapse to read.
|
|
257
|
+
.navGroupPanel {
|
|
258
|
+
display: grid;
|
|
259
|
+
grid-template-rows: 1fr;
|
|
260
|
+
transition: grid-template-rows 260ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
261
|
+
|
|
262
|
+
&[data-open='false'] {
|
|
263
|
+
grid-template-rows: 0fr;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
> .navList {
|
|
267
|
+
min-height: 0;
|
|
268
|
+
overflow: hidden;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Rows inside the clipped panel draw their focus ring INSET, so the
|
|
272
|
+
// overflow:hidden needed for the height animation can't clip it.
|
|
273
|
+
.navRow:focus-visible {
|
|
274
|
+
outline-offset: -2px;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ---------- Skeleton ----------
|
|
279
|
+
|
|
280
|
+
.navSkeletonItem {
|
|
281
|
+
display: flex;
|
|
282
|
+
align-items: center;
|
|
283
|
+
gap: 0.625rem;
|
|
284
|
+
padding: 0.5rem 0.75rem;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.navSkeletonIcon {
|
|
288
|
+
width: 1.125rem;
|
|
289
|
+
height: 1.125rem;
|
|
290
|
+
border-radius: $radius-sm;
|
|
291
|
+
background: $color-skeleton-base;
|
|
292
|
+
flex-shrink: 0;
|
|
293
|
+
animation: navShimmer 1.6s ease-in-out infinite;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.navSkeletonText {
|
|
297
|
+
height: 0.6875rem;
|
|
298
|
+
border-radius: $radius-sm;
|
|
299
|
+
background: $color-skeleton-base;
|
|
300
|
+
animation: navShimmer 1.6s ease-in-out infinite;
|
|
301
|
+
animation-delay: 0.1s;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@keyframes navShimmer {
|
|
305
|
+
0%, 100% { opacity: 0.4; }
|
|
306
|
+
50% { opacity: 0.9; }
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// ---------- Quick action ----------
|
|
310
|
+
|
|
311
|
+
.navQuickAction {
|
|
312
|
+
display: flex;
|
|
313
|
+
align-items: center;
|
|
314
|
+
gap: 0.625rem;
|
|
315
|
+
width: 100%;
|
|
316
|
+
padding: 0.5rem 0.75rem;
|
|
317
|
+
min-height: 2.25rem;
|
|
318
|
+
font-family: inherit;
|
|
319
|
+
font-size: $text-sm;
|
|
320
|
+
font-weight: 500;
|
|
321
|
+
color: $evo-primary-color;
|
|
322
|
+
background: $evo-primary-soft;
|
|
323
|
+
border: 1px dashed color-mix(in srgb, $evo-primary-color 35%, transparent);
|
|
324
|
+
border-radius: $radius-sm;
|
|
325
|
+
cursor: pointer;
|
|
326
|
+
transition:
|
|
327
|
+
background-color $transition-fast,
|
|
328
|
+
border-color $transition-fast;
|
|
329
|
+
|
|
330
|
+
&:hover {
|
|
331
|
+
background: color-mix(in srgb, $evo-primary-color 15%, transparent);
|
|
332
|
+
border-color: color-mix(in srgb, $evo-primary-color 55%, transparent);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
&:active {
|
|
336
|
+
background: color-mix(in srgb, $evo-primary-color 22%, transparent);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
&:focus-visible {
|
|
340
|
+
outline: $evo-btn-outline-width solid $evo-primary-focus;
|
|
341
|
+
outline-offset: $evo-btn-outline-offset;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// ---------- Responsive: hamburger + drawer ----------
|
|
346
|
+
|
|
347
|
+
.navTrigger {
|
|
348
|
+
display: inline-flex;
|
|
349
|
+
align-items: center;
|
|
350
|
+
justify-content: center;
|
|
351
|
+
width: 2.75rem;
|
|
352
|
+
height: 2.75rem;
|
|
353
|
+
padding: 0;
|
|
354
|
+
background: transparent;
|
|
355
|
+
border: 1px solid $color-border;
|
|
356
|
+
border-radius: $radius-sm;
|
|
357
|
+
color: $color-text-primary;
|
|
358
|
+
cursor: pointer;
|
|
359
|
+
transition:
|
|
360
|
+
background-color $transition-fast,
|
|
361
|
+
border-color $transition-fast;
|
|
362
|
+
|
|
363
|
+
&:hover {
|
|
364
|
+
background-color: $color-surface-hover;
|
|
365
|
+
border-color: $color-border-strong;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
&:focus-visible {
|
|
369
|
+
outline: $evo-btn-outline-width solid $evo-primary-focus;
|
|
370
|
+
outline-offset: $evo-btn-outline-offset;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.navBackdrop {
|
|
375
|
+
position: fixed;
|
|
376
|
+
inset: 0;
|
|
377
|
+
background: $color-backdrop;
|
|
378
|
+
z-index: 60;
|
|
379
|
+
animation: navFadeIn $transition-fast;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Desktop default — nav renders inline as a sidebar.
|
|
383
|
+
.navDesktop {
|
|
384
|
+
position: relative;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Mobile default — nav lives off-canvas. The trigger sits next to it
|
|
388
|
+
// (rendered by the root before the <nav>); the drawer slides in when
|
|
389
|
+
// `aria-hidden` is not set.
|
|
390
|
+
.navMobile {
|
|
391
|
+
position: fixed;
|
|
392
|
+
top: 0;
|
|
393
|
+
left: 0;
|
|
394
|
+
bottom: 0;
|
|
395
|
+
width: min(280px, 85vw);
|
|
396
|
+
padding: 1rem 0.75rem;
|
|
397
|
+
background: $color-surface-elevated;
|
|
398
|
+
border-right: 1px solid $color-border;
|
|
399
|
+
box-shadow: $shadow-lg;
|
|
400
|
+
z-index: 70;
|
|
401
|
+
transform: translateX(-100%);
|
|
402
|
+
transition: transform $transition-normal;
|
|
403
|
+
// Always allow scrolling inside the drawer; touch-action keeps native
|
|
404
|
+
// scroll smooth on mobile.
|
|
405
|
+
overflow-y: auto;
|
|
406
|
+
touch-action: pan-y;
|
|
407
|
+
|
|
408
|
+
// Slightly larger touch targets inside the drawer.
|
|
409
|
+
.navRow,
|
|
410
|
+
.navQuickAction {
|
|
411
|
+
min-height: 2.75rem;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.navMobile.navDrawerOpen {
|
|
416
|
+
transform: translateX(0);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
@keyframes navFadeIn {
|
|
420
|
+
from { opacity: 0; }
|
|
421
|
+
to { opacity: 1; }
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// ---------- Collapsed (icon-only rail) ----------
|
|
425
|
+
|
|
426
|
+
.navCollapsed {
|
|
427
|
+
.navRow,
|
|
428
|
+
.navQuickAction {
|
|
429
|
+
justify-content: center;
|
|
430
|
+
gap: 0;
|
|
431
|
+
padding-left: 0.5rem;
|
|
432
|
+
padding-right: 0.5rem;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.navLabel {
|
|
436
|
+
flex: 0;
|
|
437
|
+
opacity: 0;
|
|
438
|
+
transform: translateX(-4px);
|
|
439
|
+
clip-path: inset(0 100% 0 0);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Group heading text stays in the a11y tree (it names the heading) but is
|
|
443
|
+
// visually hidden; the decorative count chip is removed entirely.
|
|
444
|
+
.navGroupLabelText {
|
|
445
|
+
position: absolute;
|
|
446
|
+
width: 1px;
|
|
447
|
+
height: 1px;
|
|
448
|
+
padding: 0;
|
|
449
|
+
margin: -1px;
|
|
450
|
+
overflow: hidden;
|
|
451
|
+
clip-path: inset(50%);
|
|
452
|
+
white-space: nowrap;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
.navGroupCount {
|
|
456
|
+
display: none;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
.navGroupLabel {
|
|
460
|
+
min-height: 0.5rem;
|
|
461
|
+
padding: 0.25rem 0;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// Accordion is meaningless in rail mode — force panels open.
|
|
465
|
+
.navGroupPanel {
|
|
466
|
+
grid-template-rows: 1fr;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Collapsing fades labels out together — outrank the per-row expand stagger.
|
|
471
|
+
.navCollapsed .navList .navLi .navLabel {
|
|
472
|
+
transition-delay: 0ms;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// ---------- Reduced motion ----------
|
|
476
|
+
|
|
477
|
+
@media (prefers-reduced-motion: reduce) {
|
|
478
|
+
.navRow,
|
|
479
|
+
.navRow .navIcon,
|
|
480
|
+
.navLabel,
|
|
481
|
+
.navGroupPanel,
|
|
482
|
+
.navGroupToggle,
|
|
483
|
+
.navQuickAction,
|
|
484
|
+
.chevron,
|
|
485
|
+
.navTrigger,
|
|
486
|
+
.navMobile {
|
|
487
|
+
transition: none;
|
|
488
|
+
}
|
|
489
|
+
.navSkeletonIcon,
|
|
490
|
+
.navSkeletonText,
|
|
491
|
+
.navBackdrop {
|
|
492
|
+
animation-duration: 0.001ms;
|
|
493
|
+
}
|
|
494
|
+
}
|