` header block. Wrap the entire return in:
```tsx
` root since PageShell provides the outer container.
3. **Skeleton loading:** Replace `if (loading) return null` with:
```tsx
if (loading) return (
{[1, 2, 3, 4, 5].map((i) => (
))}
)
```
**SettingsPage.tsx changes:**
1. **Import PageShell and Skeleton:** Add `import { PageShell } from "@/components/shared/PageShell"` and `import { Skeleton } from "@/components/ui/skeleton"`.
2. **Remove duplicate heading:** Delete the `
{t("settings.title")}
` on line 67. This creates a double heading since the Card below also has a CardTitle with "Settings".
3. **Wrap with PageShell:** Replace the `
` root with:
```tsx
{/* Remove CardHeader with CardTitle since PageShell provides the title.
Keep CardContent as-is. */}
{/* existing form fields unchanged */}
```
Remove the CardHeader and CardTitle entirely -- PageShell provides the page-level title, and the Card should just contain the form. Add `pt-6` to CardContent's className since without CardHeader the content needs top padding.
4. **Skeleton loading:** Replace `if (loading) return null` with:
```tsx
if (loading) return (
{[1, 2, 3].map((i) => (
))}
)
```
5. **Clean up unused imports:** After removing CardHeader and CardTitle usage, update the import to: `import { Card, CardContent } from "@/components/ui/card"`. Remove `CardHeader` and `CardTitle` from the import.
**No i18n changes needed for this task.** QuickAdd and Settings pages already have all required translation keys.
cd /home/jlmak/Projects/jlmak/SimpleFinanceDash && bun run build
QuickAddPage uses PageShell with title and action button, shows skeleton on load. SettingsPage uses PageShell with no double "Settings" heading, Card contains only the form, shows skeleton on load. No `return null` loading patterns remain in either file. Build passes.
- `bun run build` compiles without TypeScript errors
- `grep -c "return null" src/pages/CategoriesPage.tsx src/pages/TemplatePage.tsx src/pages/QuickAddPage.tsx src/pages/SettingsPage.tsx` returns 0 for all files
- `grep -c "size-3 rounded-full" src/pages/CategoriesPage.tsx src/pages/TemplatePage.tsx` returns 0 for both (old dot headers removed)
- `grep -c "border-l-4" src/pages/CategoriesPage.tsx src/pages/TemplatePage.tsx` returns at least 1 for each (new accent headers applied)
- `grep -c "PageShell" src/pages/CategoriesPage.tsx src/pages/QuickAddPage.tsx src/pages/SettingsPage.tsx` returns at least 1 for each
- All four pages (Categories, Template, QuickAdd, Settings) show consistent PageShell-style headers
- All four pages show skeleton loading states instead of blank screens
- Categories and Template pages show left-border accent group headers
- Settings page has exactly ONE "Settings" heading (via PageShell), not two
- `bun run build` passes
- No `return null` loading patterns remain in any of the four files