@bagelink/vue 0.0.726 → 0.0.728
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/BglVideo.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText2/Toolbar.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText2/index.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText2/richtext-types.d.ts +1 -1
- package/dist/components/form/inputs/RichText2/richtext-types.d.ts.map +1 -1
- package/dist/components/lightbox/Lightbox.vue.d.ts.map +1 -1
- package/dist/components/lightbox/index.d.ts.map +1 -1
- package/dist/index.cjs +217 -220
- package/dist/index.mjs +218 -221
- package/dist/style.css +72 -59
- package/package.json +1 -1
- package/src/components/BglVideo.vue +6 -3
- package/src/components/form/inputs/RichText2/Toolbar.vue +30 -28
- package/src/components/form/inputs/RichText2/index.vue +38 -2
- package/src/components/form/inputs/RichText2/richtext-types.ts +3 -0
- package/src/components/lightbox/Lightbox.vue +96 -115
- package/src/components/lightbox/index.ts +18 -25
- package/src/styles/modal.css +18 -0
- package/src/components/form/inputs/RichText2/FontWithASyntaxHighlighter-Regular.woff2 +0 -0
package/dist/style.css
CHANGED
|
@@ -1,78 +1,47 @@
|
|
|
1
1
|
@import url("https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200");@import url("https://fonts.googleapis.com/css2?family=Lexend:wght@100;200;300;400;500;600;700;800;900&display=swap");
|
|
2
|
-
.lightbox-overlay[data-v-
|
|
3
|
-
position: fixed;
|
|
4
|
-
top: 0;
|
|
5
|
-
left: 0;
|
|
6
|
-
width: 100%;
|
|
7
|
-
height: 100%;
|
|
2
|
+
.bgl-lightbox-overlay[data-v-b3a3d091] {
|
|
8
3
|
background: rgba(0, 0, 0, 0.8);
|
|
9
|
-
display: flex;
|
|
10
|
-
justify-content: center;
|
|
11
|
-
align-items: center;
|
|
12
|
-
z-index: 1000;
|
|
13
4
|
}
|
|
14
|
-
.lightbox[data-v-
|
|
15
|
-
position: relative;
|
|
5
|
+
.bgl-lightbox[data-v-b3a3d091] {
|
|
16
6
|
max-height: 90%;
|
|
17
|
-
width: 90vw;
|
|
18
|
-
text-align: center;
|
|
19
7
|
}
|
|
20
|
-
.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
8
|
+
.bgl-lightbox-item[data-v-b3a3d091]{
|
|
9
|
+
animation: 500ms ease bgl-lightbox-load-b3a3d091;
|
|
10
|
+
}
|
|
11
|
+
@keyframes bgl-lightbox-load-b3a3d091 {
|
|
12
|
+
from {
|
|
13
|
+
scale:0.7;
|
|
24
14
|
}
|
|
25
|
-
|
|
15
|
+
to {
|
|
16
|
+
scale:1;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
.bgl-lightbox-item[data-v-b3a3d091] * {
|
|
26
20
|
max-width: 90%;
|
|
27
21
|
max-height: calc(80vh - 90px);
|
|
28
22
|
border-radius: 3px;
|
|
23
|
+
margin: auto;
|
|
24
|
+
animation: 200ms ease bgl-lightbox-load-b3a3d091;
|
|
29
25
|
}
|
|
30
|
-
.navigation[data-v-
|
|
31
|
-
display: flex;
|
|
32
|
-
justify-content: space-between;
|
|
33
|
-
width: 100%;
|
|
34
|
-
position: absolute;
|
|
26
|
+
.navigation[data-v-b3a3d091] {
|
|
35
27
|
top: 50%;
|
|
36
28
|
transform: translateY(-50%);
|
|
37
29
|
}
|
|
38
|
-
.navigation-btn[data-v-
|
|
39
|
-
user-select: none;
|
|
30
|
+
.navigation-btn[data-v-b3a3d091] {
|
|
40
31
|
width: var(--input-height);
|
|
41
32
|
height: var(--input-height);
|
|
42
|
-
border-radius: 100%;
|
|
43
33
|
}
|
|
44
|
-
.
|
|
45
|
-
display: flex;
|
|
46
|
-
justify-content: center;
|
|
47
|
-
margin-top: 10px;
|
|
48
|
-
overflow: auto;
|
|
49
|
-
padding: 1rem;
|
|
50
|
-
position: fixed;
|
|
51
|
-
bottom: 0;
|
|
52
|
-
left: 0;
|
|
53
|
-
right: 0;
|
|
54
|
-
}
|
|
55
|
-
.thumbnail[data-v-c003c59a] {
|
|
34
|
+
.thumbnail[data-v-b3a3d091] {
|
|
56
35
|
height: 50px;
|
|
57
36
|
width: 50px;
|
|
58
|
-
object-fit: cover;
|
|
59
|
-
margin: 0 5px;
|
|
60
|
-
cursor: pointer;
|
|
61
|
-
opacity: 0.5;
|
|
62
|
-
border-radius: 3px;
|
|
63
|
-
transition: all 200ms ease;
|
|
64
|
-
background-color: white;
|
|
65
|
-
display: flex;
|
|
66
|
-
justify-content: center;
|
|
67
|
-
align-items: center;
|
|
68
37
|
}
|
|
69
|
-
.thumbnail[data-v-
|
|
38
|
+
.thumbnail[data-v-b3a3d091]:hover {
|
|
70
39
|
opacity: 1;
|
|
71
40
|
}
|
|
72
|
-
.thumbnail[data-v-
|
|
41
|
+
.thumbnail[data-v-b3a3d091]:active {
|
|
73
42
|
opacity: 0.8;
|
|
74
43
|
}
|
|
75
|
-
.thumbnail.active[data-v-
|
|
44
|
+
.thumbnail.active[data-v-b3a3d091] {
|
|
76
45
|
opacity: 1;
|
|
77
46
|
outline: 2px solid white;
|
|
78
47
|
}
|
|
@@ -500,6 +469,24 @@ a[data-v-895cf824] {
|
|
|
500
469
|
height: fit-content;
|
|
501
470
|
}
|
|
502
471
|
|
|
472
|
+
.is-active .modal {
|
|
473
|
+
animation: 200ms ease bgl-modal-animation;
|
|
474
|
+
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
@keyframes bgl-modal-animation {
|
|
478
|
+
from {
|
|
479
|
+
scale: 0.7;
|
|
480
|
+
transform: translateY(2rem);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
to {
|
|
484
|
+
scale: 1;
|
|
485
|
+
transform: translateY(0);
|
|
486
|
+
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
503
490
|
.small-modal .modal {
|
|
504
491
|
max-width: 300px;
|
|
505
492
|
text-align: center;
|
|
@@ -1144,14 +1131,15 @@ display: block;
|
|
|
1144
1131
|
color: var(--bgl-red);
|
|
1145
1132
|
}
|
|
1146
1133
|
|
|
1147
|
-
.bgl_vid iframe[data-v-
|
|
1148
|
-
.bgl_vid video[data-v-
|
|
1134
|
+
.bgl_vid iframe[data-v-8495afe2],
|
|
1135
|
+
.bgl_vid video[data-v-8495afe2] {
|
|
1149
1136
|
width: 100%;
|
|
1150
1137
|
height: auto;
|
|
1151
1138
|
display: block;
|
|
1139
|
+
margin: auto;
|
|
1152
1140
|
border-radius: var(--input-border-radius);
|
|
1153
1141
|
}
|
|
1154
|
-
.bgl_vid.vid_empty[data-v-
|
|
1142
|
+
.bgl_vid.vid_empty[data-v-8495afe2] {
|
|
1155
1143
|
padding-top: 56.25%;
|
|
1156
1144
|
background: var(--input-bg);
|
|
1157
1145
|
border-radius: var(--input-border-radius);
|
|
@@ -2301,23 +2289,48 @@ p {
|
|
|
2301
2289
|
8 #818181 /* few chars */
|
|
2302
2290
|
;
|
|
2303
2291
|
}
|
|
2304
|
-
.preview-area[data-v-
|
|
2292
|
+
.preview-area[data-v-c9729efd]{
|
|
2305
2293
|
font-family: "FontWithASyntaxHighlighter", monospace;
|
|
2306
2294
|
font-palette: --myCustomPalette;
|
|
2307
2295
|
}
|
|
2308
|
-
.rich-text-editor[data-v-
|
|
2296
|
+
.rich-text-editor[data-v-c9729efd] {
|
|
2309
2297
|
background: var(--input-bg);
|
|
2310
2298
|
margin-bottom: 0.5rem;
|
|
2311
2299
|
width: 100%;
|
|
2312
2300
|
}
|
|
2313
|
-
.editableContent[data-v-
|
|
2301
|
+
.editableContent[data-v-c9729efd]{
|
|
2314
2302
|
min-height: 100%;
|
|
2315
2303
|
white-space: pre-wrap;
|
|
2316
2304
|
outline: none;
|
|
2317
2305
|
}
|
|
2318
|
-
.content-area[data-v-
|
|
2306
|
+
.content-area[data-v-c9729efd], .preview-area[data-v-c9729efd]{
|
|
2319
2307
|
min-height: 200px;
|
|
2320
2308
|
}
|
|
2309
|
+
.fullscreen-mode[data-v-c9729efd] {
|
|
2310
|
+
position: fixed;
|
|
2311
|
+
top: 0;
|
|
2312
|
+
left: 0;
|
|
2313
|
+
width: 100%;
|
|
2314
|
+
height: 100%;
|
|
2315
|
+
z-index: 9999;
|
|
2316
|
+
background: var(--input-bg);
|
|
2317
|
+
padding: 2rem;
|
|
2318
|
+
overflow: auto;
|
|
2319
|
+
border-radius: 0;
|
|
2320
|
+
}
|
|
2321
|
+
.fullscreen-mode .content-area[data-v-c9729efd]{
|
|
2322
|
+
height: calc(100vh - 5rem);
|
|
2323
|
+
padding: 4rem !important;
|
|
2324
|
+
max-width: 900px;
|
|
2325
|
+
margin-inline: auto ;
|
|
2326
|
+
overflow-y: auto;
|
|
2327
|
+
}
|
|
2328
|
+
.fullscreen-mode .toolbar[data-v-c9729efd]{
|
|
2329
|
+
max-width: 900px;
|
|
2330
|
+
margin-inline: auto ;
|
|
2331
|
+
/* border-bottom: 1px solid var(--border-color); */
|
|
2332
|
+
/* margin-bottom: 2rem; */
|
|
2333
|
+
}
|
|
2321
2334
|
|
|
2322
2335
|
/* [contenteditable='true'] {
|
|
2323
2336
|
white-space: pre-wrap;
|
package/package.json
CHANGED
|
@@ -26,7 +26,10 @@ const videoUrl = $computed(() => {
|
|
|
26
26
|
if (embedType) {
|
|
27
27
|
if (embedType === 'YouTube') {
|
|
28
28
|
const videoId = props.src?.split(/v=|youtu\.be\//)[1]?.split('&')?.[0]
|
|
29
|
-
|
|
29
|
+
const queryParams = new URLSearchParams({
|
|
30
|
+
autoplay: props.autoplay ? '1' : '0'
|
|
31
|
+
})
|
|
32
|
+
return `https://www.youtube.com/embed/${videoId}?${queryParams}`
|
|
30
33
|
}
|
|
31
34
|
if (embedType === 'Vimeo') {
|
|
32
35
|
const vimeoRegex
|
|
@@ -38,8 +41,6 @@ const videoUrl = $computed(() => {
|
|
|
38
41
|
}
|
|
39
42
|
return props.src
|
|
40
43
|
})
|
|
41
|
-
|
|
42
|
-
console.log('Video URL:', videoUrl)
|
|
43
44
|
</script>
|
|
44
45
|
|
|
45
46
|
<template>
|
|
@@ -51,6 +52,7 @@ console.log('Video URL:', videoUrl)
|
|
|
51
52
|
frameborder="0"
|
|
52
53
|
allowfullscreen
|
|
53
54
|
title="Video"
|
|
55
|
+
allow="autoplay"
|
|
54
56
|
/>
|
|
55
57
|
<video
|
|
56
58
|
v-else-if="src"
|
|
@@ -71,6 +73,7 @@ console.log('Video URL:', videoUrl)
|
|
|
71
73
|
width: 100%;
|
|
72
74
|
height: auto;
|
|
73
75
|
display: block;
|
|
76
|
+
margin: auto;
|
|
74
77
|
border-radius: var(--input-border-radius);
|
|
75
78
|
}
|
|
76
79
|
|
|
@@ -6,45 +6,46 @@ import type { ToolbarConfig, ToolbarConfigOption } from './richtext-types'
|
|
|
6
6
|
defineProps<{ config: ToolbarConfig }>()
|
|
7
7
|
const emit = defineEmits(['action'])
|
|
8
8
|
|
|
9
|
-
const colorPicker = $ref<HTMLInputElement | null>(null)
|
|
10
|
-
const fontSizeInput = $ref<HTMLInputElement | null>(null)
|
|
9
|
+
// const colorPicker = $ref<HTMLInputElement | null>(null)
|
|
10
|
+
// const fontSizeInput = $ref<HTMLInputElement | null>(null)
|
|
11
11
|
|
|
12
12
|
interface toolbarOption {
|
|
13
13
|
name: ToolbarConfigOption | 'separator'
|
|
14
|
-
|
|
14
|
+
label?: string
|
|
15
|
+
icon?: MaterialIcons
|
|
16
|
+
class?: string
|
|
15
17
|
}
|
|
16
|
-
|
|
17
18
|
const toolbarOptions: toolbarOption[] = [
|
|
18
19
|
{ name: 'separator' },
|
|
19
|
-
{ name: 'bold', icon: 'format_bold' },
|
|
20
|
-
{ name: 'italic', icon: 'format_italic' },
|
|
21
|
-
{ name: 'underline', icon: 'format_underlined' },
|
|
20
|
+
{ name: 'bold', label: 'Bold', icon: 'format_bold' },
|
|
21
|
+
{ name: 'italic', label: 'Italic', icon: 'format_italic' },
|
|
22
|
+
{ name: 'underline', label: 'Underline', icon: 'format_underlined' },
|
|
22
23
|
{ name: 'separator' },
|
|
23
|
-
{ name: 'orderedList', icon: 'format_list_numbered' },
|
|
24
|
-
{ name: 'unorderedList', icon: 'format_list_bulleted' },
|
|
24
|
+
{ name: 'orderedList', label: 'Ordered List', icon: 'format_list_numbered' },
|
|
25
|
+
{ name: 'unorderedList', label: 'Unordered List', icon: 'format_list_bulleted' },
|
|
25
26
|
{ name: 'separator' },
|
|
26
|
-
{ name: 'link', icon: 'add_link' },
|
|
27
|
-
{ name: 'image', icon: 'add_photo_alternate' },
|
|
28
|
-
{ name: 'youtube', icon: 'youtube_activity' },
|
|
27
|
+
{ name: 'link', label: 'Link', icon: 'add_link' },
|
|
28
|
+
{ name: 'image', label: 'Image', icon: 'add_photo_alternate' },
|
|
29
|
+
{ name: 'youtube', label: 'YouTube', icon: 'youtube_activity' },
|
|
29
30
|
{ name: 'separator' },
|
|
30
|
-
{ name: 'splitView', icon: 'code' },
|
|
31
|
-
{ name: 'clear', icon: 'format_clear' },
|
|
32
|
-
|
|
31
|
+
{ name: 'splitView', label: 'Split View', icon: 'code' },
|
|
32
|
+
{ name: 'clear', label: 'Clear Formatting', icon: 'format_clear' },
|
|
33
|
+
{ name: 'fullScreen', label: 'Full Screen', icon: 'fullscreen', class: 'ms-auto' },
|
|
33
34
|
]
|
|
34
35
|
|
|
35
|
-
function handleColorPick(type: 'textColor' | 'backgroundColor') {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
36
|
+
// function handleColorPick(type: 'textColor' | 'backgroundColor') {
|
|
37
|
+
// const color = colorPicker?.value
|
|
38
|
+
// if (color) {
|
|
39
|
+
// emit('action', type, color)
|
|
40
|
+
// }
|
|
41
|
+
// }
|
|
41
42
|
|
|
42
|
-
function handleFontSizeChange() {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
43
|
+
// function handleFontSizeChange() {
|
|
44
|
+
// const size = fontSizeInput?.value
|
|
45
|
+
// if (size) {
|
|
46
|
+
// emit('action', 'fontSize', size)
|
|
47
|
+
// }
|
|
48
|
+
// }
|
|
48
49
|
function handleSelectChange(selectedOption: string) {
|
|
49
50
|
emit('action', 'formatBlock', selectedOption)
|
|
50
51
|
}
|
|
@@ -62,9 +63,10 @@ function handleSelectChange(selectedOption: string) {
|
|
|
62
63
|
<Btn
|
|
63
64
|
v-if="action.name !== 'separator' && config.includes(action.name)"
|
|
64
65
|
:key="action.name"
|
|
65
|
-
v-tooltip="action.
|
|
66
|
+
v-tooltip="action.label"
|
|
66
67
|
thin
|
|
67
68
|
flat
|
|
69
|
+
:class="action.class"
|
|
68
70
|
class="rounded"
|
|
69
71
|
:aria-label="action.name"
|
|
70
72
|
:icon="action.icon"
|
|
@@ -33,6 +33,7 @@ const defaultConfig: ToolbarConfig = [
|
|
|
33
33
|
'youtube',
|
|
34
34
|
'codeView',
|
|
35
35
|
'clear',
|
|
36
|
+
'fullScreen'
|
|
36
37
|
]
|
|
37
38
|
const config = $ref<ToolbarConfig>(props.toolbarConfig || defaultConfig)
|
|
38
39
|
let contentHtml = $ref(props.modelValue)
|
|
@@ -69,6 +70,9 @@ function handleToolbarAction(action: string, value?: string) {
|
|
|
69
70
|
case 'codeView':
|
|
70
71
|
isCodeView = !isCodeView
|
|
71
72
|
break
|
|
73
|
+
case 'fullScreen':
|
|
74
|
+
toggleFullScreen()
|
|
75
|
+
break
|
|
72
76
|
default:
|
|
73
77
|
applyFormatting(action, value)
|
|
74
78
|
break
|
|
@@ -76,6 +80,13 @@ function handleToolbarAction(action: string, value?: string) {
|
|
|
76
80
|
updateContent()
|
|
77
81
|
}
|
|
78
82
|
|
|
83
|
+
function toggleFullScreen() {
|
|
84
|
+
const editor = document.querySelector('.rich-text-editor')
|
|
85
|
+
if (editor) {
|
|
86
|
+
editor.classList.toggle('fullscreen-mode')
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
79
90
|
watch(() => props.modelValue, (newValue) => {
|
|
80
91
|
if (newValue !== contentHtml) {
|
|
81
92
|
contentHtml = newValue
|
|
@@ -125,8 +136,8 @@ function handleKeyDown(event: KeyboardEvent) {
|
|
|
125
136
|
<template>
|
|
126
137
|
<div class="rich-text-editor round pt-05 px-1 pb-1">
|
|
127
138
|
<Toolbar :config @action="handleToolbarAction" />
|
|
128
|
-
<div class="editor-container flex flex-stretch
|
|
129
|
-
<div class="content-area rounded p-1 bg-white shadow-light w-100 grid"
|
|
139
|
+
<div class="editor-container flex flex-stretch gap-1 m_column">
|
|
140
|
+
<div class="content-area rounded p-1 bg-white shadow-light w-100 grid">
|
|
130
141
|
<textarea v-if="isCodeView" v-model="contentHtml" @input="updateContent" />
|
|
131
142
|
<div
|
|
132
143
|
v-else
|
|
@@ -186,6 +197,31 @@ function handleKeyDown(event: KeyboardEvent) {
|
|
|
186
197
|
.content-area, .preview-area{
|
|
187
198
|
min-height: 200px;
|
|
188
199
|
}
|
|
200
|
+
.fullscreen-mode {
|
|
201
|
+
position: fixed;
|
|
202
|
+
top: 0;
|
|
203
|
+
left: 0;
|
|
204
|
+
width: 100%;
|
|
205
|
+
height: 100%;
|
|
206
|
+
z-index: 9999;
|
|
207
|
+
background: var(--input-bg);
|
|
208
|
+
padding: 2rem;
|
|
209
|
+
overflow: auto;
|
|
210
|
+
border-radius: 0;
|
|
211
|
+
}
|
|
212
|
+
.fullscreen-mode .content-area{
|
|
213
|
+
height: calc(100vh - 5rem);
|
|
214
|
+
padding: 4rem !important;
|
|
215
|
+
max-width: 900px;
|
|
216
|
+
margin-inline: auto ;
|
|
217
|
+
overflow-y: auto;
|
|
218
|
+
}
|
|
219
|
+
.fullscreen-mode .toolbar{
|
|
220
|
+
max-width: 900px;
|
|
221
|
+
margin-inline: auto ;
|
|
222
|
+
/* border-bottom: 1px solid var(--border-color); */
|
|
223
|
+
/* margin-bottom: 2rem; */
|
|
224
|
+
}
|
|
189
225
|
|
|
190
226
|
/* [contenteditable='true'] {
|
|
191
227
|
white-space: pre-wrap;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { Btn, Icon } from '@bagelink/vue'
|
|
2
|
+
import { BglVideo, Btn, Icon } from '@bagelink/vue'
|
|
3
3
|
import { watch } from 'vue'
|
|
4
4
|
import type { LightboxItem } from './lightbox.types'
|
|
5
5
|
|
|
@@ -66,153 +66,134 @@ defineExpose({ open, close })
|
|
|
66
66
|
</script>
|
|
67
67
|
|
|
68
68
|
<template>
|
|
69
|
-
<
|
|
70
|
-
|
|
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
|
-
|
|
69
|
+
<transition name="fade">
|
|
70
|
+
<div
|
|
71
|
+
v-if="isOpen"
|
|
72
|
+
class="bgl-lightbox-overlay fixed w-100 h-100 flex justify-content-center z-999 inset mx-auto"
|
|
73
|
+
@keydown.esc="close"
|
|
74
|
+
@keydown.left="prev"
|
|
75
|
+
@keydown.right="next"
|
|
76
|
+
@click="close"
|
|
77
|
+
>
|
|
78
|
+
<div class="bgl-lightbox relative vw90 txt-center" @click.stop>
|
|
79
|
+
<Btn flat class="fixed top-1 end-1 color-white" icon="close" @click="close" />
|
|
80
|
+
<div class="bgl-lightbox-item">
|
|
81
|
+
<template v-if="currentItem?.type === 'image'">
|
|
82
|
+
<img :src="currentItem?.src" alt="Preview">
|
|
83
|
+
</template>
|
|
84
|
+
<template v-else-if="currentItem?.type === 'video'">
|
|
85
|
+
<BglVideo
|
|
86
|
+
:src="currentItem?.src"
|
|
87
|
+
autoplay
|
|
88
|
+
controls
|
|
89
|
+
/>
|
|
90
|
+
</template>
|
|
91
|
+
<template v-else-if="currentItem?.type === 'pdf'">
|
|
92
|
+
<embed
|
|
93
|
+
:src="normalizeURL(currentItem?.src)"
|
|
94
|
+
type="application/pdf"
|
|
95
|
+
width="100%"
|
|
96
|
+
height="1080"
|
|
97
|
+
:title="currentItem?.name"
|
|
98
|
+
>
|
|
99
|
+
</template>
|
|
100
|
+
<template v-else>
|
|
101
|
+
<div class="file-info txt-white">
|
|
102
|
+
<p>File: {{ currentItem?.name }}</p>
|
|
103
|
+
<p>Type: {{ currentItem?.type }}</p>
|
|
104
|
+
<a :href="currentItem?.src" target="_blank">Open file</a>
|
|
105
|
+
</div>
|
|
106
|
+
</template>
|
|
107
|
+
</div>
|
|
108
|
+
<div v-if="group.length" class="navigation flex space-between w-100 absolute">
|
|
109
|
+
<Btn
|
|
110
|
+
class="navigation-btn oval user-select-none"
|
|
111
|
+
icon="arrow_back"
|
|
112
|
+
@click="prev"
|
|
113
|
+
/>
|
|
114
|
+
<Btn
|
|
115
|
+
class="navigation-btn oval user-select-none"
|
|
116
|
+
icon="arrow_forward"
|
|
117
|
+
@click="next"
|
|
118
|
+
/>
|
|
119
|
+
</div>
|
|
120
|
+
<div
|
|
121
|
+
v-if="group && group.length > 1"
|
|
122
|
+
class="flex justify-content-center mt-2 overflow
|
|
123
|
+
p-1 fixed bottom start end gap-1 m_justify-content-start"
|
|
122
124
|
>
|
|
123
|
-
<
|
|
124
|
-
v-
|
|
125
|
-
|
|
126
|
-
:src="item.src"
|
|
127
|
-
alt=""
|
|
128
|
-
@click="selectItem(index)"
|
|
125
|
+
<template
|
|
126
|
+
v-for="(item, index) in group"
|
|
127
|
+
:key="index"
|
|
129
128
|
>
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
129
|
+
<img
|
|
130
|
+
v-if="item.type === 'image'"
|
|
131
|
+
class="thumbnail object-fit-cover hover
|
|
132
|
+
opacity-5 round flex bg-white justify-content-center align-items-center flex-shrink-0"
|
|
133
|
+
:src="item.src"
|
|
134
|
+
alt=""
|
|
135
|
+
:class="{ active: currentIndex === index }"
|
|
136
|
+
@click="selectItem(index)"
|
|
137
|
+
>
|
|
138
|
+
<Icon
|
|
139
|
+
v-else
|
|
140
|
+
class="thumbnail object-fit-cover hover
|
|
141
|
+
opacity-5 round flex bg-white justify-content-center align-items-center flex-shrink-0"
|
|
142
|
+
icon="description"
|
|
143
|
+
:class="{ active: currentIndex === index }"
|
|
144
|
+
@click="selectItem(index)"
|
|
145
|
+
/>
|
|
146
|
+
</template>
|
|
147
|
+
</div>
|
|
137
148
|
</div>
|
|
138
149
|
</div>
|
|
139
|
-
</
|
|
150
|
+
</transition>
|
|
140
151
|
</template>
|
|
141
152
|
|
|
142
153
|
<style scoped>
|
|
143
|
-
.lightbox-overlay {
|
|
144
|
-
position: fixed;
|
|
145
|
-
top: 0;
|
|
146
|
-
left: 0;
|
|
147
|
-
width: 100%;
|
|
148
|
-
height: 100%;
|
|
154
|
+
.bgl-lightbox-overlay {
|
|
149
155
|
background: rgba(0, 0, 0, 0.8);
|
|
150
|
-
display: flex;
|
|
151
|
-
justify-content: center;
|
|
152
|
-
align-items: center;
|
|
153
|
-
z-index: 1000;
|
|
154
156
|
}
|
|
155
157
|
|
|
156
|
-
.lightbox {
|
|
157
|
-
position: relative;
|
|
158
|
+
.bgl-lightbox {
|
|
158
159
|
max-height: 90%;
|
|
159
|
-
width: 90vw;
|
|
160
|
-
text-align: center;
|
|
161
160
|
}
|
|
162
161
|
|
|
163
|
-
.
|
|
164
|
-
|
|
165
|
-
top: 1rem;
|
|
166
|
-
inset-inline-end: 1rem;
|
|
162
|
+
.bgl-lightbox-item{
|
|
163
|
+
animation: 500ms ease bgl-lightbox-load;
|
|
167
164
|
}
|
|
165
|
+
@keyframes bgl-lightbox-load {
|
|
166
|
+
from {
|
|
167
|
+
scale:0.7;
|
|
168
|
+
}
|
|
168
169
|
|
|
169
|
-
|
|
170
|
+
to {
|
|
171
|
+
scale:1;
|
|
172
|
+
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.bgl-lightbox-item * {
|
|
170
177
|
max-width: 90%;
|
|
171
178
|
max-height: calc(80vh - 90px);
|
|
172
179
|
border-radius: 3px;
|
|
180
|
+
margin: auto;
|
|
181
|
+
animation: 200ms ease bgl-lightbox-load;
|
|
173
182
|
}
|
|
174
183
|
|
|
175
184
|
.navigation {
|
|
176
|
-
display: flex;
|
|
177
|
-
justify-content: space-between;
|
|
178
|
-
width: 100%;
|
|
179
|
-
position: absolute;
|
|
180
185
|
top: 50%;
|
|
181
186
|
transform: translateY(-50%);
|
|
182
187
|
}
|
|
183
188
|
|
|
184
189
|
.navigation-btn {
|
|
185
|
-
user-select: none;
|
|
186
190
|
width: var(--input-height);
|
|
187
191
|
height: var(--input-height);
|
|
188
|
-
border-radius: 100%;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
.thumbnails {
|
|
192
|
-
display: flex;
|
|
193
|
-
justify-content: center;
|
|
194
|
-
margin-top: 10px;
|
|
195
|
-
overflow: auto;
|
|
196
|
-
padding: 1rem;
|
|
197
|
-
position: fixed;
|
|
198
|
-
bottom: 0;
|
|
199
|
-
left: 0;
|
|
200
|
-
right: 0;
|
|
201
192
|
}
|
|
202
193
|
|
|
203
194
|
.thumbnail {
|
|
204
195
|
height: 50px;
|
|
205
196
|
width: 50px;
|
|
206
|
-
object-fit: cover;
|
|
207
|
-
margin: 0 5px;
|
|
208
|
-
cursor: pointer;
|
|
209
|
-
opacity: 0.5;
|
|
210
|
-
border-radius: 3px;
|
|
211
|
-
transition: all 200ms ease;
|
|
212
|
-
background-color: white;
|
|
213
|
-
display: flex;
|
|
214
|
-
justify-content: center;
|
|
215
|
-
align-items: center;
|
|
216
197
|
}
|
|
217
198
|
.thumbnail:hover {
|
|
218
199
|
opacity: 1;
|