Skip to content

Commit 3899b5f

Browse files
chore: update deps (#3412)
Co-authored-by: Miloš Paunović <[email protected]>
1 parent 274697a commit 3899b5f

File tree

4 files changed

+2591
-2174
lines changed

4 files changed

+2591
-2174
lines changed

components/common/Modal.vue

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<script lang="ts" setup>
2+
const show = defineModel<boolean>("show")
3+
const modalRef = useTemplateRef<HTMLDialogElement>("modalRef")
4+
5+
function popModal() {
6+
if (!modalRef.value) return;
7+
modalRef.value.showModal();
8+
}
9+
10+
function closeModal() {
11+
if (!modalRef.value) return;
12+
modalRef.value.close();
13+
}
14+
15+
watch(
16+
show,
17+
(newVal) => {
18+
if (newVal) {
19+
popModal();
20+
} else {
21+
closeModal();
22+
}
23+
},
24+
{ immediate: true }
25+
);
26+
27+
</script>
28+
29+
<template>
30+
<teleport to="body">
31+
<dialog ref="modalRef" v-bind="$attrs">
32+
<slot/>
33+
</dialog>
34+
</teleport>
35+
</template>
36+
37+
<style scoped>
38+
dialog {
39+
border: none;
40+
border-radius: 8px;
41+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
42+
padding: 0;
43+
overflow: auto;
44+
animation: fadeOut 1s forwards;
45+
display: inline-block;
46+
width: 90%;
47+
48+
@media screen and (min-width: 820px) {
49+
width: 800px;
50+
}
51+
52+
&::backdrop {
53+
background-color: #26282d;
54+
backdrop-filter: blur(2px);
55+
opacity: .5;
56+
}
57+
&::backdrop {
58+
animation: fadeOutHalf 1s forwards;
59+
}
60+
61+
&[open] {
62+
animation: fadeIn 1s forwards;
63+
&::backdrop {
64+
animation: fadeInHalf 1s forwards;
65+
}
66+
}
67+
}
68+
69+
/* Keyframes for dialog and popover elements */
70+
@keyframes fadeIn {
71+
from { opacity: 0 }
72+
to { opacity: 1 }
73+
}
74+
@keyframes fadeOut {
75+
from { opacity: 1 }
76+
to { opacity: 0 }
77+
}
78+
@keyframes fadeInHalf {
79+
from { opacity: 0 }
80+
to { opacity: .5 }
81+
}
82+
@keyframes fadeOutHalf {
83+
from { opacity: .5 }
84+
to { opacity: 0 }
85+
}
86+
</style>

components/videos/TutorialsList.vue

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@
7575
:video="video"
7676
:getYMD="getYMD"
7777
@click="openVideoModal(video)"
78-
data-bs-toggle="modal"
79-
data-bs-target="#youtube-video"
8078
/>
8179
</div>
8280
</div>
@@ -111,18 +109,8 @@
111109
</div>
112110
</div>
113111
</div>
114-
<div
115-
v-on="{
116-
'show.bs.modal': () => (videoVisible = true),
117-
'hidden.bs.modal': () => (videoVisible = false),
118-
}"
119-
class="modal fade"
120-
tabindex="-1"
121-
role="dialog"
122-
id="youtube-video"
123-
ref="youtubeVideoModal"
124-
aria-labelledby="youtube-video"
125-
aria-hidden="true"
112+
<Modal
113+
v-model:show="videoVisible"
126114
>
127115
<div class="modal-dialog modal-lg modal-dialog-centered">
128116
<div class="modal-content">
@@ -146,11 +134,13 @@
146134
</div>
147135
</div>
148136
</div>
149-
</div>
137+
</Modal>
150138
</div>
151139
</template>
152140

153141
<script setup lang="ts">
142+
import Modal from '../common/Modal.vue'
143+
154144
interface Category {
155145
name: string
156146
}
@@ -171,7 +161,6 @@ interface TutorialVideoResponse {
171161
total: number
172162
}
173163
174-
const { $bootstrap } = useNuxtApp()
175164
const config = useRuntimeConfig()
176165
const route = useRoute()
177166
const router = useRouter()
@@ -260,13 +249,12 @@ function changePage(pageNo: number): void {
260249
}
261250
262251
function closeModal(): void {
263-
if (process.client && youtubeVideoModal.value) {
264-
const modal = $bootstrap.Modal.getInstance(youtubeVideoModal.value)
265-
modal?.hide()
266-
}
252+
videoVisible.value = false
253+
visibleVideoData.value = {} as VideoData
267254
}
268255
269256
function openVideoModal(video: VideoData): void {
257+
videoVisible.value = true
270258
visibleVideoData.value = video
271259
}
272260
@@ -323,6 +311,7 @@ watch(tutorialVideo, (newVal) => {
323311
.modal-header {
324312
background-color: $black-2;
325313
border-bottom-color: $black-2;
314+
padding: 1rem;
326315
padding-bottom: 0;
327316
padding-top: 5px;
328317
display: flex;
@@ -331,11 +320,13 @@ watch(tutorialVideo, (newVal) => {
331320
background: transparent;
332321
border: none;
333322
color: $white;
323+
outline: $black-5 dotted 1px;
334324
}
335325
}
336326
337327
.modal-body {
338328
background-color: $black-2;
329+
padding: 1rem;
339330
}
340331
341332
.right-side-bar {

0 commit comments

Comments
 (0)