Merge branch 'code/cleanup' into dev

This commit is contained in:
Alexis
2025-03-14 17:45:15 +01:00
11 changed files with 104 additions and 70 deletions

View File

@@ -87,123 +87,123 @@
/* Colors */ /* Colors */
.event-red:not(.is-hidden) { .event-red:not(.is-hidden) {
@apply text-slate-900 bg-red-500 hover:bg-red-600 @apply text-slate-900 bg-red-500 hover:bg-red-600 focus-visible:bg-red-600
} }
.event-orange:not(.is-hidden) { .event-orange:not(.is-hidden) {
@apply text-slate-900 bg-orange-500 hover:bg-orange-600 @apply text-slate-900 bg-orange-500 hover:bg-orange-600 focus-visible:bg-orange-600
} }
.event-amber:not(.is-hidden) { .event-amber:not(.is-hidden) {
@apply text-slate-900 bg-amber-500 hover:bg-amber-600 @apply text-slate-900 bg-amber-500 hover:bg-amber-600 focus-visible:bg-amber-600
} }
.event-yellow:not(.is-hidden) { .event-yellow:not(.is-hidden) {
@apply text-slate-900 bg-yellow-600 hover:bg-yellow-700 @apply text-slate-900 bg-yellow-600 hover:bg-yellow-700 focus-visible:bg-yellow-700
} }
.event-lime:not(.is-hidden) { .event-lime:not(.is-hidden) {
@apply text-slate-900 bg-lime-500 hover:bg-lime-600 @apply text-slate-900 bg-lime-500 hover:bg-lime-600 focus-visible:bg-lime-600
} }
.event-green:not(.is-hidden) { .event-green:not(.is-hidden) {
@apply text-white bg-green-600 hover:bg-green-700 @apply text-white bg-green-600 hover:bg-green-700 focus-visible:bg-green-700
} }
.event-emerald:not(.is-hidden) { .event-emerald:not(.is-hidden) {
@apply text-white bg-emerald-600 hover:bg-emerald-700 @apply text-white bg-emerald-600 hover:bg-emerald-700 focus-visible:bg-emerald-700
} }
.event-teal:not(.is-hidden) { .event-teal:not(.is-hidden) {
@apply text-white bg-teal-600 hover:bg-teal-700 @apply text-white bg-teal-600 hover:bg-teal-700 focus-visible:bg-teal-700
} }
.event-cyan:not(.is-hidden) { .event-cyan:not(.is-hidden) {
@apply text-white bg-cyan-600 hover:bg-cyan-700 @apply text-white bg-cyan-600 hover:bg-cyan-700 focus-visible:bg-cyan-700
} }
.event-sky:not(.is-hidden) { .event-sky:not(.is-hidden) {
@apply text-white bg-sky-600 hover:bg-sky-700 @apply text-white bg-sky-600 hover:bg-sky-700 focus-visible:bg-sky-700
} }
.event-blue:not(.is-hidden) { .event-blue:not(.is-hidden) {
@apply text-white bg-blue-600 hover:bg-blue-700 @apply text-white bg-blue-600 hover:bg-blue-700 focus-visible:bg-blue-700
} }
.event-indigo:not(.is-hidden) { .event-indigo:not(.is-hidden) {
@apply text-white bg-indigo-600 hover:bg-indigo-700 @apply text-white bg-indigo-600 hover:bg-indigo-700 focus-visible:bg-indigo-700
} }
.event-violet:not(.is-hidden) { .event-violet:not(.is-hidden) {
@apply text-white bg-violet-600 hover:bg-violet-700 @apply text-white bg-violet-600 hover:bg-violet-700 focus-visible:bg-violet-700
} }
.event-purple:not(.is-hidden) { .event-purple:not(.is-hidden) {
@apply text-white bg-purple-600 hover:bg-purple-700 @apply text-white bg-purple-600 hover:bg-purple-700 focus-visible:bg-purple-700
} }
.event-fuchsia:not(.is-hidden) { .event-fuchsia:not(.is-hidden) {
@apply text-white bg-fuchsia-600 hover:bg-fuchsia-700 @apply text-white bg-fuchsia-600 hover:bg-fuchsia-700 focus-visible:bg-fuchsia-700
} }
.event-pink:not(.is-hidden) { .event-pink:not(.is-hidden) {
@apply text-white bg-pink-700 hover:bg-pink-800 @apply text-white bg-pink-700 hover:bg-pink-800 focus-visible:bg-pink-800
} }
.event-rose:not(.is-hidden) { .event-rose:not(.is-hidden) {
@apply text-white bg-rose-700 hover:bg-rose-800 @apply text-white bg-rose-700 hover:bg-rose-800 focus-visible:bg-rose-800
} }
.event-black:not(.is-hidden) { .event-black:not(.is-hidden) {
@apply text-white bg-stone-500 hover:bg-stone-700 @apply text-white bg-stone-500 hover:bg-stone-700 focus-visible:bg-stone-700
} }
.event-white:not(.is-hidden) { .event-white:not(.is-hidden) {
@apply text-slate-900 bg-white hover:bg-yellow-200 border-[1px] border-slate-300 @apply text-slate-900 bg-white hover:bg-yellow-200 focus-visible:bg-yellow-200 border-[1px] border-slate-300
} }
.event.is-hidden { .event.is-hidden {
border: 1px solid transparent; border: 1px dashed transparent;
} }
.event-red.is-hidden { .event-red.is-hidden {
@apply text-red-500 hover:text-white dark:hover:text-slate-900 border-red-500 hover:bg-red-600 dark:text-white @apply text-red-600 border-red-600 hover:bg-red-100 focus-visible:bg-red-100 dark:text-white dark:hover:bg-red-950 dark:focus-visible:bg-red-950
} }
.event-orange.is-hidden { .event-orange.is-hidden {
@apply text-orange-500 hover:text-white dark:hover:text-slate-900 border-orange-500 hover:bg-orange-600 dark:text-white @apply text-orange-600 border-orange-600 hover:bg-orange-100 focus-visible:bg-orange-100 dark:text-white dark:hover:bg-orange-950 dark:focus-visible:bg-orange-950
} }
.event-amber.is-hidden { .event-amber.is-hidden {
@apply text-amber-500 hover:text-white dark:hover:text-slate-900 border-amber-500 hover:bg-amber-600 dark:text-white @apply text-red-600 border-red-600 hover:bg-red-100 focus-visible:bg-red-100 dark:text-white dark:hover:bg-red-950 dark:focus-visible:bg-red-950
} }
.event-yellow.is-hidden { .event-yellow.is-hidden {
@apply text-yellow-600 hover:text-white dark:hover:text-slate-900 border-yellow-600 hover:bg-yellow-700 dark:text-white @apply text-yellow-600 border-yellow-600 hover:bg-yellow-100 focus-visible:bg-yellow-100 dark:text-white dark:hover:bg-yellow-950 dark:focus-visible:bg-yellow-950
} }
.event-lime.is-hidden { .event-lime.is-hidden {
@apply text-lime-500 hover:text-white dark:hover:text-slate-900 border-lime-500 hover:bg-lime-600 dark:text-white @apply text-lime-600 border-lime-600 hover:bg-lime-100 focus-visible:bg-lime-100 dark:text-white dark:hover:bg-lime-950 dark:focus-visible:bg-lime-950
} }
.event-green.is-hidden { .event-green.is-hidden {
@apply text-green-600 hover:text-white border-green-600 hover:bg-green-700 dark:text-white @apply text-green-600 border-green-600 hover:bg-green-700 focus-visible:bg-green-700 dark:text-white dark:hover:bg-green-950 dark:focus-visible:bg-green-950
} }
.event-emerald.is-hidden { .event-emerald.is-hidden {
@apply text-emerald-600 hover:text-white border-emerald-600 hover:bg-emerald-700 dark:text-white @apply text-emerald-600 border-emerald-600 hover:bg-emerald-700 focus-visible:bg-emerald-700 dark:text-white dark:hover:bg-emerald-950 dark:focus-visible:bg-emerald-950
} }
.event-teal.is-hidden { .event-teal.is-hidden {
@apply text-teal-700 hover:text-white border-teal-600 hover:bg-teal-700 dark:text-white @apply text-teal-700 border-teal-600 hover:bg-teal-700 focus-visible:bg-teal-700 dark:text-white dark:hover:bg-teal-950 dark:focus-visible:bg-teal-950
} }
.event-cyan.is-hidden { .event-cyan.is-hidden {
@apply text-cyan-600 hover:text-white border-cyan-600 hover:bg-cyan-700 dark:text-white @apply text-cyan-600 border-cyan-600 hover:bg-cyan-100 focus-visible:bg-cyan-100 dark:text-white dark:hover:bg-cyan-950 dark:focus-visible:bg-cyan-950
} }
.event-sky.is-hidden { .event-sky.is-hidden {
@apply text-sky-600 hover:text-white border-sky-600 hover:bg-sky-700 dark:text-white @apply text-sky-600 border-sky-600 hover:bg-sky-100 focus-visible:bg-sky-100 dark:text-white dark:hover:bg-sky-950 dark:focus-visible:bg-sky-950
} }
.event-blue.is-hidden { .event-blue.is-hidden {
@apply text-blue-600 hover:text-white border-blue-600 hover:bg-blue-700 dark:text-white @apply text-blue-600 border-blue-600 hover:bg-blue-100 focus-visible:bg-blue-100 dark:text-white dark:hover:bg-blue-950 dark:focus-visible:bg-blue-950
} }
.event-indigo.is-hidden { .event-indigo.is-hidden {
@apply text-indigo-600 hover:text-white border-indigo-600 hover:bg-indigo-700 dark:text-white @apply text-indigo-600 border-indigo-600 hover:bg-indigo-100 focus-visible:bg-indigo-100 dark:text-white dark:hover:bg-indigo-950 dark:focus-visible:bg-indigo-950
} }
.event-violet.is-hidden { .event-violet.is-hidden {
@apply text-violet-600 hover:text-white border-violet-600 hover:bg-violet-700 dark:text-white @apply text-violet-600 border-violet-600 hover:bg-violet-100 focus-visible:bg-violet-100 dark:text-white dark:hover:bg-violet-950 dark:focus-visible:bg-violet-950
} }
.event-purple.is-hidden { .event-purple.is-hidden {
@apply text-purple-600 hover:text-white border-purple-600 hover:bg-purple-700 dark:text-white @apply text-purple-600 border-purple-600 hover:bg-purple-100 focus-visible:bg-purple-100 dark:text-white dark:hover:bg-purple-950 dark:focus-visible:bg-purple-950
} }
.event-fuchsia.is-hidden { .event-fuchsia.is-hidden {
@apply text-fuchsia-600 hover:text-white border-fuchsia-600 hover:bg-fuchsia-700 dark:text-white @apply text-fuchsia-600 border-fuchsia-600 hover:bg-fuchsia-100 focus-visible:bg-fuchsia-100 dark:text-white dark:hover:bg-fuchsia-950 dark:focus-visible:bg-fuchsia-950
} }
.event-pink.is-hidden { .event-pink.is-hidden {
@apply text-pink-700 hover:text-white border-pink-700 hover:bg-pink-800 dark:text-white @apply text-pink-700 border-pink-700 hover:bg-pink-100 focus-visible:bg-pink-100 dark:text-white dark:hover:bg-pink-950 dark:focus-visible:bg-pink-950
} }
.event-rose.is-hidden { .event-rose.is-hidden {
@apply text-rose-700 hover:text-white border-rose-700 hover:bg-rose-800 dark:text-white @apply text-rose-700 border-rose-700 hover:bg-rose-100 focus-visible:bg-rose-100 dark:text-white dark:hover:bg-rose-950 dark:focus-visible:bg-rose-950
} }
.event-black.is-hidden { .event-black.is-hidden {
@apply text-stone-700 hover:text-white border-stone-500 hover:bg-stone-700 dark:text-white @apply text-stone-700 border-stone-500 hover:bg-stone-100 focus-visible:bg-stone-100 dark:text-white dark:hover:bg-stone-950 dark:focus-visible:bg-stone-950
} }
.event-white.is-hidden { .event-white.is-hidden {
@apply text-slate-900 border-neutral-400 hover:bg-yellow-200 dark:bg-neutral-800 dark:text-white dark:hover:bg-neutral-300 dark:hover:text-slate-900 @apply text-slate-900 border-neutral-400 hover:bg-yellow-200 focus-visible:bg-yellow-200 dark:bg-neutral-900 dark:text-white dark:hover:bg-neutral-700 dark:focus-visible:bg-neutral-300
} }
.dark .event-details-red { .dark .event-details-red {

View File

@@ -51,9 +51,9 @@ onMounted(() => {
<component :is="currentViewComponent" /> <component :is="currentViewComponent" />
<CalendarSearch /> <LazyCalendarSearch />
<CalendarDialogUpdateEvent v-if="!isReadOnly" /> <LazyCalendarDialogUpdateEvent v-if="!isReadOnly" />
<CalendarDialogDeleteEvent v-if="!isReadOnly" /> <LazyCalendarDialogDeleteEvent v-if="!isReadOnly" />
</div> </div>
</div> </div>
</template> </template>

View File

@@ -55,7 +55,7 @@ onMounted(() => {
<UiPopover v-model:open="isPopoverDetailsOpen"> <UiPopover v-model:open="isPopoverDetailsOpen">
<UiPopoverTrigger as-child> <UiPopoverTrigger as-child>
<button <button
class="event text-xs px-2 py-1 block w-full text-left rounded-sm focus-visible:bg-red-200 transition-colors" class="event text-xs px-2 py-1 block w-full text-left rounded-sm transition-colors outline-offset-1"
:class=" :class="
cn( cn(
event.category ? `event-${event.category.color}` : '', event.category ? `event-${event.category.color}` : '',

View File

@@ -2,12 +2,20 @@
import type { RPGDate } from "~/models/Date"; import type { RPGDate } from "~/models/Date";
import { PhAlarm, PhCircleNotch, PhEye, PhEyeClosed, PhMapPinArea, PhTag } from "@phosphor-icons/vue" import { PhAlarm, PhCircleNotch, PhEye, PhEyeClosed, PhMapPinArea, PhTag } from "@phosphor-icons/vue"
const { t } = useI18n()
const emit = defineEmits(["event-created"]) const emit = defineEmits(["event-created"])
const props = defineProps<{
date?: RPGDate
btnClass?: string
}>()
const { eventSkeleton } = storeToRefs(useCalendar()) const { eventSkeleton } = storeToRefs(useCalendar())
const { submitSkeleton, cancelLatestRequest } = useCalendar() const { submitSkeleton, cancelLatestRequest } = useCalendar()
const { t } = useI18n() const newEventTitle = shallowRef<HTMLInputElement>()
useFocus(newEventTitle, { initialValue: true })
const isLoading = ref(false) const isLoading = ref(false)
@@ -15,11 +23,6 @@ const formErrors = reactive<{ message: string | null }>({
message: null message: null
}) })
const props = defineProps<{
date?: RPGDate
btnClass?: string
}>()
async function handleSubmit() { async function handleSubmit() {
// Prevent form submission if already loading // Prevent form submission if already loading
if (isLoading.value) return if (isLoading.value) return
@@ -56,6 +59,7 @@ function handleCancel() {
<div class="col-span-2 pl-8"> <div class="col-span-2 pl-8">
<input <input
id="new-event-title" id="new-event-title"
ref="newEventTitle"
v-model="eventSkeleton.title" v-model="eventSkeleton.title"
type="text" type="text"
name="new-event-title" name="new-event-title"

View File

@@ -29,6 +29,9 @@ import type { Category } from "~/models/Category"
const { isAdvancedSearchOpen, allEvents } = storeToRefs(useCalendar()) const { isAdvancedSearchOpen, allEvents } = storeToRefs(useCalendar())
const { characters } = storeToRefs(useCharacters()) const { characters } = storeToRefs(useCharacters())
const searchInput = shallowRef<HTMLInputElement>()
useFocus(searchInput, { initialValue: true })
const searchQuery = ref<string>("") const searchQuery = ref<string>("")
// const searchEnough = computed<boolean>(() => searchQuery.value.length >= 2) // const searchEnough = computed<boolean>(() => searchQuery.value.length >= 2)
@@ -281,6 +284,7 @@ function handleCategoryUnselect(e: Category) {
<div class="relative w-full h-fit"> <div class="relative w-full h-fit">
<UiInput <UiInput
id="search" id="search"
ref="searchInput"
v-model:model-value="searchQuery" v-model:model-value="searchQuery"
type="text" type="text"
:placeholder="$t('entity.advancedSearch.ctaPlaceholder')" :placeholder="$t('entity.advancedSearch.ctaPlaceholder')"
@@ -321,7 +325,7 @@ function handleCategoryUnselect(e: Category) {
<ComboboxRoot <ComboboxRoot
v-model="selectedCategories" v-model="selectedCategories"
v-model:open="categoryFilterOpened" v-model:open="categoryFilterOpened"
v-model:searchTerm="searchCategory" v-model:search-term="searchCategory"
class="grow flex items-center gap-y-1 pr-2" class="grow flex items-center gap-y-1 pr-2"
> >
<ComboboxAnchor as-child> <ComboboxAnchor as-child>

View File

@@ -21,7 +21,7 @@ const dateDuration = computed<string | null>(() => props.event.endDate ? getRela
<template> <template>
<button <button
class="event relative block w-full text-left py-3 px-4 rounded-sm transition-colors" class="event group relative block w-full text-left py-3 px-4 rounded-sm transition-colors"
:class="cn( :class="cn(
event.category ? `event-${event.category.color}` : '', event.category ? `event-${event.category.color}` : '',
{ {
@@ -30,7 +30,7 @@ const dateDuration = computed<string | null>(() => props.event.endDate ? getRela
@click="$emit('query:date-jump', event.startDate)" @click="$emit('query:date-jump', event.startDate)"
> >
<div class="flex gap-2 items-center mb-1"> <div class="flex gap-2 items-center mb-1">
<h2 class="font-bold text-lg"> <h2 class="font-bold text-lg underline-offset-4 group-hover:underline">
{{ event.title }} {{ event.title }}
</h2> </h2>
<div v-if="event.wiki"> <div v-if="event.wiki">

View File

@@ -0,0 +1,21 @@
<script lang="ts" setup>
const { lineNb = 3 } = defineProps<{
lineNb?: number
}>()
</script>
<template>
<UiCard class="w-full h-full flex flex-col">
<UiCardHeader>
<UiCardTitle>
<UiSkeleton class="w-2/3 max-w-full h-8" />
</UiCardTitle>
</UiCardHeader>
<UiCardContent class="grow grid gap-2">
<UiSkeleton class="w-full max-w-full h-6" />
<template v-for="(l, i) in lineNb" :key="i">
<UiSkeleton class="max-w-full h-6" :style="`width: ${Math.floor(Math.random() * 100) + 1}%`" />
</template>
</UiCardContent>
</UiCard>
</template>

View File

@@ -52,7 +52,7 @@ watch(user, () => {
</div> </div>
</div> </div>
<div v-else-if="calendar?.data && categories?.data" class="h-full w-full"> <div v-else-if="calendar?.data && categories?.data" class="h-full w-full pt-8">
<Head> <Head>
<Title>{{ calendar.data.name }}</Title> <Title>{{ calendar.data.name }}</Title>
</Head> </Head>
@@ -68,21 +68,21 @@ watch(user, () => {
<div class="grid justify-items-center opacity-80"> <div class="grid justify-items-center opacity-80">
<PhCalendarX size="75" class="opacity-60" /> <PhCalendarX size="75" class="opacity-60" />
<Heading level="h1"> <LazyHeading level="h1">
{{ $t("entity.calendar.notFound") }} {{ $t("entity.calendar.notFound") }}
</Heading> </LazyHeading>
<p> <p>
{{ $t('entity.calendar.notFoundDescription') }} {{ $t('entity.calendar.notFoundDescription') }}
</p> </p>
<UiButton variant="default" class="mt-4 gap-2" as-child> <LazyUiButton variant="default" class="mt-4 gap-2" as-child>
<RouterLink to="/explore"> <RouterLink to="/explore">
<PhArrowBendDoubleUpLeft size="24" /> <PhArrowBendDoubleUpLeft size="24" />
{{ $t('entity.calendar.backToList') }} {{ $t('entity.calendar.backToList') }}
</RouterLink> </RouterLink>
</UiButton> </LazyUiButton>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -5,7 +5,9 @@ definePageMeta({
middleware: ["reset-menu"] middleware: ["reset-menu"]
}) })
const { data: availableCalendars } = await useLazyFetch<{ data: Calendar[] }>("/api/calendars/query", { key: "explore-calendars", query: { full: true } }) const { data: availableCalendars, status: calendarStatus } = await useLazyFetch<{ data: Calendar[] }>("/api/calendars/query", { key: "explore-calendars", query: { full: true } })
const isLoading = computed(() => calendarStatus.value === "pending")
</script> </script>
<template> <template>
@@ -24,11 +26,14 @@ const { data: availableCalendars } = await useLazyFetch<{ data: Calendar[] }>("/
{{ $t("entity.calendar.namePublicPlural") }} {{ $t("entity.calendar.namePublicPlural") }}
</Heading> </Heading>
<ul v-if="availableCalendars?.data" class="grid md:grid-cols-3 gap-2"> <div v-if="isLoading" class="grid md:grid-cols-3 gap-2">
<li v-for="calendar in availableCalendars.data" :key="calendar.shortId"> <LoadingCard />
<CalendarPreviewCard :calendar="calendar" :gm-id="calendar.world?.gmId" /> </div>
</li> <ul v-else-if="availableCalendars?.data" class="grid md:grid-cols-3 gap-2">
</ul> <li v-for="calendar in availableCalendars.data" :key="calendar.shortId">
<CalendarPreviewCard :calendar="calendar" :gm-id="calendar.world?.gmId" />
</li>
</ul>
</Spacing> </Spacing>
</Spacing> </Spacing>
</main> </main>

View File

@@ -153,8 +153,8 @@ function hideEditModal() {
</Spacing> </Spacing>
</section> </section>
<WorldDialogCreate :modal-state="isCreateWorldModalOpen" @on-close="hideCreateDialog" /> <LazyWorldDialogCreate :modal-state="isCreateWorldModalOpen" @on-close="hideCreateDialog" />
<WorldDialogEdit :world="markedWorld" :modal-state="isEditWorldModalOpen" @on-close="hideEditModal" /> <LazyWorldDialogEdit :world="markedWorld" :modal-state="isEditWorldModalOpen" @on-close="hideEditModal" />
<WorldDialogDelete :world="markedWorld" :modal-state="isDeleteWorldModalOpen" @on-close="hideDeleteModal" /> <LazyWorldDialogDelete :world="markedWorld" :modal-state="isDeleteWorldModalOpen" @on-close="hideDeleteModal" />
</main> </main>
</template> </template>

View File

@@ -251,10 +251,10 @@ function hideEditModal() {
</Spacing> </Spacing>
</section> </section>
<WorldDialogEdit :world="world.data" :modal-state="isEditWorldModalOpen" @on-close="hideEditModal" /> <LazyWorldDialogEdit :world="world.data" :modal-state="isEditWorldModalOpen" @on-close="hideEditModal" />
<CalendarDialogCreate :world="world.data" :modal-state="isCreateCalendarModalOpen" @on-close="hideCreateDialog" /> <LazyCalendarDialogCreate :world="world.data" :modal-state="isCreateCalendarModalOpen" @on-close="hideCreateDialog" />
<CalendarDialogUpdate v-if="markedCalendar?.id" :world="world.data" :calendar="markedCalendar" :modal-state="isUpdateCalendarModalOpen" @on-close="hideUpdateDialog" /> <LazyCalendarDialogUpdate v-if="markedCalendar?.id" :world="world.data" :calendar="markedCalendar" :modal-state="isUpdateCalendarModalOpen" @on-close="hideUpdateDialog" />
<CalendarDialogDelete :calendar="markedCalendar" :modal-state="isDeleteCalendarModalOpen" @on-close="hideDeleteCalendarModal"/> <LazyCalendarDialogDelete :calendar="markedCalendar" :modal-state="isDeleteCalendarModalOpen" @on-close="hideDeleteCalendarModal"/>
</template> </template>
<template v-else> <template v-else>
<div class="h-full w-full grid place-items-center"> <div class="h-full w-full grid place-items-center">