aboutsummaryrefslogtreecommitdiffstats
path: root/components/editor/SidebarCategory.vue
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.com>2024-03-10 01:31:42 +0000
committerLeonardo Bishop <me@leonardobishop.com>2024-03-10 01:31:42 +0000
commit71e4ad2c71efea471923ea47f01bfda841387f81 (patch)
treef08293fdc56b4eb2e3d0e520b79b4d8aad78924c /components/editor/SidebarCategory.vue
parent4495c02c41b95ce6df0c34dbf6ac62f7addae7a3 (diff)
Use nuxt auto import magic
Diffstat (limited to 'components/editor/SidebarCategory.vue')
-rw-r--r--components/editor/SidebarCategory.vue95
1 files changed, 95 insertions, 0 deletions
diff --git a/components/editor/SidebarCategory.vue b/components/editor/SidebarCategory.vue
new file mode 100644
index 0000000..3e0db9b
--- /dev/null
+++ b/components/editor/SidebarCategory.vue
@@ -0,0 +1,95 @@
+<script setup lang="ts">
+import { useSessionStore, type EditorCategory } from '@/stores/session';
+import { computed, ref, toRefs } from 'vue';
+import { stripColorCodes } from '@/lib/util';
+
+const props = defineProps<{
+ category: EditorCategory;
+}>();
+
+const { category } = toRefs(props);
+
+const expanded = ref(true);
+
+const sessionStore = useSessionStore();
+const route = useRoute();
+
+const questsInCategory = computed(() => {
+ return sessionStore.getQuestsInCategory(category.value.id);
+});
+
+const expandCategory = () => {
+ expanded.value = !expanded.value;
+};
+
+const setSelectedCategory = () => {
+ navigateTo({ path: `/category/${category.value.id}` })
+};
+
+const selected = computed(() => {
+ return route.path.startsWith('/category') && route.params.id === category.value.id;
+});
+</script>
+
+<template>
+ <div id="category-container" :class="{ selected: selected }">
+ <span id="category-title" @click="setSelectedCategory">
+ <font-awesome-icon @click.stop="expandCategory" class="category-icon"
+ :icon="expanded ? ['fas', 'fa-caret-down'] : ['fas', 'fa-caret-up']" />
+ <span id="category-name">
+ <span id="category-display-name">{{ stripColorCodes(category.display.name) }}</span>
+ <code id="category-display-id">{{ category.id }}</code>
+ </span>
+ </span>
+ </div>
+ <div v-if="expanded" id="quests">
+ <EditorSidebarQuest class="quest" v-for="quest in questsInCategory" :key="quest.id" :quest="quest" />
+ </div>
+</template>
+
+<style scoped>
+#category-container {
+ cursor: pointer;
+ padding: 0.5rem 1rem;
+ transition: background-color 0.3s;
+ border-bottom: 1px solid var(--color-border-soft);
+
+ #category-title {
+ display: flex;
+ align-items: center;
+ margin: 0;
+ gap: 1rem;
+ font-size: 1.1rem;
+
+ #category-name {
+ display: flex;
+ flex-direction: column;
+ align-items: left;
+
+ #category-display-id {
+ font-size: 0.8rem;
+ color: var(--color-text-mute);
+ }
+ }
+ }
+}
+
+.selected {
+ background-color: var(--color-primary-mute);
+}
+
+#quests {
+ background-color: var(--color-background-mute);
+ border-bottom: 1px solid var(--color-border-soft);
+}
+
+.quest {
+ margin: 0 0 0 1.4rem;
+ background-color: var(--color-background);
+ border-left: 1px solid var(--color-border);
+}
+
+#category-container:hover {
+ background-color: var(--color-hover);
+}
+</style> \ No newline at end of file