feat(ui): S7 People + Meetings/To-dos screens#70
Merged
Conversation
Pure, DOM-free selectors over the /api/people, /api/meetings and /api/todos payloads so the §5/§6 screens stay thin: - initials / hueFromName / avatarTint — per-name oklch tinted disc - peopleStatusMeta — Hebrew label + warn flag (cold-lead → warn) - groupMeetingsByDay / relativeDay — UTC-day buckets, chronological, null-start meetings collected into a trailing bucket - eventDaySet / buildMonthGrid — calendar event dots + month grid - todoProgress — checklist done/open/pct Date math is over the UTC calendar day so grouping + the grid are deterministic and time-zone independent. Colocated test (19 cases). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`users` heads the People (§5) view + its empty state; `target` marks the "הצעד הבא" card. currentColor-driven like the rest. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
getPeople / getMeetings(from?,to?) / getTodos / setTodoDone(id,done), mirroring the getScopes/putScopes/getToday style (throw on !ok, JSDoc'd shapes). setTodoDone PATCHes same-origin JSON so the CSRF guard passes. The endpoints don't exist yet — callers treat a throw as empty. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Two new views wired into the navigate/popstate/hash state machine, with אנשים and פגישות ומשימות top-bar entries: - People: two-pane (list + sticky detail) that stacks on mobile. Rows show a tinted initials disc, status badge (cold-lead → warn), next-step note and "קשר אחרון · N שיחות פתוחות". Detail has a "הצעד הבא" card with a source chip → S2 thread jump, plus "פתח צ׳אט" / "+ משימה" (the latter static for this slice). - Meetings/To-dos: a month calendar (today + event dots, prev/next month) and a day-grouped agenda timeline on one side; a checklist with a progress bar and optimistic round-checkbox toggles on the other. Local-only — no Google-Calendar connect banner. Source chips reuse the S2 thread jump. Every fetch failure (the endpoints don't exist yet) renders a graceful empty state instead of crashing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Tokenized, RTL-via-logical-properties styles for the new views: shared entity chrome (nav/head/badge/avatar/source chip/empty), the People two-pane split, and the agenda calendar + timeline + checklist. Two-pane/two-column kick in at ≥900px; transitions are gated behind prefers-reduced-motion. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Builds the §5 People (אנשים) and §6 Meetings & To-dos (פגישות ומשימות) screens for the CatchApp redesign — slice S7, UI only. Vanilla JS, no React. Frontend-only; no backend files touched.
The three read endpoints + one write endpoint these screens consume don't exist yet (being built in parallel). The UI is built strictly to the agreed contract and renders a graceful empty state on any 404 / error / empty, never crashing.
Screens
People (§5) — two-pane (list + sticky detail) on desktop, stacks on mobile.
oklchtint hashed from the name), name + status badge (cold-lead→--warn), next-step note, "קשר אחרון · N שיחות פתוחות".Meetings & To-dos (§6) — two visually distinct columns (
.duo), stack on mobile.dir="ltr"mono, owner, source chip).setTodoDone(id, !done)(revert on failure), source chip + due badge per row.Both reachable via new אנשים / פגישות ומשימות top-bar entries, wired into the existing
navigate/popstate/hash state machine (#people,#agenda).How it's structured (follows existing patterns)
lib/agenda.js(new, pure + tested):initials,hueFromName,avatarTint,peopleStatusMeta,groupMeetingsByDay,relativeDay,eventDaySet,buildMonthGrid,todoProgress. Date math is over the UTC calendar day so grouping + the month grid are deterministic. Colocatedagenda.test.js— 19 cases.lib/api.js:getPeople(),getMeetings(from?, to?),getTodos(),setTodoDone(id, done)— mirror thegetScopes/putScopes/getTodaystyle (throw on!ok, JSDoc'd shapes).setTodoDonePATCHes same-origin JSON so the CSRF guard passes.lib/icons.js:users+targetglyphs.app.js: fetch-on-entry views with thin DOM + delegated wiring, mirroringrenderSources/renderToday.styles.css: token vocabulary only, RTL logical properties, numbers/datesdir="ltr", motion gated behindprefers-reduced-motion, two-pane/two-column at ≥900px.Quality gate
npm run check✅ (no fixes)npm run typecheck✅npm run build✅npm test✅ — 1307 passed (144 files), including the 19 new agenda casesVerify steps (once backend lands, or now against empty states)
npm run dev(ormake dev), open the web app.Notes / couldn't verify
🤖 Generated with Claude Code