From 5f0a73920034741236034ed7a721c68eceb8ab82 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Sat, 12 Sep 2026 22:24:19 +0200 Subject: Extract Row primitive, migrate all call sites Variants card/ref/plain with scoped skin. Padding and wrap one-offs via style prop; draggable and handlers via rest spread. GroceryRow absorbs item-btn/ref-link globals with local names; BestRef scopes best-ref. Delete item-* globals and dead page overrides. --- src/app.css | 107 --------------------- src/lib/components/BestRef.svelte | 8 ++ src/lib/components/GroceryRow.svelte | 71 ++++++++++++-- src/lib/components/Row.svelte | 54 +++++++++++ src/routes/+page.svelte | 9 +- src/routes/groceries/categories/+page.svelte | 6 +- src/routes/grocery/[id]/+page.svelte | 5 +- src/routes/projects/[id]/+page.svelte | 20 ++-- .../[projectId]/routine/[routineId]/+page.svelte | 10 +- 9 files changed, 146 insertions(+), 144 deletions(-) create mode 100644 src/lib/components/Row.svelte (limited to 'src') diff --git a/src/app.css b/src/app.css index 87817bd..daeffd7 100644 --- a/src/app.css +++ b/src/app.css @@ -15,113 +15,6 @@ gap: 0.5rem; } -/* Row containers */ -.item-row { - display: flex; - align-items: center; - gap: 0.5rem; -} - -.item-row--card { - padding: 0.5rem 0.75rem; - background: var(--surface); - border-radius: 0.75rem; - box-shadow: 0 1px 2px var(--shadow); - transition: all 0.2s ease; -} - -.item-row--card:hover { - box-shadow: 0 2px 6px var(--shadow); - transform: translateY(-1px); -} - -.item-row--fixed { - height: 2.75rem; -} - -.item-row--ref { - padding: 0.875rem 1rem; - gap: 0.75rem; - background: var(--surface); - border-radius: 0.75rem; - box-shadow: 0 1px 2px var(--shadow); - transition: all 0.2s ease; -} - -.item-row--ref:hover { - box-shadow: 0 2px 6px var(--shadow); - transform: translateY(-1px); -} - -/* Buttons inside rows */ -.item-btn { - width: 100%; - text-align: left; - padding: 0 0.875rem; - height: 100%; - border: none; - border-radius: 0.75rem; - background: var(--surface); - font-size: 1rem; - font-weight: 500; - display: flex; - align-items: center; - transition: all 0.2s ease; - box-shadow: 0 1px 2px var(--shadow); -} - -.item-btn:hover { - background: var(--surface-hover); - box-shadow: 0 2px 6px var(--shadow-accent); - transform: translateY(-1px); -} - -.item-btn--grow { - flex-grow: 1; - width: auto; -} - -/* Text */ -.item-text { - display: flex; - flex-direction: column; - text-align: left; - line-height: 1.2; - gap: 0.0625rem; - overflow: hidden; -} - -.best-ref { - font-size: 0.75rem; - color: var(--text-secondary); - font-weight: 400; -} - -/* Links */ -.ref-link { - width: 2.75rem; - flex-shrink: 0; - height: 2.75rem; - aspect-ratio: 1; - display: flex; - align-items: center; - justify-content: center; - border-radius: 0.75rem; - background: var(--surface); - color: var(--text-secondary); - text-decoration: none; - font-size: 1rem; - transition: all 0.2s ease; - box-shadow: 0 1px 2px var(--shadow); -} - -.ref-link:hover { - background: var(--surface-hover); - color: var(--accent); - box-shadow: 0 2px 6px var(--shadow-accent); - transform: translateY(-1px); -} - /* Category heading */ .category-name { font-size: 0.75rem; diff --git a/src/lib/components/BestRef.svelte b/src/lib/components/BestRef.svelte index e194876..baa04f8 100644 --- a/src/lib/components/BestRef.svelte +++ b/src/lib/components/BestRef.svelte @@ -14,3 +14,11 @@  ({ref.qualityScore}/100) {/if} + + diff --git a/src/lib/components/GroceryRow.svelte b/src/lib/components/GroceryRow.svelte index 3305afa..9a88e90 100644 --- a/src/lib/components/GroceryRow.svelte +++ b/src/lib/components/GroceryRow.svelte @@ -1,5 +1,6 @@ -
  • + {#if selectable} - + {/if} - → -
  • + → + diff --git a/src/lib/components/Row.svelte b/src/lib/components/Row.svelte new file mode 100644 index 0000000..e388392 --- /dev/null +++ b/src/lib/components/Row.svelte @@ -0,0 +1,54 @@ + + +
  • + {@render children()} +
  • + + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 1adfb6b..66b3259 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -2,6 +2,7 @@ import { enhance } from '$app/forms'; import ScoreBadge from '$lib/components/ScoreBadge.svelte'; import Button from '$lib/components/Button.svelte'; + import Row from '$lib/components/Row.svelte'; let { data, form } = $props(); @@ -32,12 +33,12 @@ @@ -47,10 +48,6 @@