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:
Aculix Technologies
2026-08-16 01:50:59 +05:30
parent 7e030722a9
commit 6b01e4c246
9 changed files with 22 additions and 1584 deletions
+10 -10
View File
@@ -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
View File
@@ -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)
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 {