Calendar items + hover card redesign: clock+time chips/title/leaf tag chips; 'Journal' everywhere; kind-labelled attachments; two bottom pills; one action path #628

Open
opened 2026-10-01 10:56:43 +00:00 by kayg · 6 comments
Owner

Owner spec (2026-10-01, Calendar Week + hover card screenshot): "make it simple stupid"

Calendar items (Week/Day grid), three lines:

  1. 🕒 clock icon + the time range as chips ("15:20" "16:18");
  2. the event title;
  3. tag chips without "#" and without the parent path: #area/selfcare → "selfcare".
    Truncate gracefully at narrow widths (the title wins over tags; chips collapse to "+N").
    Hover preview card (#421 card), top to bottom:
  • <appropriate icon> Journal: the item kind label must read "Journal" (not "Log entry") everywhere: the card, the context menu, toasts ("Journal entry moved…"), search kinds, and aria labels. Grep and replace in UI strings; CONTEXT already names it.
  • 📅 <absolute day/date in the User's locale> 🕒 <time chips>.
  • Title.
  • Tag chips (horizontally scrollable when there are many; no "#", leaf name only, full tag in the tooltip).
  • Attachments, one row each, labelled by kind ("Voice Memo", "Document", "Photo", "PDF"), not the file name (the full name in the tooltip). On hover, a small pill at the row's trailing edge with two actions: Copy link and Delete (delete = the poof + Undo, #603). Audio rows keep the inline ▶ from #622.
  • Bottom row, two pills only: left [Attach File | Voice Memo]; right-aligned [Edit | Hide | Duplicate | Delete]. Remove "Open Day" (the card only appears on that day anyway). Copy link moves to the right-click menu and the title row (hover).
    One action path: right-click on an item shows all the same actions (from the #581 action registry): the hover card's pills and the context menu render the same list. No second implementation.
    Tests: e2e: an item renders the clock + chips / title / leaf tag chips; the card shows the Journal label, date row, chips, kind-labelled attachments with hover Copy link/Delete, and the two bottom pills in that order; right-click lists the same actions. Screenshots at 1440/390, both themes, 3× crops.
## Owner spec (2026-10-01, Calendar Week + hover card screenshot): "make it simple stupid" **Calendar items (Week/Day grid), three lines:** 1. `🕒` clock icon + the **time range as chips** ("15:20" "16:18"); 2. the **event title**; 3. **tag chips without "#" and without the parent path**: `#area/selfcare` → "selfcare". Truncate gracefully at narrow widths (the title wins over tags; chips collapse to "+N"). **Hover preview card (#421 card), top to bottom:** - `<appropriate icon> Journal`: the item kind label must read **"Journal"** (not "Log entry") **everywhere**: the card, the context menu, toasts ("Journal entry moved…"), search kinds, and aria labels. Grep and replace in UI strings; CONTEXT already names it. - `📅 <absolute day/date in the User's locale> 🕒 <time chips>`. - **Title.** - **Tag chips** (horizontally scrollable when there are many; no "#", leaf name only, full tag in the tooltip). - **Attachments**, one row each, labelled by kind (**"Voice Memo"**, **"Document"**, "Photo", "PDF"), not the file name (the full name in the tooltip). On hover, a small pill at the row's trailing edge with two actions: **Copy link** and **Delete** (delete = the poof + Undo, #603). Audio rows keep the inline ▶ from #622. - **Bottom row**, two pills only: **left** `[Attach File | Voice Memo]`; **right-aligned** `[Edit | Hide | Duplicate | Delete]`. **Remove "Open Day"** (the card only appears on that day anyway). Copy link moves to the right-click menu and the title row (hover). **One action path:** right-click on an item shows **all** the same actions (from the #581 action registry): the hover card's pills and the context menu render the same list. No second implementation. **Tests:** e2e: an item renders the clock + chips / title / leaf tag chips; the card shows the Journal label, date row, chips, kind-labelled attachments with hover Copy link/Delete, and the two bottom pills in that order; right-click lists the same actions. Screenshots at 1440/390, both themes, 3× crops.
Author
Owner

Started #628 on job/calcard-series from dev at 6527b9ef9b. I am tracing the shared Calendar item, preview, attachment, and action-registry code before implementing the owner spec.

Started #628 on job/calcard-series from dev at 6527b9ef9b5a9a1ecbceedc0a01b7fd36f8c5961. I am tracing the shared Calendar item, preview, attachment, and action-registry code before implementing the owner spec.
Author
Owner

Finding: ItemPreview and the right-click menu had separate action lists, so labels and ordering could drift. The Calendar model now supplies one ordered action definition to both. Decision: Hide closes the preview surface; DESIGN §34 does not define persistent Calendar hide state. The hover card keeps attachment actions in their own leading pill and item actions in one trailing pill.

Finding: ItemPreview and the right-click menu had separate action lists, so labels and ordering could drift. The Calendar model now supplies one ordered action definition to both. Decision: Hide closes the preview surface; DESIGN §34 does not define persistent Calendar hide state. The hover card keeps attachment actions in their own leading pill and item actions in one trailing pill.
Author
Owner

Finding from the first production e2e: the CalDAV Event fixture kept in its summary but returned an empty array. GridColumn stripped those inline tokens from the title and then had no Tag row to draw. I am merging inline and indexed Tags for block rendering, with normalization and deduplication.

Finding from the first production e2e: the CalDAV Event fixture kept in its summary but returned an empty array. GridColumn stripped those inline tokens from the title and then had no Tag row to draw. I am merging inline and indexed Tags for block rendering, with normalization and deduplication.
Author
Owner

Finding from the first production e2e: the CalDAV Event fixture kept #area/proof #area/selfcare in its summary but returned an empty event.tags array. GridColumn stripped those inline tokens from the title and then had no Tag row to draw. I am merging inline and indexed Tags for block rendering, with NFC normalization and duplicate removal.

Finding from the first production e2e: the CalDAV Event fixture kept `#area/proof #area/selfcare` in its summary but returned an empty `event.tags` array. GridColumn stripped those inline tokens from the title and then had no Tag row to draw. I am merging inline and indexed Tags for block rendering, with NFC normalization and duplicate removal.
Author
Owner

Finding from the full web suite: the existing TimeGrid Tag test queried .b-meta, which the three-line block no longer renders, and expected a leading #. I updated it to assert the visible leaf travel, no #, the full area/personal/travel tooltip, and the accessible full path. The first rerun then showed the tooltip stores the canonical path without #; the test now matches that value. This keeps the #628 chip behavior under regression coverage.

Finding from the full web suite: the existing TimeGrid Tag test queried `.b-meta`, which the three-line block no longer renders, and expected a leading `#`. I updated it to assert the visible leaf `travel`, no `#`, the full `area/personal/travel` tooltip, and the accessible full path. The first rerun then showed the tooltip stores the canonical path without `#`; the test now matches that value. This keeps the #628 chip behavior under regression coverage.
Author
Owner

#628 complete

Branch: job/calcard-series
Head: 8ee6a0a34e6f6c8b0e930c9e68f9d1d466b02cac
Commits: cd435e354d78ff44e225e5bfdab91db4179fb18a (calendar blocks and shared Journal preview actions), 8ee6a0a34e6f6c8b0e930c9e68f9d1d466b02cac (inline Tag merge and Voice Memo kind detection).

Built the three-line Calendar block layout with separate time chips, leaf-only Tag chips, and +N; the shared Journal hover card with locale date/time, attachment kind rows and hover actions; and one action registry for card and right-click menu. Removed Open Day, placed Copy link on the title row, and changed user-facing Log entry labels to Journal. Added production e2e coverage and screenshots.

Files: packages/ui/src/components/calendar/{GridColumn.svelte,ItemPreview.svelte,AttachmentDeck.svelte,attachments.ts,model.ts}, packages/ui/src/components/TagPill.svelte, packages/ui/src/components/calendar/Agenda.svelte, apps/web/src/routes/calendar/[view]/[date]/+page.svelte, apps/web/src/lib/calendar/TimeGrid.svelte.test.ts, apps/web/src/lib/components/webmcp/types.ts, apps/web/e2e/calendar-preview-421.mjs, plus related Calendar Composer and e2e selector updates in the first commit.

Decisions where DESIGN was silent: Hide closes the current preview surface and does not mutate the Calendar item; read-only Events retain their existing Copy to Calendar action in the shared registry; provider inline Tags merge with indexed Tags after NFC normalization and case-insensitive de-duplication; a Voice memo attachment label identifies audio if the API omits a media type.

Screenshots from the production build are in artifacts/preview-421/: Week grid at 390/820/1440 in light and dark, and Journal/Event/Task cards and action captures at those widths/themes. These are local review artifacts and are not committed.

Gates:

svelte-check found 0 errors and 0 warnings
 Test Files  148 passed (148)
      Tests  1013 passed (1013)
   Start at  14:38:52
   Duration  71.27s (transform 52%, environment 18%, import 16%, tests 10%, setup 4%)
Calendar preview 421 passed; screenshots saved in /home/kayg/Developer/calternal-wt/calcard-series/artifacts/preview-421

Production build output:

✓ built in 30.80s
Run npm run preview to preview your production build locally.

> Using @sveltejs/adapter-static
  Wrote site to "build"
  ✔ done
#628 complete Branch: `job/calcard-series` Head: `8ee6a0a34e6f6c8b0e930c9e68f9d1d466b02cac` Commits: `cd435e354d78ff44e225e5bfdab91db4179fb18a` (calendar blocks and shared Journal preview actions), `8ee6a0a34e6f6c8b0e930c9e68f9d1d466b02cac` (inline Tag merge and Voice Memo kind detection). Built the three-line Calendar block layout with separate time chips, leaf-only Tag chips, and `+N`; the shared Journal hover card with locale date/time, attachment kind rows and hover actions; and one action registry for card and right-click menu. Removed Open Day, placed Copy link on the title row, and changed user-facing Log entry labels to Journal. Added production e2e coverage and screenshots. Files: `packages/ui/src/components/calendar/{GridColumn.svelte,ItemPreview.svelte,AttachmentDeck.svelte,attachments.ts,model.ts}`, `packages/ui/src/components/TagPill.svelte`, `packages/ui/src/components/calendar/Agenda.svelte`, `apps/web/src/routes/calendar/[view]/[date]/+page.svelte`, `apps/web/src/lib/calendar/TimeGrid.svelte.test.ts`, `apps/web/src/lib/components/webmcp/types.ts`, `apps/web/e2e/calendar-preview-421.mjs`, plus related Calendar Composer and e2e selector updates in the first commit. Decisions where DESIGN was silent: `Hide` closes the current preview surface and does not mutate the Calendar item; read-only Events retain their existing Copy to Calendar action in the shared registry; provider inline Tags merge with indexed Tags after NFC normalization and case-insensitive de-duplication; a `Voice memo` attachment label identifies audio if the API omits a media type. Screenshots from the production build are in `artifacts/preview-421/`: Week grid at 390/820/1440 in light and dark, and Journal/Event/Task cards and action captures at those widths/themes. These are local review artifacts and are not committed. Gates: ```text svelte-check found 0 errors and 0 warnings ``` ```text Test Files 148 passed (148) Tests 1013 passed (1013) Start at 14:38:52 Duration 71.27s (transform 52%, environment 18%, import 16%, tests 10%, setup 4%) ``` ```text Calendar preview 421 passed; screenshots saved in /home/kayg/Developer/calternal-wt/calcard-series/artifacts/preview-421 ``` Production build output: ```text ✓ built in 30.80s Run npm run preview to preview your production build locally. > Using @sveltejs/adapter-static Wrote site to "build" ✔ done ```
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#628
No description provided.