diff --git a/src/app/activity/page.tsx b/src/app/(app)/activity/page.tsx similarity index 99% rename from src/app/activity/page.tsx rename to src/app/(app)/activity/page.tsx index 2a07bcc..232a48f 100644 --- a/src/app/activity/page.tsx +++ b/src/app/(app)/activity/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; -import { useFamily } from "../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { getGuideline, getAgeInMonths } from "@/lib/guidelines"; import { api } from "@/lib/api"; import { CalendarView } from "@/components/CalendarView"; diff --git a/src/app/ai/page.tsx b/src/app/(app)/ai/page.tsx similarity index 99% rename from src/app/ai/page.tsx rename to src/app/(app)/ai/page.tsx index 469af9b..d578fda 100644 --- a/src/app/ai/page.tsx +++ b/src/app/(app)/ai/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useState, useEffect } from "react"; -import { useFamily } from "../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { Button, Input, ConfirmDialog } from "@/components/ui"; import type { AIChat, ChatSession } from "@/types"; diff --git a/src/app/circle/[id]/page.tsx b/src/app/(app)/circle/[id]/page.tsx similarity index 99% rename from src/app/circle/[id]/page.tsx rename to src/app/(app)/circle/[id]/page.tsx index f714d37..c5bded8 100644 --- a/src/app/circle/[id]/page.tsx +++ b/src/app/(app)/circle/[id]/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useCallback, use } from "react"; import { useRouter } from "next/navigation"; -import { useFamily } from "../../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import type { CirclePost, CircleComment, Circle } from "@/types"; const REACTIONS = ["โค๏ธ", "๐Ÿ˜‚", "๐Ÿ‘", "๐Ÿ™", "๐Ÿ˜ฎ"]; diff --git a/src/app/circle/join/[token]/page.tsx b/src/app/(app)/circle/join/[token]/page.tsx similarity index 93% rename from src/app/circle/join/[token]/page.tsx rename to src/app/(app)/circle/join/[token]/page.tsx index fe93fe7..0423ca5 100644 --- a/src/app/circle/join/[token]/page.tsx +++ b/src/app/(app)/circle/join/[token]/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, use } from "react"; import { useRouter } from "next/navigation"; -import { useFamily } from "../../../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; type State = "loading" | "preview" | "joining" | "success" | "error"; @@ -89,7 +89,7 @@ export default function JoinCirclePage({ params }: { params: Promise<{ token: st > {familyId ? `Join ${circleName}` : "Log in to Join"} - @@ -115,7 +115,7 @@ export default function JoinCirclePage({ params }: { params: Promise<{ token: st
๐Ÿ˜•

Invite issue

{errorMsg}

- + )} diff --git a/src/app/circle/page.tsx b/src/app/(app)/circle/page.tsx similarity index 99% rename from src/app/circle/page.tsx rename to src/app/(app)/circle/page.tsx index bfafd2f..4a895bf 100644 --- a/src/app/circle/page.tsx +++ b/src/app/(app)/circle/page.tsx @@ -3,7 +3,7 @@ import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; -import { useFamily } from "../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import type { Circle } from "@/types"; type PendingInvite = { diff --git a/src/app/dev/components/page.tsx b/src/app/(app)/dev/components/page.tsx similarity index 99% rename from src/app/dev/components/page.tsx rename to src/app/(app)/dev/components/page.tsx index 67539a3..6d2506f 100644 --- a/src/app/dev/components/page.tsx +++ b/src/app/(app)/dev/components/page.tsx @@ -6,7 +6,7 @@ import { EmptyState, LoadingShimmer, ConfirmDialog, WashiTape, Badge, Avatar, Tabs, TabPanel, } from "@/components/ui"; -import { useTheme } from "../../ThemeProvider"; +import { useTheme } from "@/app/ThemeProvider"; export default function DevComponentsPage() { const { theme, toggle } = useTheme(); diff --git a/src/app/family/page.tsx b/src/app/(app)/family/page.tsx similarity index 99% rename from src/app/family/page.tsx rename to src/app/(app)/family/page.tsx index 317715c..eade0ce 100644 --- a/src/app/family/page.tsx +++ b/src/app/(app)/family/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; -import { useFamily } from "../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; interface Child { id: string; diff --git a/src/app/growth/page.tsx b/src/app/(app)/growth/page.tsx similarity index 99% rename from src/app/growth/page.tsx rename to src/app/(app)/growth/page.tsx index 252c357..ed96e00 100644 --- a/src/app/growth/page.tsx +++ b/src/app/(app)/growth/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from "react"; import Link from "next/link"; -import { useFamily } from "../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { Button, Card, Input, ConfirmDialog } from "@/components/ui"; import { WHO_BOY_WEIGHT, WHO_GIRL_WEIGHT, getAgeInMonthsFromBirth, getPercentile } from "@/lib/growth-standards"; import { formatAge } from "@/lib/formatting"; @@ -19,7 +19,7 @@ import { Filler, } from "chart.js"; import { Line } from "react-chartjs-2"; -import { useTheme } from "../ThemeProvider"; +import { useTheme } from "@/app/ThemeProvider"; ChartJS.register(CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend, Filler); diff --git a/src/app/page.tsx b/src/app/(app)/home/page.tsx similarity index 99% rename from src/app/page.tsx rename to src/app/(app)/home/page.tsx index 22d420a..31e55bb 100644 --- a/src/app/page.tsx +++ b/src/app/(app)/home/page.tsx @@ -2,8 +2,8 @@ import { useState, useEffect, useRef } from "react"; import Link from "next/link"; -import { useTheme } from "./ThemeProvider"; -import { useFamily } from "./FamilyProvider"; +import { useTheme } from "@/app/ThemeProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { useStageCheck, type BabyStage } from "@/hooks/useStageCheck"; import { LogModal, type LogType } from "@/components/LogModal"; import { getOfflineQueue, processOfflineQueue } from "@/lib/offline-queue"; diff --git a/src/app/(app)/layout.tsx b/src/app/(app)/layout.tsx new file mode 100644 index 0000000..91b442c --- /dev/null +++ b/src/app/(app)/layout.tsx @@ -0,0 +1,19 @@ +import { ThemeProvider } from "@/app/ThemeProvider"; +import { FamilyProvider } from "@/app/FamilyProvider"; +import { PageTransition } from "@/components/PageTransition"; +import { BottomNav } from "@/components/BottomNav"; + +export default function AppLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + {children} + + + + ); +} diff --git a/src/app/medical/emergency/page.tsx b/src/app/(app)/medical/emergency/page.tsx similarity index 100% rename from src/app/medical/emergency/page.tsx rename to src/app/(app)/medical/emergency/page.tsx diff --git a/src/app/medical/page.tsx b/src/app/(app)/medical/page.tsx similarity index 97% rename from src/app/medical/page.tsx rename to src/app/(app)/medical/page.tsx index a6a8eec..2dc05a9 100644 --- a/src/app/medical/page.tsx +++ b/src/app/(app)/medical/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useState } from "react"; -import { useFamily } from "../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { PageHeader } from "@/components/PageHeader"; import { TabBar } from "@/components/TabBar"; import { VaccineTab } from "@/components/medical/VaccineTab"; diff --git a/src/app/memories/page.tsx b/src/app/(app)/memories/page.tsx similarity index 99% rename from src/app/memories/page.tsx rename to src/app/(app)/memories/page.tsx index 34b682e..362fbce 100644 --- a/src/app/memories/page.tsx +++ b/src/app/(app)/memories/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useRef, useCallback } from "react"; import Link from "next/link"; -import { useFamily } from "../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { Button, ConfirmDialog, Modal } from "@/components/ui"; const PRESET_FOLDERS = [ diff --git a/src/app/menu/page.tsx b/src/app/(app)/menu/page.tsx similarity index 100% rename from src/app/menu/page.tsx rename to src/app/(app)/menu/page.tsx diff --git a/src/app/milestones/page.tsx b/src/app/(app)/milestones/page.tsx similarity index 100% rename from src/app/milestones/page.tsx rename to src/app/(app)/milestones/page.tsx diff --git a/src/app/notifications/page.tsx b/src/app/(app)/notifications/page.tsx similarity index 100% rename from src/app/notifications/page.tsx rename to src/app/(app)/notifications/page.tsx diff --git a/src/app/onboarding/page.tsx b/src/app/(app)/onboarding/page.tsx similarity index 99% rename from src/app/onboarding/page.tsx rename to src/app/(app)/onboarding/page.tsx index cfe43ca..7a90f41 100644 --- a/src/app/onboarding/page.tsx +++ b/src/app/(app)/onboarding/page.tsx @@ -68,7 +68,7 @@ export default function OnboardingPage() { if (!data.authenticated) { router.push("/login"); } else if (data.familyId) { - router.push("/"); + router.push("/home"); } setCheckingAuth(false); } @@ -127,7 +127,7 @@ export default function OnboardingPage() { console.error(e); } setSaving(false); - router.push("/"); + router.push("/home"); }; if (checkingAuth) { @@ -268,7 +268,7 @@ export default function OnboardingPage() { )}
- +
diff --git a/src/app/profile/page.tsx b/src/app/(app)/profile/page.tsx similarity index 100% rename from src/app/profile/page.tsx rename to src/app/(app)/profile/page.tsx diff --git a/src/app/settings/page.tsx b/src/app/(app)/settings/page.tsx similarity index 99% rename from src/app/settings/page.tsx rename to src/app/(app)/settings/page.tsx index 22ee315..d11683a 100644 --- a/src/app/settings/page.tsx +++ b/src/app/(app)/settings/page.tsx @@ -3,8 +3,8 @@ import { useState, useEffect } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; -import { useTheme } from "../ThemeProvider"; -import { useFamily } from "../FamilyProvider"; +import { useTheme } from "@/app/ThemeProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { Button, Card, Input, Select, Badge } from "@/components/ui"; interface Member { diff --git a/src/app/settings/profile/page.tsx b/src/app/(app)/settings/profile/page.tsx similarity index 100% rename from src/app/settings/profile/page.tsx rename to src/app/(app)/settings/profile/page.tsx diff --git a/src/app/wardrobe/[id]/page.tsx b/src/app/(app)/wardrobe/[id]/page.tsx similarity index 100% rename from src/app/wardrobe/[id]/page.tsx rename to src/app/(app)/wardrobe/[id]/page.tsx diff --git a/src/app/wardrobe/add/page.tsx b/src/app/(app)/wardrobe/add/page.tsx similarity index 99% rename from src/app/wardrobe/add/page.tsx rename to src/app/(app)/wardrobe/add/page.tsx index 2c0787b..a7ab654 100644 --- a/src/app/wardrobe/add/page.tsx +++ b/src/app/(app)/wardrobe/add/page.tsx @@ -3,7 +3,7 @@ import { useRef, useState } from "react"; import { useRouter } from "next/navigation"; import Image from "next/image"; -import { useFamily } from "../../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { Button } from "@/components/ui"; import { GARMENT_CATEGORIES, GARMENT_SIZE_ORDER } from "@/db/schema/wardrobe"; diff --git a/src/app/wardrobe/outfit/page.tsx b/src/app/(app)/wardrobe/outfit/page.tsx similarity index 99% rename from src/app/wardrobe/outfit/page.tsx rename to src/app/(app)/wardrobe/outfit/page.tsx index 453ebd0..2132387 100644 --- a/src/app/wardrobe/outfit/page.tsx +++ b/src/app/(app)/wardrobe/outfit/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; -import { useFamily } from "../../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { Button } from "@/components/ui"; interface OutfitItem { diff --git a/src/app/wardrobe/packing/page.tsx b/src/app/(app)/wardrobe/packing/page.tsx similarity index 99% rename from src/app/wardrobe/packing/page.tsx rename to src/app/(app)/wardrobe/packing/page.tsx index 16a3d78..9369254 100644 --- a/src/app/wardrobe/packing/page.tsx +++ b/src/app/(app)/wardrobe/packing/page.tsx @@ -2,7 +2,7 @@ import { useState } from "react"; import { useRouter } from "next/navigation"; -import { useFamily } from "../../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { Button } from "@/components/ui"; interface PackingItem { diff --git a/src/app/wardrobe/page.tsx b/src/app/(app)/wardrobe/page.tsx similarity index 99% rename from src/app/wardrobe/page.tsx rename to src/app/(app)/wardrobe/page.tsx index 3beee49..5699293 100644 --- a/src/app/wardrobe/page.tsx +++ b/src/app/(app)/wardrobe/page.tsx @@ -3,7 +3,7 @@ import { useState, useEffect, useCallback } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; -import { useFamily } from "../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; import { GARMENT_CATEGORIES, GARMENT_SIZE_ORDER } from "@/db/schema/wardrobe"; interface Garment { diff --git a/src/app/wardrobe/saved-outfits/page.tsx b/src/app/(app)/wardrobe/saved-outfits/page.tsx similarity index 99% rename from src/app/wardrobe/saved-outfits/page.tsx rename to src/app/(app)/wardrobe/saved-outfits/page.tsx index f71db17..7b34dcc 100644 --- a/src/app/wardrobe/saved-outfits/page.tsx +++ b/src/app/(app)/wardrobe/saved-outfits/page.tsx @@ -3,7 +3,7 @@ import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; -import { useFamily } from "../../FamilyProvider"; +import { useFamily } from "@/app/FamilyProvider"; interface SavedOutfit { id: string; diff --git a/src/app/(marketing)/layout.tsx b/src/app/(marketing)/layout.tsx new file mode 100644 index 0000000..f4f358b --- /dev/null +++ b/src/app/(marketing)/layout.tsx @@ -0,0 +1,95 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { NavAuthButton } from "@/components/marketing/NavAuthButton"; +import Script from "next/script"; + +export const metadata: Metadata = { + title: { + default: "Tia โ€” Your baby's digital heirloom", + template: "%s | Tia", + }, + description: + "Tia is a digital heirloom for your baby โ€” not just a tracker. Log daily moments, track the IAP vaccination schedule, and build a living archive your child will one day inherit.", + openGraph: { + type: "website", + siteName: "Tia", + title: "Tia โ€” Your baby's digital heirloom", + description: + "Log every feed, milestone, and memory. Built for Indian families. Privacy-first. Free during early access.", + }, + twitter: { + card: "summary_large_image", + title: "Tia โ€” Your baby's digital heirloom", + description: + "Log every feed, milestone, and memory. Built for Indian families. Privacy-first. Free during early access.", + }, +}; + +export default function MarketingLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + <> + {/* Privacy-respecting analytics โ€” no cookies, no tracking */} +