feat: Step 1 - Project setup & smoke test

Initialize Next.js 16 (App Router) project with all core dependencies:
- Next.js, React 19, TypeScript configuration
- Mantine UI components (@mantine/core, @mantine/hooks)
- ATproto SDK for Bluesky integration
- SurrealDB client (updated to latest non-deprecated version)
- Vercel AI SDK with Google AI provider
- Deepgram SDK for voice-to-text
- React Three Fiber for 3D visualization
- UMAP.js for dimensionality reduction
- Magnitude test framework for E2E testing
- Playwright for browser automation

Created basic app structure with homepage displaying "Ponderants" text.
Configured magnitude.config.ts for testing framework.
Added .example.env with all required environment variables.

Test: Smoke test verifies app boots and renders homepage.
Status: ✓ Test passed (8.4s)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-08 20:36:34 +00:00
parent e867e626fe
commit 4c7eb94ea6
16 changed files with 7085 additions and 0 deletions

8
app/globals.css Normal file
View File

@@ -0,0 +1,8 @@
@import '@mantine/core/styles.css';
body {
margin: 0;
padding: 0;
background-color: #181a1d; /* Our darkest gray */
color: #e9ecef; /* Our lightest gray */
}

32
app/layout.tsx Normal file
View File

@@ -0,0 +1,32 @@
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import { MantineProvider, ColorSchemeScript } from "@mantine/core";
import { theme } from "./theme";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "Ponderants",
description: "Your AI Thought Partner",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<head>
{/* Enforce dark scheme as per our theme */}
<ColorSchemeScript forceColorScheme="dark" />
</head>
<body className={inter.className}>
<MantineProvider theme={theme} forceColorScheme="dark">
{children}
</MantineProvider>
</body>
</html>
);
}

14
app/page.tsx Normal file
View File

@@ -0,0 +1,14 @@
import { Stack, Title, Paper, Button, Center } from '@mantine/core';
export default function Home() {
return (
<Center h="100vh">
<Paper w={400} p="xl">
<Stack align="center">
<Title order={1}>Ponderants</Title>
<Button>Test Button</Button>
</Stack>
</Paper>
</Center>
);
}

67
app/theme.ts Normal file
View File

@@ -0,0 +1,67 @@
'use client';
import { createTheme, MantineColorsTuple } from '@mantine/core';
// Define a rich 10-shade grayscale palette
const ponderGray: MantineColorsTuple = [
'#f8f9fa', // lightest
'#e9ecef',
'#dee2e6',
'#ced4da',
'#adb5bd',
'#868e96',
'#495057',
'#343a40',
'#212529',
'#181a1d', // darkest
];
export const theme = createTheme({
primaryColor: 'gray',
// Use our custom gray palette
colors: {
gray: ponderGray,
},
// Set default dark mode and grayscale for the "minimalist" look
defaultRadius: 'md',
fontFamily: 'Inter, sans-serif',
// Enforce dark mode
forceColorScheme: 'dark',
// Set default component props for a consistent look
components: {
Button: {
defaultProps: {
variant: 'filled',
color: 'gray',
radius: 'xl',
},
},
Paper: {
defaultProps: {
shadow: 'xs',
p: 'md',
radius: 'md',
withBorder: true,
},
styles: {
root: {
backgroundColor: '#212529', // gray.8
borderColor: '#495057', // gray.6
},
},
},
TextInput: {
defaultProps: {
variant: 'filled',
radius: 'xl',
},
},
Textarea: {
defaultProps: {
variant: 'filled',
radius: 'lg',
},
},
},
});