feat: Phase 4-5 — demo mode, polish, deploy, and bug fixes

Add demo mode with mock data provider, Docker deployment, Playwright
tests, PostHog analytics, error boundaries, and SEO metadata. Fix
residences API response unwrapping, kanban drag-and-drop with optimistic
updates, trailing slash proxy redirects, and column name mismatches with
Go API.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-03-03 11:37:41 -06:00
parent 5a50d77515
commit 7884ebbfd4
133 changed files with 3904 additions and 300 deletions
+7 -3
View File
@@ -4,6 +4,7 @@ import Link from "next/link";
import { Badge } from "@/components/ui/badge";
import { Calendar, DollarSign } from "lucide-react";
import { cn } from "@/lib/utils";
import { useDataProvider } from "@/lib/demo/data-provider-context";
import type { TaskResponse } from "@/lib/api/tasks";
interface TaskCardProps {
@@ -12,8 +13,9 @@ interface TaskCardProps {
}
export function TaskCard({ task, isDragging }: TaskCardProps) {
const { basePath } = useDataProvider();
return (
<Link href={`/app/tasks/${task.id}`}>
<Link href={`${basePath}/tasks/${task.id}`}>
<div
className={cn(
"rounded-lg border bg-card p-3 space-y-2 transition-shadow hover:shadow-md cursor-grab",
@@ -52,13 +54,15 @@ export function TaskCard({ task, isDragging }: TaskCardProps) {
<div className="flex items-center gap-3 text-xs text-muted-foreground">
{task.due_date && (
<span className="flex items-center gap-1">
<Calendar className="size-3" />
<Calendar className="size-3" aria-hidden="true" />
<span className="sr-only">Due date:</span>
{new Date(task.due_date).toLocaleDateString()}
</span>
)}
{task.estimated_cost != null && task.estimated_cost > 0 && (
<span className="flex items-center gap-1">
<DollarSign className="size-3" />
<DollarSign className="size-3" aria-hidden="true" />
<span className="sr-only">Estimated cost:</span>
{task.estimated_cost.toFixed(2)}
</span>
)}