From f484b02c587f484f612343f1e059d828dfde97ab Mon Sep 17 00:00:00 2001 From: Braden Wong <13159333+braden-w@users.noreply.github.com> Date: Wed, 18 Mar 2026 14:01:11 -0700 Subject: [PATCH 01/26] refactor(honeycrisp): split god factory into focused state modules and reorganize files Split the 538-line createNotesState into three focused factories (foldersState, notesState, viewState) with a clean dependency DAG. Extract workspace schema from client instantiation, co-locate editor utilities with the Editor component, and consolidate date utils. All component imports updated to use the split state modules. --- .../src/lib/components/CommandPalette.svelte | 12 +- .../src/lib/components/NoteCard.svelte | 14 +- .../src/lib/components/NoteList.svelte | 51 ++- .../src/lib/components/Sidebar.svelte | 26 +- .../lib/{components => editor}/Editor.svelte | 42 +-- apps/honeycrisp/src/lib/editor/extensions.ts | 28 ++ apps/honeycrisp/src/lib/editor/utils.ts | 34 ++ .../src/lib/state/folders.svelte.ts | 115 ++++++ apps/honeycrisp/src/lib/state/index.ts | 3 + apps/honeycrisp/src/lib/state/notes.svelte.ts | 326 ++---------------- apps/honeycrisp/src/lib/state/view.svelte.ts | 216 ++++++++++++ apps/honeycrisp/src/lib/utils/date.ts | 26 ++ apps/honeycrisp/src/lib/workspace/client.ts | 16 + apps/honeycrisp/src/lib/workspace/index.ts | 8 + .../lib/{workspace.ts => workspace/schema.ts} | 25 +- apps/honeycrisp/src/routes/+page.svelte | 16 +- specs/20260318T123322-honeycrisp-refactor.md | 67 ++++ 17 files changed, 603 insertions(+), 422 deletions(-) rename apps/honeycrisp/src/lib/{components => editor}/Editor.svelte (87%) create mode 100644 apps/honeycrisp/src/lib/editor/extensions.ts create mode 100644 apps/honeycrisp/src/lib/editor/utils.ts create mode 100644 apps/honeycrisp/src/lib/state/folders.svelte.ts create mode 100644 apps/honeycrisp/src/lib/state/index.ts create mode 100644 apps/honeycrisp/src/lib/state/view.svelte.ts create mode 100644 apps/honeycrisp/src/lib/workspace/client.ts create mode 100644 apps/honeycrisp/src/lib/workspace/index.ts rename apps/honeycrisp/src/lib/{workspace.ts => workspace/schema.ts} (85%) create mode 100644 specs/20260318T123322-honeycrisp-refactor.md diff --git a/apps/honeycrisp/src/lib/components/CommandPalette.svelte b/apps/honeycrisp/src/lib/components/CommandPalette.svelte index 86af051e4d..9cca0769c8 100644 --- a/apps/honeycrisp/src/lib/components/CommandPalette.svelte +++ b/apps/honeycrisp/src/lib/components/CommandPalette.svelte @@ -4,7 +4,7 @@ import FolderIcon from '@lucide/svelte/icons/folder'; import FolderPlusIcon from '@lucide/svelte/icons/folder-plus'; import PlusIcon from '@lucide/svelte/icons/plus'; - import { notesState } from '$lib/state/notes.svelte'; + import { foldersState, notesState, viewState } from '$lib/state'; let { open = $bindable(false) }: { open: boolean } = $props(); @@ -17,17 +17,17 @@ { - notesState.selectFolder(null); + viewState.selectFolder(null); open = false; }} > All Notes - {#each notesState.folders as folder (folder.id)} + {#each foldersState.folders as folder (folder.id)} { - notesState.selectFolder(folder.id); + viewState.selectFolder(folder.id); open = false; }} > @@ -47,7 +47,7 @@ {#each notesState.notes as note (note.id)} { - notesState.selectNote(note.id); + viewState.selectNote(note.id); open = false; }} > @@ -78,7 +78,7 @@ { - notesState.createFolder(); + foldersState.createFolder(); open = false; }} > diff --git a/apps/honeycrisp/src/lib/components/NoteCard.svelte b/apps/honeycrisp/src/lib/components/NoteCard.svelte index 0e6af4a143..6e3d6fc609 100644 --- a/apps/honeycrisp/src/lib/components/NoteCard.svelte +++ b/apps/honeycrisp/src/lib/components/NoteCard.svelte @@ -8,13 +8,13 @@ import PinIcon from '@lucide/svelte/icons/pin'; import TrashIcon from '@lucide/svelte/icons/trash-2'; import { format } from 'date-fns'; - import type { Note } from '$lib/workspace'; - import { notesState } from '$lib/state/notes.svelte'; + import { foldersState, notesState, viewState } from '$lib/state'; import { parseDateTime } from '$lib/utils/date'; + import type { Note } from '$lib/workspace'; let { note }: { note: Note } = $props(); - const isSelected = $derived(note.id === notesState.selectedNoteId); + const isSelected = $derived(note.id === viewState.selectedNoteId); let confirmingPermanentDelete = $state(false); @@ -27,7 +27,7 @@ class="group relative flex cursor-pointer flex-col gap-0.5 rounded-lg px-3 py-2 text-sm transition-colors hover:bg-accent/30 {isSelected ? 'bg-accent' : ''}" - onclick={() => notesState.selectNote(note.id)} + onclick={() => viewState.selectNote(note.id)} >
@@ -44,7 +44,7 @@ {note.preview || 'No content'}

- {#if notesState.isRecentlyDeletedView} + {#if viewState.isRecentlyDeletedView}