From e7cac505e4c1bb158824632ce698cd7502e5cc89 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 8 Oct 2026 15:50:02 +0000 Subject: [PATCH] Course page: number the open tasks, and the number is the handle The grip hung 18px off a row already pulled into the gutter, so on a phone it sat off the glass and a course's tasks could not be reordered there at all. On a laptop it was a faint pair of strokes nobody found. ReorderList rows can now be numbered: the place in mono in a 22px lane of its own, swapping to the strokes under a cursor, renumbering live while a row is carried. The course page uses it, says which order the numbers are ("most pressing first" / "in your order") beside the header, and explains dragging once with a FirstNote until anything has been placed. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01W2qN84qBgHi1Y749Kd9Nq5 --- app/courses/[courseId]/page.tsx | 99 +++++++++++++++++++++++---------- components/ReorderList.tsx | 74 +++++++++++++++++++++++- readmedesign.md | 22 ++++++++ 3 files changed, 162 insertions(+), 33 deletions(-) diff --git a/app/courses/[courseId]/page.tsx b/app/courses/[courseId]/page.tsx index f7e96ee..d7cc86e 100644 --- a/app/courses/[courseId]/page.tsx +++ b/app/courses/[courseId]/page.tsx @@ -11,6 +11,7 @@ import { useRecall } from '@/lib/recall/use-recall'; import Marginalia from '@/components/progression/Marginalia'; import { useProgression } from '@/lib/progression/use-progression'; import ConfirmSheet from '@/components/ConfirmSheet'; +import FirstNote from '@/components/FirstNote'; import DatePicker from '@/components/DatePicker'; import DueDateBadge from '@/components/DueDateBadge'; import LoadingIndicator from '@/components/LoadingIndicator'; @@ -68,7 +69,7 @@ import { * It deliberately does not become a second Tasks screen. The task list here * is this course's list and nothing else, with no filters and no sort toggle: * it reads in the order the student dragged it into (what matters, until they - * do). The cross-course list, with its filters, its editing and its reading + * do), each open task numbered in the margin, and the number is the handle. The cross-course list, with its filters, its editing and its reading * view, is still Tasks, and there is a link through to it at the foot of the * section. */ @@ -143,6 +144,15 @@ export default function CoursePage() { }; }, [courseTasks]); + // The open list is numbered, and the numbers are what carry a task, as soon + // as there are two to put in order. + const numbered = open.length > 1; + // Placed by hand (or by Claude's reorder_tasks) at least once. + const arranged = open.some((task) => typeof task.position === 'number'); + // Rows outside the numbered list step in to its lane on a phone, where the + // numbers cannot hang out in the margin. + const lane = numbered ? 'pl-[22px] md:pl-0' : ''; + function openRow(task: Task, course: Course) { return (
-

- Tasks - - {open.length} +

+ + Tasks + + {open.length} + + {/* Which order the numbers are, in the margin: the student's + own once anything has been placed, "what matters" until. */} + {numbered && ( + + {arranged ? 'in your order' : 'most pressing first'} + + )}

{done.length > 0 && ( + ) : ( - {renderItem(item, index)} + )} + {lane ?
{renderItem(item, index)}
: renderItem(item, index)} ); })} diff --git a/readmedesign.md b/readmedesign.md index a2a725a..2876831 100644 --- a/readmedesign.md +++ b/readmedesign.md @@ -2422,6 +2422,20 @@ Both paths have a keyboard twin: the grip is a real button, and up and down arrows move the item one place, with every move said out loud through a polite live region. +A row list can be **numbered** (`numbered`), and the course page's open tasks +are. The grip is then the item's place, written in mono (digits, so mono is +right) in a 22px lane of its own: `1` in `ink-soft`, the rest `muted`. Under +a cursor on the number it gives way to the two pencil strokes; on a touch +screen nothing hovers, so the number simply stays and is what a finger takes +hold of. The lane is in the flow rather than hung off the row, because a grip +hung 18px past a row that is already pulled into the gutter sat off the glass +on a phone, which left a course's tasks with no way to be reordered there. +From `md` the list is pulled back by the lane so the numbers sit in the page +margin and the rows keep the column; below `md` they take the lane, and the +finished rows under them step in to match. While a row is carried every +number reads the place it would land in, the carried one in `ink` at 600, +so the new order is visible before letting go. + ### Study: the reader `/notes` is Markd folded into the app, a reader for long study notes written @@ -2703,6 +2717,14 @@ vocabulary, which used to open the page), then **Weak points** once Claude has recorded any. The right column carries **Practice** (once there is a paper) and **Sessions** with Log time; below `xl` they follow in that order. +**Tasks** is numbered once it holds two open tasks, and the numbers carry +them (see Rearranging by hand). Beside the `.eyebrow` and its count, a few +words in Caveat say which order the numbers are: "most pressing first" until +anything has been placed, "in your order" after, read off whether any open +task has a position (a drag here, or Claude's `reorder_tasks`). Until then a +`FirstNote` under the header says what the order is and that dragging a +number changes it, and it goes for good with the first placement. + **Where the grade stands**, on a course with no scheme, says "Akada does not know how ECON 100 is marked yet." over two equal buttons. **Type it in** opens the scheme editor already holding the usual pieces (Quizzes,