UMBRA/frontend
Kyle Pope 1806e15487 Address all QA review warnings and suggestions for entity pages
Warnings fixed:
- 3.1: _compute_display_name stale-data bug on all-names-clear
- 3.3: Location getValue unsafe type cast replaced with typed helper
- 3.5: Explicit updated_at timestamp refresh in locations router
- 3.6: Drop deprecated relationship column (migration 021, model, schema, TS type)

Suggestions fixed:
- 4.1: CategoryAutocomplete keyboard navigation (ArrowUp/Down, Enter, Escape)
- 4.2: Mobile detail panel backdrop click-to-close on both pages
- 4.3: PersonCreate whitespace bypass in require_some_name validator
- 4.5/4.6: Extract SortIcon, DataRow, SectionHeader from EntityTable render body
- 4.8: PersonForm sends null instead of empty string for birthday
- 4.10: Remove unnecessary executeDelete wrapper in EntityDetailPanel

Also includes previously completed fixes from prior session:
- 2.1: Remove Z suffix from naive timestamp in formatUpdatedAt
- 3.2: Drag-then-click conflict prevention in SortableCategoryChip
- 3.4: localStorage JSON shape validation in useCategoryOrder
- 4.4: Category chip styling consistency (both pages use inline hsl styles)
- 4.9: restrictToHorizontalAxis modifier on CategoryFilterBar drag

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 01:04:20 +08:00
..
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00
2026-02-15 16:13:41 +08:00

UMBRA Frontend

A modern, dark-themed React application for managing your life - todos, calendar events, reminders, projects, people, and locations.

Tech Stack

  • React 18 with TypeScript
  • Vite for fast builds
  • Tailwind CSS v3 for styling
  • shadcn/ui components (manually implemented)
  • React Router v6 for routing
  • TanStack Query v5 for data fetching
  • Axios for HTTP requests
  • FullCalendar for calendar view
  • Lucide React for icons
  • date-fns for date formatting
  • sonner for toast notifications

Features

  • PIN-based authentication with setup wizard
  • Dark theme with customizable accent colors (cyan, blue, purple, orange, green)
  • Dashboard with stats and widgets
  • Todos with priority, category, and recurrence
  • Calendar with event management
  • Reminders with dismiss functionality
  • Projects with tasks and progress tracking
  • People management with relationships
  • Locations categorization
  • Responsive design with collapsible sidebar

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm or yarn

Installation

# Install dependencies
npm install

# Start development server
npm run dev

# Build for production
npm run build

# Preview production build
npm run preview

Development

The application expects a backend API at /api. During development, Vite proxies /api requests to http://localhost:8000.

Project Structure

frontend/
├── src/
│   ├── components/
│   │   ├── auth/          # Authentication components
│   │   ├── calendar/      # Calendar page and forms
│   │   ├── dashboard/     # Dashboard widgets
│   │   ├── layout/        # Layout components (sidebar, etc)
│   │   ├── locations/     # Locations management
│   │   ├── people/        # People management
│   │   ├── projects/      # Projects and tasks
│   │   ├── reminders/     # Reminders management
│   │   ├── settings/      # Settings page
│   │   ├── todos/         # Todos management
│   │   └── ui/            # shadcn/ui components
│   ├── hooks/             # Custom React hooks
│   ├── lib/               # Utilities (API client, utils)
│   ├── types/             # TypeScript type definitions
│   ├── App.tsx            # Main app with routing
│   ├── main.tsx           # Entry point
│   └── index.css          # Global styles
├── Dockerfile             # Production Docker image
├── nginx.conf             # Nginx configuration
└── package.json

Docker Deployment

Build and run with Docker:

# Build image
docker build -t umbra-frontend .

# Run container
docker run -p 80:80 umbra-frontend

Environment Variables

No environment variables required. API base URL is configured to /api and proxied by nginx in production.

Customization

Accent Colors

Accent colors are defined in src/hooks/useTheme.ts and can be changed in Settings. The application uses CSS custom properties for theming.

Adding New Pages

  1. Create component in src/components/<feature>/
  2. Add route in src/App.tsx
  3. Add navigation item in src/components/layout/Sidebar.tsx

License

Private project - all rights reserved.