From c29f7939732a14c26762784be5be928353918cfc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 09:49:45 +0000 Subject: [PATCH] feat: mobile-first redesign (warm notebook aesthetic, thumb-zone capture bar) - Editorial masthead (Fraunces + Spline Sans), warm paper/ink palette with terracotta accent, matching dark mode - Thumb-zone composer: single capture input + round submit, optional note toggle, refocus after add for rapid capture - Mobile-first CSS: 44-50px touch targets, 16px inputs (no iOS zoom), edge-to-edge scroll-snap list chips, safe-area insets, tap-highlight off, contained overscroll; desktop as min-width enhancement - Staggered task-card entrance (reduced-motion aware), themed empty states - Head: theme-color light/dark, Apple web-app metas, lang attr, font preconnect Co-Authored-By: Claude Opus 4.8 --- app/pages/auth/callback.vue | 11 +- app/pages/index.vue | 344 +++++++++++++++++++++++++++--------- nuxt.config.ts | 14 ++ 3 files changed, 282 insertions(+), 87 deletions(-) diff --git a/app/pages/auth/callback.vue b/app/pages/auth/callback.vue index 3160815..037f835 100644 --- a/app/pages/auth/callback.vue +++ b/app/pages/auth/callback.vue @@ -17,7 +17,14 @@ onMounted(() => { min-height: 100dvh; display: grid; place-items: center; - color: #6b7280; - font: 500 1rem/1.4 system-ui, sans-serif; + background: #f4f1ea; + color: #837a6b; + font: 500 1rem/1.4 "Spline Sans", system-ui, sans-serif; +} +@media (prefers-color-scheme: dark) { + .callback { + background: #181410; + color: #9d9281; + } } diff --git a/app/pages/index.vue b/app/pages/index.vue index 5ffd6f6..18543a4 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -24,10 +24,18 @@ const error = ref(null); const title = ref(""); const description = ref(""); +const showNote = ref(false); const adding = ref(false); +const titleInput = ref(null); const selectedList = computed(() => lists.value.find((l) => l.id === selectedId.value) ?? null); +const today = new Intl.DateTimeFormat(undefined, { + weekday: "long", + month: "long", + day: "numeric", +}).format(new Date()); + async function refreshLists() { loadingLists.value = true; error.value = null; @@ -79,6 +87,8 @@ async function addTask() { tasks.value = [...tasks.value, created]; title.value = ""; description.value = ""; + showNote.value = false; + titleInput.value?.focus(); } catch (e) { error.value = (e as Error).message; } finally { @@ -86,6 +96,11 @@ async function addTask() { } } +function toggleNote() { + showNote.value = !showNote.value; + if (!showNote.value) description.value = ""; +} + onMounted(() => { // The auth plugin gates before mount, so this is normally authenticated. // Safety net: if not, drive login instead of calling the API (no 401 banner). @@ -96,12 +111,16 @@ onMounted(() => {