@bagelink/vue 1.5.30 → 1.6.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/dist/components/ListItem.vue.d.ts +1 -0
- package/dist/components/ListItem.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/ArrayInput.vue.d.ts +33 -0
- package/dist/components/form/inputs/ArrayInput.vue.d.ts.map +1 -0
- package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/index.d.ts +1 -0
- package/dist/components/form/inputs/index.d.ts.map +1 -1
- package/dist/components/lightbox/Lightbox.vue.d.ts.map +1 -1
- package/dist/index.cjs +21 -21
- package/dist/index.mjs +3736 -3660
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/ListItem.vue +10 -8
- package/src/components/form/inputs/ArrayInput.vue +79 -0
- package/src/components/form/inputs/SelectInput.vue +28 -28
- package/src/components/form/inputs/index.ts +1 -0
- package/src/components/lightbox/Lightbox.vue +76 -87
- package/src/styles/text.css +36 -0
- package/src/styles/theme.css +1 -0
package/package.json
CHANGED
|
@@ -21,6 +21,7 @@ const props = withDefaults(
|
|
|
21
21
|
fullWidth?: boolean
|
|
22
22
|
ellipsis?: boolean
|
|
23
23
|
ripple?: boolean
|
|
24
|
+
tiny?: boolean
|
|
24
25
|
onClick?: () => void
|
|
25
26
|
}>(),
|
|
26
27
|
{
|
|
@@ -30,9 +31,9 @@ const props = withDefaults(
|
|
|
30
31
|
)
|
|
31
32
|
|
|
32
33
|
const isComponent = $computed(() => {
|
|
33
|
-
if (props.to) {return 'router-link'}
|
|
34
|
-
if (props.href) {return 'a'}
|
|
35
|
-
if (props.onClick) {return 'button'}
|
|
34
|
+
if (props.to) { return 'router-link' }
|
|
35
|
+
if (props.href) { return 'a' }
|
|
36
|
+
if (props.onClick) { return 'button' }
|
|
36
37
|
return 'div'
|
|
37
38
|
})
|
|
38
39
|
|
|
@@ -42,15 +43,15 @@ const isClickable = $computed(() => {
|
|
|
42
43
|
|
|
43
44
|
const bind = $computed(() => {
|
|
44
45
|
const obj: { [key: string]: any } = {}
|
|
45
|
-
if (props.to) {obj.to = props.to}
|
|
46
|
-
else if (props.href) {obj.href = props.href}
|
|
47
|
-
if (props.target && (props.to || props.href)) {obj.target = props.target}
|
|
46
|
+
if (props.to) { obj.to = props.to }
|
|
47
|
+
else if (props.href) { obj.href = props.href }
|
|
48
|
+
if (props.target && (props.to || props.href)) { obj.target = props.target }
|
|
48
49
|
|
|
49
50
|
obj.class = {
|
|
50
51
|
'notClickable': !(props.to || props.onClick),
|
|
51
52
|
'no-border-list': props.flat,
|
|
52
53
|
}
|
|
53
|
-
if (props.disabled) {obj.disabled = true}
|
|
54
|
+
if (props.disabled) { obj.disabled = true }
|
|
54
55
|
return obj
|
|
55
56
|
})
|
|
56
57
|
</script>
|
|
@@ -60,8 +61,9 @@ const bind = $computed(() => {
|
|
|
60
61
|
<component
|
|
61
62
|
:is="isComponent" v-bind="bind" v-ripple="ripple && isClickable"
|
|
62
63
|
class="flex flex-grow-1 gap-05 list-item" :class="{
|
|
63
|
-
'py-1': !props.thin,
|
|
64
|
+
'py-1': !props.thin && !props.tiny,
|
|
64
65
|
'py-05': props.thin,
|
|
66
|
+
'py-0': props.tiny,
|
|
65
67
|
'px-1': !props.fullWidth,
|
|
66
68
|
'px-0': props.fullWidth,
|
|
67
69
|
}" @click="onClick"
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<script setup lang="ts" generic="T = unknown">
|
|
2
|
+
import type { Ref, WritableComputedRef } from 'vue'
|
|
3
|
+
|
|
4
|
+
import { Btn } from '@bagelink/vue'
|
|
5
|
+
import { computed, ref, watch } from 'vue'
|
|
6
|
+
|
|
7
|
+
const props = defineProps<{
|
|
8
|
+
label?: string
|
|
9
|
+
helpText?: string
|
|
10
|
+
modelValue: T[]
|
|
11
|
+
allowAdd?: boolean
|
|
12
|
+
allowDelete?: boolean
|
|
13
|
+
}>()
|
|
14
|
+
|
|
15
|
+
const emit = defineEmits(['update:modelValue'])
|
|
16
|
+
|
|
17
|
+
defineSlots<{
|
|
18
|
+
default: (props: { item: WritableComputedRef<T>, index: number }) => unknown
|
|
19
|
+
}>()
|
|
20
|
+
|
|
21
|
+
const items = ref(Array.isArray(props.modelValue) ? [...props.modelValue] : []) as Ref<T[]>
|
|
22
|
+
|
|
23
|
+
watch(
|
|
24
|
+
() => props.modelValue,
|
|
25
|
+
(newVal) => {
|
|
26
|
+
if (Array.isArray(newVal)) {
|
|
27
|
+
items.value = [...newVal]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
function addItem() {
|
|
33
|
+
items.value.push(undefined as T)
|
|
34
|
+
updateModel()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function deleteItem(i: number) {
|
|
38
|
+
items.value.splice(i, 1)
|
|
39
|
+
updateModel()
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function updateModel() {
|
|
43
|
+
emit('update:modelValue', [...items.value])
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function onUpdate(value: T, i: number) {
|
|
47
|
+
items.value[i] = value
|
|
48
|
+
updateModel()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Create a writable computed ref for each item
|
|
52
|
+
function getItemRef(i: number) {
|
|
53
|
+
return computed({
|
|
54
|
+
get: () => items.value[i],
|
|
55
|
+
set: (value) => {
|
|
56
|
+
onUpdate(value, i)
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<template>
|
|
63
|
+
<div>
|
|
64
|
+
<label v-if="label" class="txt12 txt-gray-90 mb-025">
|
|
65
|
+
{{ label }}
|
|
66
|
+
</label>
|
|
67
|
+
<p v-if="helpText" class="txt12 txt-gray-50 mb-05">
|
|
68
|
+
{{ helpText }}
|
|
69
|
+
</p>
|
|
70
|
+
<div
|
|
71
|
+
v-for="(_, i) in items" :key="i" class="array-input-row"
|
|
72
|
+
style="display: flex; align-items: center; gap: 0.5rem;"
|
|
73
|
+
>
|
|
74
|
+
<slot :item="getItemRef(i)" :index="i" />
|
|
75
|
+
<Btn v-if="allowDelete" v-tooltip="'Delete'" flat icon="delete" size="xs" @click="deleteItem(i)" />
|
|
76
|
+
</div>
|
|
77
|
+
<Btn v-if="allowAdd" icon="add" size="small" value="Add" @click="addItem" />
|
|
78
|
+
</div>
|
|
79
|
+
</template>
|
|
@@ -13,7 +13,7 @@ const props = withDefaults(defineProps<PropTypes>(), {
|
|
|
13
13
|
|
|
14
14
|
const emit = defineEmits(['update:modelValue'])
|
|
15
15
|
|
|
16
|
-
const isAsyncSource = (src: OptionsSource): src is (q: string) => Promise<Option[]> => 'function'
|
|
16
|
+
const isAsyncSource = (src: OptionsSource): src is (q: string) => Promise<Option[]> => typeof src === 'function'
|
|
17
17
|
|
|
18
18
|
type Primitive = string | number | boolean
|
|
19
19
|
|
|
@@ -48,8 +48,8 @@ let selected = $ref(false)
|
|
|
48
48
|
let open = $ref(false)
|
|
49
49
|
|
|
50
50
|
const selectedLabel = $computed((): string => {
|
|
51
|
-
if (
|
|
52
|
-
if (
|
|
51
|
+
if (selectedItemCount === 0) { return props.placeholder }
|
|
52
|
+
if (selectedItemCount > 4) {
|
|
53
53
|
const str = selectedItems
|
|
54
54
|
.slice(0, 4)
|
|
55
55
|
.map(item => getLabel(item))
|
|
@@ -77,30 +77,30 @@ function navigate(direction: 'up' | 'down') {
|
|
|
77
77
|
setTimeout(() => { navigate(direction) }, 210)
|
|
78
78
|
return
|
|
79
79
|
}
|
|
80
|
-
if ('up'
|
|
81
|
-
highlightedIndex =
|
|
82
|
-
} else if ('down'
|
|
80
|
+
if (direction === 'up') {
|
|
81
|
+
highlightedIndex = highlightedIndex > 0 ? highlightedIndex - 1 : results.value.length - 1
|
|
82
|
+
} else if (direction === 'down') {
|
|
83
83
|
highlightedIndex = highlightedIndex < results.value.length - 1 ? highlightedIndex + 1 : 0
|
|
84
84
|
}
|
|
85
85
|
setTimeout(() => {
|
|
86
86
|
const el = selectOptions?.children[highlightedIndex] as HTMLElement
|
|
87
|
-
if (el) {el.focus()}
|
|
88
|
-
else {highlightedIndex = -1}
|
|
87
|
+
if (el) { el.focus() }
|
|
88
|
+
else { highlightedIndex = -1 }
|
|
89
89
|
}, 10)
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
const isSelected = (option: Option) => selectedItems.find(item => getValue(option) === getValue(item)) !== undefined
|
|
93
93
|
|
|
94
94
|
function scrollToSelectedItem() {
|
|
95
|
-
if (!selectOptions ||
|
|
95
|
+
if (!selectOptions || selectedItemCount === 0) { return }
|
|
96
96
|
|
|
97
97
|
// Find the first selected item in the results
|
|
98
98
|
const selectedIndex = results.value.findIndex(option => isSelected(option))
|
|
99
|
-
if (
|
|
99
|
+
if (selectedIndex === -1) { return }
|
|
100
100
|
|
|
101
101
|
// Get the selected option element
|
|
102
102
|
const selectedElement = selectOptions.children[selectedIndex] as HTMLElement
|
|
103
|
-
if (!selectedElement) {return}
|
|
103
|
+
if (!selectedElement) { return }
|
|
104
104
|
|
|
105
105
|
// Scroll the selected item into view
|
|
106
106
|
selectedElement.scrollIntoView({
|
|
@@ -110,22 +110,22 @@ function scrollToSelectedItem() {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
function getLabel(option: Option) {
|
|
113
|
-
if (
|
|
114
|
-
if ('object'
|
|
115
|
-
if ('boolean'
|
|
113
|
+
if (option == null) { return '' }
|
|
114
|
+
if (typeof option === 'object') { return option.label ?? String((option as any).value ?? '') }
|
|
115
|
+
if (typeof option === 'boolean') { return option ? 'Yes' : 'No' }
|
|
116
116
|
return String(option)
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
function getValue(option?: Option): Primitive | undefined {
|
|
120
|
-
if (
|
|
121
|
-
if ('object'
|
|
120
|
+
if (option == null) { return }
|
|
121
|
+
if (typeof option === 'object') { return option.value as Primitive }
|
|
122
122
|
return option as Primitive
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
function focusInput() {
|
|
126
126
|
open = true
|
|
127
127
|
setTimeout(() => {
|
|
128
|
-
if (searchInput) {searchInput.focus()}
|
|
128
|
+
if (searchInput) { searchInput.focus() }
|
|
129
129
|
}, 10)
|
|
130
130
|
}
|
|
131
131
|
|
|
@@ -134,7 +134,7 @@ function select(option: Option) {
|
|
|
134
134
|
const existingIndex = selectedItems.findIndex(
|
|
135
135
|
item => getValue(item) === getValue(option),
|
|
136
136
|
)
|
|
137
|
-
if (-1
|
|
137
|
+
if (existingIndex > -1) {
|
|
138
138
|
selectedItems.splice(existingIndex, 1)
|
|
139
139
|
}
|
|
140
140
|
else if (props.multiselect) {
|
|
@@ -148,7 +148,7 @@ function select(option: Option) {
|
|
|
148
148
|
|
|
149
149
|
// Move focus away from popper content before it gets aria-hidden
|
|
150
150
|
const active = document.activeElement as HTMLElement | null
|
|
151
|
-
if (active && selectOptions?.contains(active)) {active.blur()}
|
|
151
|
+
if (active && selectOptions?.contains(active)) { active.blur() }
|
|
152
152
|
|
|
153
153
|
if (!props.multiselect) {
|
|
154
154
|
open = false
|
|
@@ -169,7 +169,7 @@ function emitUpdate() {
|
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
function compareArrays(arr1: Option[], arr2: Option[]) {
|
|
172
|
-
if (arr1.length !== arr2.length) {return false}
|
|
172
|
+
if (arr1.length !== arr2.length) { return false }
|
|
173
173
|
const s1 = arr1.map(getValue).filter(Boolean).map(String).sort()
|
|
174
174
|
const s2 = arr2.map(getValue).filter(Boolean).map(String).sort()
|
|
175
175
|
return s1.every((v, i) => v === s2[i])
|
|
@@ -182,7 +182,7 @@ watch(
|
|
|
182
182
|
const newOption = Array.isArray(props.options)
|
|
183
183
|
? (props.options.find(o => getValue(o) === newVal) ?? newVal)
|
|
184
184
|
: newVal
|
|
185
|
-
if (newOption && !isSelected(newOption)) {selectedItems = [newOption]}
|
|
185
|
+
if (newOption && !isSelected(newOption)) { selectedItems = [newOption] }
|
|
186
186
|
} else {
|
|
187
187
|
const newData = [newVal].flat()
|
|
188
188
|
const isSame = compareArrays(newData, selectedItems)
|
|
@@ -206,13 +206,13 @@ watch(
|
|
|
206
206
|
() => props.options,
|
|
207
207
|
() => {
|
|
208
208
|
const opts = props.options
|
|
209
|
-
if (!Array.isArray(opts)) {return}
|
|
209
|
+
if (!Array.isArray(opts)) { return }
|
|
210
210
|
selectedItems.forEach((option, i) => {
|
|
211
211
|
const exists = opts.find(
|
|
212
212
|
(o: Option) => getValue(o) === getValue(option),
|
|
213
213
|
)
|
|
214
|
-
if (exists === undefined) {selectedItems.splice(i, 1)}
|
|
215
|
-
else {selectedItems.splice(i, 1, exists)}
|
|
214
|
+
if (exists === undefined) { selectedItems.splice(i, 1) }
|
|
215
|
+
else { selectedItems.splice(i, 1, exists) }
|
|
216
216
|
})
|
|
217
217
|
// const original = JSON.stringify(props.options.map(getValue));
|
|
218
218
|
// const newSelection = JSON.stringify(selectedItems.map(getValue));
|
|
@@ -225,11 +225,11 @@ watch(
|
|
|
225
225
|
watch(
|
|
226
226
|
() => results.value,
|
|
227
227
|
(newResults) => {
|
|
228
|
-
if (isAsyncSource(props.options) &&
|
|
228
|
+
if (isAsyncSource(props.options) && newResults.length > 0) {
|
|
229
229
|
selectedItems.forEach((option, i) => {
|
|
230
230
|
const optionValue = getValue(option)
|
|
231
231
|
// If the selected item is just a primitive value (no label), find the full option
|
|
232
|
-
if ('object'
|
|
232
|
+
if (typeof option !== 'object' || !option.label) {
|
|
233
233
|
const fullOption = newResults.find(
|
|
234
234
|
(o: Option) => getValue(o) === optionValue,
|
|
235
235
|
)
|
|
@@ -250,7 +250,7 @@ onMounted(() => {
|
|
|
250
250
|
(o: Option) => getValue(o) === getValue(props.defaultValue),
|
|
251
251
|
)
|
|
252
252
|
|
|
253
|
-
if (defaultOption === undefined) {return}
|
|
253
|
+
if (defaultOption === undefined) { return }
|
|
254
254
|
|
|
255
255
|
selectedItems = [defaultOption]
|
|
256
256
|
}
|
|
@@ -411,7 +411,7 @@ onMounted(() => {
|
|
|
411
411
|
.v-popper--theme-dropdown .v-popper__inner {
|
|
412
412
|
border: none;
|
|
413
413
|
/* background: transparent; if anyone is changing this please talk to me first*/
|
|
414
|
-
border-radius: var(--
|
|
414
|
+
border-radius: var(--popper-border-radius);
|
|
415
415
|
color: var(--dropdown-color);
|
|
416
416
|
}
|
|
417
417
|
</style>
|
|
@@ -22,14 +22,14 @@ function close() {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
function next() {
|
|
25
|
-
if (
|
|
25
|
+
if (group.length > 1) {
|
|
26
26
|
currentIndex = (currentIndex + 1) % group.length
|
|
27
27
|
currentItem = group[currentIndex]
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
function prev() {
|
|
32
|
-
if (
|
|
32
|
+
if (group.length > 1) {
|
|
33
33
|
currentIndex = (currentIndex - 1 + group.length) % group.length
|
|
34
34
|
currentItem = group[currentIndex]
|
|
35
35
|
}
|
|
@@ -41,16 +41,16 @@ function selectItem(index: number) {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
watch(() => isOpen, (val) => {
|
|
44
|
-
if (val) {document.body.style.overflow = 'hidden'}
|
|
45
|
-
else {document.body.style.overflow = ''}
|
|
44
|
+
if (val) { document.body.style.overflow = 'hidden' }
|
|
45
|
+
else { document.body.style.overflow = '' }
|
|
46
46
|
})
|
|
47
47
|
|
|
48
48
|
function handleKeydown(event: KeyboardEvent) {
|
|
49
|
-
if ('Escape'
|
|
49
|
+
if (event.key === 'Escape') {
|
|
50
50
|
close()
|
|
51
|
-
} else if ('ArrowLeft'
|
|
51
|
+
} else if (event.key === 'ArrowLeft') {
|
|
52
52
|
prev()
|
|
53
|
-
} else if ('ArrowRight'
|
|
53
|
+
} else if (event.key === 'ArrowRight') {
|
|
54
54
|
next()
|
|
55
55
|
}
|
|
56
56
|
}
|
|
@@ -58,7 +58,7 @@ function handleKeydown(event: KeyboardEvent) {
|
|
|
58
58
|
const zoom = $ref(1)
|
|
59
59
|
|
|
60
60
|
function clickOutside() {
|
|
61
|
-
if (
|
|
61
|
+
if (zoom === 1) { close() }
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
defineExpose({ open, close })
|
|
@@ -69,25 +69,15 @@ defineExpose({ open, close })
|
|
|
69
69
|
<div
|
|
70
70
|
v-if="isOpen"
|
|
71
71
|
class="bgl-lightbox-overlay fixed w-100 h-100 flex justify-content-center z-9999 inset mx-auto"
|
|
72
|
-
@keydown.esc="close"
|
|
73
|
-
@keydown.left="prev"
|
|
74
|
-
@keydown.right="next"
|
|
75
|
-
@click="clickOutside"
|
|
72
|
+
@keydown.esc="close" @keydown.left="prev" @keydown.right="next" @click="clickOutside"
|
|
76
73
|
>
|
|
77
|
-
<div
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
/>
|
|
84
|
-
|
|
85
|
-
<Btn
|
|
86
|
-
class="oval opacity-8"
|
|
87
|
-
icon="arrow_forward"
|
|
88
|
-
color="black"
|
|
89
|
-
@click="next"
|
|
90
|
-
/>
|
|
74
|
+
<div
|
|
75
|
+
v-if="group && group.length > 1"
|
|
76
|
+
class="navigation flex space-between px-3 w-100 absolute m_px-1 m_none z-9"
|
|
77
|
+
>
|
|
78
|
+
<Btn class="oval opacity-8" icon="arrow_back" color="black" @click="prev" />
|
|
79
|
+
|
|
80
|
+
<Btn class="oval opacity-8" icon="arrow_forward" color="black" @click="next" />
|
|
91
81
|
</div>
|
|
92
82
|
<div class="bgl-lightbox relative txt-center" @click.stop>
|
|
93
83
|
<div class="flex start fixed top-1 w-100 space-between px-1 z-9">
|
|
@@ -98,44 +88,37 @@ defineExpose({ open, close })
|
|
|
98
88
|
<Btn flat class="color-white" icon="add" :disabled="zoom === 3" @click="zoom++" />
|
|
99
89
|
</div>
|
|
100
90
|
<Btn
|
|
101
|
-
v-if="currentItem?.openFile && currentItem?.src" class="color-white" round thin flat
|
|
102
|
-
value="Open File"
|
|
103
|
-
:href="currentItem?.src"
|
|
104
|
-
target="_blank"
|
|
91
|
+
v-if="currentItem?.openFile && currentItem?.src" class="color-white" round thin flat
|
|
92
|
+
iconEnd="arrow_outward" value="Open File" :href="currentItem?.src" target="_blank"
|
|
105
93
|
/>
|
|
106
94
|
<Btn
|
|
107
|
-
v-if="currentItem?.download && currentItem?.src" class="color-white" round thin flat
|
|
108
|
-
value="Download File"
|
|
109
|
-
@click="downloadFile(currentItem?.src)"
|
|
95
|
+
v-if="currentItem?.download && currentItem?.src" class="color-white" round thin flat
|
|
96
|
+
icon="download" value="Download File" @click="downloadFile(currentItem?.src)"
|
|
110
97
|
/>
|
|
111
98
|
<div v-if="!currentItem?.openFile && !currentItem?.download" />
|
|
112
99
|
</div>
|
|
113
100
|
|
|
114
|
-
<Carousel
|
|
101
|
+
<Carousel
|
|
102
|
+
v-model:index="currentIndex" :items="1" class="bgl-lightbox-item"
|
|
103
|
+
:class="{ zoomed: zoom > 1 }" :freeDrag="zoom === 1"
|
|
104
|
+
>
|
|
115
105
|
<template v-for="item in group" :key="item.src">
|
|
116
|
-
<Zoomer
|
|
106
|
+
<Zoomer
|
|
107
|
+
v-if="item.type === 'image'" v-model:zoom="zoom" :disabled="!item?.enableZoom"
|
|
108
|
+
:mouse-wheel-to-zoom="false"
|
|
109
|
+
>
|
|
117
110
|
<Image :draggable="false" :src="item?.src" alt="Preview" class="vw90 lightbox-image" />
|
|
118
111
|
</Zoomer>
|
|
119
112
|
|
|
120
113
|
<BglVideo
|
|
121
|
-
v-else-if="item?.type === 'video' && item?.src"
|
|
122
|
-
:src="item?.src"
|
|
123
|
-
autoplay
|
|
124
|
-
controls
|
|
114
|
+
v-else-if="item?.type === 'video' && item?.src" :src="item?.src" autoplay controls
|
|
125
115
|
class="vw90"
|
|
126
116
|
/>
|
|
127
117
|
|
|
128
|
-
<div
|
|
129
|
-
v-else-if="item?.type === 'pdf' && item?.src"
|
|
130
|
-
class="vw90"
|
|
131
|
-
>
|
|
118
|
+
<div v-else-if="item?.type === 'pdf' && item?.src" class="vw90">
|
|
132
119
|
<embed
|
|
133
|
-
:src="normalizeURL(item?.src)"
|
|
134
|
-
|
|
135
|
-
width="100%"
|
|
136
|
-
height="1080"
|
|
137
|
-
:title="item?.name"
|
|
138
|
-
class="vw90"
|
|
120
|
+
:src="normalizeURL(item?.src)" type="application/pdf" width="100%" height="1080"
|
|
121
|
+
:title="item?.name" class="vw90"
|
|
139
122
|
>
|
|
140
123
|
</div>
|
|
141
124
|
<div v-else class="vw90">
|
|
@@ -164,30 +147,19 @@ defineExpose({ open, close })
|
|
|
164
147
|
</template>
|
|
165
148
|
</Carousel>
|
|
166
149
|
<div
|
|
167
|
-
v-if="group && group.length > 1"
|
|
168
|
-
class="flex justify-content-center mt-2 overflow
|
|
150
|
+
v-if="group && group.length > 1" class="flex justify-content-center mt-2 overflow
|
|
169
151
|
p-1 fixed bottom start end gap-1 m_justify-content-start"
|
|
170
152
|
>
|
|
171
|
-
<template
|
|
172
|
-
v-for="(item, index) in group"
|
|
173
|
-
:key="index"
|
|
174
|
-
>
|
|
153
|
+
<template v-for="(item, index) in group" :key="index">
|
|
175
154
|
<Image
|
|
176
|
-
v-if="item.type === 'image'"
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
:src="item.src"
|
|
180
|
-
alt=""
|
|
181
|
-
:class="{ active: currentIndex === index }"
|
|
182
|
-
@click="selectItem(index)"
|
|
155
|
+
v-if="item.type === 'image'" class="thumbnail object-fit-cover hover
|
|
156
|
+
opacity-5 rounded flex bg-popup justify-content-center align-items-center flex-shrink-0" :src="item.src" alt=""
|
|
157
|
+
:class="{ active: currentIndex === index }" @click="selectItem(index)"
|
|
183
158
|
/>
|
|
184
159
|
<Icon
|
|
185
|
-
v-else
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
icon="description"
|
|
189
|
-
:class="{ active: currentIndex === index }"
|
|
190
|
-
@click="selectItem(index)"
|
|
160
|
+
v-else class="thumbnail object-fit-cover hover
|
|
161
|
+
opacity-5 ed flex bg-popup justify-content-center align-items-center flex-shrink-0" icon="description"
|
|
162
|
+
:class="{ active: currentIndex === index }" @click="selectItem(index)"
|
|
191
163
|
/>
|
|
192
164
|
</template>
|
|
193
165
|
</div>
|
|
@@ -200,15 +172,18 @@ defineExpose({ open, close })
|
|
|
200
172
|
.bgl-lightbox:has(.bgl_vid) {
|
|
201
173
|
width: 90vw;
|
|
202
174
|
}
|
|
175
|
+
|
|
203
176
|
.bgl-lightbox:has(.vid_short) {
|
|
204
177
|
width: auto;
|
|
205
178
|
aspect-ratio: 9/16;
|
|
206
179
|
height: 90vh;
|
|
207
180
|
}
|
|
181
|
+
|
|
208
182
|
.bgl-lightbox:has(.vid_short) .bgl-lightbox-item * {
|
|
209
|
-
|
|
183
|
+
max-height: unset !important;
|
|
210
184
|
}
|
|
211
|
-
|
|
185
|
+
|
|
186
|
+
.lightbox-image {
|
|
212
187
|
object-fit: contain;
|
|
213
188
|
width: fit-content;
|
|
214
189
|
}
|
|
@@ -221,18 +196,19 @@ defineExpose({ open, close })
|
|
|
221
196
|
max-height: 90%;
|
|
222
197
|
}
|
|
223
198
|
|
|
224
|
-
.bgl-lightbox-item{
|
|
199
|
+
.bgl-lightbox-item {
|
|
225
200
|
animation: 500ms ease bgl-lightbox-load;
|
|
226
201
|
}
|
|
202
|
+
|
|
227
203
|
@keyframes bgl-lightbox-load {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
204
|
+
from {
|
|
205
|
+
scale: 0.7;
|
|
206
|
+
}
|
|
231
207
|
|
|
232
|
-
|
|
233
|
-
|
|
208
|
+
to {
|
|
209
|
+
scale: 1;
|
|
234
210
|
|
|
235
|
-
|
|
211
|
+
}
|
|
236
212
|
}
|
|
237
213
|
|
|
238
214
|
.bgl-lightbox-item * {
|
|
@@ -248,6 +224,14 @@ defineExpose({ open, close })
|
|
|
248
224
|
height: calc(100vh - 90px);
|
|
249
225
|
}
|
|
250
226
|
|
|
227
|
+
.bgl-lightbox-item.zoomed {
|
|
228
|
+
pointer-events: none;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.bgl-lightbox-item.zoomed .vue-zoomer {
|
|
232
|
+
pointer-events: auto;
|
|
233
|
+
}
|
|
234
|
+
|
|
251
235
|
.navigation {
|
|
252
236
|
top: 50%;
|
|
253
237
|
transform: translateY(-50%);
|
|
@@ -257,9 +241,11 @@ defineExpose({ open, close })
|
|
|
257
241
|
height: 50px;
|
|
258
242
|
width: 50px;
|
|
259
243
|
}
|
|
244
|
+
|
|
260
245
|
.thumbnail:hover {
|
|
261
246
|
opacity: 1;
|
|
262
247
|
}
|
|
248
|
+
|
|
263
249
|
.thumbnail:active {
|
|
264
250
|
opacity: 0.8;
|
|
265
251
|
}
|
|
@@ -268,18 +254,21 @@ defineExpose({ open, close })
|
|
|
268
254
|
opacity: 1;
|
|
269
255
|
outline: 2px solid white;
|
|
270
256
|
}
|
|
271
|
-
|
|
257
|
+
|
|
258
|
+
.file-info {
|
|
272
259
|
max-width: 420px
|
|
273
260
|
}
|
|
261
|
+
|
|
274
262
|
@media screen and (max-width: 910px) {
|
|
275
|
-
.file-info{
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
263
|
+
.file-info {
|
|
264
|
+
max-width: 220px;
|
|
265
|
+
text-align: center !important;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.file-info * {
|
|
269
|
+
text-align: center !important;
|
|
270
|
+
margin-inline: 0 !important;
|
|
271
|
+
max-width: 100% !important;
|
|
272
|
+
}
|
|
284
273
|
}
|
|
285
274
|
</style>
|
package/src/styles/text.css
CHANGED
|
@@ -1391,6 +1391,22 @@
|
|
|
1391
1391
|
white-space: nowrap;
|
|
1392
1392
|
}
|
|
1393
1393
|
|
|
1394
|
+
.white-space-break-spaces {
|
|
1395
|
+
white-space: break-spaces;
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
.white-space-pre {
|
|
1399
|
+
white-space: pre;
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
.white-space-pre-line {
|
|
1403
|
+
white-space: pre-line;
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
.white-space-pre-wrap {
|
|
1407
|
+
white-space: pre-wrap;
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1394
1410
|
.notranslate {
|
|
1395
1411
|
translate: none !important;
|
|
1396
1412
|
-webkit-translate: none !important;
|
|
@@ -2791,4 +2807,24 @@
|
|
|
2791
2807
|
.m_capitalize {
|
|
2792
2808
|
text-transform: capitalize;
|
|
2793
2809
|
}
|
|
2810
|
+
|
|
2811
|
+
.m_white-space {
|
|
2812
|
+
white-space: nowrap;
|
|
2813
|
+
}
|
|
2814
|
+
|
|
2815
|
+
.m_white-space-break-spaces {
|
|
2816
|
+
white-space: break-spaces;
|
|
2817
|
+
}
|
|
2818
|
+
|
|
2819
|
+
.m_white-space-pre {
|
|
2820
|
+
white-space: pre;
|
|
2821
|
+
}
|
|
2822
|
+
|
|
2823
|
+
.m_white-space-pre-line {
|
|
2824
|
+
white-space: pre-line;
|
|
2825
|
+
}
|
|
2826
|
+
|
|
2827
|
+
.m_white-space-pre-wrap {
|
|
2828
|
+
white-space: pre-wrap;
|
|
2829
|
+
}
|
|
2794
2830
|
}
|
package/src/styles/theme.css
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
--bgl-box-bg: var(--bgl-white);
|
|
25
25
|
--bgl-popup-bg: var(--bgl-white);
|
|
26
26
|
--bgl-popup-text: var(--bgl-black);
|
|
27
|
+
--popper-border-radius: var(--card-border-radius);
|
|
27
28
|
--bgl-text-color: var(--bgl-black);
|
|
28
29
|
--bgl-light-text: var(--bgl-white);
|
|
29
30
|
--bgl-richtext-color: var(--bgl-white);
|