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:
8
app/globals.css
Normal file
8
app/globals.css
Normal 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
32
app/layout.tsx
Normal 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
14
app/page.tsx
Normal 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
67
app/theme.ts
Normal 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',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user