feat: Initial Monorepo Setup for Such Software

- **Architecture**: Initialized Turborepo monorepo with pnpm workspace.
- **Frontend**: Scaffolding for Next.js 14 app (apps/web) with Tailwind CSS v4 configuration.
- **UI System**: Created shared UI package (@repo/ui) with Shadcn/UI primitives (Card, Button).
- **Procedural Design**:
  - Implemented 'NebulaField' organic background animation for Home.
  - Implemented 'DataGrid' isometric background for Services.
  - Added 'DynamicBackground' for theme-aware transitions.
- **Features**:
  - Responsive 'ThemeToggle' with View Transitions API support.
  - 'PortfolioGrid' component showcasing key projects (r/CryptoCurrency, etc.).
  - 'FounderSignature' component detailing accessibility focus.
  - 'ContactForm' with Zod validation + turnstile integration stub.
- **Pages**:
  - Landing page with parallax/procedural visuals.
  - Services page highlighting Medusa v2 development capabilities.
- **Clean Up**: Removed initial Medusa backend scaffold to focus on frontend delivery first.
This commit is contained in:
jwinterm
2026-01-15 15:43:47 -05:00
commit 717a3be1c8
33 changed files with 5194 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
'use server';
import { z } from 'zod';
import { verifyTurnstile } from '@/lib/turnstile'; // Helper to call Cloudflare API
const ContactSchema = z.object({
name: z.string().min(2, "Name is too short"),
email: z.string().email("Invalid email address"),
message: z.string().min(10, "Please tell us more about your project"),
token: z.string().min(1, "Security check failed")
});
export async function submitContactForm(prevState: any, formData: FormData) {
const rawData = Object.fromEntries(formData.entries());
// 1. Zod Validation
const validated = ContactSchema.safeParse(rawData);
if (!validated.success) {
return { success: false, errors: validated.error.flatten().fieldErrors };
}
// 2. Turnstile Verification
const isHuman = await verifyTurnstile(validated.data.token);
if (!isHuman) {
return { success: false, message: "Security check failed. Please refresh." };
}
// 3. Send to Backend (or Email)
try {
// TODO: Connect to email service or CMS
console.log("Form submitted:", validated.data);
// Simulating success for now
await new Promise(resolve => setTimeout(resolve, 500));
return { success: true, message: "Request received. We will be in touch shortly." };
} catch (e) {
console.error(e);
return { success: false, message: "System error. Please contact us via email." };
}
}