srcdev-nuxt-components 2.5.1 → 2.5.3
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/components/deep-expanding-menu/DeepExpandingMenu.vue +3 -3
- package/components/deep-expanding-menu/DeepExpandingMenuOld.vue +3 -3
- package/components/responsive-header/NavigationItems.vue +5 -29
- package/components/responsive-header/ResponsiveHeader.vue +11 -46
- package/package.json +1 -1
- package/types/responsiveHeader.ts +38 -0
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
<script lang="ts">
|
|
28
28
|
const TAGS_ALLOWED = <string[]>['div', 'section', 'nav', 'ul', 'ol'];
|
|
29
29
|
|
|
30
|
-
interface
|
|
30
|
+
interface ResponsiveHeaderNavItem {
|
|
31
31
|
name: string;
|
|
32
32
|
path?: string;
|
|
33
33
|
isExternal?: boolean;
|
|
34
|
-
childLinks?:
|
|
34
|
+
childLinks?: ResponsiveHeaderNavItem[];
|
|
35
35
|
childLinksTitle?: string;
|
|
36
36
|
}
|
|
37
37
|
</script>
|
|
@@ -46,7 +46,7 @@ const props = defineProps({
|
|
|
46
46
|
},
|
|
47
47
|
},
|
|
48
48
|
navLinks: {
|
|
49
|
-
type: Array as PropType<
|
|
49
|
+
type: Array as PropType<ResponsiveHeaderNavItem[]>,
|
|
50
50
|
default: () => [],
|
|
51
51
|
},
|
|
52
52
|
styleClassPassthrough: {
|
|
@@ -34,7 +34,7 @@ const props = defineProps({
|
|
|
34
34
|
},
|
|
35
35
|
},
|
|
36
36
|
navLinks: {
|
|
37
|
-
type: Array as PropType<
|
|
37
|
+
type: Array as PropType<ResponsiveHeaderNavItem[]>,
|
|
38
38
|
default: () => [],
|
|
39
39
|
},
|
|
40
40
|
styleClassPassthrough: {
|
|
@@ -66,12 +66,12 @@ onMounted(() => {
|
|
|
66
66
|
<script lang="ts">
|
|
67
67
|
const TAGS_ALLOWED = <string[]>['div', 'section', 'nav', 'ul', 'ol'];
|
|
68
68
|
|
|
69
|
-
interface
|
|
69
|
+
interface ResponsiveHeaderNavItem {
|
|
70
70
|
name: string;
|
|
71
71
|
path?: string;
|
|
72
72
|
isExternal?: boolean;
|
|
73
73
|
childLinksTitle?: string;
|
|
74
|
-
childLinks?:
|
|
74
|
+
childLinks?: ResponsiveHeaderNavItem[];
|
|
75
75
|
}
|
|
76
76
|
</script>
|
|
77
77
|
|
|
@@ -49,37 +49,12 @@
|
|
|
49
49
|
</div>
|
|
50
50
|
</template>
|
|
51
51
|
|
|
52
|
-
<script lang="ts">
|
|
53
|
-
interface NavLinkConfig {
|
|
54
|
-
left: number;
|
|
55
|
-
right: number;
|
|
56
|
-
width?: number;
|
|
57
|
-
visible: boolean;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
interface INavLink {
|
|
61
|
-
name: string;
|
|
62
|
-
path?: string;
|
|
63
|
-
isExternal?: boolean;
|
|
64
|
-
childLinksTitle?: string;
|
|
65
|
-
childLinks?: INavLink[];
|
|
66
|
-
config?: NavLinkConfig;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
interface IResponsiveNavLinks {
|
|
70
|
-
[key: string]: INavLink[];
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
interface INavigationRefTrackState {
|
|
74
|
-
navListVisibility: Record<string, boolean>;
|
|
75
|
-
clonedNavLinks?: IResponsiveNavLinks;
|
|
76
|
-
}
|
|
77
|
-
</script>
|
|
78
|
-
|
|
79
52
|
<script setup lang="ts">
|
|
53
|
+
import type { ResponsiveHeaderState } from '@/types/responsiveHeader';
|
|
54
|
+
|
|
80
55
|
const props = defineProps({
|
|
81
56
|
mainNavigationState: {
|
|
82
|
-
type: Object as PropType<
|
|
57
|
+
type: Object as PropType<ResponsiveHeaderState>,
|
|
83
58
|
default: () => [],
|
|
84
59
|
},
|
|
85
60
|
styleClassPassthrough: {
|
|
@@ -89,6 +64,7 @@ const props = defineProps({
|
|
|
89
64
|
});
|
|
90
65
|
|
|
91
66
|
const detailsAanimationDuration = 200;
|
|
67
|
+
const detailsAanimationDurationString = `${detailsAanimationDuration}ms`;
|
|
92
68
|
|
|
93
69
|
const widestNavLinkWidthInMainNavigationState = computed(() => {
|
|
94
70
|
return Object.values(props.mainNavigationState.clonedNavLinks || {}).reduce((maxWidth, group) => {
|
|
@@ -166,7 +142,7 @@ watch(
|
|
|
166
142
|
flex-direction: column;
|
|
167
143
|
gap: 12px;
|
|
168
144
|
margin-block-start: var(--_overflow-navigation-sub-nav-list-margin-block-start);
|
|
169
|
-
transition: margin-block-start v-bind(
|
|
145
|
+
transition: margin-block-start v-bind(detailsAanimationDurationString) ease;
|
|
170
146
|
|
|
171
147
|
.overflow-navigation-sub-nav-item {
|
|
172
148
|
|
|
@@ -73,51 +73,13 @@
|
|
|
73
73
|
</LayoutRow>
|
|
74
74
|
</template>
|
|
75
75
|
|
|
76
|
-
<script lang="ts">
|
|
77
|
-
|
|
78
|
-
interface INavLink {
|
|
79
|
-
name: string;
|
|
80
|
-
path?: string;
|
|
81
|
-
isExternal?: boolean;
|
|
82
|
-
childLinksTitle?: string;
|
|
83
|
-
childLinks?: INavLink[];
|
|
84
|
-
config?: NavLinkConfig;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
interface IResponsiveNavLinks {
|
|
88
|
-
[key: string]: INavLink[];
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
interface IFlooredRect {
|
|
92
|
-
left: number;
|
|
93
|
-
right: number;
|
|
94
|
-
top: number;
|
|
95
|
-
bottom: number;
|
|
96
|
-
width: number;
|
|
97
|
-
height: number;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
interface NavLinkConfig {
|
|
101
|
-
left: number;
|
|
102
|
-
right: number;
|
|
103
|
-
width?: number;
|
|
104
|
-
visible: boolean;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
interface INavigationRefTrackState {
|
|
108
|
-
navListVisibility: Record<string, boolean>;
|
|
109
|
-
clonedNavLinks?: IResponsiveNavLinks;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
</script>
|
|
114
|
-
|
|
115
76
|
<script setup lang="ts">
|
|
116
77
|
import { useResizeObserver, onClickOutside } from '@vueuse/core';
|
|
78
|
+
import type { ResponsiveHeaderProp, ResponsiveHeaderState, IFlooredRect } from '@/types/responsiveHeader';
|
|
117
79
|
|
|
118
80
|
const props = defineProps({
|
|
119
81
|
responsiveNavLinks: {
|
|
120
|
-
type: Object as PropType<
|
|
82
|
+
type: Object as PropType<ResponsiveHeaderProp>,
|
|
121
83
|
default: () => [],
|
|
122
84
|
},
|
|
123
85
|
gapBetweenFirstAndSecondNav: {
|
|
@@ -130,7 +92,6 @@ const props = defineProps({
|
|
|
130
92
|
},
|
|
131
93
|
});
|
|
132
94
|
|
|
133
|
-
|
|
134
95
|
const navLoaded = ref(false);
|
|
135
96
|
const navigationWrapperRef = useTemplateRef('navigationWrapper');
|
|
136
97
|
|
|
@@ -143,9 +104,10 @@ const handleSummaryHover = (event: MouseEvent | FocusEvent) => {
|
|
|
143
104
|
} else {
|
|
144
105
|
parentDetailsElement.setAttribute('open', '');
|
|
145
106
|
}
|
|
107
|
+
overflowDetailsRef.value?.removeAttribute('open');
|
|
146
108
|
};
|
|
147
109
|
|
|
148
|
-
const mainNavigationState = ref<
|
|
110
|
+
const mainNavigationState = ref<ResponsiveHeaderState>({
|
|
149
111
|
navListVisibility: {
|
|
150
112
|
firstNav: false,
|
|
151
113
|
secondNav: false,
|
|
@@ -181,7 +143,11 @@ const showOverflowDetails = computed(() => {
|
|
|
181
143
|
});
|
|
182
144
|
|
|
183
145
|
const mainNavigationMarginBlockEnd = computed(() => {
|
|
184
|
-
|
|
146
|
+
return secondaryNavRects.value ? secondaryNavRects.value.width + props.gapBetweenFirstAndSecondNav : 0;
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const mainNavigationMarginBlockEndStr = computed(() => {
|
|
150
|
+
return mainNavigationMarginBlockEnd.value + 'px';
|
|
185
151
|
});
|
|
186
152
|
|
|
187
153
|
const initTemplateRefs = async () => {
|
|
@@ -327,7 +293,7 @@ watch(
|
|
|
327
293
|
gap: 60px;
|
|
328
294
|
|
|
329
295
|
overflow-x: hidden;
|
|
330
|
-
margin-inline-end: v-bind(
|
|
296
|
+
margin-inline-end: v-bind(mainNavigationMarginBlockEndStr);
|
|
331
297
|
|
|
332
298
|
&.collapsed {
|
|
333
299
|
justify-content: flex-start;
|
|
@@ -485,14 +451,13 @@ watch(
|
|
|
485
451
|
position: relative;
|
|
486
452
|
cursor: pointer;
|
|
487
453
|
width: fit-content;
|
|
488
|
-
/* overflow: hidden; */
|
|
489
454
|
|
|
490
455
|
transition: all 0.2s ease-in-out;
|
|
491
456
|
|
|
492
457
|
&.visually-hidden {
|
|
493
458
|
opacity: 0;
|
|
494
459
|
visibility: hidden;
|
|
495
|
-
|
|
460
|
+
width: 0;
|
|
496
461
|
}
|
|
497
462
|
|
|
498
463
|
.overflow-details-summary {
|
package/package.json
CHANGED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface ResponsiveHeaderNavItem {
|
|
2
|
+
name: string;
|
|
3
|
+
path?: string;
|
|
4
|
+
iconName?: string;
|
|
5
|
+
imageSrc?: string;
|
|
6
|
+
imageAlt?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
isActive?: boolean;
|
|
9
|
+
isExternal?: boolean;
|
|
10
|
+
childLinksTitle?: string;
|
|
11
|
+
childLinks?: ResponsiveHeaderNavItem[];
|
|
12
|
+
config?: ResponsiveHeaderItemRects;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ResponsiveHeaderProp {
|
|
16
|
+
[key: string]: ResponsiveHeaderNavItem[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface IFlooredRect {
|
|
20
|
+
left: number;
|
|
21
|
+
right: number;
|
|
22
|
+
top: number;
|
|
23
|
+
bottom: number;
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ResponsiveHeaderItemRects {
|
|
29
|
+
left: number;
|
|
30
|
+
right: number;
|
|
31
|
+
width?: number;
|
|
32
|
+
visible: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ResponsiveHeaderState {
|
|
36
|
+
navListVisibility: Record<string, boolean>;
|
|
37
|
+
clonedNavLinks?: ResponsiveHeaderProp;
|
|
38
|
+
}
|