-
Notifications
You must be signed in to change notification settings - Fork 0
Open
2 / 62 of 6 issues completedOpen
2 / 62 of 6 issues completed
Copy link
Labels
enhancementNew feature or requestNew feature or requestphase:8Phase 8 — Polish + HardeningPhase 8 — Polish + Hardening
Description
Overview
Full audit of Interaction to Next Paint (INP) bottlenecks and perceived performance gaps across the codebase. Each sub-issue below is a self-contained PR targeting a specific problem area.
Sub-issues (recommended order)
- perf: replace window.confirm() with Dialog components #63 — Replace
window.confirm()with Dialog components (P0 — blocks main thread) - perf: add missing loading.tsx skeletons for data-heavy routes #64 — Add missing
loading.tsxskeletons for data-heavy routes (P0 — blank page on navigation) - perf: add optimistic updates for comment and attachment mutations #65 — Optimistic updates for comment and attachment mutations (P1 — dead silence after action)
- perf: add loading fallbacks to dynamic imports and auto-dismiss settings alerts #66 — Loading fallbacks for dynamic imports + auto-dismiss settings alerts (P1)
- perf: add confirmation dialogs to DeletePaymentButton and TimeEntryModal delete #67 — Confirmation dialogs for
DeletePaymentButtonandTimeEntryModaldelete (P2) - perf: replace "Loading…" text with skeleton in InvoiceBuilderClient time entries #68 — Replace "Loading…" text with skeleton in
InvoiceBuilderClient(P2)
What was already good
TaskStatusControl— usesuseOptimistic+useTransitioncorrectly ✅TaskTitleEditor— optimistic local state update before server call ✅DeleteTaskButton— correct Dialog confirmation pattern ✅CloseTaskDialog,TimeEntryModalsave/edit — properisPendinglabel changes ✅tasks/loading.tsx,tasks/[taskKey]/loading.tsx— full structural skeletons ✅
Future development checklist
For all new features, check before opening a PR:
- Every destructive action uses Dialog, not
window.confirm() - Every button shows a label change while
isPending(not just opacity) - Every new route has a
loading.tsxskeleton - Every
dynamic(..., { ssr: false })has aloadingprop - List mutations (add/delete) use
useOptimisticfor instant feedback - Client-side fetches show a skeleton, not a text string
Reactions are currently unavailable
Sub-issues
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or requestphase:8Phase 8 — Polish + HardeningPhase 8 — Polish + Hardening