mirror of
https://github.com/aculix/negotium.git
synced 2026-09-11 07:28:17 +00:00
docs: tighten wording, drop the planning scratch files
Removes docs/superpowers, which held a design note and an implementation plan. Those were working notes rather than anything the project needs, and they don't belong in the repo. Everything else here is wording: em dashes swapped for ordinary punctuation across the README and the code comments, and a few sentences straightened out.
This commit is contained in:
+10
-10
@@ -17,7 +17,7 @@
|
||||
|
||||
// Storage is synchronous, so the first render can already have the real list.
|
||||
// Loading in onMount instead meant one frame of the empty state on every
|
||||
// launch — previously hidden behind the splash screen, and very visible once
|
||||
// launch. That was hidden behind the splash screen before, and very visible once
|
||||
// that went away.
|
||||
storage.migrateLegacyKeys();
|
||||
const bootNow = new Date();
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/** Single write path, so persistence cannot drift out of step with the list.
|
||||
* Loading a different day assigns `tasks` directly and deliberately skips
|
||||
* this — there is nothing new to save. */
|
||||
* this, because there is nothing new to save. */
|
||||
function setTasks(next) {
|
||||
tasks = next;
|
||||
if (isInitialized) storage.saveTasks(selectedKey, tasks);
|
||||
@@ -116,7 +116,7 @@
|
||||
}
|
||||
|
||||
// Reordering runs on Pointer Events rather than HTML5 drag-and-drop, which
|
||||
// never fired on touch at all — so a documented feature was desktop-only.
|
||||
// never fired on touch at all, so a documented feature was desktop-only.
|
||||
//
|
||||
// Touch and mouse need different entry conditions. A mouse drag begins once
|
||||
// the pointer has moved past a small threshold. A touch drag cannot, because
|
||||
@@ -181,9 +181,9 @@
|
||||
* Inline styling for the one row the pointer is carrying.
|
||||
*
|
||||
* Only the lifted card is styled here. Everything else is moved by
|
||||
* animate:flip, so exactly one mechanism owns `transform` per element —
|
||||
* when both did, flip measured a "before" rect that already included a
|
||||
* manual offset, computed a bogus delta, and slid the whole list on drop.
|
||||
* animate:flip, so one mechanism owns `transform` per element. When both
|
||||
* did, flip measured a "before" rect that already had a manual offset in
|
||||
* it, computed a bogus delta, and slid the whole list on drop.
|
||||
*
|
||||
* The lifted card takes no transition, so it stays welded to the pointer.
|
||||
* On release it keeps its transform but gains one via the settling class,
|
||||
@@ -245,7 +245,7 @@
|
||||
|
||||
// Reorder as the pointer crosses each boundary rather than waiting for the
|
||||
// drop. animate:flip then eases the displaced card across, one swap at a
|
||||
// time, and by release the list is already in its final order — so letting
|
||||
// time. By release the list is already in its final order, so letting
|
||||
// go changes nothing but the lifted card settling into place.
|
||||
const from = tasks.findIndex(task => task.id === drag.id);
|
||||
const to = targetIndexFor(event.clientY);
|
||||
@@ -268,8 +268,8 @@
|
||||
const landedAt = tasks.findIndex(task => task.id === drag.id);
|
||||
const settling = drag.id;
|
||||
|
||||
// The order is already correct — it was applied swap by swap during the
|
||||
// drag — so this only writes it through to storage.
|
||||
// The order is already correct, applied swap by swap during the
|
||||
// drag, so this only writes it through to storage.
|
||||
if (wasActive && landedAt !== drag.originIndex) setTasks(tasks);
|
||||
|
||||
endDrag();
|
||||
@@ -311,7 +311,7 @@
|
||||
|
||||
/**
|
||||
* Re-evaluates the day boundary and reloads the visible list. Safe to call
|
||||
* repeatedly — rollover is idempotent within a day.
|
||||
* repeatedly, since rollover is idempotent within a day.
|
||||
*
|
||||
* If the day changed while the user was looking at Today, they stay on the
|
||||
* new Today. If they were looking at Tomorrow, that key has become Today and
|
||||
|
||||
+2
-2
@@ -7,7 +7,7 @@ import { toKey } from './dates.js'
|
||||
* today (oldest day first, within-day order preserved, ahead of anything
|
||||
* already in today), completed tasks are discarded, and the old key is
|
||||
* deleted. Pruning is therefore a side effect of carrying, so there is no
|
||||
* separate retention policy. Future keys — Tomorrow — are never touched.
|
||||
* separate retention policy. Future keys, meaning Tomorrow, are never touched.
|
||||
*
|
||||
* `now` is a parameter rather than a `new Date()` call so the boundary is
|
||||
* testable. This replaces `checkAndMigrateTasks`, whose guard compared a
|
||||
@@ -17,7 +17,7 @@ export function rollover(storage, now) {
|
||||
const todayKey = toKey(now)
|
||||
|
||||
// listTaskKeys yields only well-formed ISO keys, which is what makes this
|
||||
// string comparison safe — and is why the key format changed.
|
||||
// string comparison safe, and is why the key format changed.
|
||||
const pastKeys = storage
|
||||
.listTaskKeys()
|
||||
.filter((key) => key < todayKey)
|
||||
|
||||
@@ -4,10 +4,10 @@ const TEXT_FIELDS = new Set(['INPUT', 'TEXTAREA'])
|
||||
* Whether a keydown should trigger task undo.
|
||||
*
|
||||
* The subtlety is the text field. Deferring to a focused field's own undo
|
||||
* sounds right, but the add-task input is where focus normally sits — you
|
||||
* sounds right, but the add-task input is where focus normally sits. You
|
||||
* click it to add a task and focus stays there, and on macOS clicking a
|
||||
* button does not move focus. Guarding on focus alone therefore disables
|
||||
* undo in precisely the situation it is needed: right after deleting a task.
|
||||
* undo in the one situation it is needed: right after deleting a task.
|
||||
*
|
||||
* So it defers only when the field actually holds text worth undoing. An
|
||||
* empty input has nothing for the browser to restore, and task undo wins.
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/** crypto.randomUUID requires a secure context, and Negotium over plain HTTP
|
||||
* on a LAN is a real self-hosted deployment shape — hence the fallback. */
|
||||
* on a LAN is a real deployment shape for this app, hence the fallback. */
|
||||
function newId() {
|
||||
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
|
||||
return crypto.randomUUID()
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ export function createUndoStack(limit = 10) {
|
||||
* Reverses one entry against the current task list.
|
||||
*
|
||||
* Indices are clamped because the list may have changed since the entry was
|
||||
* recorded — a task deleted from position 5 can be restored into a list that
|
||||
* recorded. A task deleted from position 5 can be restored into a list that
|
||||
* has since shrunk to two items, and landing at the end beats throwing.
|
||||
*
|
||||
* `clearCompleted` entries must record `removed` in ascending index order, so
|
||||
|
||||
+3
-3
@@ -274,7 +274,7 @@ body {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
/* The lifted card. It stays fully opaque and sits above the list — the old
|
||||
/* The lifted card. It stays fully opaque and sits above the list. The old
|
||||
ghosted 0.4 opacity read as "this card is disabled" rather than "you are
|
||||
holding this card". The gap that opens beneath it is the drop indicator. */
|
||||
.task-item.dragging {
|
||||
@@ -390,7 +390,7 @@ html.dark .task-item.dragging {
|
||||
}
|
||||
|
||||
/* focus-within matters as much as hover here: the button is opacity 0 by
|
||||
default, so a keyboard user tabbing to it previously saw nothing at all —
|
||||
default, so a keyboard user tabbing to it previously saw nothing at all:
|
||||
the focus outline was drawn on an invisible element. */
|
||||
.task-item:hover .delete-btn,
|
||||
.task-item:focus-within .delete-btn {
|
||||
@@ -458,7 +458,7 @@ html.dark .task-item.dragging {
|
||||
50% { opacity: 0.6; transform: translateY(-6px); }
|
||||
}
|
||||
|
||||
/* Decorative only — respect a reduced-motion preference. */
|
||||
/* Decorative only, so respect a reduced-motion preference. */
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.empty-art-box,
|
||||
.empty-art-motes path {
|
||||
|
||||
Reference in New Issue
Block a user