From d903b371b23285d67c998a44b85639e309607872 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Sun, 31 Mar 2024 12:43:12 +0200 Subject: [PATCH 01/63] Added calendar config base --- src/stores/calendar.ts | 60 ++++++++++++++++++++++++++++++++++++++++++ src/stores/counter.ts | 12 --------- src/views/HomeView.vue | 8 +++++- 3 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 src/stores/calendar.ts delete mode 100644 src/stores/counter.ts diff --git a/src/stores/calendar.ts b/src/stores/calendar.ts new file mode 100644 index 0000000..80fc6c1 --- /dev/null +++ b/src/stores/calendar.ts @@ -0,0 +1,60 @@ +import { computed, ref, type Ref } from 'vue' +import { defineStore } from 'pinia' + +type CalendarPeriod = 'ante' | 'nante' + +type CalendarStaticConfig = { + months: string[] + monthsPerYear: number + daysPerYear: number + daysPerMonth: number + daysPerWeek: number +} + +type CalendarCurrentConfig = { + currentPeriod: Ref + currentYear: Ref + currentMonth: Ref + currentDay: Ref +} + +export const useCalendar = defineStore('calendar', () => { + const months = [ + 'Jalen', + 'Malsen', + 'Verlys', + 'Nalys', + 'Verdore', + 'Sidore', + 'Lyllion', + 'Rion', + 'Farene', + 'Dalvene' + ] + const monthsPerYear = computed(() => months.length) + const daysPerYear = 320 + const daysPerMonth = computed(() => daysPerYear / monthsPerYear.value) + const daysPerWeek = 6 + + const staticConfig: CalendarStaticConfig = { + months, + monthsPerYear: monthsPerYear.value, + daysPerYear, + daysPerMonth: daysPerMonth.value, + daysPerWeek + } + + const currentPeriod: Ref<'nante' | 'ante'> = ref('nante') + const currentYear = ref(3209) + const currentMonth = ref(8) + const currentDay = ref(12) + + const config: CalendarCurrentConfig = { + currentPeriod, + currentYear, + currentMonth, + currentDay + } + + return { staticConfig, config } +}) diff --git a/src/stores/counter.ts b/src/stores/counter.ts deleted file mode 100644 index b6757ba..0000000 --- a/src/stores/counter.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ref, computed } from 'vue' -import { defineStore } from 'pinia' - -export const useCounterStore = defineStore('counter', () => { - const count = ref(0) - const doubleCount = computed(() => count.value * 2) - function increment() { - count.value++ - } - - return { count, doubleCount, increment } -}) diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 128941e..75c3e88 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,5 +1,11 @@ + + From a4b2fa271b28089092385c5b3d373d8fd224309d Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Sun, 31 Mar 2024 16:34:14 +0200 Subject: [PATCH 02/63] Added main system to navigate time --- src/stores/calendar.ts | 139 ++++++++++++++++++++++++++++++++++++----- src/views/HomeView.vue | 42 ++++++++++++- 2 files changed, 165 insertions(+), 16 deletions(-) diff --git a/src/stores/calendar.ts b/src/stores/calendar.ts index 80fc6c1..2bb7af3 100644 --- a/src/stores/calendar.ts +++ b/src/stores/calendar.ts @@ -1,5 +1,6 @@ -import { computed, ref, type Ref } from 'vue' +import { computed, ref, type Ref, type ComputedRef } from 'vue' import { defineStore } from 'pinia' +import { useUrlSearchParams } from '@vueuse/core' type CalendarPeriod = 'ante' | 'nante' @@ -13,12 +14,14 @@ type CalendarStaticConfig = { type CalendarCurrentConfig = { currentPeriod: Ref - currentYear: Ref - currentMonth: Ref - currentDay: Ref + currentYear: ComputedRef + currentMonth: ComputedRef + currentDay: ComputedRef + currentMonthName: ComputedRef } export const useCalendar = defineStore('calendar', () => { + // Static calendar config const months = [ 'Jalen', 'Malsen', @@ -44,17 +47,125 @@ export const useCalendar = defineStore('calendar', () => { daysPerWeek } - const currentPeriod: Ref<'nante' | 'ante'> = ref('nante') - const currentYear = ref(3209) - const currentMonth = ref(8) - const currentDay = ref(12) + // Get date from URL params + const params = useUrlSearchParams('history', { + removeNullishValues: true + }) - const config: CalendarCurrentConfig = { - currentPeriod, - currentYear, - currentMonth, - currentDay + // Default date settings (current day) + const defaultDay = String(12) + const defaultMonth = String(8) + const defaultYear = String(3209) + + // Assign default values if no params exist in URL + if (!params.day) { + params.day = defaultDay + } + if (!params.month) { + params.month = defaultMonth + } + if (!params.year) { + params.year = defaultYear } - return { staticConfig, config } + const currentDay = computed(() => params.day) + + const currentMonth = computed(() => params.month) + // Gets the label from currentMonth index + const currentMonthName = computed(() => { + const index = Number(currentMonth.value) + return staticConfig.months[index] + }) + + const currentYear = computed(() => params.year) + + // Get period from currentYear + const currentPeriod: ComputedRef = computed(() => { + const year = Number(currentYear.value) + return year >= 0 ? 'nante' : 'ante' + }) + + // Create base config + const config: CalendarCurrentConfig = { + currentDay, + currentMonth, + currentYear, + currentPeriod, + currentMonthName + } + + /** + * Moves the current date forward one month + */ + function incrementMonth() { + // const oldValue = params.month + let newValue = Number(params.month) + 1 + + // If the new value would exceed the max number of month per year + if (newValue >= staticConfig.monthsPerYear) { + newValue = 0 + // Increment the year + incrementYear() + } + + params.month = newValue.toString() + } + + /** + * Moves the current date backward one month + */ + function decrementMonth() { + // const oldValue = params.month + let newValue = Number(params.month) - 1 + + // If the new value would go below 0 + if (newValue < 0) { + newValue = staticConfig.monthsPerYear - 1 + // Decrement the year + decrementYear() + } + + params.month = newValue.toString() + } + + /** + * Moves the current date to a particular month + */ + function setMonth(target: number) { + // If the target is outside the month bounds + if (target < 0 || target >= staticConfig.monthsPerYear) { + return + } + + params.month = target.toString() + } + + /** + * Moves the current date forward one year + */ + function incrementYear(inc: number = 1) { + const newValue = Number(params.year) + inc + + params.year = newValue.toString() + } + + /** + * Moves the current date backward one year + */ + function decrementYear(inc: number = 1) { + const newValue = Number(params.year) - inc + + params.year = newValue.toString() + } + + return { + staticConfig, + config, + params, + incrementMonth, + decrementMonth, + setMonth, + incrementYear, + decrementYear + } }) diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 75c3e88..724c8b6 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,11 +1,49 @@ From 2bf2ad2492e9c59128b0f447df674fa4a87ab500 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Sun, 31 Mar 2024 19:37:02 +0200 Subject: [PATCH 03/63] Added sample data for characters --- src/models/Date.ts | 8 ++++++++ src/stores/calendar.ts | 9 ++++----- src/stores/characters.ts | 18 ++++++++++++++++++ src/stores/events.ts | 30 ++++++++++++++++++++++++++++++ src/views/HomeView.vue | 7 +++++++ 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 src/models/Date.ts create mode 100644 src/stores/characters.ts create mode 100644 src/stores/events.ts diff --git a/src/models/Date.ts b/src/models/Date.ts new file mode 100644 index 0000000..37872e8 --- /dev/null +++ b/src/models/Date.ts @@ -0,0 +1,8 @@ +export type LeimDate = { + day: number + month: number + year: number + period: LeimPeriod +} + +export type LeimPeriod = 'ante' | 'nante' diff --git a/src/stores/calendar.ts b/src/stores/calendar.ts index 2bb7af3..3e6cda7 100644 --- a/src/stores/calendar.ts +++ b/src/stores/calendar.ts @@ -1,8 +1,7 @@ -import { computed, ref, type Ref, type ComputedRef } from 'vue' +import { computed, type Ref, type ComputedRef } from 'vue' import { defineStore } from 'pinia' import { useUrlSearchParams } from '@vueuse/core' - -type CalendarPeriod = 'ante' | 'nante' +import type { LeimPeriod } from '@/models/Date' type CalendarStaticConfig = { months: string[] @@ -13,7 +12,7 @@ type CalendarStaticConfig = { } type CalendarCurrentConfig = { - currentPeriod: Ref + currentPeriod: Ref currentYear: ComputedRef currentMonth: ComputedRef currentDay: ComputedRef @@ -80,7 +79,7 @@ export const useCalendar = defineStore('calendar', () => { const currentYear = computed(() => params.year) // Get period from currentYear - const currentPeriod: ComputedRef = computed(() => { + const currentPeriod: ComputedRef = computed(() => { const year = Number(currentYear.value) return year >= 0 ? 'nante' : 'ante' }) diff --git a/src/stores/characters.ts b/src/stores/characters.ts new file mode 100644 index 0000000..5cca8c6 --- /dev/null +++ b/src/stores/characters.ts @@ -0,0 +1,18 @@ +import { defineStore } from 'pinia' +import type { LeimDate } from '@/models/Date' + +type Character = { + name: string + birth?: LeimDate + death?: LeimDate +} + +export const useCharacters = defineStore('characters', () => { + const characters: Character[] = [ + { name: 'Quacille Lévios', birth: { day: 3, month: 6, year: 3162, period: 'nante' } }, + { name: 'Lazarus Tymos', birth: { day: 29, month: 9, year: 3145, period: 'nante' } }, + { name: 'Ernestin Pomel', birth: { day: 11, month: 2, year: 3179, period: 'nante' } } + ] + + return { characters } +}) diff --git a/src/stores/events.ts b/src/stores/events.ts new file mode 100644 index 0000000..591ea5a --- /dev/null +++ b/src/stores/events.ts @@ -0,0 +1,30 @@ +import { defineStore } from 'pinia' +import { computed } from 'vue' +import { useCharacters } from './characters' + +import type { LeimDate } from '@/models/Date' + +type CalendarEvent = { + title: string + date: LeimDate +} + +export const useCalendarEvents = defineStore('calendar-events', () => { + const { characters } = useCharacters() + + const characterBirthEvents = computed(() => { + const charactersWithBirthData = characters.filter((character) => character.birth) + return charactersWithBirthData.map((character) => { + return { title: `Naissance de ${character.name}`, date: character.birth } as CalendarEvent + }) + }) + + const characterDeathEvents = computed(() => { + const charactersWithDeathData = characters.filter((character) => character.death) + return charactersWithDeathData.map((character) => { + return { title: `Décès de ${character.name}`, date: character.death } as CalendarEvent + }) + }) + + return { characterBirthEvents, characterDeathEvents } +}) diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 724c8b6..e722a57 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,10 +1,13 @@ @@ -45,5 +48,9 @@ const monthTarget = ref(0) + +
+      {{ characterDeathEvents }}
+    
From 196c06ece484adab10d5bd73f15316b01f0f96c7 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Mon, 1 Apr 2024 00:19:13 +0200 Subject: [PATCH 04/63] Added current event state --- .eslintrc.cjs | 2 +- src/stores/calendar.ts | 28 +++++++++++++++---- src/stores/characters.ts | 2 +- src/stores/events.ts | 60 ++++++++++++++++++++++++++++++++++------ src/views/HomeView.vue | 10 ++++--- 5 files changed, 82 insertions(+), 20 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 2bbbb28..95aefff 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -23,7 +23,7 @@ module.exports = { ecmaVersion: 'latest' }, rules: { - indent: ['error', 2], + indent: ['error', 2, { SwitchCase: 1 }], 'prettier/prettier': [ 'error', { diff --git a/src/stores/calendar.ts b/src/stores/calendar.ts index 3e6cda7..bc0a14c 100644 --- a/src/stores/calendar.ts +++ b/src/stores/calendar.ts @@ -1,8 +1,10 @@ -import { computed, type Ref, type ComputedRef } from 'vue' +import { computed, type Ref, type ComputedRef, ref } from 'vue' import { defineStore } from 'pinia' import { useUrlSearchParams } from '@vueuse/core' import type { LeimPeriod } from '@/models/Date' +type CalendarViewType = 'month' | 'year' | 'decade' | 'century' + type CalendarStaticConfig = { months: string[] monthsPerYear: number @@ -12,6 +14,10 @@ type CalendarStaticConfig = { } type CalendarCurrentConfig = { + viewType: CalendarViewType +} + +type CalendarCurrentDate = { currentPeriod: Ref currentYear: ComputedRef currentMonth: ComputedRef @@ -20,7 +26,13 @@ type CalendarCurrentConfig = { } export const useCalendar = defineStore('calendar', () => { - // Static calendar config + /** + * Static calendar config + * This shouldn't change + */ + /** + * Month list + */ const months = [ 'Jalen', 'Malsen', @@ -38,6 +50,7 @@ export const useCalendar = defineStore('calendar', () => { const daysPerMonth = computed(() => daysPerYear / monthsPerYear.value) const daysPerWeek = 6 + // Assign the static config const staticConfig: CalendarStaticConfig = { months, monthsPerYear: monthsPerYear.value, @@ -46,6 +59,10 @@ export const useCalendar = defineStore('calendar', () => { daysPerWeek } + const currentConfig: Ref = ref({ + viewType: 'century' + }) + // Get date from URL params const params = useUrlSearchParams('history', { removeNullishValues: true @@ -53,7 +70,7 @@ export const useCalendar = defineStore('calendar', () => { // Default date settings (current day) const defaultDay = String(12) - const defaultMonth = String(8) + const defaultMonth = String(7) const defaultYear = String(3209) // Assign default values if no params exist in URL @@ -85,7 +102,7 @@ export const useCalendar = defineStore('calendar', () => { }) // Create base config - const config: CalendarCurrentConfig = { + const currentDate: CalendarCurrentDate = { currentDay, currentMonth, currentYear, @@ -159,7 +176,8 @@ export const useCalendar = defineStore('calendar', () => { return { staticConfig, - config, + currentConfig, + currentDate, params, incrementMonth, decrementMonth, diff --git a/src/stores/characters.ts b/src/stores/characters.ts index 5cca8c6..e124ac8 100644 --- a/src/stores/characters.ts +++ b/src/stores/characters.ts @@ -1,7 +1,7 @@ import { defineStore } from 'pinia' import type { LeimDate } from '@/models/Date' -type Character = { +export type Character = { name: string birth?: LeimDate death?: LeimDate diff --git a/src/stores/events.ts b/src/stores/events.ts index 591ea5a..193f548 100644 --- a/src/stores/events.ts +++ b/src/stores/events.ts @@ -1,8 +1,9 @@ -import { defineStore } from 'pinia' -import { computed } from 'vue' -import { useCharacters } from './characters' +import { defineStore, storeToRefs } from 'pinia' +import { computed, watch, type ComputedRef, toRefs, type Ref, ref } from 'vue' +import { useCharacters, type Character } from './characters' import type { LeimDate } from '@/models/Date' +import { useCalendar } from './calendar' type CalendarEvent = { title: string @@ -11,20 +12,61 @@ type CalendarEvent = { export const useCalendarEvents = defineStore('calendar-events', () => { const { characters } = useCharacters() + const calendarStore = useCalendar() + const charactersWithBirthData: ComputedRef = computed(() => + characters.filter((character) => character.birth) + ) const characterBirthEvents = computed(() => { - const charactersWithBirthData = characters.filter((character) => character.birth) - return charactersWithBirthData.map((character) => { + return charactersWithBirthData.value.map((character) => { return { title: `Naissance de ${character.name}`, date: character.birth } as CalendarEvent }) }) - + const charactersWithDeathData: ComputedRef = computed(() => + characters.filter((character) => character.death) + ) const characterDeathEvents = computed(() => { - const charactersWithDeathData = characters.filter((character) => character.death) - return charactersWithDeathData.map((character) => { + return charactersWithDeathData.value.map((character) => { return { title: `Décès de ${character.name}`, date: character.death } as CalendarEvent }) }) - return { characterBirthEvents, characterDeathEvents } + const currentEvents: Ref = ref(computeCurrentEvents()) + + watch(calendarStore.currentDate, () => { + currentEvents.value = computeCurrentEvents() + }) + + function shouldEventBeDisplayed(event: CalendarEvent): boolean { + switch (calendarStore.currentConfig.viewType) { + case 'month': + return event.date.month === Number(calendarStore.currentDate.currentMonth) + + case 'year': + return event.date.year === Number(calendarStore.currentDate.currentYear) + + case 'decade': + return ( + event.date.year >= Number(calendarStore.currentDate.currentYear) - 10 && + event.date.year <= Number(calendarStore.currentDate.currentYear) + 10 + ) + + case 'century': + return ( + event.date.year >= Number(calendarStore.currentDate.currentYear) - 100 && + event.date.year <= Number(calendarStore.currentDate.currentYear) + 100 + ) + + default: + return false + } + } + + function computeCurrentEvents(): CalendarEvent[] { + const allEvents = [...characterBirthEvents.value, ...characterDeathEvents.value] + + return allEvents.filter((event) => shouldEventBeDisplayed(event)) + } + + return { currentEvents } }) diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index e722a57..58074de 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -2,11 +2,12 @@ import { ref } from 'vue' import { useCalendar } from '@/stores/calendar' import { useCalendarEvents } from '@/stores/events' +import { storeToRefs } from 'pinia' -const { config, incrementMonth, decrementMonth, setMonth, incrementYear, decrementYear } = +const { currentDate, incrementMonth, decrementMonth, setMonth, incrementYear, decrementYear } = useCalendar() -const { characterBirthEvents, characterDeathEvents } = useCalendarEvents() +const { currentEvents } = storeToRefs(useCalendarEvents()) const monthTarget = ref(0) @@ -14,7 +15,7 @@ const monthTarget = ref(0) From 39c03c970636a30b9ab91ec5c4467fdff0c87570 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Mon, 1 Apr 2024 00:29:13 +0200 Subject: [PATCH 05/63] Added comments to event store --- src/stores/events.ts | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/stores/events.ts b/src/stores/events.ts index 193f548..985551c 100644 --- a/src/stores/events.ts +++ b/src/stores/events.ts @@ -1,5 +1,5 @@ -import { defineStore, storeToRefs } from 'pinia' -import { computed, watch, type ComputedRef, toRefs, type Ref, ref } from 'vue' +import { defineStore } from 'pinia' +import { computed, watch, type ComputedRef, type Ref, ref } from 'vue' import { useCharacters, type Character } from './characters' import type { LeimDate } from '@/models/Date' @@ -12,8 +12,9 @@ type CalendarEvent = { export const useCalendarEvents = defineStore('calendar-events', () => { const { characters } = useCharacters() - const calendarStore = useCalendar() + const { currentDate, currentConfig } = useCalendar() + // Get all birth events const charactersWithBirthData: ComputedRef = computed(() => characters.filter((character) => character.birth) ) @@ -22,6 +23,8 @@ export const useCalendarEvents = defineStore('calendar-events', () => { return { title: `Naissance de ${character.name}`, date: character.birth } as CalendarEvent }) }) + + // Get all death events const charactersWithDeathData: ComputedRef = computed(() => characters.filter((character) => character.death) ) @@ -31,30 +34,40 @@ export const useCalendarEvents = defineStore('calendar-events', () => { }) }) + // Gets all current event in its default state const currentEvents: Ref = ref(computeCurrentEvents()) - watch(calendarStore.currentDate, () => { + // Watch for currentDate changes + watch(currentDate, () => { currentEvents.value = computeCurrentEvents() }) + /** + * Determines if the event can appear in the front end + * + * This function takes into consideration the viewType of the calendar config + * + * @param event The event to analyze + * @returns Whether the event should appear in the current view + */ function shouldEventBeDisplayed(event: CalendarEvent): boolean { - switch (calendarStore.currentConfig.viewType) { + switch (currentConfig.viewType) { case 'month': - return event.date.month === Number(calendarStore.currentDate.currentMonth) + return event.date.month === Number(currentDate.currentMonth) case 'year': - return event.date.year === Number(calendarStore.currentDate.currentYear) + return event.date.year === Number(currentDate.currentYear) case 'decade': return ( - event.date.year >= Number(calendarStore.currentDate.currentYear) - 10 && - event.date.year <= Number(calendarStore.currentDate.currentYear) + 10 + event.date.year >= Number(currentDate.currentYear) - 10 && + event.date.year <= Number(currentDate.currentYear) + 10 ) case 'century': return ( - event.date.year >= Number(calendarStore.currentDate.currentYear) - 100 && - event.date.year <= Number(calendarStore.currentDate.currentYear) + 100 + event.date.year >= Number(currentDate.currentYear) - 100 && + event.date.year <= Number(currentDate.currentYear) + 100 ) default: @@ -62,6 +75,11 @@ export const useCalendarEvents = defineStore('calendar-events', () => { } } + /** + * Fetches all the current events for the current view + * + * @returns A list of events that can appear in the current view + */ function computeCurrentEvents(): CalendarEvent[] { const allEvents = [...characterBirthEvents.value, ...characterDeathEvents.value] From c1edf3b5ea8c3b1b88b11e57797da858cb3d410d Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Mon, 1 Apr 2024 11:53:13 +0200 Subject: [PATCH 06/63] Added base calendar formatting --- src/App.vue | 4 +++- src/components/Calendar.vue | 40 ++++++++++++++++++++++++++++++++ src/components/CalendarMenu.vue | 33 ++++++++++++++++++++++++++ src/components/state/Century.vue | 9 +++++++ src/components/state/Decade.vue | 3 +++ src/components/state/Monthly.vue | 3 +++ src/components/state/Year.vue | 3 +++ src/models/Date.ts | 1 + src/stores/calendar.ts | 35 +++++++++++++++++++++++----- src/stores/events.ts | 4 ++-- src/views/HomeView.vue | 19 ++++----------- 11 files changed, 131 insertions(+), 23 deletions(-) create mode 100644 src/components/Calendar.vue create mode 100644 src/components/CalendarMenu.vue create mode 100644 src/components/state/Century.vue create mode 100644 src/components/state/Decade.vue create mode 100644 src/components/state/Monthly.vue create mode 100644 src/components/state/Year.vue diff --git a/src/App.vue b/src/App.vue index a78fb6f..ed2af98 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,5 +3,7 @@ import { RouterView } from 'vue-router' diff --git a/src/components/Calendar.vue b/src/components/Calendar.vue new file mode 100644 index 0000000..d9a3835 --- /dev/null +++ b/src/components/Calendar.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/components/CalendarMenu.vue b/src/components/CalendarMenu.vue new file mode 100644 index 0000000..8a70e70 --- /dev/null +++ b/src/components/CalendarMenu.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/state/Century.vue b/src/components/state/Century.vue new file mode 100644 index 0000000..1c83776 --- /dev/null +++ b/src/components/state/Century.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/components/state/Decade.vue b/src/components/state/Decade.vue new file mode 100644 index 0000000..1c6de81 --- /dev/null +++ b/src/components/state/Decade.vue @@ -0,0 +1,3 @@ + diff --git a/src/components/state/Monthly.vue b/src/components/state/Monthly.vue new file mode 100644 index 0000000..6a1ce67 --- /dev/null +++ b/src/components/state/Monthly.vue @@ -0,0 +1,3 @@ + diff --git a/src/components/state/Year.vue b/src/components/state/Year.vue new file mode 100644 index 0000000..b5256a2 --- /dev/null +++ b/src/components/state/Year.vue @@ -0,0 +1,3 @@ + diff --git a/src/models/Date.ts b/src/models/Date.ts index 37872e8..6c8950a 100644 --- a/src/models/Date.ts +++ b/src/models/Date.ts @@ -6,3 +6,4 @@ export type LeimDate = { } export type LeimPeriod = 'ante' | 'nante' +export type LeimPeriodShort = 'A.R' | 'N.R' diff --git a/src/stores/calendar.ts b/src/stores/calendar.ts index bc0a14c..a28a897 100644 --- a/src/stores/calendar.ts +++ b/src/stores/calendar.ts @@ -1,7 +1,7 @@ import { computed, type Ref, type ComputedRef, ref } from 'vue' import { defineStore } from 'pinia' import { useUrlSearchParams } from '@vueuse/core' -import type { LeimPeriod } from '@/models/Date' +import type { LeimPeriod, LeimPeriodShort } from '@/models/Date' type CalendarViewType = 'month' | 'year' | 'decade' | 'century' @@ -18,11 +18,12 @@ type CalendarCurrentConfig = { } type CalendarCurrentDate = { - currentPeriod: Ref - currentYear: ComputedRef - currentMonth: ComputedRef currentDay: ComputedRef + currentMonth: ComputedRef currentMonthName: ComputedRef + currentYear: ComputedRef + currentPeriod: Ref + currentPeriodAbbr: Ref } export const useCalendar = defineStore('calendar', () => { @@ -60,7 +61,7 @@ export const useCalendar = defineStore('calendar', () => { } const currentConfig: Ref = ref({ - viewType: 'century' + viewType: 'month' }) // Get date from URL params @@ -100,14 +101,18 @@ export const useCalendar = defineStore('calendar', () => { const year = Number(currentYear.value) return year >= 0 ? 'nante' : 'ante' }) + const currentPeriodAbbr: ComputedRef = computed(() => { + return currentPeriod.value === 'ante' ? 'A.R' : 'N.R' + }) // Create base config const currentDate: CalendarCurrentDate = { currentDay, currentMonth, + currentMonthName, currentYear, currentPeriod, - currentMonthName + currentPeriodAbbr } /** @@ -174,11 +179,29 @@ export const useCalendar = defineStore('calendar', () => { params.year = newValue.toString() } + /** + * From a given year, returns a set of LeimPeriod identifier + * + * This is used in range use-cases + * + * @param year The year to display + * @returns An object containing both short and long LeimPeriod + */ + function getPeriodOfYear(year: string | number): { long: LeimPeriod; short: LeimPeriodShort } { + const numYear = year as number + + return { + long: numYear >= 0 ? 'nante' : 'ante', + short: numYear >= 0 ? 'N.R' : 'A.R' + } + } + return { staticConfig, currentConfig, currentDate, params, + getPeriodOfYear, incrementMonth, decrementMonth, setMonth, diff --git a/src/stores/events.ts b/src/stores/events.ts index 985551c..9ca812c 100644 --- a/src/stores/events.ts +++ b/src/stores/events.ts @@ -60,13 +60,13 @@ export const useCalendarEvents = defineStore('calendar-events', () => { case 'decade': return ( - event.date.year >= Number(currentDate.currentYear) - 10 && + event.date.year >= Number(currentDate.currentYear) && event.date.year <= Number(currentDate.currentYear) + 10 ) case 'century': return ( - event.date.year >= Number(currentDate.currentYear) - 100 && + event.date.year >= Number(currentDate.currentYear) && event.date.year <= Number(currentDate.currentYear) + 100 ) diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 58074de..401a6c1 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,20 +1,11 @@ From abc4d908f17e30e04e3a8b3c932a464dc8698bb5 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Mon, 1 Apr 2024 11:56:03 +0200 Subject: [PATCH 07/63] Added shadcn setup --- components.json | 16 +++ package-lock.json | 342 ++++++++++++++++++++++++++++---------------- package.json | 6 + src/assets/main.css | 75 ++++++++++ src/lib/utils.ts | 6 + tailwind.config.js | 98 +++++++++++-- 6 files changed, 411 insertions(+), 132 deletions(-) create mode 100644 components.json create mode 100644 src/lib/utils.ts diff --git a/components.json b/components.json new file mode 100644 index 0000000..9c826ef --- /dev/null +++ b/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://shadcn-vue.com/schema.json", + "style": "default", + "typescript": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/assets/main.css", + "baseColor": "slate", + "cssVariables": true + }, + "framework": "vite", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9c98bfc..d9febb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,13 @@ "version": "0.0.0", "dependencies": { "@vueuse/core": "^10.9.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "lucide-vue-next": "^0.364.0", "pinia": "^2.1.7", + "radix-vue": "^1.6.1", + "tailwind-merge": "^2.2.2", + "tailwindcss-animate": "^1.0.7", "vue": "^3.4.21", "vue-router": "^4.3.0" }, @@ -49,7 +55,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -68,6 +73,17 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -572,6 +588,63 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@floating-ui/vue": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.0.6.tgz", + "integrity": "sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==", + "dependencies": { + "@floating-ui/dom": "^1.6.1", + "@floating-ui/utils": "^0.2.1", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -642,11 +715,18 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, + "node_modules/@internationalized/date": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz", + "integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -663,7 +743,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -675,7 +754,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { "node": ">=12" }, @@ -686,14 +764,12 @@ "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -710,7 +786,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -725,7 +800,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -742,7 +816,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -756,7 +829,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -765,7 +837,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -779,7 +850,6 @@ "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -789,7 +859,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -802,7 +871,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -811,7 +879,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -824,7 +891,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" @@ -1064,6 +1130,14 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, + "node_modules/@swc/helpers": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.8.tgz", + "integrity": "sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@tsconfig/node20": { "version": "20.1.4", "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", @@ -1696,7 +1770,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1705,7 +1778,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1719,14 +1791,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1758,8 +1828,7 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -1767,6 +1836,17 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -1910,8 +1990,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -1946,7 +2025,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -1976,7 +2054,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -1985,7 +2062,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -2099,7 +2175,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -2171,7 +2246,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2195,7 +2269,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -2218,6 +2291,25 @@ "node": ">=8" } }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -2270,11 +2362,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2285,8 +2384,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colorette": { "version": "2.0.20", @@ -2346,7 +2444,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2360,7 +2457,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -2494,6 +2590,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2506,8 +2607,7 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -2524,8 +2624,7 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -2548,8 +2647,7 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/ecc-jsbn": { "version": "0.1.2", @@ -2570,8 +2668,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -3025,8 +3122,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", @@ -3038,7 +3134,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3054,7 +3149,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -3078,7 +3172,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -3132,7 +3225,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3200,7 +3292,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -3216,7 +3307,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -3291,7 +3381,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -3305,7 +3394,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3386,7 +3474,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -3539,7 +3626,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -3671,7 +3757,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -3695,7 +3780,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -3707,7 +3791,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3716,7 +3799,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -3725,7 +3807,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -3753,7 +3834,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -3800,8 +3880,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isstream": { "version": "0.1.2", @@ -3813,7 +3892,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -3831,7 +3909,6 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -3968,7 +4045,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -3976,8 +4052,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listr2": { "version": "3.14.0", @@ -4116,6 +4191,14 @@ "node": ">=10" } }, + "node_modules/lucide-vue-next": { + "version": "0.364.0", + "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.364.0.tgz", + "integrity": "sha512-O8MQEEktkd5zL+1S40P3UnEXotR6lrN0oaV/8uyVQCwvBMWlnTKlwIg4Rd8yDBGrALFOAiyCLu69y4gh82fNew==", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, "node_modules/magic-string": { "version": "0.30.8", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", @@ -4152,7 +4235,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -4161,7 +4243,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -4204,7 +4285,6 @@ "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4228,7 +4308,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -4249,7 +4328,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -4289,7 +4367,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4377,7 +4454,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4386,7 +4462,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -4532,7 +4607,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -4540,14 +4614,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", - "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -4563,7 +4635,6 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, "engines": { "node": "14 || >=16.14" } @@ -4607,7 +4678,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -4631,7 +4701,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4690,7 +4759,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -4726,7 +4794,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -4743,7 +4810,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -4762,7 +4828,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4797,7 +4862,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "dev": true, "engines": { "node": ">=14" }, @@ -4809,7 +4873,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -4828,7 +4891,6 @@ "version": "6.0.16", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -4840,8 +4902,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -4971,7 +5032,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -4987,11 +5047,46 @@ } ] }, + "node_modules/radix-vue": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/radix-vue/-/radix-vue-1.6.1.tgz", + "integrity": "sha512-/nnA4u8oYAZK86unEjRuIROrTDDU0HHiwkCgGI0YeCNpyObSnbC1CZJlXUBErdY51yxcqV4cU4WJBKwQC8iRFA==", + "dependencies": { + "@floating-ui/dom": "^1.5.4", + "@floating-ui/vue": "^1.0.4", + "@internationalized/date": "^3.5.2", + "@vueuse/core": "^10.5.0", + "@vueuse/shared": "^10.5.0", + "aria-hidden": "^1.2.3", + "defu": "^6.1.4", + "fast-deep-equal": "^3.1.3", + "nanoid": "^5.0.6" + }, + "peerDependencies": { + "vue": ">= 3.2.0" + } + }, + "node_modules/radix-vue/node_modules/nanoid": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.6.tgz", + "integrity": "sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -5013,7 +5108,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -5021,6 +5115,11 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/request-progress": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", @@ -5040,7 +5139,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -5079,7 +5177,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -5144,7 +5241,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -5234,7 +5330,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -5246,7 +5341,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -5433,7 +5527,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5448,7 +5541,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5462,7 +5554,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5475,7 +5566,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5508,7 +5598,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -5530,7 +5619,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } @@ -5539,7 +5627,6 @@ "version": "10.3.12", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", - "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.6", @@ -5576,7 +5663,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -5600,11 +5686,22 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tailwind-merge": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.2.tgz", + "integrity": "sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==", + "dependencies": { + "@babel/runtime": "^7.24.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", - "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -5637,6 +5734,14 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5647,7 +5752,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -5656,7 +5760,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -5692,7 +5795,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -5739,14 +5841,12 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -5879,8 +5979,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "8.3.2", @@ -6068,7 +6167,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -6101,7 +6199,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6139,7 +6236,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", - "dev": true, "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index be1e4dc..423abc5 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,13 @@ }, "dependencies": { "@vueuse/core": "^10.9.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "lucide-vue-next": "^0.364.0", "pinia": "^2.1.7", + "radix-vue": "^1.6.1", + "tailwind-merge": "^2.2.2", + "tailwindcss-animate": "^1.0.7", "vue": "^3.4.21", "vue-router": "^4.3.0" }, diff --git a/src/assets/main.css b/src/assets/main.css index b5c61c9..10b7e9c 100644 --- a/src/assets/main.css +++ b/src/assets/main.css @@ -1,3 +1,78 @@ @tailwind base; @tailwind components; @tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..d32b0fe --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/tailwind.config.js b/tailwind.config.js index 878a16e..d803171 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,13 +1,93 @@ +const animate = require("tailwindcss-animate") + /** @type {import('tailwindcss').Config} */ -export default { - content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], +module.exports = { + darkMode: ["class"], + safelist: ["dark"], + prefix: "", + + content: [ + './pages/**/*.{ts,tsx,vue}', + './components/**/*.{ts,tsx,vue}', + './app/**/*.{ts,tsx,vue}', + './src/**/*.{ts,tsx,vue}', + ], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, extend: { - container: { - padding: '2rem', - center: true - } - } + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + xl: "calc(var(--radius) + 4px)", + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + "collapsible-down": { + from: { height: 0 }, + to: { height: 'var(--radix-collapsible-content-height)' }, + }, + "collapsible-up": { + from: { height: 'var(--radix-collapsible-content-height)' }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "collapsible-down": "collapsible-down 0.2s ease-in-out", + "collapsible-up": "collapsible-up 0.2s ease-in-out", + }, + }, }, - plugins: [] -} + plugins: [animate], +} \ No newline at end of file From e7d3fd3fd3b3e449df4021bae35d7a919673b889 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Mon, 1 Apr 2024 15:05:08 +0200 Subject: [PATCH 08/63] Added grid layout for monthly view --- package-lock.json | 24 ++++++ package.json | 1 + src/App.vue | 3 + src/assets/theme.css | 86 ------------------- src/components/CalendarMenu.vue | 33 ------- src/components/{ => calendar}/Calendar.vue | 35 ++++---- src/components/calendar/CalendarMenu.vue | 41 +++++++++ src/components/calendar/CalendarTile.vue | 29 +++++++ .../{ => calendar}/state/Century.vue | 0 .../{ => calendar}/state/Decade.vue | 0 src/components/calendar/state/Monthly.vue | 21 +++++ src/components/{ => calendar}/state/Year.vue | 0 src/components/state/Monthly.vue | 3 - src/components/ui/button/Button.vue | 26 ++++++ src/components/ui/button/index.ts | 34 ++++++++ src/components/ui/select/Select.vue | 15 ++++ src/components/ui/select/SelectContent.vue | 53 ++++++++++++ src/components/ui/select/SelectGroup.vue | 19 ++++ src/components/ui/select/SelectItem.vue | 44 ++++++++++ src/components/ui/select/SelectItemText.vue | 11 +++ src/components/ui/select/SelectLabel.vue | 13 +++ .../ui/select/SelectScrollDownButton.vue | 24 ++++++ .../ui/select/SelectScrollUpButton.vue | 24 ++++++ src/components/ui/select/SelectSeparator.vue | 17 ++++ src/components/ui/select/SelectTrigger.vue | 31 +++++++ src/components/ui/select/SelectValue.vue | 11 +++ src/components/ui/select/index.ts | 11 +++ src/main.ts | 1 - src/stores/calendar.ts | 30 ++++++- src/views/HomeView.vue | 4 +- 30 files changed, 498 insertions(+), 146 deletions(-) delete mode 100644 src/assets/theme.css delete mode 100644 src/components/CalendarMenu.vue rename src/components/{ => calendar}/Calendar.vue (56%) create mode 100644 src/components/calendar/CalendarMenu.vue create mode 100644 src/components/calendar/CalendarTile.vue rename src/components/{ => calendar}/state/Century.vue (100%) rename src/components/{ => calendar}/state/Decade.vue (100%) create mode 100644 src/components/calendar/state/Monthly.vue rename src/components/{ => calendar}/state/Year.vue (100%) delete mode 100644 src/components/state/Monthly.vue create mode 100644 src/components/ui/button/Button.vue create mode 100644 src/components/ui/button/index.ts create mode 100644 src/components/ui/select/Select.vue create mode 100644 src/components/ui/select/SelectContent.vue create mode 100644 src/components/ui/select/SelectGroup.vue create mode 100644 src/components/ui/select/SelectItem.vue create mode 100644 src/components/ui/select/SelectItemText.vue create mode 100644 src/components/ui/select/SelectLabel.vue create mode 100644 src/components/ui/select/SelectScrollDownButton.vue create mode 100644 src/components/ui/select/SelectScrollUpButton.vue create mode 100644 src/components/ui/select/SelectSeparator.vue create mode 100644 src/components/ui/select/SelectTrigger.vue create mode 100644 src/components/ui/select/SelectValue.vue create mode 100644 src/components/ui/select/index.ts diff --git a/package-lock.json b/package-lock.json index d9febb4..4d804e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,7 @@ "npm-run-all2": "^6.1.2", "postcss": "^8.4.38", "prettier": "^3.0.3", + "sass": "^1.72.0", "start-server-and-test": "^2.0.3", "tailwindcss": "^3.4.3", "typescript": "~5.4.0", @@ -3694,6 +3695,12 @@ "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5294,6 +5301,23 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/sass": { + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", diff --git a/package.json b/package.json index 423abc5..d7bf905 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "npm-run-all2": "^6.1.2", "postcss": "^8.4.38", "prettier": "^3.0.3", + "sass": "^1.72.0", "start-server-and-test": "^2.0.3", "tailwindcss": "^3.4.3", "typescript": "~5.4.0", diff --git a/src/App.vue b/src/App.vue index ed2af98..15727d4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,8 @@