Skip to content

Commit e562b9c

Browse files
committed
feat: support ssr generation
1 parent 946f83a commit e562b9c

File tree

2 files changed

+85
-63
lines changed

2 files changed

+85
-63
lines changed

components/sidebar/ReadStatus.vue

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<template>
2+
<Dropdown
3+
ref="statusDropDown"
4+
:customTriggerClass="
5+
'px-3 py-1 hover:bg-orange-100 dark:hover:bg-black dark:border-white border' + status.toLowerCase()"
6+
:border="false"
7+
>
8+
<!-- trigger element -->
9+
<template #trigger>
10+
<button type="button" v-text="status" />
11+
</template>
12+
13+
<!-- contents display in dropdown -->
14+
<ul class="flex flex-col bg-orange-100 dark:bg-[#131313]">
15+
<li
16+
v-for="(s, i) in allStatus"
17+
:key="'status-' + i"
18+
@click="changeStatus(s)"
19+
:class="[
20+
'px-4 py-2 hover:cursor-pointer border-b border-orange-200 dark:border-gray-500 hover:bg-orange-50 dark:hover:bg-black',
21+
s.toLowerCase(),
22+
]"
23+
v-text="s"
24+
></li>
25+
</ul>
26+
</Dropdown>
27+
</template>
28+
29+
<script setup>
30+
import { ref } from "vue";
31+
import Dropdown from "v-dropdown";
32+
33+
const { $locally } = useNuxtApp();
34+
const allStatus = ["Pendiente", "Leyendo", "Completado", "Omitir"];
35+
const statusDropDown = ref(null);
36+
37+
const props = defineProps({
38+
name: {
39+
type: String
40+
},
41+
})
42+
43+
const status = ref($locally.get(props.name) ?? "Pendiente");
44+
45+
function changeStatus(val) {
46+
if (val == status.value) return;
47+
if (!statusDropDown.value) return;
48+
status.value = val;
49+
$locally.set(props.name, val);
50+
statusDropDown.value.close();
51+
}
52+
</script>
53+
54+
<style>
55+
.pendiente::before,
56+
.leyendo::before,
57+
.completado::before,
58+
.omitir::before {
59+
content: "";
60+
margin-right: 5px;
61+
}
62+
63+
.pendiente::before {
64+
color: var(--tw-text-gray-950);
65+
}
66+
.leyendo::before {
67+
color: var(--tw-text-orange-500);
68+
}
69+
.completado::before {
70+
color: var(--tw-text-green-600);
71+
}
72+
.omitir::before {
73+
color: var(--tw-text-slate-500);
74+
}
75+
.v-dropdown-container.v-dropdown-no-border {
76+
border-radius: 0px !important;
77+
}
78+
</style>

pages/[...slug].vue

Lines changed: 7 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
<template>
22
<Header />
33
<HeroSection />
4-
<Roadmap />
4+
<client-only>
5+
<Roadmap />
6+
</client-only>
57
<Teleport to="body">
68
<div v-if="content" :class="['fixed top-0 h-screen', sidebarClass]">
79
<div
@@ -17,31 +19,9 @@
1719
: 'border-gray-300 dark:border-white mb-2 py-2 dark:backdrop-blur-2xl',
1820
]"
1921
>
20-
<Dropdown
21-
ref="statusDropDown"
22-
:customTriggerClass="
23-
'px-3 py-1 hover:bg-orange-100 dark:hover:bg-black dark:border-white border' + status.toLowerCase()"
24-
:border="false"
25-
>
26-
<!-- trigger element -->
27-
<template #trigger>
28-
<button type="button" v-text="status" />
29-
</template>
30-
31-
<!-- contents display in dropdown -->
32-
<ul class="flex flex-col bg-orange-100 dark:bg-[#131313]">
33-
<li
34-
v-for="(s, i) in allStatus"
35-
:key="'status-' + i"
36-
@click="changeStatus(s)"
37-
:class="[
38-
'px-4 py-2 hover:cursor-pointer border-b border-orange-200 dark:border-gray-500 hover:bg-orange-50 dark:hover:bg-black',
39-
s.toLowerCase(),
40-
]"
41-
v-text="s"
42-
></li>
43-
</ul>
44-
</Dropdown>
22+
<client-only>
23+
<ReadStatus :name="nodeId" />
24+
</client-only>
4525
<span
4626
class="hover:cursor-pointer dark:text-white"
4727
@click="closeSidebar"
@@ -100,18 +80,13 @@ import { useRoute, useRouter } from "vue-router";
10080
import { ref, onMounted } from "vue";
10181
import Roadmap from "@/components/Roadmap.vue";
10282
import HeroSection from "@/layouts/hero.vue";
103-
import Dropdown from "v-dropdown";
104-
105-
const { $locally } = useNuxtApp();
83+
import ReadStatus from "@/components/sidebar/ReadStatus.vue";
10684
107-
const allStatus = ["Pendiente", "Leyendo", "Completado", "Omitir"];
10885
const { push } = useRouter();
10986
const route = useRoute();
11087
const nodeId = route.params.slug;
11188
const showSidebar = ref(true);
11289
const content = ref(null);
113-
const statusDropDown = ref(null);
114-
const status = ref($locally.get(nodeId) ?? "Pendiente");
11590
const isScrolled = ref(false);
11691
11792
useSeoMeta({
@@ -145,41 +120,10 @@ const onScroll = (e) => {
145120
const sidebarClass = computed(() =>
146121
showSidebar.value ? "right-0 w-screen lg:w-2/4" : "w-screen"
147122
);
148-
149-
function changeStatus(val) {
150-
if (val == status.value) return;
151-
if (!statusDropDown.value) return;
152-
status.value = val;
153-
$locally.set(nodeId, val);
154-
statusDropDown.value.close();
155-
}
156123
</script>
157124

158125
<style>
159-
.pendiente::before,
160-
.leyendo::before,
161-
.completado::before,
162-
.omitir::before {
163-
content: "";
164-
margin-right: 5px;
165-
}
166-
167-
.pendiente::before {
168-
color: var(--tw-text-gray-950);
169-
}
170-
.leyendo::before {
171-
color: var(--tw-text-orange-500);
172-
}
173-
.completado::before {
174-
color: var(--tw-text-green-600);
175-
}
176-
.omitir::before {
177-
color: var(--tw-text-slate-500);
178-
}
179126
article [id] {
180127
scroll-margin-top: 3.5rem;
181128
}
182-
.v-dropdown-container.v-dropdown-no-border {
183-
border-radius: 0px !important;
184-
}
185129
</style>

0 commit comments

Comments
 (0)