Files
kandev/docs/plans/sidebar-task-row-compact-trailing/plan.md
T
2026-08-29 10:56:58 +00:00

98 lines
4.5 KiB
Markdown

---
created: 2026-08-28
status: done
requirements:
- REQ-UI-SIDEBAR-TASK-ROW-PRESENTATION-001
system_design:
- ../../specs/ui/system-design/sidebar-task-row-presentation.md
legacy_specs: []
---
# Implementation Plan: Compact Sidebar Trailing Content
## Overview
Refine the compact task-row trailing slot in one vertical implementation pass. The pass removes the
idle change-request menu gap and gives right-side time a short, stable column.
## Scope
### In scope
- Collapse the hidden fine-pointer menu width beside trailing change-request status.
- Reveal the menu on outer-row hover and keyboard focus without covering the status.
- Add a sidebar-only localized elapsed-time ladder for seconds through years.
- Give right-side time a fixed visual width and a full localized accessible name.
- Preserve phone task actions, row navigation, and document-width containment.
### Out of scope
- Changes to saved sidebar-view data or editor choices.
- Changes to provider status derivation or summary content.
- Changes to the shared full relative-time formatter or other time surfaces.
- A new mobile drawer, menu primitive, or task-row preference.
## Technical approach
### Compact elapsed formatter
Add `formatSidebarElapsedTime` to `apps/web/lib/i18n/formats.ts`. Use catalog-backed compact unit
tokens and the bucket rules from the system design. Clamp future values to zero, omit invalid input,
and cap displayed years at `99+`.
Add the six compact unit keys and the bounded-year form to every locale catalog. Keep the visual
tokens short in each language. Do not change `formatRelativeTime` or `formatRelativeCompact`.
### Trailing row geometry
Update `TaskItemTrailing` so a valid formatted time uses one fixed, right-aligned, tabular-number
column. Use the full `formatRelativeTime` phrase as its accessible name. Omit the column when the
compact formatter returns an empty value.
Make the menu wrapper beside `TaskItemChangeRequestStatus` collapse to zero width on idle
fine-pointer rows. Expand it on outer-row hover, menu-open state, or keyboard focus. Keep the status
mounted and interactive. Reuse the current mobile action classes so phone rows keep the visible
44 CSS pixel menu target.
### Test integration
Extend the formatter and trailing-component tests before production changes. Add rendered geometry
assertions to the existing desktop sidebar and PR tests. Extend the mobile sidebar-view scenario for
the touch action, fixed time width, primary row action, and horizontal containment.
## Tests
| Acceptance criterion | Evidence |
| -------------------------------------------- | ------------------------------------------------------------------------------------- |
| `AC-UI-SIDEBAR-TASK-ROW-PRESENTATION-001.8` | `components/task/task-item-trailing.test.tsx`, `e2e/tests/pr/pr-status-badge.spec.ts` |
| `AC-UI-SIDEBAR-TASK-ROW-PRESENTATION-001.13` | `lib/i18n/formats.test.ts`, `e2e/tests/task/sidebar-filter.spec.ts` |
| `AC-UI-SIDEBAR-TASK-ROW-PRESENTATION-001.14` | `components/task/task-item-trailing.test.tsx`, desktop and mobile sidebar-view E2E |
## E2E tests
Desktop Chromium will select a no-details row view. It will prove that compact time has no direction
copy and that all rendered time columns have equal width. A linked change-request row will prove
that the idle status reaches the trailing edge and hover reveals an operable menu beside it.
The `mobile-chrome` project will use the existing task-row settings drawer. It will prove that the
menu target remains visible and touch-sized, the row remains the primary action, and the page has no
horizontal overflow.
## Work orders
- [x] [Task 01: Refine compact trailing content](task-01-refine-compact-trailing-content.md)
## Verification results
- 84 focused Vitest tests passed across the formatter, trailing component, and task item suites.
- `pnpm run lint`, `pnpm run typecheck`, and `pnpm run i18n:check` passed.
- Managed Chromium E2E passed both task-row presentation and PR trailing-action scenarios.
- Managed mobile Chromium E2E passed the task-row settings, touch-target, navigation, and overflow scenario.
- Specification lint and the scoped whitespace check passed.
## Risks
- A zero-width wrapper can leave a focusable button visually hidden if focus expansion is incomplete.
- Localized unit tokens can exceed the visual column if a catalog uses full words.
- Hover geometry can cover the status or title if the action cluster uses absolute positioning.