From 33fcb1642791815a742321dc2a6d26f1b466eb7c Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Thu, 27 Nov 2025 15:19:05 -0500 Subject: [PATCH] beat calendar styling into submission to support multi day events --- api/src/services/calendarService.ts | 2 +- shared/types/calendar.ts | 1 + .../calendar/CreateCalendarEvent.vue | 1 - ui/src/pages/Calendar.vue | 33 ++++++++----------- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/api/src/services/calendarService.ts b/api/src/services/calendarService.ts index f91e02c..ce4e805 100644 --- a/api/src/services/calendarService.ts +++ b/api/src/services/calendarService.ts @@ -65,7 +65,7 @@ export async function cancelEvent(eventID: number) { export async function getShortEventsInRange(startDate: string, endDate: string): Promise { const sql = ` - SELECT id, name, start, end, color, cancelled + SELECT id, name, start, end, color, cancelled, full_day FROM calendar_events WHERE start BETWEEN ? AND ? ORDER BY start ASC diff --git a/shared/types/calendar.ts b/shared/types/calendar.ts index 184abaf..526068f 100644 --- a/shared/types/calendar.ts +++ b/shared/types/calendar.ts @@ -35,4 +35,5 @@ export interface CalendarEventShort { end: Date; color: string; cancelled: boolean; + full_day: boolean; } \ No newline at end of file diff --git a/ui/src/components/calendar/CreateCalendarEvent.vue b/ui/src/components/calendar/CreateCalendarEvent.vue index 78dfcad..62d812c 100644 --- a/ui/src/components/calendar/CreateCalendarEvent.vue +++ b/ui/src/components/calendar/CreateCalendarEvent.vue @@ -44,7 +44,6 @@ function roundToNextHour(d = new Date()) { return t } - import { calendarEventSchema, parseLocalDateTime } from '@shared/schemas/calendarEventSchema' import { createCalendarEvent } from "@/api/calendar" const formSchema = toTypedSchema(calendarEventSchema) diff --git a/ui/src/pages/Calendar.vue b/ui/src/pages/Calendar.vue index c1cdc3b..271861c 100644 --- a/ui/src/pages/Calendar.vue +++ b/ui/src/pages/Calendar.vue @@ -264,7 +264,7 @@ onMounted(() => { filter: grayscale(100%); } -.calendar-card { +:global(.calendar-card) { background: var(--color-card); border: 1px solid var(--color-border); border-radius: var(--radius-xl); @@ -292,7 +292,9 @@ onMounted(() => { /* no internal scroll for month grid */ } - +:global(.fc-daygrid:hover) { + cursor: pointer; +} /* Subtle borders everywhere */ :global(.fc .fc-scrollgrid), @@ -355,6 +357,7 @@ onMounted(() => { font-weight: 600; font-size: 12px; text-decoration: none; + height: 26px; } /* Today: soft background + stronger number */ @@ -378,7 +381,6 @@ onMounted(() => { background: transparent; color: var(--color-foreground); border-radius: 4px; - padding: 4px 8px; margin: 2px 6px; text-decoration: none; transition: background 120ms ease, border-color 120ms ease, transform 120ms ease; @@ -389,14 +391,7 @@ onMounted(() => { border-color: color-mix(in oklab, var(--color-foreground) 12%, var(--color-border)); } -/* One-line custom pill content (our renderer) */ -:global(.ev-pill) { - display: flex; - align-items: center; - gap: 6px; - min-width: 0; - color: inherit; -} + :global(.ev-dot) { width: 8px; @@ -423,16 +418,14 @@ onMounted(() => { } /* One-line custom pill */ -.ev-pill { +:global(.ev-pill) { display: flex; align-items: center; gap: 6px; min-width: 0; padding: 4px 8px; - border-radius: 14px; - border: 1px solid var(--color-border); - background: color-mix(in oklab, var(--color-primary) 14%, transparent); - color: var(--color-foreground); + border-radius: 6px; + background: color-mix(in srgb, var(--ev-color) 15%, transparent); text-decoration: none; transition: background 120ms ease, border-color 120ms ease, transform 120ms ease; } @@ -469,15 +462,17 @@ onMounted(() => { color: var(--color-primary-foreground); } +:global(.fc-daygrid-top) { + margin-bottom: 2px; +} + /* --- Replace the default today highlight with a round badge --- */ :global(.fc .fc-daygrid-day.fc-day-today) { background: transparent; } :global(.fc .fc-daygrid-day.fc-day-today .fc-daygrid-day-number) { - display: inline-block; - padding: 2px 8px; - border-radius: 9999px; + border-radius: 6px; background: color-mix(in oklab, var(--color-primary) 100%, transparent); font-weight: 700; text-decoration: none;