bfg-common 1.2.71 → 1.2.72
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/atoms/nav/NavBar.vue +140 -128
- package/components/atoms/tabs/Tabs.vue +30 -2
- package/package.json +1 -1
|
@@ -1,128 +1,140 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<nav
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
1
|
+
<template>
|
|
2
|
+
<nav :id="id" :class="['nav', { 'not-collapse': notCollapse }]">
|
|
3
|
+
<ul>
|
|
4
|
+
<li v-for="(item, key) in props.items" :key="key" class="nav-item">
|
|
5
|
+
<atoms-collapse-nav-item
|
|
6
|
+
:test-id="`${props.testId}-item-${key}`"
|
|
7
|
+
:is-link="props.isLink"
|
|
8
|
+
:item="item"
|
|
9
|
+
:value="props.modelValue"
|
|
10
|
+
btn-class="btn btn-link nav-link"
|
|
11
|
+
@change="change"
|
|
12
|
+
/>
|
|
13
|
+
</li>
|
|
14
|
+
<atoms-collapse-nav
|
|
15
|
+
v-show="collapsedItems.length && !notCollapse"
|
|
16
|
+
:test-id="`${props.testId}-container`"
|
|
17
|
+
:items="collapsedItems"
|
|
18
|
+
:is-link="props.isLink"
|
|
19
|
+
:value="props.modelValue"
|
|
20
|
+
@change="change"
|
|
21
|
+
/>
|
|
22
|
+
</ul>
|
|
23
|
+
</nav>
|
|
24
|
+
</template>
|
|
25
|
+
|
|
26
|
+
<script setup lang="ts">
|
|
27
|
+
import { UI_I_CollapseNavItem } from '~/components/atoms/collapse/models/interfaces'
|
|
28
|
+
|
|
29
|
+
const props = withDefaults(
|
|
30
|
+
defineProps<{
|
|
31
|
+
items: UI_I_CollapseNavItem[]
|
|
32
|
+
testId?: string
|
|
33
|
+
modelValue?: number | string
|
|
34
|
+
isLink?: boolean
|
|
35
|
+
notCollapse?: boolean
|
|
36
|
+
}>(),
|
|
37
|
+
{ testId: 'ui-nav-bar' }
|
|
38
|
+
)
|
|
39
|
+
const emits = defineEmits<{
|
|
40
|
+
(event: 'update:model-value', num: number): void
|
|
41
|
+
(event: 'change', num: number): void
|
|
42
|
+
}>()
|
|
43
|
+
|
|
44
|
+
const change = (value: number): void => {
|
|
45
|
+
emits('update:model-value', value)
|
|
46
|
+
emits('change', value)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const visibleCount = ref(props.items.length)
|
|
50
|
+
const collapsedItems = computed<UI_I_CollapseNavItem[]>(() => {
|
|
51
|
+
return props.items.filter((_, index) => {
|
|
52
|
+
return index >= visibleCount.value
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
let triggerElementWidth = 0
|
|
57
|
+
const setTriggerElementWidth = (): void => {
|
|
58
|
+
if (!id.value || !props.testId) return
|
|
59
|
+
|
|
60
|
+
const element = document.querySelector(
|
|
61
|
+
`#${id.value} [test-id="${props.testId}-container"]`
|
|
62
|
+
)
|
|
63
|
+
triggerElementWidth =
|
|
64
|
+
element && element?.style?.display !== 'none'
|
|
65
|
+
? element.getBoundingClientRect().width
|
|
66
|
+
: 0
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let outputSize = (): void => {
|
|
70
|
+
const el = document.getElementById(id.value)
|
|
71
|
+
if (!el) return
|
|
72
|
+
|
|
73
|
+
const elWidth = el.clientWidth
|
|
74
|
+
const elItems = el.children[0].children
|
|
75
|
+
|
|
76
|
+
setTriggerElementWidth()
|
|
77
|
+
const elItemsMarginLeft = parseInt(getComputedStyle(elItems[0]).marginLeft)
|
|
78
|
+
const elItemsMarginRight = parseInt(getComputedStyle(elItems[0]).marginRight)
|
|
79
|
+
const childrenMarginY = elItemsMarginLeft + elItemsMarginRight
|
|
80
|
+
|
|
81
|
+
let childrenWidth = 0
|
|
82
|
+
let count = 0
|
|
83
|
+
for (let i = 0; i < elItems.length; i++) {
|
|
84
|
+
childrenWidth += elItems[i].clientWidth + childrenMarginY
|
|
85
|
+
const isWrap = elWidth - triggerElementWidth < childrenWidth
|
|
86
|
+
|
|
87
|
+
if (isWrap) break
|
|
88
|
+
count++
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
visibleCount.value = count
|
|
92
|
+
|
|
93
|
+
const element = document.querySelector(`#${id.value} ul`)
|
|
94
|
+
if (element) {
|
|
95
|
+
element.style.paddingRight =
|
|
96
|
+
collapsedItems.value.length && !props.notCollapse
|
|
97
|
+
? `${triggerElementWidth}px`
|
|
98
|
+
: ''
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
outputSize = useThrottle(outputSize)
|
|
102
|
+
|
|
103
|
+
const id = ref<string>('')
|
|
104
|
+
const setResizeObserve = (): void => {
|
|
105
|
+
const el = document.getElementById(id.value)
|
|
106
|
+
|
|
107
|
+
if (!el) {
|
|
108
|
+
setTimeout(setResizeObserve, 0)
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
new ResizeObserver(outputSize).observe(el)
|
|
113
|
+
}
|
|
114
|
+
onMounted(() => {
|
|
115
|
+
setTriggerElementWidth()
|
|
116
|
+
setResizeObserve()
|
|
117
|
+
id.value = `nav-bar${useUniqueId()}`
|
|
118
|
+
})
|
|
119
|
+
</script>
|
|
120
|
+
|
|
121
|
+
<style scoped lang="scss">
|
|
122
|
+
.nav {
|
|
123
|
+
box-shadow: inset 0 -0.05rem 0 var(--nav-panel-border-color);
|
|
124
|
+
align-items: flex-start;
|
|
125
|
+
|
|
126
|
+
&.not-collapse {
|
|
127
|
+
ul {
|
|
128
|
+
flex-wrap: nowrap;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
ul {
|
|
133
|
+
position: relative;
|
|
134
|
+
height: 36px;
|
|
135
|
+
overflow: hidden;
|
|
136
|
+
display: flex;
|
|
137
|
+
flex-wrap: wrap;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
</style>
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
/>
|
|
18
18
|
</li>
|
|
19
19
|
<atoms-collapse-nav
|
|
20
|
-
:test-id="`${props.testId}-item`"
|
|
21
20
|
v-show="collapsedItems.length"
|
|
21
|
+
:test-id="`${props.testId}-item`"
|
|
22
22
|
:items="collapsedItems"
|
|
23
23
|
:is-link="props.isLink"
|
|
24
24
|
/>
|
|
@@ -77,6 +77,23 @@ const collapsedItems = computed<UI_I_CollapseNavItem[]>(() => {
|
|
|
77
77
|
|
|
78
78
|
const classes = computed<string>(() => `btn btn--${props.size}`)
|
|
79
79
|
|
|
80
|
+
let triggerElementWidth = 0
|
|
81
|
+
const setTriggerElementWidth = (): void => {
|
|
82
|
+
if (!id.value || !props.testId) return
|
|
83
|
+
|
|
84
|
+
const element = document.querySelector(
|
|
85
|
+
`#${id.value} [test-id="${props.testId}-item"]`
|
|
86
|
+
)
|
|
87
|
+
if (
|
|
88
|
+
element &&
|
|
89
|
+
element?.style?.display !== 'none' &&
|
|
90
|
+
collapsedItems.value.length
|
|
91
|
+
) {
|
|
92
|
+
const { width, right, left } = element.getBoundingClientRect()
|
|
93
|
+
triggerElementWidth = width + (right - left)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
80
97
|
const outputSize = (): void => {
|
|
81
98
|
const el = document.getElementById(id.value)
|
|
82
99
|
if (!el) return
|
|
@@ -89,15 +106,25 @@ const outputSize = (): void => {
|
|
|
89
106
|
|
|
90
107
|
let childrenWidth = 0
|
|
91
108
|
let count = 0
|
|
109
|
+
setTriggerElementWidth()
|
|
92
110
|
for (let i = 0; i < elItems.length; i++) {
|
|
93
111
|
childrenWidth += elItems[i].clientWidth + childrenMarginY
|
|
94
|
-
const isWrap =
|
|
112
|
+
const isWrap = collapsedItems.value.length
|
|
113
|
+
? elWidth - triggerElementWidth < childrenWidth
|
|
114
|
+
: elWidth < childrenWidth
|
|
95
115
|
|
|
96
116
|
if (isWrap) break
|
|
97
117
|
count++
|
|
98
118
|
}
|
|
99
119
|
|
|
100
120
|
visibleCount.value = count
|
|
121
|
+
|
|
122
|
+
const element = document.querySelector(`#${id.value} ul`)
|
|
123
|
+
if (element) {
|
|
124
|
+
element.style.paddingRight = collapsedItems.value.length
|
|
125
|
+
? `${triggerElementWidth}px`
|
|
126
|
+
: ''
|
|
127
|
+
}
|
|
101
128
|
}
|
|
102
129
|
|
|
103
130
|
const id = ref(`tabs-${useUniqueId()}`)
|
|
@@ -133,6 +160,7 @@ onMounted(() => {
|
|
|
133
160
|
overflow: hidden;
|
|
134
161
|
display: flex;
|
|
135
162
|
flex-wrap: wrap;
|
|
163
|
+
grid-row-gap: 11px;
|
|
136
164
|
|
|
137
165
|
&-item {
|
|
138
166
|
margin-right: 0;
|