srcdev-nuxt-components 3.0.0 → 4.0.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.
Files changed (90) hide show
  1. package/assets/styles/a11y/_utils.css +20 -0
  2. package/assets/styles/a11y/_variables.css +8 -0
  3. package/assets/styles/a11y/index.css +2 -0
  4. package/assets/styles/forms/index.css +2 -0
  5. package/assets/styles/forms/themes/_error.css +77 -0
  6. package/assets/styles/forms/themes/_ghost.css +77 -0
  7. package/assets/styles/forms/themes/_input-action.css +20 -0
  8. package/assets/styles/forms/themes/_primary.css +82 -0
  9. package/assets/styles/forms/themes/_secondary.css +77 -0
  10. package/assets/styles/forms/themes/_success.css +77 -0
  11. package/assets/styles/forms/themes/_tertiary.css +77 -0
  12. package/assets/styles/forms/themes/_warning.css +77 -0
  13. package/assets/styles/forms/themes/index.css +8 -0
  14. package/assets/styles/forms/variables/_sizes.css +82 -0
  15. package/assets/styles/forms/variables/_theme.css +11 -0
  16. package/assets/styles/forms/variables/index.css +2 -0
  17. package/assets/styles/main.css +5 -0
  18. package/assets/styles/typography/index.css +2 -0
  19. package/assets/styles/typography/utils/_font-classes.css +160 -0
  20. package/assets/styles/typography/utils/_weights.css +69 -0
  21. package/assets/styles/typography/utils/index.css +2 -0
  22. package/assets/styles/typography/variables/_colors.css +14 -0
  23. package/assets/styles/typography/variables/_reponsive-font-size.css +10 -0
  24. package/assets/styles/typography/variables/index.css +2 -0
  25. package/assets/styles/utils/_animations.css +42 -0
  26. package/assets/styles/utils/_canvasWidths.css +18 -0
  27. package/assets/styles/utils/_display.css +7 -0
  28. package/assets/styles/utils/_margin-helpers.css +334 -0
  29. package/assets/styles/utils/_padding-helpers.css +308 -0
  30. package/assets/styles/utils/_page.css +24 -0
  31. package/assets/styles/utils/_placement.css +73 -0
  32. package/assets/styles/utils/index.css +7 -0
  33. package/assets/styles/variables/colors/_blue.css +15 -0
  34. package/assets/styles/variables/colors/_gray.css +16 -0
  35. package/assets/styles/variables/colors/_green.css +15 -0
  36. package/assets/styles/variables/colors/_orange.css +15 -0
  37. package/assets/styles/variables/colors/_red.css +15 -0
  38. package/assets/styles/variables/colors/_yellow.css +15 -0
  39. package/assets/styles/variables/colors/colors.css +6 -0
  40. package/assets/styles/variables/components/_accordian.css +7 -0
  41. package/assets/styles/variables/components/_container-glow-core.css +16 -0
  42. package/assets/styles/variables/components/_display-dialog-core.css +35 -0
  43. package/assets/styles/variables/components/_tabs.css +18 -0
  44. package/assets/styles/variables/components/display-prompt-core/_scaffolding.css +57 -0
  45. package/assets/styles/variables/components/display-prompt-core/index.css +2 -0
  46. package/assets/styles/variables/components/display-prompt-core/themes/_error.css +39 -0
  47. package/assets/styles/variables/components/display-prompt-core/themes/_info.css +39 -0
  48. package/assets/styles/variables/components/display-prompt-core/themes/_success.css +39 -0
  49. package/assets/styles/variables/components/display-prompt-core/themes/_warning.css +39 -0
  50. package/assets/styles/variables/components/display-prompt-core/themes/index.css +4 -0
  51. package/assets/styles/variables/components/index.css +5 -0
  52. package/assets/styles/variables/index.css +2 -0
  53. package/components/animated-svg-text/AnimatedSvgText.vue +87 -0
  54. package/components/canvas-switcher/CanvasSwitcher.vue +77 -0
  55. package/components/carousel-basic/CarouselBasic.vue +241 -0
  56. package/components/carousel-basic/CarouselFlip.vue +378 -0
  57. package/components/clip-element/ClipElement.vue +73 -0
  58. package/components/clipped-panels/ClippedPanel.vue +73 -0
  59. package/components/deep-expanding-menu/DeepExpandingMenu.vue +214 -0
  60. package/components/deep-expanding-menu/DeepExpandingMenuOld.vue +218 -0
  61. package/components/display-banner/DisplayBanner.vue +63 -0
  62. package/components/display-details/DisplayDetailsCore.vue +312 -0
  63. package/components/functional/accordian/AccordianCore.vue +138 -0
  64. package/components/functional/display-dialog/DisplayDialogCore.vue +244 -0
  65. package/components/functional/display-dialog/variants/DisplayDialogConfirm.vue +45 -0
  66. package/components/functional/display-dialog/variants/DisplayDialogScrollableContent.vue +49 -0
  67. package/components/functional/pop-over/PopOver.vue +88 -0
  68. package/components/image-galleries/SliderGallery.vue +784 -0
  69. package/components/masonry-grid-ordered/MasonryGridOrdered.vue +158 -0
  70. package/components/presentation/container-glow/ContainerGlowCore.vue +211 -0
  71. package/components/presentation/display-grid/DisplayGridCore.vue +22 -0
  72. package/components/presentation/display-prompt/DisplayPromptCore.vue +150 -0
  73. package/components/presentation/display-prompt/variants/DisplayPromptError.vue +53 -0
  74. package/components/presentation/layout-grids/LayoutGridA.vue +103 -0
  75. package/components/presentation/layout-grids/LayoutGridB.vue +132 -0
  76. package/components/presentation/layout-row/LayoutRow.vue +157 -0
  77. package/components/presentation/masonry-grid/MasonryGrid.vue +62 -0
  78. package/components/presentation/masonry-grid-sorted/MasonryGridSorted.vue +115 -0
  79. package/components/presentation/tabs/TabsCore.vue +308 -0
  80. package/components/responsive-header/NavigationItems.vue +164 -0
  81. package/components/responsive-header/ResponsiveHeader.vue +586 -0
  82. package/components/rotating-carousel/RotatingCarouselImage.vue +200 -0
  83. package/composables/useDialogControls.ts +23 -0
  84. package/composables/useStyleClassPassthrough.ts +35 -0
  85. package/composables/useTabs.ts +201 -0
  86. package/nuxt.config.ts +0 -3
  87. package/package.json +7 -7
  88. package/types/gallery-data.ts +13 -0
  89. package/types/responsiveHeader.ts +38 -0
  90. package/types/types.carousel-basic.ts +19 -0
@@ -0,0 +1,586 @@
1
+ <template>
2
+ <div class="navigation" :class="[elementClasses, { loaded: navLoaded }]" ref="navigationWrapper">
3
+ <nav class="main-navigation" ref="mainNav">
4
+
5
+ <ul v-for="(navGroup, groupKey) in responsiveNavLinks" :key="groupKey" class="main-navigation-list"
6
+ :ref="el => setNavRef(String(groupKey), el as HTMLUListElement | null)">
7
+ <template v-for="(link, localIndex) in navGroup" :key="localIndex">
8
+ <li v-if="link.path" class="main-navigation-item"
9
+ :class="{ 'visually-hidden': !mainNavigationState.clonedNavLinks?.[groupKey]?.[localIndex]?.config?.visible }"
10
+ :style="{ '--_main-navigation-item-width': mainNavigationState.clonedNavLinks?.[groupKey]?.[localIndex]?.config?.width + 'px' }"
11
+ ref="mainNavigationItems" :data-group-key="groupKey" :data-local-index="localIndex">
12
+ <NuxtLink class="main-navigation-link" :to="link.path">{{ link.name }}</NuxtLink>
13
+ </li>
14
+ <li v-else class="main-navigation-item"
15
+ :class="{ 'visually-hidden': !mainNavigationState.clonedNavLinks?.[groupKey]?.[localIndex]?.config?.visible }"
16
+ :style="{ '--_main-navigation-item-width': mainNavigationState.clonedNavLinks?.[groupKey]?.[localIndex]?.config?.width + 'px' }"
17
+ ref="mainNavigationItems" :data-group-key="groupKey" :data-local-index="localIndex">
18
+ <details class="main-navigation-details" name="navigation-group" ref="navigationDetails">
19
+ <summary @mouseenter="handleSummaryHover($event)" @focusin="handleSummaryHover($event)"
20
+ class="main-navigation-details-summary has-toggle-icon">
21
+ <Icon name="mdi:chevron-down" class="icon" />
22
+ {{ link.childLinksTitle }}
23
+ </summary>
24
+ <div class="main-navigation-sub-nav">
25
+ <ul class="main-navigation-sub-nav-list">
26
+ <li class="main-navigation-sub-nav-item" v-for="childLink in link.childLinks" :key="childLink.name">
27
+ <NuxtLink :to="childLink.path" class="main-navigation-sub-nav-link">{{ childLink.name }}</NuxtLink>
28
+ </li>
29
+ </ul>
30
+ </div>
31
+ </details>
32
+ </li>
33
+ </template>
34
+ </ul>
35
+
36
+ </nav>
37
+ <nav class="secondary-navigation" ref="secondaryNav">
38
+ <details class="overflow-details" :class="[{ 'visually-hidden': !navLoaded || !showOverflowDetails }]"
39
+ ref="overflowDetails" name="overflow-group">
40
+ <summary class="overflow-details-summary has-toggle-icon">
41
+ <Icon :name="overflowDetailsSummaryIcons.more" class="icon" :class="[{ show: !allowNavigationCollapse }]" />
42
+ <Icon :name="overflowDetailsSummaryIcons.burger" class="icon" :class="[{ show: allowNavigationCollapse }]" />
43
+ </summary>
44
+ <div class="overflow-details-nav">
45
+ <NavigationItems :main-navigation-state="mainNavigationState" />
46
+ </div>
47
+ </details>
48
+ <slot v-if="hasSecondaryNavigation" name="secondaryNavigation"></slot>
49
+ </nav>
50
+ <LayoutRow tag="div" variant="full" :style-class-passthrough="['mb-20', 'debug-grid']">
51
+ <ClientOnly>
52
+ <div>
53
+ <h2 class="heading-4">navigationWrapperRects</h2>
54
+ <pre>{{ navigationWrapperRects }}</pre>
55
+ <hr>
56
+ <h2 class="heading-4">secondaryNavRects</h2>
57
+ <pre>{{ secondaryNavRects }}</pre>
58
+ </div>
59
+ <div>
60
+ <h2 class="heading-4">mainNavigationState</h2>
61
+ <pre>{{ mainNavigationState }}</pre>
62
+ </div>
63
+ </ClientOnly>
64
+ </LayoutRow>
65
+ </div>
66
+ </template>
67
+
68
+ <script setup lang="ts">
69
+ import { useResizeObserver, onClickOutside } from '@vueuse/core';
70
+ import type { ResponsiveHeaderProp, ResponsiveHeaderState, IFlooredRect } from '@/types/responsiveHeader';
71
+
72
+ const props = defineProps({
73
+ responsiveNavLinks: {
74
+ type: Object as PropType<ResponsiveHeaderProp>,
75
+ default: () => [],
76
+ },
77
+ gapBetweenFirstAndSecondNav: {
78
+ type: Number,
79
+ default: 12, // px
80
+ },
81
+ overflowDetailsSummaryIcons: {
82
+ type: Object as PropType<Record<string, string>>,
83
+ default: {
84
+ more: 'gravity-ui:ellipsis',
85
+ burger: 'gravity-ui:bars',
86
+ }
87
+ },
88
+ collapseNavigationBelowWidth: {
89
+ type: Boolean,
90
+ default: true,
91
+ },
92
+ collapseBreakpoint: {
93
+ type: Number,
94
+ default: 500, // px
95
+ },
96
+ styleClassPassthrough: {
97
+ type: Array as PropType<string[]>,
98
+ default: () => [],
99
+ },
100
+ });
101
+
102
+ const slots = useSlots();
103
+ const hasSecondaryNavigation = computed(() => slots.secondaryNavigation !== undefined);
104
+
105
+ const navLoaded = ref(false);
106
+ const navigationWrapperRef = useTemplateRef('navigationWrapper');
107
+
108
+ const handleSummaryHover = (event: MouseEvent | FocusEvent) => {
109
+ const summaryElement = event.currentTarget as HTMLElement;
110
+ const parentDetailsElement = summaryElement.closest('details');
111
+ if (!parentDetailsElement) return;
112
+ if (parentDetailsElement.hasAttribute('open')) {
113
+ parentDetailsElement.removeAttribute('open');
114
+ } else {
115
+ parentDetailsElement.setAttribute('open', '');
116
+ }
117
+ overflowDetailsRef.value?.removeAttribute('open');
118
+ };
119
+
120
+ const mainNavigationState = ref<ResponsiveHeaderState>({
121
+ navListVisibility: {
122
+ firstNav: false,
123
+ secondNav: false,
124
+ },
125
+ clonedNavLinks: props.responsiveNavLinks,
126
+ hasSecondNav: Object.keys(props.responsiveNavLinks).length > 1,
127
+ });
128
+
129
+ const navRefs = ref<Record<string, HTMLUListElement | null>>({});
130
+
131
+ const setNavRef = (key: string, el: HTMLUListElement | null) => {
132
+ navRefs.value[key] = el
133
+ }
134
+
135
+ const navigationWrapperRects = ref<IFlooredRect | null>(null);
136
+ const firstNavRef = ref<HTMLUListElement | null>(null);
137
+ const firstNavRects = ref<IFlooredRect | null>(null);
138
+
139
+ const secondNavRef = ref<HTMLUListElement | null>(null);
140
+ const secondNavRects = ref<IFlooredRect | null>(null);
141
+
142
+ const secondaryNavRef = useTemplateRef('secondaryNav');
143
+ const secondaryNavRects = ref<IFlooredRect | null>(null);
144
+
145
+ const mainNavigationItemsRefs = useTemplateRef<HTMLLIElement[]>('mainNavigationItems');
146
+
147
+ const navigationDetailsRefs = useTemplateRef<HTMLElement[]>('navigationDetails');
148
+
149
+ const overflowDetailsRef = useTemplateRef('overflowDetails');
150
+
151
+ const showOverflowDetails = computed(() => {
152
+ const hasHiddenNav = !mainNavigationState.value.navListVisibility['firstNav'] || (!mainNavigationState.value.navListVisibility['secondNav'] && mainNavigationState.value.hasSecondNav);
153
+ return hasHiddenNav;
154
+ });
155
+
156
+ const mainNavigationMarginBlockEnd = computed(() => {
157
+ return secondaryNavRects.value ? secondaryNavRects.value.width + props.gapBetweenFirstAndSecondNav : 0;
158
+ });
159
+
160
+ const mainNavigationMarginBlockEndStr = computed(() => {
161
+ return mainNavigationMarginBlockEnd.value + 'px';
162
+ });
163
+
164
+ const initTemplateRefs = async () => {
165
+ firstNavRef.value = navRefs.value['firstNav'] as HTMLUListElement | null;
166
+ secondNavRef.value = navRefs.value['secondNav'] as HTMLUListElement | null;
167
+ return;
168
+ }
169
+
170
+ const getFlooredRect = (rect: DOMRect | null) => {
171
+ if (!rect) return null;
172
+ return {
173
+ left: Math.floor(rect.left),
174
+ right: Math.floor(rect.right),
175
+ top: Math.floor(rect.top),
176
+ bottom: Math.floor(rect.bottom),
177
+ width: Math.floor(rect.width),
178
+ height: Math.floor(rect.height),
179
+ };
180
+ }
181
+
182
+ const updateNavigationConfig = async (source: string) => {
183
+ navigationWrapperRects.value = getFlooredRect((navigationWrapperRef.value && navigationWrapperRef.value.getBoundingClientRect()) ?? null) || null;
184
+ secondaryNavRects.value = getFlooredRect((secondaryNavRef.value && secondaryNavRef.value.getBoundingClientRect()) ?? null) || null;
185
+ firstNavRects.value = getFlooredRect((firstNavRef.value && firstNavRef.value.getBoundingClientRect()) ?? null) || null;
186
+ secondNavRects.value = getFlooredRect((secondNavRef.value && secondNavRef.value.getBoundingClientRect()) ?? null) || null;
187
+ }
188
+
189
+ const allowNavigationCollapse = computed(() => {
190
+ return props.collapseNavigationBelowWidth && navigationWrapperRects.value && navigationWrapperRects.value.width < props.collapseBreakpoint;
191
+ });
192
+
193
+ const determineNavigationItemVisibility = (rect: DOMRect) => {
194
+ // Check if navigation should be collapsed based on width
195
+ if (allowNavigationCollapse.value) {
196
+ return false;
197
+ }
198
+
199
+ // Use default responsive visibility logic if wrapper exists
200
+ if (navigationWrapperRects.value) {
201
+ return Math.floor(rect.right + mainNavigationMarginBlockEnd.value + props.gapBetweenFirstAndSecondNav) < navigationWrapperRects.value.right;
202
+ }
203
+
204
+ // Default to visible
205
+ return true;
206
+ };
207
+
208
+ const initMainNavigationState = () => {
209
+ if (!mainNavigationItemsRefs.value) return;
210
+
211
+ mainNavigationItemsRefs.value.forEach((item, index) => {
212
+
213
+ const rect = item.getBoundingClientRect();
214
+
215
+ const groupKey = item.dataset.groupKey;
216
+ const localIndex = item.dataset.localIndex ? parseInt(item.dataset.localIndex, 10) : 0;
217
+ if (
218
+ groupKey !== undefined &&
219
+ groupKey !== null &&
220
+ mainNavigationState.value.clonedNavLinks &&
221
+ mainNavigationState.value.clonedNavLinks[groupKey] &&
222
+ mainNavigationState.value.clonedNavLinks[groupKey][localIndex]
223
+ ) {
224
+ mainNavigationState.value.clonedNavLinks[groupKey][localIndex] = {
225
+ ...mainNavigationState.value.clonedNavLinks[groupKey][localIndex],
226
+ config: {
227
+ left: item.offsetLeft,
228
+ right: item.offsetLeft + item.offsetWidth,
229
+ width: item.offsetWidth,
230
+ visible: determineNavigationItemVisibility(rect),
231
+ },
232
+ };
233
+ }
234
+
235
+ // Check if a single item has visible set to false and set the visibility of the group accordingly
236
+ if (
237
+ typeof groupKey === 'string' &&
238
+ mainNavigationState.value.clonedNavLinks &&
239
+ mainNavigationState.value.clonedNavLinks[groupKey] &&
240
+ mainNavigationState.value.clonedNavLinks[groupKey][localIndex].config?.visible === false
241
+ ) {
242
+ mainNavigationState.value.navListVisibility[groupKey] = false;
243
+ } else if (typeof groupKey === 'string') {
244
+ mainNavigationState.value.navListVisibility[groupKey] = true;
245
+ }
246
+ })
247
+
248
+ }
249
+
250
+ onMounted(async() => {
251
+ await initTemplateRefs().then(() => {
252
+ setTimeout(() => {
253
+ navLoaded.value = true;
254
+ }, 100);
255
+ });
256
+
257
+ navigationDetailsRefs.value?.forEach((element, index) => {
258
+ onClickOutside(element, () => {
259
+ navigationDetailsRefs.value?.[index]?.removeAttribute('open');
260
+ });
261
+ });
262
+ // Add onClickOutside to overflowDetailsRef
263
+ overflowDetailsRef.value && onClickOutside(overflowDetailsRef.value, () => {
264
+ overflowDetailsRef.value?.removeAttribute('open');
265
+ });
266
+ });
267
+
268
+ useResizeObserver(navigationWrapperRef, async () => {
269
+ await updateNavigationConfig("useResizeObserver").then(() => {
270
+ initMainNavigationState()
271
+ });
272
+ });
273
+
274
+ const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
275
+
276
+ watch(
277
+ () => props.styleClassPassthrough,
278
+ () => {
279
+ resetElementClasses(props.styleClassPassthrough);
280
+ }
281
+ );
282
+ </script>
283
+
284
+ <style lang="css">
285
+
286
+ .navigation {
287
+
288
+ ul,
289
+ ol {
290
+ list-style-type: none;
291
+ margin: 0;
292
+ padding: 0;
293
+
294
+ li {
295
+ /* text-box-trim: trim-both; */
296
+ /* text-box-edge: cap alphabetic; */
297
+ display: flex;
298
+ align-items: center;
299
+ }
300
+ }
301
+
302
+ --_link-visibility-transition: none;
303
+
304
+ &.loaded {
305
+ --_link-visibility-transition: all 0.2s ease-in-out;
306
+ }
307
+
308
+ /* flex-grow: 1; */
309
+ display: grid;
310
+ grid-template-areas: 'navStack';
311
+
312
+ margin: 12px;
313
+ border-radius: 8px;
314
+ background-color: #efefef05;
315
+ border: 1px solid #efefef75;
316
+ padding: 12px;
317
+
318
+ .main-navigation {
319
+ grid-area: navStack;
320
+ display: flex;
321
+ flex-wrap: nowrap;
322
+ flex-grow: 1;
323
+ justify-content: space-between;
324
+ gap: 60px;
325
+
326
+ overflow-x: hidden;
327
+ margin-inline-end: v-bind(mainNavigationMarginBlockEndStr);
328
+
329
+ &.collapsed {
330
+ justify-content: flex-start;
331
+ }
332
+
333
+ .main-navigation-list {
334
+ display: flex;
335
+ flex-wrap: nowrap;
336
+
337
+ &:nth-of-type(1) {
338
+ gap: 30px;
339
+ }
340
+
341
+ &:nth-of-type(2) {
342
+ gap: 30px;
343
+ }
344
+
345
+ .main-navigation-item {
346
+
347
+ width: var(--_main-navigation-item-width);
348
+ overflow: hidden;
349
+ transition:
350
+ opacity 0.2s ease-in-out,
351
+ visibility 0.2s ease-in-out;
352
+
353
+ .main-navigation-link {
354
+ display: flex;
355
+ text-wrap-mode: nowrap;
356
+ color: inherit;
357
+ text-decoration: none;
358
+ margin-inline-start: 0;
359
+ transition: var(--_link-visibility-transition);
360
+ }
361
+
362
+ .main-navigation-details {
363
+
364
+ --_icon-transform: scaleY(1);
365
+
366
+ margin-inline-start: 0;
367
+ transition: var(--_link-visibility-transition);
368
+
369
+ &[open] {
370
+ --_icon-transform: scaleY(-1);
371
+ }
372
+
373
+ .has-toggle-icon {
374
+ display: flex;
375
+ gap: 6px;
376
+ text-wrap-mode: nowrap;
377
+
378
+ .icon {
379
+ display: block;
380
+ transform: var(--_icon-transform);
381
+ transition: transform 0.2s ease-in-out;
382
+ }
383
+ }
384
+
385
+ .main-navigation-details-summary {
386
+
387
+ &::-webkit-details-marker,
388
+ &::marker {
389
+ display: none;
390
+ }
391
+
392
+ &:hover {
393
+ cursor: pointer;
394
+ }
395
+
396
+ }
397
+
398
+ .main-navigation-sub-nav {
399
+ position: absolute;
400
+ padding: 12px;
401
+ border: 1px solid #efefef75;
402
+ border-radius: 8px;
403
+ background-color: #000;
404
+ translate: 0 12px;
405
+
406
+ min-width: var(--_main-navigation-item-width);
407
+
408
+ .main-navigation-sub-nav-list {
409
+
410
+ display: grid;
411
+ grid-template-columns: repeat(2, auto);
412
+ gap: 12px;
413
+
414
+ .main-navigation-sub-nav-item {
415
+ margin-bottom: 8px;
416
+
417
+ &:last-child {
418
+ margin-bottom: 0;
419
+ }
420
+
421
+ .main-navigation-sub-nav-link {
422
+ display: block;
423
+ text-wrap-mode: nowrap;
424
+ text-decoration: none;
425
+ color: inherit;
426
+ }
427
+ }
428
+ }
429
+ }
430
+ }
431
+
432
+ &.visually-hidden {
433
+ visibility: hidden;
434
+ opacity: 0;
435
+
436
+ .main-navigation-details,
437
+ .main-navigation-link {
438
+ margin-inline-start: var(--_main-navigation-item-width);
439
+ }
440
+ }
441
+ }
442
+ }
443
+ }
444
+
445
+ .secondary-navigation {
446
+ grid-area: navStack;
447
+ justify-self: end;
448
+
449
+ display: flex;
450
+ gap: 12px;
451
+ align-items: center;
452
+
453
+ .secondary-navigation-list {
454
+
455
+ .secondary-navigation-item {
456
+
457
+ .secondary-navigation-link {
458
+ display: flex;
459
+ align-items: center;
460
+ font: inherit;
461
+ color: inherit;
462
+
463
+ .icon {
464
+ height: 1.35em;
465
+ width: 1.35em;
466
+ }
467
+ }
468
+ }
469
+ }
470
+
471
+ .main-navigation-link {
472
+ .icon {
473
+ height: 1.35em;
474
+ width: 1.35em;
475
+ }
476
+ }
477
+
478
+ .overflow-details {
479
+ list-style: none;
480
+ padding: 0;
481
+ margin: 0;
482
+ position: relative;
483
+ cursor: pointer;
484
+ width: fit-content;
485
+
486
+ transition: all 0.2s ease-in-out;
487
+
488
+ &.visually-hidden {
489
+ opacity: 0;
490
+ visibility: hidden;
491
+ width: 0;
492
+ }
493
+
494
+ .overflow-details-summary {
495
+ --_icon-zoom: 1;
496
+ --_icon-size: 20px;
497
+ --_border-width: 1px;
498
+ --_outline-width: 1px;
499
+ --_transition-duration: 0.2s;
500
+
501
+ display: grid;
502
+ grid-template-areas: 'icon';
503
+ align-items: center;
504
+ justify-content: center;
505
+ padding-inline: 5px;
506
+ text-wrap: nowrap;
507
+
508
+ aspect-ratio: 1;
509
+ border-radius: 4px;
510
+ border: var(--_border-width) solid #ffffff90;
511
+ outline: var(--_outline-width) solid #ffffff10;
512
+ background-color: Canvas;
513
+
514
+ width: var(--_icon-size);
515
+ height: var(--_icon-size);
516
+ overflow: hidden;
517
+ transition-property: all;
518
+ transition-timing-function: linear;
519
+ transition-duration: var(--_transition-duration);
520
+
521
+ &::-webkit-details-marker,
522
+ &::marker {
523
+ display: none;
524
+ }
525
+
526
+ &:hover {
527
+ --_icon-zoom: 1.2;
528
+ outline: var(--_outline-width) solid #ffffff;
529
+ }
530
+
531
+ .icon {
532
+ grid-area: icon;
533
+ scale: var(--_icon-zoom);
534
+ transition: scale 0.2s ease-in-out;
535
+ width: calc(var(--_icon-size) - var(--_border-width) * 2 - var(--_outline-width) * 2);
536
+ height: calc(var(--_icon-size) - var(--_border-width) * 2 - var(--_outline-width) * 2);
537
+
538
+ opacity: 0;
539
+ transition-property: opacity, transform; /* For reference */
540
+ transition-timing-function: linear; /* For reference */
541
+ transition-duration: var(--_transition-duration); /* For reference */
542
+
543
+ &.show {
544
+ opacity: 1;
545
+ }
546
+ }
547
+ }
548
+
549
+
550
+ .overflow-details-nav {
551
+ position: absolute;
552
+ top: 135%;
553
+ right: 0;
554
+ background-color: #000;
555
+ border: 1px solid #ffffff90;
556
+ border-radius: 8px;
557
+ padding: 12px;
558
+ margin: 0;
559
+ z-index: 999;
560
+ min-width: var(--_overflow-drop-down-width, fit-content);
561
+
562
+ display: grid;
563
+ grid-auto-flow: row;
564
+ gap: 8px;
565
+ }
566
+ }
567
+ }
568
+ }
569
+
570
+ .debug-grid {
571
+ display: none;
572
+
573
+ .layout-row-inner > div {
574
+ display: flex;
575
+ flex-wrap: wrap;
576
+ gap: 12px;
577
+
578
+ margin-inline: 12px;
579
+
580
+ > div {
581
+ outline: 1px solid gray;
582
+ padding: 12px;
583
+ }
584
+ }
585
+ }
586
+ </style>