Mail: remove unread dots; bold emphasis shows unread #1389

Closed
opened 2026-10-07 18:12:50 +00:00 by kayg · 5 comments
Owner

Owner report (2026-10-07, repeated; asked before)

"in mail, the dots should not be there? the highlight already indicates that a mail is unread?"

Decision

Remove the unread dot from Mail list rows (and from thread toggles). Unread state is shown by the existing emphasis only: the bold sender and subject (the "highlight"). Rows must not keep an empty indent where the dot was; text starts at the row's normal inset. Screen readers keep the "Unread:" text. Mark read/unread still updates the emphasis at once.

Code: apps/web/src/lib/mail/MailView.svelte .unread-dot (rows ~1377, ~1412; CSS ~1560, ~1583). Check Search results and any other Mail row component for the same dot.

## Owner report (2026-10-07, repeated; asked before) "in mail, the dots should not be there? the highlight already indicates that a mail is unread?" ## Decision Remove the unread dot from Mail list rows (and from thread toggles). Unread state is shown by the existing emphasis only: the bold sender and subject (the "highlight"). Rows must not keep an empty indent where the dot was; text starts at the row's normal inset. Screen readers keep the "Unread:" text. Mark read/unread still updates the emphasis at once. Code: apps/web/src/lib/mail/MailView.svelte `.unread-dot` (rows ~1377, ~1412; CSS ~1560, ~1583). Check Search results and any other Mail row component for the same dot.
Author
Owner

Starting work on job/mailrows-1390 from base 0419170fe4 (branch job/mailrows-1390). I will handle #1389 and #1390 in separate commits and comments.

Starting work on job/mailrows-1390 from base 0419170fe456b58614befcb12d9c9d255118f1c0 (branch job/mailrows-1390). I will handle #1389 and #1390 in separate commits and comments.
Author
Owner

Finding on #1389: MailView.svelte contained the only Mail unread-dot markup, in list rows and thread toggles. I removed both, retained the Unread: screen-reader labels, removed the empty icon column and aligned row dividers to the normal inset, and updated the live projection check to follow the unread class. Focused test: bunx vitest run src/lib/mail/MailView.svelte.test.ts --maxWorkers=2 — 1 test passed.

Finding on #1389: `MailView.svelte` contained the only Mail unread-dot markup, in list rows and thread toggles. I removed both, retained the `Unread:` screen-reader labels, removed the empty icon column and aligned row dividers to the normal inset, and updated the live projection check to follow the unread class. Focused test: `bunx vitest run src/lib/mail/MailView.svelte.test.ts --maxWorkers=2` — 1 test passed.
Author
Owner

Implemented #1389 on job/mailrows-1390.

Head SHA: 8078bface56724c49520e651b2cb4378d6b51d8e

Removed unread dots from Mail thread rows and thread message toggles. Unread rows keep the existing bold sender and subject emphasis, the “Unread:” screen-reader label, and no reserved dot gutter. Search result rows were checked; they had no unread dot to remove. The real-list e2e asserts that no unread dots render.

Files: apps/web/src/lib/mail/MailView.svelte, apps/web/src/lib/mail/MailView.svelte.test.ts, apps/web/e2e/mail-proxy-486.mjs, apps/web/e2e/mail-layouts.mjs, docs/DESIGN.md.

Gates

bun run check exited 0. Verbatim summary lines:

PASS production dependency licences: 759 locked package releases across apps/web, apps/docs and packages
perf-lint: PASS; 0 violations; 22544 scoped exceptions
User browser caches use userStorage; only documented device/public-link exceptions remain.
Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css.
Text sizes and UI shape values use shared role tokens.
Keyboard focus rings use the shared focus tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
svelte-check found 0 errors and 1 warning in 1 file

The one Svelte warning is the existing unused .ready selector in the unrelated Money route at apps/web/src/routes/money/[budget]/[month]/+page.svelte:407.

Focused Vitest output:

 Test Files  1 passed (1)
      Tests  2 passed (2)

Mail e2e output:

Mail layouts e2e passed; screenshots are in artifacts/mail-layouts

Screenshot proof (macOS platform emulation, actual-size PNGs):

UX gaps closed: Dot removal keeps row alignment; screen readers still hear “Unread:”; unread sender and subject remain emphasized. UX gaps left: None found.

Decisions: No additional product decision was needed for #1389; DESIGN §45 now records the unread treatment.

Implemented #1389 on `job/mailrows-1390`. **Head SHA:** `8078bface56724c49520e651b2cb4378d6b51d8e` Removed unread dots from Mail thread rows and thread message toggles. Unread rows keep the existing bold sender and subject emphasis, the “Unread:” screen-reader label, and no reserved dot gutter. Search result rows were checked; they had no unread dot to remove. The real-list e2e asserts that no unread dots render. **Files:** `apps/web/src/lib/mail/MailView.svelte`, `apps/web/src/lib/mail/MailView.svelte.test.ts`, `apps/web/e2e/mail-proxy-486.mjs`, `apps/web/e2e/mail-layouts.mjs`, `docs/DESIGN.md`. **Gates** `bun run check` exited 0. Verbatim summary lines: ```text PASS production dependency licences: 759 locked package releases across apps/web, apps/docs and packages perf-lint: PASS; 0 violations; 22544 scoped exceptions User browser caches use userStorage; only documented device/public-link exceptions remain. Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css. Text sizes and UI shape values use shared role tokens. Keyboard focus rings use the shared focus tokens. UI transitions and animation options use shared motion tokens or documented exceptions. svelte-check found 0 errors and 1 warning in 1 file ``` The one Svelte warning is the existing unused `.ready` selector in the unrelated Money route at `apps/web/src/routes/money/[budget]/[month]/+page.svelte:407`. Focused Vitest output: ```text Test Files 1 passed (1) Tests 2 passed (2) ``` Mail e2e output: ```text Mail layouts e2e passed; screenshots are in artifacts/mail-layouts ``` **Screenshot proof (macOS platform emulation, actual-size PNGs):** - [columns-desktop-columns-row-zoom-paper-light.png](https://git.kayg.org/attachments/1c82e955-e81e-4b76-b0a5-e4200aea5c7d) - [columns-desktop-columns-row-zoom-tokyo-night-dark.png](https://git.kayg.org/attachments/59bd5a15-22f9-45ea-adf7-35d3670f9e02) - [mail-list-phone-paper-light.png](https://git.kayg.org/attachments/02b5fa02-dd2c-4dfc-ac29-032ed25387f9) - [mail-list-phone-tokyo-night-dark.png](https://git.kayg.org/attachments/289e8b89-cc59-4586-9141-fdf4630b57c4) **UX gaps closed:** Dot removal keeps row alignment; screen readers still hear “Unread:”; unread sender and subject remain emphasized. **UX gaps left:** None found. **Decisions:** No additional product decision was needed for #1389; DESIGN §45 now records the unread treatment.
Author
Owner

Verification update for #1389 (head remains 8078bface56724c49520e651b2cb4378d6b51d8e).

The full web test command also passed: cd apps/web && bun run test --maxWorkers=2 (exit code 0).

 Test Files  298 passed (298)
      Tests  2118 passed (2118)
   Start at  03:43:38
   Duration  488.68s (transform 28%, environment 26%, import 23%, tests 18%, setup 5%)
Verification update for #1389 (head remains `8078bface56724c49520e651b2cb4378d6b51d8e`). The full web test command also passed: `cd apps/web && bun run test --maxWorkers=2` (exit code 0). ```text Test Files 298 passed (298) Tests 2118 passed (2118) Start at 03:43:38 Duration 488.68s (transform 28%, environment 26%, import 23%, tests 18%, setup 5%) ```
Author
Owner

Deployed to calternal.cloud in merge round 35b (build 9dc65437e, live 2026-10-09 ~11:07 IST). Closing.

Deployed to calternal.cloud in merge round 35b (build 9dc65437e, live 2026-10-09 ~11:07 IST). Closing.
kayg closed this issue 2026-10-09 05:36:51 +00:00
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
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-v0#1389
No description provided.