chore: merge executor worktree (worktree-agent-a29c13e1)

This commit is contained in:
2026-04-20 17:12:56 +02:00
6 changed files with 122 additions and 14 deletions

View 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

View File

@@ -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}`)}

View File

@@ -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

View File

@@ -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>

View File

@@ -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
)} )}
> >

View File

@@ -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>