From 16f2680cb4e054f4955fd8eaa7f2a5580d6c34d2 Mon Sep 17 00:00:00 2001 From: Eli <88557639+lishaduck@users.noreply.github.com> Date: Tue, 9 Dec 2025 12:24:12 -0600 Subject: [PATCH 01/11] start cleaning --- src/lib/components/Sidebar.svelte | 9 +- src/lib/components/codemirror/Toolbar.svelte | 207 +++++++------------ src/lib/components/sidebar-context.ts | 5 +- src/lib/loro.ts | 8 +- src/routes/+layout.svelte | 5 +- 5 files changed, 87 insertions(+), 147 deletions(-) diff --git a/src/lib/components/Sidebar.svelte b/src/lib/components/Sidebar.svelte index 895aaf4..a0ffd96 100644 --- a/src/lib/components/Sidebar.svelte +++ b/src/lib/components/Sidebar.svelte @@ -1,5 +1,4 @@
- {#if sidebarCtx?.isCollapsed} + {#if sidebarCtx.isCollapsed}
{/if} - - {#each sortedGroups as group, index (index)} - {#if shouldShowAsButtons(index)} -
- {#each group.tools as tool (tool.title)} - {@const Icon = tool.icon} - - {/each} -
-
+ + {#each sortedGroups as group, i (group.label ?? group.priority)} + {@const isLast = i === sortedGroups.length - 1} + {@const priorityClass = + group.priority === 1 + ? "" + : group.priority === 2 + ? "hidden @md:flex" + : "hidden @lg:flex"} +
+ {#each group.tools as tool (tool.title)} + {@const Icon = tool.icon} + + {/each} +
+ {#if !isLast} +
{/if} {/each} - - {#if collapsedGroups.length > 0} - diff --git a/src/lib/components/sidebar-context.ts b/src/lib/components/sidebar-context.ts index bd8c70c..f874446 100644 --- a/src/lib/components/sidebar-context.ts +++ b/src/lib/components/sidebar-context.ts @@ -1,6 +1,9 @@ -export const SIDEBAR_CONTEXT_KEY = Symbol("sidebar-context"); +import { createContext } from "svelte"; export interface SidebarContext { isCollapsed: boolean; toggleSidebar: () => void; } + +export const [getSidebarContext, setSidebarContext] = + createContext(); diff --git a/src/lib/loro.ts b/src/lib/loro.ts index 948ecec..fc50b7c 100644 --- a/src/lib/loro.ts +++ b/src/lib/loro.ts @@ -263,16 +263,16 @@ export class LoroNoteManager { * Get version history with user attribution * Returns an array of version snapshots */ - getHistory(): Array<{ + getHistory(): { version: number; timestamp: Date; preview: string; - }> { - const history: Array<{ + }[] { + const history: { version: number; timestamp: Date; preview: string; - }> = []; + }[] = []; // Get current version const currentVersion = this.doc.version(); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index c3077dc..950f721 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -6,8 +6,7 @@ import favicon from "$lib/assets/favicon.svg"; import Sidebar from "$lib/components/Sidebar.svelte"; import { getNotes } from "$lib/remote/notes.remote.ts"; - import { setContext } from "svelte"; - import { SIDEBAR_CONTEXT_KEY } from "$lib/components/sidebar-context"; + import { setSidebarContext } from "$lib/components/sidebar-context.js"; import { decryptWithPassword } from "$lib/crypto.ts"; @@ -97,7 +96,7 @@ isCollapsed = !isCollapsed; } - setContext(SIDEBAR_CONTEXT_KEY, { + setSidebarContext({ get isCollapsed() { return isCollapsed; }, From ef0f52a5094b0a2dd3ae4882e199d7c6201b6a64 Mon Sep 17 00:00:00 2001 From: Eli <88557639+lishaduck@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:06:57 -0600 Subject: [PATCH 02/11] feat: versions and times and shtuffies --- package.json | 1 + pnpm-lock.yaml | 15 +++ src/lib/components/HistoryPanel.svelte | 37 ++---- src/lib/loro.ts | 79 ++++++++----- src/lib/remote/accounts.remote.ts | 4 +- src/lib/utils/time.ts | 28 +++++ src/routes/+page.svelte | 18 +-- src/routes/notes/[id]/+page.svelte | 150 +++++++------------------ 8 files changed, 158 insertions(+), 174 deletions(-) create mode 100644 src/lib/utils/time.ts diff --git a/package.json b/package.json index 9c9c95d..805c0de 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "loro-codemirror": "^0.3.3", "loro-crdt": "^1.10.0", "svelte": "^5.44.0", + "temporal-polyfill": "^0.3.0", "tiptap-markdown": "^0.9.0", "typescript-svelte-plugin": "^0.3.50" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd49989..a3c36f5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -152,6 +152,9 @@ importers: svelte: specifier: ^5.44.0 version: 5.45.7 + temporal-polyfill: + specifier: ^0.3.0 + version: 0.3.0 tiptap-markdown: specifier: ^0.9.0 version: 0.9.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) @@ -3136,6 +3139,12 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + temporal-polyfill@0.3.0: + resolution: {integrity: sha512-qNsTkX9K8hi+FHDfHmf22e/OGuXmfBm9RqNismxBrnSmZVJKegQ+HYYXT+R7Ha8F/YSm2Y34vmzD4cxMu2u95g==} + + temporal-spec@0.3.0: + resolution: {integrity: sha512-n+noVpIqz4hYgFSMOSiINNOUOMFtV5cZQNCmmszA6GiVFVRt3G7AqVyhXjhCSmowvQn+NsGn+jMDMKJYHd3bSQ==} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -6510,6 +6519,12 @@ snapshots: tapable@2.3.0: {} + temporal-polyfill@0.3.0: + dependencies: + temporal-spec: 0.3.0 + + temporal-spec@0.3.0: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) diff --git a/src/lib/components/HistoryPanel.svelte b/src/lib/components/HistoryPanel.svelte index e91d4c7..9b63bdc 100644 --- a/src/lib/components/HistoryPanel.svelte +++ b/src/lib/components/HistoryPanel.svelte @@ -1,7 +1,7 @@ {#if isOpen} @@ -115,20 +95,22 @@
- {#if entry.author} + {#if entry.peerId}
- {(entry.author ?? "?").charAt(0).toUpperCase()} + {entry.peerId.slice(0, 2).toUpperCase()}
- {entry.author} + {entry.peerId.slice(0, 8)} {:else} Unknown {/if}
- {formatTime(entry.timestamp)} + {formatRelativeTime(entry.timestamp)}
@@ -158,9 +140,10 @@ {#if selectedVersion !== null && selectedVersion !== history[0]?.version} + {@const cachedVersion = selectedVersion}
{/if} + + - - -{/if} + + + + diff --git a/src/lib/components/MembersModal.svelte b/src/lib/components/MembersModal.svelte index 2bbf0ef..57b3b4c 100644 --- a/src/lib/components/MembersModal.svelte +++ b/src/lib/components/MembersModal.svelte @@ -1,5 +1,6 @@
- {name[0]?.toUpperCase()} + {name.toUpperCase()}
diff --git a/src/lib/components/Sidebar.svelte b/src/lib/components/Sidebar.svelte index a0ffd96..7a83344 100644 --- a/src/lib/components/Sidebar.svelte +++ b/src/lib/components/Sidebar.svelte @@ -328,7 +328,7 @@ role="button" class="btn h-auto min-h-0 gap-3 rounded-lg px-3 py-2 normal-case btn-ghost hover:bg-base-200" > - + {user?.username ?? "Anonymous"} diff --git a/src/lib/components/codemirror/Editor.svelte b/src/lib/components/codemirror/Editor.svelte index e31d9e3..33e3cc9 100644 --- a/src/lib/components/codemirror/Editor.svelte +++ b/src/lib/components/codemirror/Editor.svelte @@ -38,8 +38,6 @@ noteTitle, }: Props = $props(); - // ... (existing code) ... - import { LoroExtensions } from "loro-codemirror"; import Codemirror from "./Codemirror.svelte"; import HistoryPanel from "$lib/components/HistoryPanel.svelte"; @@ -126,7 +124,7 @@ let loroExtensions = $state([]); - $effect(() => { + $effect.pre(() => { if (manager !== undefined) { const ephemeral = new EphemeralStore(); const undoManager = new UndoManager(manager.doc, {}); @@ -146,12 +144,18 @@ return () => { ephemeral.destroy(); }; - } else { - loroExtensions = []; - return; } + + return; }); + let extensions = $derived([ + coreExtensions, + wikilinksExtension(notesList), + loroExtensions, + editorTheme, + ]); + const tools = [ { priority: 1, @@ -246,13 +250,6 @@ ], }, ]; - - let extensions = $derived([ - coreExtensions, - wikilinksExtension(notesList), - loroExtensions, - editorTheme, - ]);
@@ -260,11 +257,7 @@ - (isHistoryOpen = false)} - /> + Date: Wed, 10 Dec 2025 13:30:11 -0600 Subject: [PATCH 05/11] improvements --- src/lib/components/TreeItem.svelte | 8 +++++--- src/lib/components/codemirror/Codemirror.svelte | 13 ++++++------- src/routes/notes/[id]/+page.svelte | 13 +++++++------ 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/lib/components/TreeItem.svelte b/src/lib/components/TreeItem.svelte index 8111363..41bc4f9 100644 --- a/src/lib/components/TreeItem.svelte +++ b/src/lib/components/TreeItem.svelte @@ -209,8 +209,9 @@
- - {#if isOpen} -
- - - {#if isOwner} - - -
- - - {:else} -
- - - {/if} -
- {/if} -
diff --git a/src/lib/components/ShareModal.svelte b/src/lib/components/ShareModal.svelte index b8d9df3..aac67ec 100644 --- a/src/lib/components/ShareModal.svelte +++ b/src/lib/components/ShareModal.svelte @@ -5,8 +5,8 @@ Lock, Globe, UserPlus, - Loader2, Check, + LoaderCircle, } from "@lucide/svelte"; import { decryptKey, encryptWithPassword } from "$lib/crypto"; @@ -342,7 +342,7 @@ {#if invitedUsers.length > 0}
- {#each invitedUsers as user} + {#each invitedUsers as user (user)}
@@ -412,7 +412,7 @@ disabled={saving || loading} > {#if saving} - + Saving... {:else if success} diff --git a/src/lib/remote/accounts.remote.ts b/src/lib/remote/accounts.remote.ts index 72cad8b..f8245c1 100644 --- a/src/lib/remote/accounts.remote.ts +++ b/src/lib/remote/accounts.remote.ts @@ -87,7 +87,7 @@ export const login = form( const redirectTo = url.searchParams.get("redirectTo") ?? "/"; // Validate redirectTo to prevent open redirect attacks const safeRedirect = redirectTo.startsWith("/") ? redirectTo : "/"; - throw redirect(302, safeRedirect); + redirect(302, safeRedirect); }, ); diff --git a/src/routes/(auth)/login/+page.svelte b/src/routes/(auth)/login/+page.svelte index 5423b21..27776e9 100644 --- a/src/routes/(auth)/login/+page.svelte +++ b/src/routes/(auth)/login/+page.svelte @@ -16,7 +16,19 @@
{/each} -
+ { + // Cache password for the layout to use for decryption + if (_password) { + sessionStorage.setItem("notes_temp_password", _password); + } + + // TODO: do we even need this? + await submit(); + })} + >