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"
role="option"
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)}
>
{item.icon && (
@@ -198,7 +198,7 @@ export default function QuickAddPicker({ budgetId }: QuickAddPickerProps) {
<SelectGroup key={type}>
<SelectLabel className="flex items-center gap-1.5">
<div
className="size-2 rounded-full"
className="size-2"
style={{ backgroundColor: categoryColors[type] }}
/>
{t(`categories.types.${type}`)}

View File

@@ -70,7 +70,7 @@ export function CategorySection({
<Collapsible open={open} onOpenChange={onOpenChange}>
<CollapsibleTrigger asChild>
<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] }}
>
<ChevronRight

View File

@@ -17,22 +17,22 @@ function SkeletonStatCard() {
export function DashboardSkeleton() {
return (
<div className="flex flex-col gap-6">
<div className="flex flex-col gap-8">
{/* 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 />
</div>
{/* 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>
<CardHeader>
<Skeleton className="h-5 w-40" />
</CardHeader>
<CardContent>
<Skeleton className="h-[250px] w-full rounded-md" />
<Skeleton className="h-[250px] w-full" />
</CardContent>
</Card>
<Card>
@@ -40,7 +40,7 @@ export function DashboardSkeleton() {
<Skeleton className="h-5 w-40" />
</CardHeader>
<CardContent>
<Skeleton className="h-[250px] w-full rounded-md" />
<Skeleton className="h-[250px] w-full" />
</CardContent>
</Card>
<Card>
@@ -48,7 +48,7 @@ export function DashboardSkeleton() {
<Skeleton className="h-5 w-40" />
</CardHeader>
<CardContent>
<Skeleton className="h-[250px] w-full rounded-md" />
<Skeleton className="h-[250px] w-full" />
</CardContent>
</Card>
</div>
@@ -56,12 +56,12 @@ export function DashboardSkeleton() {
{/* Collapsible sections skeleton */}
<div className="space-y-3">
{[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="h-4 w-32" />
<div className="ml-auto flex items-center gap-2">
<Skeleton className="h-5 w-24 rounded-full" />
<Skeleton className="h-5 w-24 rounded-full" />
<Skeleton className="h-5 w-24" />
<Skeleton className="h-5 w-24" />
<Skeleton className="h-4 w-16" />
</div>
</div>

View File

@@ -9,7 +9,7 @@ export function ChartEmptyState({ message, className }: ChartEmptyStateProps) {
return (
<div
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
)}
>

View File

@@ -12,7 +12,7 @@ export function PageShell({
children,
}: PageShellProps) {
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>
<h1 className="text-2xl font-semibold tracking-tight">{title}</h1>