From 28c10246e3016f8d7175ed78cc2c2b9a0f1c668c Mon Sep 17 00:00:00 2001 From: Till JS Date: Fri, 10 Apr 2026 18:01:15 +0200 Subject: [PATCH] feat(zitare): smooth transitions, custom quotes, notes, new categories, fuzzy search - Smooth fade/slide animation on quote cycling in workbench - Custom quotes: new table (DB v5), store, queries for user-created quotes - Notes field on favorites for personal thoughts - 3 new categories: humor, wissenschaft, kunst - 23 new quotes incl. contemporary authors (Angelou, Mandela, Winfrey, etc.) - 5 curated theme decks (Stoizismus, Feminismus, Philosophie, etc.) - getAllAuthors() for author browse pages with bio + quote counts - fuzzySearchQuotes() with bigram similarity for typo-tolerant search - Pre-built category + author indexes for O(1) lookups Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/lib/modules/zitare/ListView.svelte | 89 ++-- .../web/src/lib/modules/zitare/collections.ts | 3 +- .../zitare/components/QuoteCard.svelte | 6 + .../apps/web/src/lib/modules/zitare/index.ts | 9 +- .../src/lib/modules/zitare/module.config.ts | 1 + .../web/src/lib/modules/zitare/queries.ts | 34 +- .../zitare/stores/custom-quotes.svelte.ts | 47 ++ .../modules/zitare/stores/favorites.svelte.ts | 7 + .../apps/web/src/lib/modules/zitare/types.ts | 11 + .../zitare/packages/content/src/categories.ts | 58 ++- apps/zitare/packages/content/src/index.ts | 7 +- apps/zitare/packages/content/src/quotes.ts | 473 ++++++++++++++++++ apps/zitare/packages/content/src/utils.ts | 154 +++++- 13 files changed, 855 insertions(+), 44 deletions(-) create mode 100644 apps/mana/apps/web/src/lib/modules/zitare/stores/custom-quotes.svelte.ts diff --git a/apps/mana/apps/web/src/lib/modules/zitare/ListView.svelte b/apps/mana/apps/web/src/lib/modules/zitare/ListView.svelte index b95815d16..a563caa30 100644 --- a/apps/mana/apps/web/src/lib/modules/zitare/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/zitare/ListView.svelte @@ -22,6 +22,7 @@ let favorites = $state([]); let quote = $state(null); + let transitioning = $state(false); // Initialize once on mount (writes to store state — keep out of $effect // to avoid the read/write loop where reading currentQuote retriggers @@ -59,8 +60,14 @@ let currentTags = $derived(getTagsByIds(allTags, currentTagIds)); function nextQuote() { - quotesStore.loadRandomQuote(); - quote = quotesStore.currentQuote; + if (transitioning) return; + transitioning = true; + // After fade-out completes, swap quote and fade back in + setTimeout(() => { + quotesStore.loadRandomQuote(); + quote = quotesStore.currentQuote; + transitioning = false; + }, 200); } async function toggleFav(e: Event) { @@ -102,42 +109,60 @@ }} > {#if quote} -
- «{quotesStore.getText(quote)}» -
-

— {quote.author}

+
+
+ «{quotesStore.getText(quote)}» +
+

— {quote.author}

- - {#if currentTags.length > 0} -
- {#each currentTags as tag (tag.id)} - - - {tag.name} - - {/each} -
- {/if} + + {#if currentTags.length > 0} +
+ {#each currentTags as tag (tag.id)} + + + {tag.name} + + {/each} +
+ {/if} - + +
{/if}