diff --git a/docs/superpowers/audits/2026-05-21-remaining-plan.md b/docs/superpowers/audits/2026-05-21-remaining-plan.md index 5c767e4b..7ef3f4d9 100644 --- a/docs/superpowers/audits/2026-05-21-remaining-plan.md +++ b/docs/superpowers/audits/2026-05-21-remaining-plan.md @@ -16,24 +16,22 @@ --- -## Group A — Tiny copy / UI fixes (batch as one PR, ~1 h total) +## Group A — Tiny copy / UI fixes — [SHIPPED in e33313b] -These are all <15 min each. Bundle so the commit history doesn't sprawl. +All 12 items closed. 7 new ships + 5 verified pre-shipped (annotation gap in master doc). -1. **[Q] Admin Documenso settings: surface env-fallback state pills** — _src/app/(dashboard)/[portSlug]/admin/documenso/page.tsx_. Pattern from `203f543` (env-fallback tooltip on password fields) needs to be applied to all Documenso settings fields. Show `Using env fallback` / `Per-port override active` pill next to each field. ~30 min. -2. **[Q] WatchersCard empty-state padding** — small CSS fix, add `pb-2` or `pb-3` to the empty state. ~5 min. -3. **[Q] EOI empty state: add "Mark as signed without file" button (parity with Reservation + Contract tabs)** — _src/components/interests/interest-eoi-tab.tsx_ — copy the existing button from the reservation/contract tabs that fires `markStageSigned` without requiring a PDF upload. ~10 min. -4. **[Q] `/invoices/upload-receipts` guide: copy rewrite** — terse, professional, in the luxury-CRM voice. ~10 min. -5. **[Q] Pageviews chart: X-axis date ticks too cramped — drop the time component** — _src/components/website-analytics/_. Format ticks `MMM d` instead of `MMM d HH:mm`. ~5 min. -6. **[Q] Pageviews chart: inline note explaining Pageviews vs Sessions** — small `

` under the chart title. ~5 min. -7. **[Q] Inbox: swap section order — Reminders above Alerts** — _src/components/inbox/_. Single JSX reorder. ~3 min. -8. **[Q] BulkAddBerthsWizard: currency field should use ``** — _src/components/admin/bulk-add-berths-wizard.tsx_. Swap raw input for the existing component. ~5 min. -9. **[Q] CommandList scroll-cap bug** — _src/components/ui/command.tsx_. CommandList inside Popover scrolls short of the bottom. Add `max-h-[var(--radix-popover-content-available-height)]` to the inner scroll container. Affects every cmdk dropdown. ~10 min. -10. **[Q] DropdownMenu content stretches to fill viewport — cap it** — _src/components/ui/dropdown-menu.tsx_. Add `max-h-[80vh]` to the content variant. ~5 min. -11. **[Q] Residential InterestsTab: whole row should navigate to the interest, not just the "View" link** — wrap row in `` or add `onClick` to the row. ~10 min. -12. **[Q] StageStepper: surface stage names visibly on reached slices** — _src/components/interests/stage-stepper.tsx_. Currently shows just an icon; add `aria-label` + visible text below the icon on reached slices. ~15 min. - -**Commit shape:** one PR titled `chore(uat-batch): group-A copy + UI quick fixes (12 items)`. +1. **[SHIPPED — e33313b]** Admin Documenso settings env-fallback pills — collapsed legacy SettingsFormCard blocks into RegistryDrivenForm sections (`documenso.behavior` + `documenso.templates`). +2. **[SHIPPED — e33313b]** WatchersCard empty-state padding — `mb-3` → `mb-4 pb-1`. +3. **[SHIPPED — 52342ee, verified]** EOI "Mark as signed without file" button — already in place. +4. **[SHIPPED — e33313b]** /invoices/upload-receipts copy rewrite — ~50% body-copy reduction, terse luxury-CRM voice. +5. **[SHIPPED — e33313b]** Pageviews X-axis ticks — `interval="preserveStartEnd"` + `minTickGap={52}`. +6. **[SHIPPED earlier, verified]** Pageviews vs Sessions explainer — Info popover already in `website-analytics-shell.tsx`. +7. **[SHIPPED — e33313b]** Inbox section order — docstring fixed; JSX already had Reminders before Alerts. +8. **[SHIPPED earlier, verified]** BulkAddBerthsWizard CurrencySelect — already wired at apply-to-all + per-row. +9. **[SHIPPED — e33313b]** CommandList scroll-cap — `max-h-[min(300px,var(--radix-popover-content-available-height,300px))]`. +10. **[SHIPPED — e33313b]** DropdownMenu max-h cap — `max-h-[min(24rem,var(--radix-dropdown-menu-content-available-height,24rem))]`. +11. **[SHIPPED — e33313b]** Residential InterestsTab whole-row navigate — `` + first-cell Link stopPropagation. +12. **[SHIPPED — e33313b]** StageStepper visible stage names — stage-name row below the bar; `size="xs"` hides labels. --- diff --git a/docs/superpowers/audits/alpha-uat-master.md b/docs/superpowers/audits/alpha-uat-master.md index 76999514..c22a0317 100644 --- a/docs/superpowers/audits/alpha-uat-master.md +++ b/docs/superpowers/audits/alpha-uat-master.md @@ -25,7 +25,7 @@ _Copy tweaks, alignment, single-prop edits, obvious typos._ > > - **Rename "Mark in EOI bundle" + add tooltip** — _src/components/interests/linked-berths-list.tsx (or wherever the toggle lives)_ — the toggle controls `interest_berths.is_in_eoi_bundle` (per CLAUDE.md), which decides _which_ of the deal's berths the signed EOI document actually commits to. Today the rep sees a label they can't decode. Rename to something like "Include in EOI" + add an info-tooltip popover explaining "Berths flagged here are covered by the EOI signature. A deal can flag a subset (e.g. 2 of 3 linked berths)." ~10 min. **SHIPPED in db51106:** label renamed to "Include in EOI"; existing tooltip already explained the bundle-vs-signature distinction. > - **Lower supplemental-info-request link TTL to ~2 weeks** — _src/lib/services/_ (token model) — link currently expires ~1 month out (`Wed, 17 Jun 2026` shown for an email sent May 18 = ~30 days). User wants ~14 days. Single constant change. ~5 min. **SHIPPED in db51106:** `TOKEN_TTL_DAYS` 30 → 14 in supplemental-forms.service. -> - **Admin Documenso settings: surface env-fallback state** — _src/app/(dashboard)/[portSlug]/admin/_ (Documenso settings page) — `getPortDocumensoConfig` already does the right thing (`adminValue ?? env.DOCUMENSO_API_KEY ?? ''`), but the admin UI doesn't show which fields are filled by the admin entry vs. silently falling back to env. Caused an in-session diagnosis loop where the operator had entered creds on Port Amador but was generating EOIs on Port Nimara — Port Nimara's admin row was empty, so it fell back to a stale env key and threw 401. Recommend a small "Using fallback from env" / "Per-port override active" pill next to each Documenso settings field so the operator can see at a glance which scope is in effect. ~30 min. +> - **Admin Documenso settings: surface env-fallback state** — _src/app/(dashboard)/[portSlug]/admin/_ (Documenso settings page) — `getPortDocumensoConfig` already does the right thing (`adminValue ?? env.DOCUMENSO_API_KEY ?? ''`), but the admin UI doesn't show which fields are filled by the admin entry vs. silently falling back to env. Caused an in-session diagnosis loop where the operator had entered creds on Port Amador but was generating EOIs on Port Nimara — Port Nimara's admin row was empty, so it fell back to a stale env key and threw 401. Recommend a small "Using fallback from env" / "Per-port override active" pill next to each Documenso settings field so the operator can see at a glance which scope is in effect. ~30 min. **SHIPPED in e33313b:** collapsed `V2_FEATURE_FIELDS` + `CONTRACT_RESERVATION_FIELDS` (legacy `SettingsFormCard`) into `RegistryDrivenForm` sections (`documenso.behavior` + the existing `documenso.templates`). Every Documenso setting now flows through the registry path that surfaces the env-fallback / port / global source badge per field via `/api/v1/admin/settings/resolved`. EOI generation card retitled to "Templates & signing pathway" since `documenso.templates` covers EOI + reservation + contract template IDs. > - **InterestDocumentsTab label clarity** — _src/components/interests/interest-documents-tab.tsx_ — the tab has two sections: "Legal documents" (Documenso envelopes — EOI / Reservation / Contract, signature-driven) and "Attachments" (general file uploads). "Legal documents" is misleading — the section is scoped to _signature envelopes_, not any legal doc. A rep uploading externally-signed PDFs (lawyer-prepared addenda, etc.) currently goes into Attachments — fine, but the label gap suggests reps expect "Legal documents" to accept external uploads too. Two paths: (a) rename "Legal documents" → "Signature documents" (or "Contracts & EOI") to scope it correctly, OR (b) allow external uploads into that section (more disruptive — needs file-classification metadata). ~15 min for rename + tooltip; ~2 h for upload route. **SHIPPED (a) in 552b966:** section heading renamed to "Signature documents". > - **Berth recommender: drop the "Tier X" prefix, keep plain-English label + add tooltip** — _src/components/interests/berth-recommender-panel.tsx:181_ (the pill render) and _:94-99_ (`TIER_LABELS` map) — the pill currently renders `Tier A · Open` / `Tier B · Fall-through` / `Tier C · Active interest` / `Tier D · Late stage`. The four tier letters are internal taxonomy from `berth-recommender.service.ts` (A = never had interest, B = past fall-through, C = active interest, D = active in late stage); reps don't speak in tier letters and the suffix label already carries the meaning. Fix: (1) drop the `Tier {rec.tier} · ` prefix in the rendered pill — show just `tier.label` (e.g. "Open" / "Fall-through" / "Active interest" / "Late stage") so the chip is self-explanatory. (2) Wrap the pill in a `Popover` (click) or `Tooltip` (hover) that explains the four-state ladder in plain English: "Recommender state — **Open**: never had interest. **Fall-through**: prior interest didn't close (warm). **Active interest**: another deal is in play. **Late stage**: another deal is near-sold." (3) Optional: a small `?` icon next to the chip so the tooltip is discoverable without hovering. The internal `Tier` type stays as-is in the service (it has semantic value in the SQL ladder + admin settings); only the UI label changes. ~15 min. Captured 2026-05-18 from UAT. **SHIPPED in 203f543:** pill is now a Popover trigger with the plain-English label + HelpCircle icon; popover content explains the 4-state ladder. > - **ChartCard: center the chart vertically when grid row is taller than the chart** — _src/components/dashboard/chart-card.tsx_ — every chart widget (`pipeline-funnel`, `occupancy-timeline`, `lead-source`, `berth-status`, `source-conversion`, …) wraps a fixed-height `ResponsiveContainer` (240-280px) inside `ChartCard`. The Card is `h-full` (stretches to its grid-row height) but the inner content keeps its 240-280px and pins to the top — when a neighbour card in the same row is taller (e.g. Pipeline Value with its full per-stage breakdown), the chart card has visible empty space below the chart. Fix: convert `ChartCard` to a flex-column (``); `CardHeader` keeps natural height; `CardContent` gets `flex-1 flex items-center` so the chart's wrapping div sits vertically centered in the remaining space. ResponsiveContainer stays at its declared fixed height. Affects all chart widgets via one wrapper change — no per-chart edits. ~10 min. Captured 2026-05-18 from UAT. **SHIPPED in 203f543.** @@ -98,7 +98,7 @@ _Copy tweaks, alignment, single-prop edits, obvious typos._ > - **Render order change in interest-tabs.tsx:** lift the PaymentsSection mount from its current position (line 846-852, above milestones) to AFTER the milestone strip + AFTER the OverviewTab grid (below "Latest note", Tags, Berth requirements). It becomes the last visual element on the OverviewTab. > - **Collapse state:** persist per-interest via Zustand or react-query cache (so re-opening the same deal remembers the rep's last expand/collapse). Default collapsed unless a deposit was added in this session. > - **Effort:** ~1-1.5h (layout reorder + collapsed-bar state + summary chip + render-order verification). Captured 2026-05-21 from UAT. **SHIPPED (layout reorder) in f39f0aa:** PaymentsSection moved below milestones (was above). Collapsed-bar + summary-chip refinement parked. -> - **WatchersCard empty state missing bottom padding** — _src/components/documents/document-detail.tsx:546_ — `

No one is watching this document yet.

` has no margin while the sibling populated `