chore: merge executor worktree (worktree-agent-a29c13e1)
This commit is contained in:
108
.planning/phases/05-design-system-token-rework/05-02-SUMMARY.md
Normal file
108
.planning/phases/05-design-system-token-rework/05-02-SUMMARY.md
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
---
|
||||||
|
phase: 05-design-system-token-rework
|
||||||
|
plan: "02"
|
||||||
|
subsystem: frontend-components
|
||||||
|
tags: [design-system, sharp-corners, spacing, shared-components]
|
||||||
|
dependency_graph:
|
||||||
|
requires: []
|
||||||
|
provides: [sharp-corners-in-shared-components, gap-8-page-spacing]
|
||||||
|
affects: [all-9-pages, dashboard-skeleton, category-sections, chart-empty-states, quick-add-picker]
|
||||||
|
tech_stack:
|
||||||
|
added: []
|
||||||
|
patterns: [remove-hardcoded-rounded-classes, upgrade-gap-spacing]
|
||||||
|
key_files:
|
||||||
|
modified:
|
||||||
|
- src/components/shared/PageShell.tsx
|
||||||
|
- src/components/dashboard/DashboardSkeleton.tsx
|
||||||
|
- src/components/dashboard/CategorySection.tsx
|
||||||
|
- src/components/dashboard/charts/ChartEmptyState.tsx
|
||||||
|
- src/components/QuickAddPicker.tsx
|
||||||
|
decisions:
|
||||||
|
- "Upgraded DashboardSkeleton summary-cards grid from gap-4 to gap-6 (not gap-8) to match plan spec for the inner card grid"
|
||||||
|
- "Upgraded DashboardSkeleton chart grid from gap-6 to gap-8 as specified"
|
||||||
|
metrics:
|
||||||
|
duration: "91s"
|
||||||
|
completed: "2026-04-20"
|
||||||
|
tasks_completed: 2
|
||||||
|
tasks_total: 2
|
||||||
|
files_modified: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
# Phase 05 Plan 02: Shared Component Rounding and Spacing Cleanup Summary
|
||||||
|
|
||||||
|
Sharp corners enforced across all 5 shared components by removing hardcoded `rounded-*` classes, and page-level spacing upgraded from `gap-6` to `gap-8` in PageShell propagating to all 9 pages.
|
||||||
|
|
||||||
|
## Tasks Completed
|
||||||
|
|
||||||
|
| Task | Name | Commit | Files Modified |
|
||||||
|
|------|------|--------|----------------|
|
||||||
|
| 1 | Upgrade PageShell spacing and remove rounded-* from DashboardSkeleton | e8f13c9 | PageShell.tsx, DashboardSkeleton.tsx |
|
||||||
|
| 2 | Remove rounded-* from CategorySection, ChartEmptyState, QuickAddPicker | e7282fa | CategorySection.tsx, ChartEmptyState.tsx, QuickAddPicker.tsx |
|
||||||
|
|
||||||
|
## Changes Made
|
||||||
|
|
||||||
|
### Task 1: PageShell + DashboardSkeleton
|
||||||
|
|
||||||
|
**PageShell.tsx**
|
||||||
|
- `gap-6` → `gap-8` in the root flex container (line 15) — applies generous section spacing across all 9 pages
|
||||||
|
|
||||||
|
**DashboardSkeleton.tsx**
|
||||||
|
- Outer flex: `gap-6` → `gap-8`
|
||||||
|
- Summary cards grid: `gap-4` → `gap-6`
|
||||||
|
- Chart area grid: `gap-6` → `gap-8`
|
||||||
|
- Removed `rounded-md` from 3 chart skeleton `<Skeleton>` elements
|
||||||
|
- Removed `rounded-md` from collapsible section row `<div>`
|
||||||
|
- Removed `rounded-full` from 2 badge `<Skeleton>` elements (2 occurrences via replace_all)
|
||||||
|
|
||||||
|
### Task 2: CategorySection + ChartEmptyState + QuickAddPicker
|
||||||
|
|
||||||
|
**CategorySection.tsx**
|
||||||
|
- Removed `rounded-md` from collapsible trigger `<button>` — sharp left-bordered row maintained via `border-l-4`
|
||||||
|
|
||||||
|
**ChartEmptyState.tsx**
|
||||||
|
- Removed `rounded-lg` from the dashed-border container div — sharp rectangular empty state
|
||||||
|
|
||||||
|
**QuickAddPicker.tsx**
|
||||||
|
- Removed `rounded-sm` from picker item `<button>` elements in the popover list
|
||||||
|
- Removed `rounded-full` from the category type dot indicator `<div>`
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
```
|
||||||
|
bun run build → exit 0 (both tasks)
|
||||||
|
grep rounded-md PageShell.tsx → 0 matches
|
||||||
|
grep rounded-md DashboardSkeleton.tsx → 0 matches
|
||||||
|
grep rounded-full DashboardSkeleton.tsx → 0 matches
|
||||||
|
grep rounded-md CategorySection.tsx → 0 matches
|
||||||
|
grep rounded-lg ChartEmptyState.tsx → 0 matches
|
||||||
|
grep rounded-sm QuickAddPicker.tsx → 0 matches
|
||||||
|
grep rounded-full QuickAddPicker.tsx → 0 matches
|
||||||
|
grep gap-8 PageShell.tsx → 1 match ✓
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deviations from Plan
|
||||||
|
|
||||||
|
None — plan executed exactly as written.
|
||||||
|
|
||||||
|
## Known Stubs
|
||||||
|
|
||||||
|
None — this plan modifies only CSS class strings. No data wiring or UI stubs introduced.
|
||||||
|
|
||||||
|
## Threat Flags
|
||||||
|
|
||||||
|
None — pure CSS class changes, no security-relevant surface modified.
|
||||||
|
|
||||||
|
## Self-Check
|
||||||
|
|
||||||
|
**Commits exist:**
|
||||||
|
- e8f13c9: feat(05-02): upgrade PageShell spacing to gap-8 and remove rounded-* from DashboardSkeleton
|
||||||
|
- e7282fa: feat(05-02): remove hardcoded rounded-* from CategorySection, ChartEmptyState, QuickAddPicker
|
||||||
|
|
||||||
|
**Files exist:**
|
||||||
|
- src/components/shared/PageShell.tsx — modified
|
||||||
|
- src/components/dashboard/DashboardSkeleton.tsx — modified
|
||||||
|
- src/components/dashboard/CategorySection.tsx — modified
|
||||||
|
- src/components/dashboard/charts/ChartEmptyState.tsx — modified
|
||||||
|
- src/components/QuickAddPicker.tsx — modified
|
||||||
|
|
||||||
|
## Self-Check: PASSED
|
||||||
@@ -153,7 +153,7 @@ export default function QuickAddPicker({ budgetId }: QuickAddPickerProps) {
|
|||||||
type="button"
|
type="button"
|
||||||
role="option"
|
role="option"
|
||||||
aria-selected={false}
|
aria-selected={false}
|
||||||
className="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
className="flex w-full items-center gap-2 px-2 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
||||||
onClick={() => handlePickItem(item)}
|
onClick={() => handlePickItem(item)}
|
||||||
>
|
>
|
||||||
{item.icon && (
|
{item.icon && (
|
||||||
@@ -198,7 +198,7 @@ export default function QuickAddPicker({ budgetId }: QuickAddPickerProps) {
|
|||||||
<SelectGroup key={type}>
|
<SelectGroup key={type}>
|
||||||
<SelectLabel className="flex items-center gap-1.5">
|
<SelectLabel className="flex items-center gap-1.5">
|
||||||
<div
|
<div
|
||||||
className="size-2 rounded-full"
|
className="size-2"
|
||||||
style={{ backgroundColor: categoryColors[type] }}
|
style={{ backgroundColor: categoryColors[type] }}
|
||||||
/>
|
/>
|
||||||
{t(`categories.types.${type}`)}
|
{t(`categories.types.${type}`)}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ export function CategorySection({
|
|||||||
<Collapsible open={open} onOpenChange={onOpenChange}>
|
<Collapsible open={open} onOpenChange={onOpenChange}>
|
||||||
<CollapsibleTrigger asChild>
|
<CollapsibleTrigger asChild>
|
||||||
<button
|
<button
|
||||||
className="group flex w-full items-center gap-3 rounded-md border-l-4 bg-card px-4 py-3 text-left hover:bg-muted/40 transition-colors"
|
className="group flex w-full items-center gap-3 border-l-4 bg-card px-4 py-3 text-left hover:bg-muted/40 transition-colors"
|
||||||
style={{ borderLeftColor: categoryColors[type] }}
|
style={{ borderLeftColor: categoryColors[type] }}
|
||||||
>
|
>
|
||||||
<ChevronRight
|
<ChevronRight
|
||||||
|
|||||||
@@ -17,22 +17,22 @@ function SkeletonStatCard() {
|
|||||||
|
|
||||||
export function DashboardSkeleton() {
|
export function DashboardSkeleton() {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-6">
|
<div className="flex flex-col gap-8">
|
||||||
{/* Summary cards skeleton */}
|
{/* Summary cards skeleton */}
|
||||||
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
|
<div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
||||||
<SkeletonStatCard />
|
<SkeletonStatCard />
|
||||||
<SkeletonStatCard />
|
<SkeletonStatCard />
|
||||||
<SkeletonStatCard />
|
<SkeletonStatCard />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 3-column chart area skeleton */}
|
{/* 3-column chart area skeleton */}
|
||||||
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
|
<div className="grid gap-8 md:grid-cols-2 lg:grid-cols-3">
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<Skeleton className="h-5 w-40" />
|
<Skeleton className="h-5 w-40" />
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<Skeleton className="h-[250px] w-full rounded-md" />
|
<Skeleton className="h-[250px] w-full" />
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
<Card>
|
<Card>
|
||||||
@@ -40,7 +40,7 @@ export function DashboardSkeleton() {
|
|||||||
<Skeleton className="h-5 w-40" />
|
<Skeleton className="h-5 w-40" />
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<Skeleton className="h-[250px] w-full rounded-md" />
|
<Skeleton className="h-[250px] w-full" />
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
<Card>
|
<Card>
|
||||||
@@ -48,7 +48,7 @@ export function DashboardSkeleton() {
|
|||||||
<Skeleton className="h-5 w-40" />
|
<Skeleton className="h-5 w-40" />
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<Skeleton className="h-[250px] w-full rounded-md" />
|
<Skeleton className="h-[250px] w-full" />
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
@@ -56,12 +56,12 @@ export function DashboardSkeleton() {
|
|||||||
{/* Collapsible sections skeleton */}
|
{/* Collapsible sections skeleton */}
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
{[1, 2, 3].map((i) => (
|
{[1, 2, 3].map((i) => (
|
||||||
<div key={i} className="flex items-center gap-3 rounded-md border-l-4 border-muted bg-card px-4 py-3">
|
<div key={i} className="flex items-center gap-3 border-l-4 border-muted bg-card px-4 py-3">
|
||||||
<Skeleton className="size-4" />
|
<Skeleton className="size-4" />
|
||||||
<Skeleton className="h-4 w-32" />
|
<Skeleton className="h-4 w-32" />
|
||||||
<div className="ml-auto flex items-center gap-2">
|
<div className="ml-auto flex items-center gap-2">
|
||||||
<Skeleton className="h-5 w-24 rounded-full" />
|
<Skeleton className="h-5 w-24" />
|
||||||
<Skeleton className="h-5 w-24 rounded-full" />
|
<Skeleton className="h-5 w-24" />
|
||||||
<Skeleton className="h-4 w-16" />
|
<Skeleton className="h-4 w-16" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ export function ChartEmptyState({ message, className }: ChartEmptyStateProps) {
|
|||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={cn(
|
className={cn(
|
||||||
"flex min-h-[250px] w-full items-center justify-center rounded-lg border border-dashed border-muted-foreground/20 bg-muted/30",
|
"flex min-h-[250px] w-full items-center justify-center border border-dashed border-muted-foreground/20 bg-muted/30",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export function PageShell({
|
|||||||
children,
|
children,
|
||||||
}: PageShellProps) {
|
}: PageShellProps) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-6">
|
<div className="flex flex-col gap-8">
|
||||||
<div className="flex items-start justify-between gap-4">
|
<div className="flex items-start justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h1 className="text-2xl font-semibold tracking-tight">{title}</h1>
|
<h1 className="text-2xl font-semibold tracking-tight">{title}</h1>
|
||||||
|
|||||||
Reference in New Issue
Block a user