From ecc6a55aba7bb35fc778e7a53848396b88214151 Mon Sep 17 00:00:00 2001 From: Leonardo Bishop Date: Sat, 23 Aug 2025 22:29:28 +0100 Subject: Add multiple conferences feature --- web/assets/css/main.css | 44 ++++++++++++ web/components/AddConference.vue | 54 +++++++++++++++ web/components/Button.vue | 2 +- web/components/Dialog.vue | 2 +- web/components/EventDetail.vue | 2 +- web/components/EventListing.vue | 10 +-- web/components/Input.vue | 2 +- web/components/Panel.vue | 15 ++-- web/components/Sidebar.vue | 47 +++++++------ web/composables/api.ts | 14 ++++ web/composables/expire-auth.ts | 8 +++ web/composables/fetch-favourites.ts | 36 +++++----- web/composables/fetch-login.ts | 6 +- web/composables/fetch-schedule.ts | 57 ++++++++++------ web/composables/logout.ts | 15 ++++ web/layouts/default.vue | 49 ++++++++------ web/middleware/conference-selected.ts | 15 ++++ web/middleware/logged-in.ts | 19 +----- web/nuxt.config.ts | 2 +- web/package-lock.json | 41 +++++++++++ web/package.json | 1 + web/pages/agenda.vue | 52 +++++++------- web/pages/conferences.vue | 124 ++++++++++++++++++++++++++++++++++ web/pages/events.vue | 11 ++- web/pages/index.vue | 9 +++ web/pages/live.vue | 9 +++ web/pages/login/[[provider]].vue | 98 ++++++++++++--------------- web/pages/tracks/[slug].vue | 9 +++ web/pages/tracks/index.vue | 12 +++- web/stores/auth.ts | 12 ++++ web/stores/conference.ts | 18 +++++ web/stores/favourites.ts | 6 +- web/stores/login-options.ts | 10 +-- web/stores/schedule.ts | 8 ++- 34 files changed, 604 insertions(+), 215 deletions(-) create mode 100644 web/components/AddConference.vue create mode 100644 web/composables/api.ts create mode 100644 web/composables/expire-auth.ts create mode 100644 web/composables/logout.ts create mode 100644 web/middleware/conference-selected.ts create mode 100644 web/pages/conferences.vue create mode 100644 web/stores/auth.ts create mode 100644 web/stores/conference.ts (limited to 'web') diff --git a/web/assets/css/main.css b/web/assets/css/main.css index 320bedb..5b88e8c 100644 --- a/web/assets/css/main.css +++ b/web/assets/css/main.css @@ -99,4 +99,48 @@ span.text-icon { display: flex; align-items: center; gap: 0.4em; +} + +form { + display: grid; + gap: 1.5rem; +} + +div.form-group { + display: flex; + flex-direction: column; +} + +label.form-label { + display: block; + font-size: 0.875rem; + font-weight: 500; + color: #374151; +} + +div.form-input-container { + margin-top: 0.25rem; +} + +div.form-submit { + display: flex; + justify-content: flex-end; +} + +.loading-text { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; + font-size: var(--text-normal); + color: var(--color-text-muted); +} + +table { + width: 100%; +} + +th { + font-weight: bold; + text-align: left; } \ No newline at end of file diff --git a/web/components/AddConference.vue b/web/components/AddConference.vue new file mode 100644 index 0000000..95154d4 --- /dev/null +++ b/web/components/AddConference.vue @@ -0,0 +1,54 @@ + + + + + \ No newline at end of file diff --git a/web/components/Button.vue b/web/components/Button.vue index ce9eefc..27cfa4e 100644 --- a/web/components/Button.vue +++ b/web/components/Button.vue @@ -48,7 +48,7 @@ button { gap: 0.4rem; padding: 0.5rem 1rem; border: 1px solid transparent; - border-radius: 0.375rem; + border-radius: 2px; font-size: var(--text-small); font-family: var(--font-family); font-weight: 500; diff --git a/web/components/Dialog.vue b/web/components/Dialog.vue index 7772f23..04e1461 100644 --- a/web/components/Dialog.vue +++ b/web/components/Dialog.vue @@ -72,7 +72,7 @@ const onDialogClick = (e: MouseEvent) => { \ No newline at end of file diff --git a/web/pages/events.vue b/web/pages/events.vue index 093e959..d369bdc 100644 --- a/web/pages/events.vue +++ b/web/pages/events.vue @@ -2,12 +2,21 @@ import { Calendar, SquareGanttChart } from 'lucide-vue-next'; import { useScheduleStore } from '~/stores/schedule'; +definePageMeta({ + middleware: ['logged-in', 'conference-selected'] +}) + const scheduleStore = useScheduleStore();