feat: initial commit — storefront, convex backend, and shared packages

Completes the first milestone of The Pet Loft ecommerce platform:
- apps/storefront: full customer-facing Next.js app with HeroUI (cart,
  checkout, orders, wishlist, product detail, shop, search, auth)
- convex/: serverless backend with schema, queries, mutations, actions,
  HTTP routes, Stripe/Shippo integrations, and co-located tests
- packages/types, packages/utils, packages/convex: shared workspace packages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-04 09:31:18 +03:00
commit cc15338ad9
361 changed files with 45005 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
import type { Metadata } from "next";
import { DM_Sans, Fraunces } from "next/font/google";
import { ClerkProvider } from "@clerk/nextjs";
import { ConvexClientProvider } from "@repo/convex";
import { CartUIProvider } from "../components/cart/CartUIProvider";
import { Header } from "../components/layout/header/Header";
import { SessionCartMerge } from "../lib/session/SessionCartMerge";
import { StoreUserSync } from "../lib/session/StoreUserSync";
import { Footer } from "../components/layout/footer/Footer";
import { ToastProvider } from "../components/layout/ToastProvider";
import "./globals.css";
const dmSans = DM_Sans({
subsets: ["latin"],
weight: ["300", "400", "500"],
variable: "--font-dm-sans",
});
const fraunces = Fraunces({
subsets: ["latin"],
weight: ["400", "600", "700"],
variable: "--font-fraunces",
});
export const metadata: Metadata = {
title: {
template: "%s | The Pet Loft",
default: "The Pet Loft — Pet Supplies & More",
},
description: "Your one-stop shop for premium pet supplies",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body
className={`${dmSans.variable} ${fraunces.variable} font-sans flex min-h-screen max-w-full flex-col overflow-x-hidden`}
>
<ClerkProvider>
<ConvexClientProvider>
<SessionCartMerge />
<StoreUserSync />
<CartUIProvider>
<Header />
{children}
<Footer />
<ToastProvider />
</CartUIProvider>
</ConvexClientProvider>
</ClerkProvider>
</body>
</html>
);
}