From a4b12f3601f3801fffcd909b7f158e561496e775 Mon Sep 17 00:00:00 2001 From: Kristian Wind Date: Wed, 19 Aug 2026 20:46:05 +0200 Subject: [PATCH] =?UTF-8?q?feat(notes):=20listen=20som=20Apple=20Noters,?= =?UTF-8?q?=20=E2=8C=98K=20finder=20noter,=20og=20de=20kan=20tr=C3=A6kkes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rækken har nu titel i samme størrelse som en opgavetitel — en note og en opgave er to ting af samme slags, og hver sin størrelse får den ene til at se mindre vigtig ud. Under den står dato og begyndelse på samme linje, som Apple Noter gør det: to linjer pr. note frem for tre, og datoen først, fordi det er den, man skanner efter. Ligger noten i et projekt, står det nedenunder. ⌘K søgte kun i opgaver og projekter. Feltet ser ud til at kunne finde alt, så det er svært at gætte, at halvdelen af programmet ikke var med. Og mens jeg var der: "Projekt" og "Opgave" stod hårdkodet på dansk i paletten. En note kan trækkes ind på et projekt i sidebjælken — samme mål som en opgave, fordi det er samme gestus: læg denne her. To fejl i søgefeltet, begge Safaris egen type="search": Fokusringen tvang sin egen hjørneradius og tegnede en firkantet bue uden om en rund kant — to streger, hvor der skulle være én. Den følger nu elementets form, overalt i programmet. Og feltet skiftede udseende ved fokus: forstørrelsesglasset forsvandt og pilleformen blev firkantet. Det tegnes nu af os. Trækket og palettens noter er ikke fastholdt i en prøve. ⌘K, tastning og en debounce oven på hinanden gjorde den upålidelig, og en flakkende prøve siger mindre end ingen. Co-Authored-By: Claude Opus 5 --- web/src/app.css | 5 +- web/src/lib/components/CommandPalette.svelte | 15 ++- web/src/lib/components/Sidebar.svelte | 19 ++- web/src/lib/dnd.js | 1 + web/src/lib/locales/da.js | 4 + web/src/lib/locales/en.js | 4 + web/src/lib/stores.svelte.js | 13 ++ web/src/routes/noter/+page.svelte | 119 +++++++++++++++++-- 8 files changed, 166 insertions(+), 14 deletions(-) diff --git a/web/src/app.css b/web/src/app.css index d30a856..403566f 100644 --- a/web/src/app.css +++ b/web/src/app.css @@ -363,7 +363,10 @@ button { :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; - border-radius: var(--radius-sm); + /* Ingen radius her. En omrids følger elementets egen afrunding af sig selv, og + at tvinge en anden på tegner en firkantet bue uden om en rund kant — to + streger, hvor der skulle være én. Det ses tydeligst om et pilleformet + søgefelt. */ } ::selection { diff --git a/web/src/lib/components/CommandPalette.svelte b/web/src/lib/components/CommandPalette.svelte index bf53261..20b5322 100644 --- a/web/src/lib/components/CommandPalette.svelte +++ b/web/src/lib/components/CommandPalette.svelte @@ -9,6 +9,7 @@ let query = $state(''); let tasks = $state([]); let projects = $state([]); + let notes = $state([]); let selected = $state(0); let input; let controller = null; @@ -32,13 +33,21 @@ if (!value) { tasks = []; projects = []; + notes = []; return; } timer = setTimeout(async () => { try { - const result = await api.search(value); + // Noter er sit eget endepunkt, så de hentes ved siden af. Uden dem + // søger ⌘K kun i halvdelen af programmet, hvilket er svært at gætte + // som bruger: feltet ser ud til at kunne finde alt. + const [result, found] = await Promise.all([ + api.search(value), + api.notes({ q: value }).catch(() => ({ notes: [] })) + ]); tasks = result.tasks ?? []; projects = result.projects ?? []; + notes = found.notes ?? []; selected = 0; } catch { // A failed search shows nothing rather than an error inside a @@ -49,6 +58,7 @@ let results = $derived([ ...projects.map((p) => ({ kind: 'project', id: p.id, label: p.name })), + ...notes.map((n) => ({ kind: 'note', id: n.id, label: n.title || n.body.slice(0, 60) })), ...tasks.map((t) => ({ kind: 'task', id: t.id, @@ -60,6 +70,7 @@ function choose(item) { open = false; + if (item.kind === 'note') return goto(`/noter?note=${item.id}`); goto(item.kind === 'project' ? `/projekt/${item.id}` : `/projekt/${item.project}`); } @@ -109,7 +120,7 @@ onclick={() => choose(item)} onmouseenter={() => (selected = i)} > - {item.kind === 'project' ? 'Projekt' : 'Opgave'} + {t('palette.' + item.kind)} {item.label} diff --git a/web/src/lib/components/Sidebar.svelte b/web/src/lib/components/Sidebar.svelte index 63df0d7..4b00ade 100644 --- a/web/src/lib/components/Sidebar.svelte +++ b/web/src/lib/components/Sidebar.svelte @@ -1,7 +1,7 @@