<feed xmlns='http://www.w3.org/2005/Atom'>
<title>home-sveltekit/src/routes/+page.svelte, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://git.kagamino.dev/home-sveltekit/atom?h=main</id>
<link rel='self' href='https://git.kagamino.dev/home-sveltekit/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/'/>
<updated>2026-09-12T20:24:19Z</updated>
<entry>
<title>Extract Row primitive, migrate all call sites</title>
<updated>2026-09-12T20:24:19Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-12T20:24:19Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=5f0a73920034741236034ed7a721c68eceb8ab82'/>
<id>urn:sha1:5f0a73920034741236034ed7a721c68eceb8ab82</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>Extract Button primitive, migrate all call sites</title>
<updated>2026-09-12T20:22:33Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-12T20:22:33Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=1cef356be95a67f95d40f5b0b131f98d11f13c13'/>
<id>urn:sha1:1cef356be95a67f95d40f5b0b131f98d11f13c13</id>
<content type='text'>
Variants primary/accent/ghost/done with scoped styles.
Disabled handling unified; block/size/style props cover
login stretch, done-lg, save-check positioning.
Delete btn-* globals and dead page overrides.
</content>
</entry>
<entry>
<title>Consolidate duplicated page CSS into app.css, share TestDb type</title>
<updated>2026-09-08T07:12:25Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-08T07:12:25Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=7d85a18867ca0fe2310218c63cfc696c0f916171'/>
<id>urn:sha1:7d85a18867ca0fe2310218c63cfc696c0f916171</id>
<content type='text'>
- Move .page-header/.back-link/.input-invalid/.save-status/.btn-done
  (plus hover/variant rules) into app.css as shared route scaffolding;
  delete per-page scoped copies
- Unify drifted values: page-header padding 1rem -&gt; 1.25rem (routine
  page), empty-state spacing 0.75/1.5rem -&gt; 1/2rem (grocery detail),
  save-status margin -0.25rem applied on both pages, back-link margin
  1.5rem -&gt; 1rem (grocery detail); routine page's large Fait button is
  kept via a .btn-done-lg modifier
- Export TestDb from test-helper and use it in the five db/service
  test files to shrink duplicated fixture scaffolding
</content>
</entry>
<entry>
<title>Deduplicate routine actions and badges across project routes</title>
<updated>2026-09-08T06:57:08Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-08T06:57:08Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=4b2b964283075712de98743720ff3e31370ddc8e'/>
<id>urn:sha1:4b2b964283075712de98743720ff3e31370ddc8e</id>
<content type='text'>
- Share edit/complete/archive form actions in routine-actions.ts; route
  servers become thin wrappers (strictest guard semantics in one place)
- Move parseFrequencyDays into validation.ts
- Extract ScoreBadge/StatusBadge components; use on project pages and
  the home page instead of duplicated scoreClass/statusClass helpers
- Fix archiveProject calling the routine archive with the project id
</content>
</entry>
<entry>
<title>Extract duplicated styles into shared molecules and color atoms</title>
<updated>2026-09-07T17:55:08Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-07T17:55:08Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=5c1e0821e762c2dd098a01b2bb6231c7f8568736'/>
<id>urn:sha1:5c1e0821e762c2dd098a01b2bb6231c7f8568736</id>
<content type='text'>
Move .score, .status, .add-bar and .btn-accent molecules into app.css
and replace BEM color modifiers with bare atoms (bg-success, bg-accent,
bg-danger, bg-accent-soft, text-accent, text-white). Rename the
category-specific cat-add-bar to add-bar and the groceries page's
sticky autocomplete bar to grocery-add-bar to avoid the collision.
Cuts dcd duplicate lines from 1288 to 780.
</content>
</entry>
<entry>
<title>Add projects with routines, urgency tracking and health scores</title>
<updated>2026-09-07T09:32:41Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-07T09:32:41Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=18a0f9c874aaa09c0f71252dad853c23f9511ed6'/>
<id>urn:sha1:18a0f9c874aaa09c0f71252dad853c23f9511ed6</id>
<content type='text'>
Projects group recurring routines (chores included) with an append-only
snapshot table (id, version) so edits never rewrite history; completions
reference the exact snapshot. Pure metrics compute due dates, urgency
buckets (ok/due/late/veryLate) and 0-100 health scores per routine,
project, and globally. Home page lists projects; project dashboard sorts
routines most-urgent first with one-tap completion and interval parser
inputs (1d/2w/3m/1y).
</content>
</entry>
<entry>
<title>Split groceries domain out of the app root</title>
<updated>2026-09-07T08:55:06Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-07T08:55:06Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=113415ce357a9cea1759d0452ebae6352f8fe36b'/>
<id>urn:sha1:113415ce357a9cea1759d0452ebae6352f8fe36b</id>
<content type='text'>
Move the grocery list, catalog, and categories routes under /groceries/
so the app home can host the projects/routines overview next. Update
nav to exact-path matching, login redirect default, and layout title.
</content>
</entry>
<entry>
<title>fix: type page state arrays (svelte-check 0 errors)</title>
<updated>2026-08-21T14:15:09Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-21T14:15:09Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=8cd634e51b79200848068ef45bd3fb700758c394'/>
<id>urn:sha1:8cd634e51b79200848068ef45bd3fb700758c394</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: fuzzy autocomplete for add-item input</title>
<updated>2026-08-21T14:13:12Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-21T14:13:12Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=07a83b2e3db40f4a380092d6566500799b340dcd'/>
<id>urn:sha1:07a83b2e3db40f4a380092d6566500799b340dcd</id>
<content type='text'>
Replace the native &lt;datalist&gt; with a custom fuzzysort-driven component
(FuzzyAutocomplete) with keyboard nav and highlighted matches, preserving
exact-match auto-add. Extract a unit-tested fuzzy-search helper, and gitignore
.juggler/. Fix the dev DB boot failure caused by a sibling project's ambient
DATABASE_URL leaking in by overriding it (file:./data.db) in mise.toml.
</content>
</entry>
<entry>
<title>fix(groceries): prevent premature auto-submit on quick-add input</title>
<updated>2026-08-01T13:15:37Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-01T13:15:37Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=b30150a8feb960c0667eaff6cb105dcc55b65744'/>
<id>urn:sha1:b30150a8feb960c0667eaff6cb105dcc55b65744</id>
<content type='text'>
Typing 'sel régénérant' would auto-submit 'sel' because oninput
fired on every keystroke, and trim() collapsed the partial input
to a catalog match. Moved auto-submit to oninput with
insertReplacementText guard (datalist selection) plus onchange
(blur/Enter), so regular typing is never interrupted.
</content>
</entry>
</feed>
