From 524f64315d1541b89660421a62c8370746d9e791 Mon Sep 17 00:00:00 2001 From: MrPiglr Date: Thu, 5 Feb 2026 10:50:56 +0000 Subject: [PATCH] deleted: app/ide/page.tsx --- .env.example | 15 + .gitignore | 1 + app/App.tsx | 18 - app/dashboard/page.tsx | 4 - app/globals.css | 154 ---- app/ide/page.tsx | 4 - app/index.html | 16 - app/layout.tsx | 35 - app/main.css | 61 -- app/page.tsx | 5 - app/studio-theme.css | 865 ------------------ components/NewProjectModal.tsx | 2 +- middleware.ts | 19 + package-lock.json | 774 +++++++++++++++- package.json | 14 + src/App.tsx | 17 +- src/app/auth/auth-code-error/page.tsx | 66 ++ src/app/auth/callback/route.ts | 21 + src/app/auth/login/page.tsx | 169 ++++ src/app/auth/signup/page.tsx | 230 +++++ src/app/globals.css | 138 ++- src/app/ide/page.tsx | 2 +- src/app/layout.tsx | 4 +- src/app/page.tsx | 474 +++++++++- src/app/profile/page.tsx | 249 +++++ src/components/aethex/aethex-studio.tsx | 312 ++++++- src/components/aethex/ai-assistant.tsx | 224 ++++- src/components/aethex/bottom-panel.tsx | 222 ++++- src/components/aethex/code-editor.tsx | 2 +- src/components/aethex/cross-platform-view.tsx | 2 +- src/components/aethex/dashboard-page.tsx | 26 +- src/components/aethex/export-modal.tsx | 211 +++++ src/components/aethex/file-navigator.tsx | 304 +++++- src/components/aethex/git-panel.tsx | 219 +++++ src/components/aethex/main-view.tsx | 213 ++++- src/components/aethex/navbar.tsx | 244 ++++- src/components/aethex/new-project-modal.tsx | 68 +- src/components/aethex/settings-panel.tsx | 320 +++++++ src/components/aethex/status-bar.tsx | 182 ++++ src/components/ui/accordion.tsx | 2 +- src/components/ui/breadcrumb.tsx | 3 +- src/components/ui/calendar.tsx | 11 +- src/components/ui/carousel.tsx | 3 +- src/components/ui/command.tsx | 2 +- src/components/ui/context-menu.tsx | 376 ++++---- src/components/ui/dropdown-menu.tsx | 4 +- src/components/ui/input-otp.tsx | 2 +- src/components/ui/menubar.tsx | 4 +- src/components/ui/navigation-menu.tsx | 2 +- src/components/ui/pagination.tsx | 4 +- src/components/ui/radio-group.tsx | 2 +- src/components/ui/resizable.tsx | 13 +- src/components/ui/sidebar.tsx | 2 +- src/components/ui/sonner.tsx | 8 +- src/components/ui/tabs-extra.tsx | 2 +- src/hooks/use-projects.ts | 95 ++ src/hooks/use-supabase.ts | 136 +++ src/lib/supabase/client.ts | 18 + src/lib/supabase/middleware.ts | 36 + src/lib/supabase/server.ts | 28 + src/lib/supabase/types.ts | 143 +++ src/lib/templates.ts | 1 + src/lib/translation-engine.ts | 4 +- src/lib/utils/index.ts | 2 +- src/types/lucide-react.d.ts | 1 - store/editor-store.ts | 44 + supabase/migrations/001_initial_schema.sql | 240 +++++ tailwind.config.js | 153 ---- tailwind.config.ts | 1 + tsconfig.json | 4 +- 70 files changed, 5527 insertions(+), 1725 deletions(-) delete mode 100644 app/App.tsx delete mode 100644 app/dashboard/page.tsx delete mode 100644 app/globals.css delete mode 100644 app/ide/page.tsx delete mode 100644 app/index.html delete mode 100644 app/layout.tsx delete mode 100644 app/main.css delete mode 100644 app/page.tsx delete mode 100644 app/studio-theme.css create mode 100644 middleware.ts create mode 100644 src/app/auth/auth-code-error/page.tsx create mode 100644 src/app/auth/callback/route.ts create mode 100644 src/app/auth/login/page.tsx create mode 100644 src/app/auth/signup/page.tsx create mode 100644 src/app/profile/page.tsx create mode 100644 src/components/aethex/export-modal.tsx create mode 100644 src/components/aethex/git-panel.tsx create mode 100644 src/components/aethex/settings-panel.tsx create mode 100644 src/components/aethex/status-bar.tsx create mode 100644 src/hooks/use-projects.ts create mode 100644 src/hooks/use-supabase.ts create mode 100644 src/lib/supabase/client.ts create mode 100644 src/lib/supabase/middleware.ts create mode 100644 src/lib/supabase/server.ts create mode 100644 src/lib/supabase/types.ts create mode 100644 supabase/migrations/001_initial_schema.sql delete mode 100644 tailwind.config.js diff --git a/.env.example b/.env.example index 0cf836f..d85da20 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,17 @@ # AeThex Studio Environment Variables +# =========================================== +# SUPABASE (Required) +# =========================================== +# Get these from: https://supabase.com/dashboard/project/_/settings/api +NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co +NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here +# Service role key - KEEP SECRET, never expose to client +SUPABASE_SERVICE_ROLE_KEY=your-service-role-key-here + +# =========================================== # Claude API Configuration +# =========================================== # Get your API key from: https://console.anthropic.com/ # Required for cross-platform code translation feature VITE_CLAUDE_API_KEY=sk-ant-api03-your-api-key-here @@ -8,9 +19,13 @@ VITE_CLAUDE_API_KEY=sk-ant-api03-your-api-key-here # Optional: Override Claude model (default: claude-3-5-sonnet-20241022) # VITE_CLAUDE_MODEL=claude-3-5-sonnet-20241022 +# =========================================== # PostHog Analytics (Optional) +# =========================================== # VITE_POSTHOG_KEY=your-posthog-key # VITE_POSTHOG_HOST=https://app.posthog.com +# =========================================== # Sentry Error Tracking (Optional) +# =========================================== # VITE_SENTRY_DSN=your-sentry-dsn diff --git a/.gitignore b/.gitignore index 02de707..417d7d0 100644 --- a/.gitignore +++ b/.gitignore @@ -95,3 +95,4 @@ pids .devcontainer/ .spark-workbench-id +.env.local diff --git a/app/App.tsx b/app/App.tsx deleted file mode 100644 index 1353d37..0000000 --- a/app/App.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useState } from 'react'; -import { Toaster } from '../src/components/ui/sonner'; -import { CodeEditor } from '../src/components/CodeEditor'; -import { AIChat } from '../src/components/AIChat'; -import { Toolbar } from '../src/components/Toolbar'; -import { TemplatesDrawer } from '../src/components/TemplatesDrawer'; -import { FileTree, FileNode } from '../src/components/FileTree'; -import { FileTabs } from '../src/components/FileTabs'; -import { PreviewModal } from '../src/components/PreviewModal'; -// Removed named imports for WelcomeDialog and NewProjectModal. Use lazy-loaded versions from src/App.tsx. -import { ConsolePanel } from '../src/components/ConsolePanel'; -import { ResizablePanelGroup, ResizablePanel, ResizableHandle } from '../src/components/ui/resizable'; -import { useIsMobile } from '../src/hooks/use-mobile'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from '../src/components/ui/tabs'; -import { toast } from 'sonner'; - - -export { default } from '../src/App'; diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx deleted file mode 100644 index b09bba6..0000000 --- a/app/dashboard/page.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { DashboardPage } from "../../src/components/aethex/dashboard-page"; -export default function Page() { - return ; -} diff --git a/app/globals.css b/app/globals.css deleted file mode 100644 index f74310e..0000000 --- a/app/globals.css +++ /dev/null @@ -1,154 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600;700&display=swap'); - -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - /* Default Dark Theme */ - :root, .theme-dark { - --background: #0a0a0f; - --surface: #1a1a1f; - --primary: #8b5cf6; - --primary-light: #a78bfa; - --primary-dark: #7c3aed; - --secondary: #ec4899; - --accent: #06b6d4; - --border: #2a2a2f; - --foreground: #ffffff; - --muted: #6b7280; - } - - /* Light Theme */ - .theme-light { - --background: #ffffff; - --surface: #f9fafb; - --primary: #7c3aed; - --primary-light: #8b5cf6; - --primary-dark: #6d28d9; - --secondary: #db2777; - --accent: #0891b2; - --border: #e5e7eb; - --foreground: #111827; - --muted: #6b7280; - } - - /* Synthwave Theme */ - .theme-synthwave { - --background: #2b213a; - --surface: #241b2f; - --primary: #ff6ac1; - --primary-light: #ff8ad8; - --primary-dark: #ff4aaa; - --secondary: #9d72ff; - --accent: #72f1b8; - --border: #495495; - --foreground: #f8f8f2; - --muted: #a599e9; - } - - /* Forest Theme */ - .theme-forest { - --background: #0d1b1e; - --surface: #1a2f33; - --primary: #2dd4bf; - --primary-light: #5eead4; - --primary-dark: #14b8a6; - --secondary: #34d399; - --accent: #a7f3d0; - --border: #234e52; - --foreground: #ecfdf5; - --muted: #6ee7b7; - } - - /* Ocean Theme */ - .theme-ocean { - --background: #0c1821; - --surface: #1b2838; - --primary: #3b82f6; - --primary-light: #60a5fa; - --primary-dark: #2563eb; - --secondary: #06b6d4; - --accent: #38bdf8; - --border: #1e3a5f; - --foreground: #dbeafe; - --muted: #7dd3fc; - } - - * { - border-color: var(--border); - } - - body { - background-color: var(--background); - color: var(--foreground); - font-family: var(--font-inter), 'Inter', sans-serif; - } - - code, pre { - font-family: var(--font-jetbrains-mono), 'JetBrains Mono', monospace; - } -} - -@layer utilities { - .text-balance { - text-wrap: balance; - } -} - -/* Custom scrollbar */ -::-webkit-scrollbar { - width: 10px; - height: 10px; -} - -::-webkit-scrollbar-track { - background: #1a1a1f; -} - -::-webkit-scrollbar-thumb { - background: #2a2a2f; - border-radius: 5px; -} - -::-webkit-scrollbar-thumb:hover { - background: #3a3a3f; -} - -/* Animation classes */ -.animate-slide-in { - animation: slideIn 0.2s ease-out; -} - -.animate-fade-in { - animation: fadeIn 0.2s ease-in-out; -} - -@keyframes slideIn { - from { - transform: translateY(-10px); - opacity: 0; - } - to { - transform: translateY(0); - opacity: 1; - } -} - -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -/* Monaco Editor theme overrides */ -.monaco-editor .margin { - background-color: #0a0a0f !important; -} - -.monaco-editor { - background-color: #0a0a0f !important; -} diff --git a/app/ide/page.tsx b/app/ide/page.tsx deleted file mode 100644 index 85ad4bd..0000000 --- a/app/ide/page.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import App from "../../src/App"; -export default function Page() { - return ; -} diff --git a/app/index.html b/app/index.html deleted file mode 100644 index dd81c8f..0000000 --- a/app/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - AeThex Studio - Roblox Lua Editor - - - - - - -
- - - diff --git a/app/layout.tsx b/app/layout.tsx deleted file mode 100644 index 313b471..0000000 --- a/app/layout.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import type { Metadata } from "next"; -import Toaster from "../src/components/ui/toaster"; -import "./globals.css"; - -export const metadata: Metadata = { - title: "AeThex Studio", - description: "The Next-Generation Cross-Platform IDE", -}; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - - - - - - {children} - - - - ); -} diff --git a/app/main.css b/app/main.css deleted file mode 100644 index e184a38..0000000 --- a/app/main.css +++ /dev/null @@ -1,61 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap'); - -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - * { - border-color: var(--border); - } - body { - font-family: 'Inter', sans-serif; - background: - radial-gradient(circle at 20% 50%, oklch(0.20 0.08 265 / 0.3) 0%, transparent 50%), - radial-gradient(circle at 80% 80%, oklch(0.20 0.08 150 / 0.2) 0%, transparent 50%), - oklch(0.15 0.02 265); - background-attachment: fixed; - } - h1, h2, h3, h4, h5, h6 { - font-family: 'Space Grotesk', sans-serif; - } - code, pre { - font-family: 'JetBrains Mono', monospace; - } -} - -@layer components { - .btn-accent-hover { - transition: all 0.2s ease; - } - .btn-accent-hover:hover { - transform: scale(1.02); - filter: brightness(1.1); - } - .btn-accent-hover:active { - transform: scale(0.98); - } -} - -:root { - --background: oklch(0.15 0.02 265); - --foreground: oklch(0.85 0.03 265); - --card: oklch(0.20 0.03 265); - --card-foreground: oklch(0.85 0.03 265); - --popover: oklch(0.20 0.03 265); - --popover-foreground: oklch(0.85 0.03 265); - --primary: oklch(0.45 0.20 265); - --primary-foreground: oklch(0.98 0 0); - --secondary: oklch(0.25 0.04 265); - --secondary-foreground: oklch(0.85 0.03 265); - --muted: oklch(0.22 0.03 265); - --muted-foreground: oklch(0.55 0.03 265); - --accent: oklch(0.75 0.20 150); - --accent-foreground: oklch(0.15 0.02 265); - --destructive: oklch(0.55 0.22 25); - --destructive-foreground: oklch(0.98 0 0); - --border: oklch(0.30 0.04 265); - --input: oklch(0.30 0.04 265); - --ring: oklch(0.75 0.20 150); - --radius: 0.5rem; -} diff --git a/app/page.tsx b/app/page.tsx deleted file mode 100644 index afa72a5..0000000 --- a/app/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import App from "../src/App"; - -export default function Page() { - return ; -} diff --git a/app/studio-theme.css b/app/studio-theme.css deleted file mode 100644 index 451fb21..0000000 --- a/app/studio-theme.css +++ /dev/null @@ -1,865 +0,0 @@ -/* Tablet region: 1015x768px - global UI sizing */ -@media (min-width: 900px) and (max-width: 1100px) and (min-height: 700px) and (max-height: 800px) { - .ide-container.grid-layout { - max-width: 1015px; - max-height: 768px; - margin: 0 auto; - grid-template-rows: 60px 1fr 120px; - grid-template-columns: 90px 1fr 220px; - grid-template-areas: - "title title title" - "sidebar editor right" - "bottom bottom bottom"; - border-radius: 20px; - box-shadow: 0 2px 24px 0 rgba(0,0,0,0.20); - background: #101014; - padding: 12px; - overflow: hidden; - } - .grid-title { - font-size: 1.25em; - padding: 16px 20px; - } - .grid-sidebar { - min-width: 90px; - max-width: 120px; - font-size: 1.18em; - padding: 16px 0; - border-radius: 14px; - box-shadow: 0 1px 10px 0 rgba(0,0,0,0.12); - } - .grid-right { - min-width: 180px; - max-width: 220px; - font-size: 1.15em; - padding: 16px 0; - border-radius: 14px; - box-shadow: 0 1px 10px 0 rgba(0,0,0,0.12); - } - .grid-editor { - min-width: 0; - padding: 0 3vw; - font-size: 1.22em; - border-radius: 16px; - box-shadow: 0 1px 10px 0 rgba(0,0,0,0.12); - background: #181818; - } - .grid-bottom { - min-height: 120px; - max-height: 180px; - font-size: 1.15em; - padding: 24px 2vw 56px 2vw; - border-radius: 14px; - box-shadow: 0 1px 10px 0 rgba(0,0,0,0.12); - background: #15151a; - box-sizing: border-box; - } - .title-bar { - padding: 16px 20px; - font-size: 1.25em; - border-radius: 14px; - box-shadow: 0 1px 10px 0 rgba(0,0,0,0.12); - background: #18181c; - } - .editor-tab, .file-item, .bottom-tab { - min-height: 52px; - font-size: 1.22em; - padding: 0 20px; - border-radius: 10px; - margin-bottom: 8px; - background: #222226; - box-shadow: 0 1px 6px 0 rgba(0,0,0,0.10); - touch-action: manipulation; - } - .bottom-collapse-btn { - font-size: 1.6em !important; - min-width: 56px; - min-height: 56px; - padding: 0 14px; - border-radius: 10px; - touch-action: manipulation; - } - .network-viz.docked { - max-width: 440px; - padding: 18px 20px; - margin: 12px auto; - font-size: 1.15em; - border-radius: 14px; - box-shadow: 0 1px 10px 0 rgba(0,0,0,0.12); - } -} -/* Responsive: docked status panel inside bottom panel for tablet/mobile */ -.network-viz.docked { - margin: 16px auto; - padding: 16px 18px; - border-radius: 14px; - background: #18181c; - box-shadow: 0 1px 8px 0 rgba(0,0,0,0.10); - max-width: 420px; - width: 100%; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 12px; -} -.network-viz-header { - font-size: 1.1em; - font-weight: 600; - margin-bottom: 8px; - color: #e0e0e0; -} -.network-nodes { - display: flex; - flex-direction: row; - gap: 18px; -} -.network-node { - display: flex; - flex-direction: column; - align-items: center; - gap: 4px; -} -.node-dot { - width: 18px; - height: 18px; - border-radius: 50%; - margin-bottom: 4px; -} -.node-dot.foundation { background: #ff0000; } -.node-dot.corporation { background: #0066ff; } -.node-dot.labs { background: #ffa500; } -.node-label { - font-size: 1em; - font-weight: 500; -} -.node-status { - font-size: 0.95em; - color: #b0b0b0; - text-align: center; -} -@media (max-width: 1024px) { - .network-viz.docked { - max-width: 98vw; - padding: 12px 8px; - margin: 8px auto; - font-size: 1.08em; - } - .network-nodes { - gap: 10px; - } - .network-node { - gap: 2px; - } - .node-dot { - width: 16px; - height: 16px; - } -} -@media (min-width: 768px) and (max-width: 1024px) { - .ide-container.grid-layout { - grid-template-rows: 56px 1fr 120px; - grid-template-columns: 72px 1fr 180px; - grid-template-areas: - "title title title" - "sidebar editor right" - "bottom bottom bottom"; - border-radius: 18px; - box-shadow: 0 2px 16px 0 rgba(0,0,0,0.18); - background: #101014; - padding: 8px; - } - .grid-sidebar { - min-width: 56px; - max-width: 90px; - font-size: 1.15em; - padding: 12px 0; - border-right: none; - background: #18181c; - border-radius: 12px; - box-shadow: 0 1px 8px 0 rgba(0,0,0,0.10); - } - .grid-right { - min-width: 100px; - max-width: 180px; - font-size: 1.1em; - border-left: none; - background: #18181c; - border-radius: 12px; - box-shadow: 0 1px 8px 0 rgba(0,0,0,0.10); - } - .grid-editor { - min-width: 0; - padding: 0 3vw; - font-size: 1.18em; - touch-action: manipulation; - border-radius: 14px; - box-shadow: 0 1px 8px 0 rgba(0,0,0,0.10); - background: #181818; - } - .grid-bottom { - min-height: 80px; - max-height: 160px; - font-size: 1.1em; - padding: 16px 2vw 40px 2vw; - border-radius: 12px; - box-shadow: 0 1px 8px 0 rgba(0,0,0,0.10); - background: #15151a; - box-sizing: border-box; - } - @media (max-width: 1024px) { - .grid-bottom { - padding-bottom: 56px; - padding-top: 24px; - min-height: 100px; - max-height: 180px; - } - } - .title-bar { - padding: 12px 12px; - font-size: 1.18em; - border-radius: 12px; - box-shadow: 0 1px 8px 0 rgba(0,0,0,0.10); - background: #18181c; - } - .editor-tab, .file-item, .bottom-tab { - min-height: 48px; - font-size: 1.18em; - padding: 0 16px; - touch-action: manipulation; - border-radius: 8px; - margin-bottom: 6px; - background: #222226; - box-shadow: 0 1px 4px 0 rgba(0,0,0,0.08); - } -} - -@media (max-width: 768px) { - .ide-container.grid-layout { - grid-template-rows: 56px 1fr 100px; - grid-template-columns: 1fr; - grid-template-areas: - "title" - "editor" - "bottom"; - width: 100vw; - height: 100vh; - overflow: hidden; - border-radius: 0; - box-shadow: none; - background: #101014; - padding: 0; - } - .grid-sidebar, - .grid-right { - display: none !important; - } - .grid-editor { - grid-area: editor; - width: 100vw; - height: calc(100vh - 56px - 100px); - min-width: 0; - min-height: 0; - overflow: auto; - font-size: 1.22em; - padding: 0 4vw; - touch-action: manipulation; - border-radius: 0; - box-shadow: none; - background: #181818; - } - .grid-bottom { - min-height: 64px; - max-height: 120px; - width: 100vw; - overflow-y: auto; - font-size: 1.15em; - padding: 0 2vw; - border-radius: 0; - box-shadow: none; - background: #15151a; - } - .title-bar { - width: 100vw; - min-width: 0; - padding: 12px 12px; - font-size: 1.22em; - border-radius: 0; - box-shadow: none; - background: #18181c; - } - .editor-tab, .file-item, .bottom-tab { - min-height: 48px; - font-size: 1.22em; - padding: 0 16px; - touch-action: manipulation; - border-radius: 0; - margin-bottom: 8px; - background: #222226; - box-shadow: none; - } - .grid-bottom.collapsed { - display: none !important; - } -} - -/* Tablet-specific layout: 768px to 1024px */ -@media (min-width: 768px) and (max-width: 1024px) { - .ide-container.grid-layout { - grid-template-rows: 48px 1fr 120px; - grid-template-columns: 80px 1fr 220px; - grid-template-areas: - "title title title" - "sidebar editor right" - "bottom bottom bottom"; - width: 100vw; - height: 100vh; - overflow: hidden; - } - .grid-sidebar { - min-width: 60px; - max-width: 100px; - font-size: 1.1em; - padding: 8px 0; - border-right: 1px solid #222; - } - .grid-right { - min-width: 120px; - max-width: 220px; - font-size: 1em; - border-left: 1px solid #222; - } - .grid-editor { - min-width: 0; - padding: 0 2vw; - font-size: 1.1em; - .bottom-tab { - display: inline-block; - padding: 14px 28px; - font-size: 1.18em; - border-radius: 10px 10px 0 0; - background: #222226; - color: #e0e0e0; - margin-right: 12px; - cursor: pointer; - transition: background 0.2s; - min-width: 56px; - min-height: 48px; - touch-action: manipulation; - } - .bottom-tab.active { - background: #333344; - color: #fff; - } - .bottom-collapse-btn { - font-size: 1.35em !important; - min-width: 44px; - min-height: 44px; - padding: 0 8px; - border-radius: 8px; - touch-action: manipulation; - } - @media (max-width: 1024px) { - .bottom-tab { - font-size: 1.22em; - min-width: 64px; - min-height: 52px; - padding: 16px 32px; - } - .bottom-collapse-btn { - font-size: 1.5em !important; - min-width: 52px; - min-height: 52px; - padding: 0 12px; - } - } - padding: 0 12px; - touch-action: manipulation; - } -} - -/* Mobile layout: <768px */ -@media (max-width: 768px) { - .ide-container.grid-layout { - grid-template-rows: 48px 1fr 120px; - grid-template-columns: 1fr; - grid-template-areas: - "title" - "editor" - "bottom"; - width: 100vw; - height: 100vh; - overflow: hidden; - } - .grid-sidebar, - .grid-right { - display: none !important; - } - .grid-editor { - grid-area: editor; - width: 100vw; - height: calc(100vh - 48px - 120px); - min-width: 0; - min-height: 0; - overflow: auto; - font-size: 1.15em; - padding: 0 2vw; - touch-action: manipulation; - } - .grid-bottom { - min-height: 80px; - max-height: 160px; - width: 100vw; - overflow-y: auto; - font-size: 1.1em; - padding: 0 1vw; - } - .title-bar { - width: 100vw; - min-width: 0; - padding: 8px 8px; - font-size: 1.15em; - } - .editor-tab, .file-item, .bottom-tab { - min-height: 44px; - font-size: 1.15em; - padding: 0 12px; - touch-action: manipulation; - } - .grid-bottom.collapsed { - display: none !important; - } -} -/* AeThex Studio Mockup Theme */ -@import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@300;400;500;700&family=JetBrains+Mono:wght@400;700&display=swap'); - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body, .ide-container { - font-family: 'JetBrains Mono', 'Roboto Mono', monospace; - background: #0a0a0a; - color: #e0e0e0; - height: 100vh; -} - -body::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: repeating-linear-gradient( - 0deg, - rgba(0, 0, 0, 0.15), - rgba(0, 0, 0, 0.15) 1px, - transparent 1px, - transparent 2px - ); - pointer-events: none; - z-index: 1000; -} - - - -.ide-container { - display: flex; - flex-direction: column; - height: 100vh; - width: 100vw; - overflow: hidden; -} - -.title-bar { - background: #0d0d0d; - border-bottom: 2px solid #1a1a1a; - padding: 8px 16px; - display: flex; - align-items: center; - justify-content: space-between; - position: relative; -} -.title-bar::after { - content: ''; - position: absolute; - bottom: -2px; - left: 0; - width: 100%; - height: 2px; - background: linear-gradient(90deg, #ff0000 33%, #0066ff 33%, #0066ff 66%, #ffa500 66%); -} -.title-left { - display: flex; - align-items: center; - gap: 20px; -} -.logo-small { - font-size: 1.2em; - font-weight: 700; - letter-spacing: 3px; - background: linear-gradient(90deg, #ff0000, #0066ff, #ffa500); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} -.project-name { - color: #666; - font-size: 0.9em; -} -.project-name span { - color: #0066ff; - font-weight: 700; -} -.title-right { - display: flex; - gap: 15px; - font-size: 0.85em; -} -.status-indicator { - display: flex; - align-items: center; - gap: 8px; -} -.status-dot { - width: 8px; - height: 8px; - border-radius: 50%; - animation: pulse 2s infinite; -} -.status-dot.foundation { background: #ff0000; } -.status-dot.corporation { background: #0066ff; } -.status-dot.labs { background: #ffa500; } -@keyframes pulse { - 0%, 100% { opacity: 1; box-shadow: 0 0 8px currentColor; } - 50% { opacity: 0.6; box-shadow: 0 0 4px currentColor; } -} - -.main-content { - display: flex; - flex: 1; - overflow: hidden; -} -.sidebar { - width: 250px; - background: #0d0d0d; - border-right: 1px solid #1a1a1a; - display: flex; - flex-direction: column; -} -.sidebar-section { - border-bottom: 1px solid #1a1a1a; -} -.sidebar-header { - padding: 12px 16px; - font-size: 0.75em; - text-transform: uppercase; - letter-spacing: 2px; - color: #666; - display: flex; - align-items: center; - gap: 8px; - border-left: 3px solid; -} -.sidebar-header.foundation { border-color: #ff0000; } -.sidebar-header.corporation { border-color: #0066ff; } -.sidebar-header.labs { border-color: #ffa500; } -.file-tree { - padding: 8px 0; -} -.file-item { - padding: 6px 16px 6px 24px; - font-size: 0.85em; - cursor: pointer; - transition: background 0.2s; - display: flex; - align-items: center; - gap: 8px; -} -.file-item:hover { - background: #1a1a1a; -} -.file-item.active { - background: #1a1a1a; - border-left: 2px solid #0066ff; -} -.file-icon { - color: #666; -} -.editor-area { - flex: 1; - display: flex; - flex-direction: column; - background: #0f0f0f; -} -.editor-tabs { - background: #0d0d0d; - border-bottom: 1px solid #1a1a1a; - display: flex; - padding: 0; -} -.editor-tab { - padding: 10px 20px; - font-size: 0.85em; - background: #0d0d0d; - border-right: 1px solid #1a1a1a; - cursor: pointer; - transition: background 0.2s; - display: flex; - align-items: center; - gap: 8px; -} -.editor-tab:hover { - background: #1a1a1a; -} -.editor-tab.active { - background: #0f0f0f; - border-bottom: 2px solid #0066ff; -} -.editor-content { - flex: 1; - overflow: auto; - padding: 20px; -} -.code-line { - display: flex; - font-size: 0.9em; - line-height: 1.6; - font-family: 'JetBrains Mono', monospace; -} -.line-number { - color: #333; - width: 40px; - text-align: right; - padding-right: 20px; - user-select: none; -} -.line-content { - flex: 1; -} -.keyword { color: #ff0000; font-weight: 700; } -.function { color: #0066ff; } -.comment { color: #ffa500; font-style: italic; } -.string { color: #00ff88; } -.number { color: #ff6b9d; } -.variable { color: #e0e0e0; } -.operator { color: #999; } -.right-panel { - width: 320px; - background: #0d0d0d; - border-left: 1px solid #1a1a1a; - display: flex; - flex-direction: column; -} -.panel-header { - padding: 12px 16px; - font-size: 0.75em; - text-transform: uppercase; - letter-spacing: 2px; - border-bottom: 1px solid #1a1a1a; - display: flex; - align-items: center; - justify-content: space-between; -} -.panel-content { - flex: 1; - overflow: auto; - padding: 16px; -} -.copilot-message { - margin-bottom: 16px; - padding: 12px; - background: #1a1a1a; - border-left: 3px solid; - font-size: 0.85em; - line-height: 1.6; -} -.copilot-message.labs { border-color: #ffa500; } -.copilot-message.foundation { border-color: #ff0000; } -.copilot-message.corporation { border-color: #0066ff; } -.copilot-label { - font-size: 0.75em; - text-transform: uppercase; - letter-spacing: 1px; - margin-bottom: 8px; - font-weight: 700; -} -.copilot-label.labs { color: #ffa500; } -.copilot-label.foundation { color: #ff0000; } -.copilot-label.corporation { color: #0066ff; } -.bottom-panel { - height: 200px; - background: #0d0d0d; - border-top: 1px solid #1a1a1a; - display: flex; - flex-direction: column; -} -.bottom-tabs-row { - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 8px; -} -.bottom-tabs { - display: flex; - gap: 0; - border-bottom: 1px solid #1a1a1a; -} -.bottom-tab { - padding: 8px 16px; - font-size: 0.8em; - text-transform: uppercase; - letter-spacing: 1px; - cursor: pointer; - border-right: 1px solid #1a1a1a; - transition: background 0.2s; -} -.bottom-tab:hover { - background: #1a1a1a; -} -.bottom-tab.active { - background: #1a1a1a; - border-bottom: 2px solid #0066ff; -} -.bottom-content { - flex: 1; - overflow: auto; - padding: 12px; -} -.terminal-output { - flex: 1; - overflow: auto; - padding: 12px; - font-size: 0.85em; - line-height: 1.6; -} -.terminal-line { - margin: 2px 0; -} -.terminal-line.foundation { color: #ff0000; } -.terminal-line.corporation { color: #0066ff; } -.terminal-line.labs { color: #ffa500; } -.terminal-line.success { color: #00ff00; } -.terminal-line.error { color: #ff0000; } -.network-viz { - position: fixed; - bottom: 220px; - right: 20px; - width: 300px; - background: rgba(13, 13, 13, 0.95); - border: 1px solid #1a1a1a; - padding: 16px; - font-size: 0.75em; - z-index: 100; -} -.network-viz-header { - text-transform: uppercase; - letter-spacing: 2px; - margin-bottom: 12px; - color: #666; -} -.network-node { - display: flex; - align-items: center; - gap: 12px; - margin: 8px 0; - padding: 8px; - background: #0f0f0f; -} -.node-dot { - width: 12px; - height: 12px; - border-radius: 50%; - animation: pulse 2s infinite; -} -.node-dot.foundation { background: #ff0000; } -.node-dot.corporation { background: #0066ff; } -.node-dot.labs { background: #ffa500; } -.node-info { - flex: 1; -} -.node-label { - font-weight: 700; - margin-bottom: 2px; -} -.node-status { - color: #666; - font-size: 0.9em; -} - -.grid-title { - grid-area: title; - z-index: 2; -} -.grid-sidebar { - grid-area: sidebar; - min-width: 180px; - max-width: 260px; - overflow-y: auto; - border-right: 2px solid #181818; - background: #111; - z-index: 1; -} -.grid-editor { - grid-area: editor; - overflow: auto; - background: #181818; -} -.grid-right { - grid-area: right; - min-width: 220px; - max-width: 400px; - border-left: 2px solid #181818; - background: #15151a; - overflow-y: auto; -} -.grid-bottom { - grid-area: bottom; - border-top: 2px solid #181818; - background: #101014; - min-height: 120px; - max-height: 220px; - overflow-y: auto; -} -.grid-network { - position: fixed; - right: 24px; - bottom: 24px; - z-index: 10; -} - -.title-bar { - background: #0d0d0d; - border-bottom: 2px solid #1a1a1a; - padding: 8px 16px; - display: flex; - align-items: center; - justify-content: space-between; - position: relative; -} - -.title-bar::after { - content: ''; - position: absolute; - bottom: -2px; - left: 0; - width: 100%; - height: 2px; - background: linear-gradient(90deg, #ff0000 33%, #0066ff 33%, #0066ff 66%, #ffa500 66%); -} - -.title-left { - display: flex; - align-items: center; - gap: 20px; -} - -.logo-small { - font-size: 1.2em; - font-weight: 700; - letter-spacing: 3px; -} - -/* ...continue copying the rest of the CSS from the mockup as needed... */ diff --git a/components/NewProjectModal.tsx b/components/NewProjectModal.tsx index e47a530..bed8dfe 100644 --- a/components/NewProjectModal.tsx +++ b/components/NewProjectModal.tsx @@ -11,7 +11,7 @@ import { Switch } from '@/components/ui/switch'; import { Label } from '@/components/ui/label'; import { Progress } from '@/components/ui/progress'; import { useAppStore } from '@/store/app-store'; -import { templates } from '@/lib/templates'; +import { templates, Template } from '../lib/templates'; import { getPlatformIcon } from '@/lib/utils'; export function NewProjectModal() { diff --git a/middleware.ts b/middleware.ts new file mode 100644 index 0000000..2b43d4b --- /dev/null +++ b/middleware.ts @@ -0,0 +1,19 @@ +import { type NextRequest } from 'next/server'; +import { updateSession } from '@/lib/supabase/middleware'; + +export async function middleware(request: NextRequest) { + return await updateSession(request); +} + +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + * - public folder + */ + '/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)', + ], +}; diff --git a/package-lock.json b/package-lock.json index 3e6c8a2..8076b25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,10 +18,13 @@ "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-collapsible": "^1.1.11", + "@radix-ui/react-context-menu": "^2.2.16", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-hover-card": "^1.1.15", "@radix-ui/react-label": "^2.1.2", "@radix-ui/react-menubar": "^1.1.6", + "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-popover": "^1.1.6", "@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-radio-group": "^1.2.3", @@ -33,29 +36,40 @@ "@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-toast": "^1.2.6", + "@radix-ui/react-toggle": "^1.1.10", + "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.1.8", + "@sentry/browser": "^10.38.0", + "@supabase/ssr": "^0.8.0", + "@supabase/supabase-js": "^2.93.3", "@tailwindcss/typography": "^0.5.13", "autoprefixer": "^10.4.23", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "cmdk": "^1.1.1", "date-fns": "^3.6.0", "dotenv": "^16.5.0", "embla-carousel-react": "^8.6.0", "firebase": "^11.9.1", "genkit": "^1.20.0", + "input-otp": "^1.4.2", "lucide-react": "^0.475.0", "marked": "^12.0.2", "next": "15.5.9", + "next-themes": "^0.4.6", "patch-package": "^8.0.0", + "posthog-js": "^1.337.0", "react": "^19.2.1", "react-day-picker": "^9.11.3", "react-dom": "^19.2.1", "react-hook-form": "^7.54.2", + "react-resizable-panels": "^4.5.9", "react-syntax-highlighter": "^15.5.0", "recharts": "^2.15.1", "sonner": "^2.0.7", "tailwind-merge": "^3.0.1", "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.2", "zod": "^3.24.2", "zustand": "^5.0.10" }, @@ -3608,6 +3622,18 @@ "node": ">=8.0.0" } }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz", + "integrity": "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@opentelemetry/auto-instrumentations-node": { "version": "0.49.2", "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.49.2.tgz", @@ -3826,6 +3852,40 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.208.0.tgz", + "integrity": "sha512-jOv40Bs9jy9bZVLo/i8FwUiuCvbjWDI+ZW13wimJm4LjnlwJxGgB+N/VWOZUTpM+ah/awXeQqKdNlpLf2EjvYg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.208.0", + "@opentelemetry/core": "2.2.0", + "@opentelemetry/otlp-exporter-base": "0.208.0", + "@opentelemetry/otlp-transformer": "0.208.0", + "@opentelemetry/sdk-logs": "0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", + "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { "version": "0.52.1", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", @@ -5265,6 +5325,37 @@ "node": ">=10" } }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.208.0.tgz", + "integrity": "sha512-gMd39gIfVb2OgxldxUtOwGJYSH8P1kVFFlJLuut32L6KgUC4gl1dMhn+YC2mGn0bDOiQYSk/uHOdSjuKp58vvA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/otlp-transformer": "0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", + "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/otlp-grpc-exporter-base": { "version": "0.52.1", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", @@ -5349,6 +5440,91 @@ "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.208.0.tgz", + "integrity": "sha512-DCFPY8C6lAQHUNkzcNT9R+qYExvsk6C5Bto2pbNxgicpcSWbe2WHShLxkOxIdNcBiYPdVHv/e7vH7K6TI+C+fQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.208.0", + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0", + "@opentelemetry/sdk-logs": "0.208.0", + "@opentelemetry/sdk-metrics": "2.2.0", + "@opentelemetry/sdk-trace-base": "2.2.0", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", + "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", + "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", + "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/propagation-utils": { "version": "0.30.16", "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz", @@ -5747,6 +5923,54 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.208.0.tgz", + "integrity": "sha512-QlAyL1jRpOeaqx7/leG1vJMp84g0xKP6gJmfELBpnI4O/9xPX+Hu5m1POk9Kl+veNkyth5t19hRlN6tNY1sjbA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.208.0", + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", + "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/sdk-metrics": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", @@ -5892,7 +6116,6 @@ "node_modules/@opentelemetry/semantic-conventions": { "version": "1.39.0", "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=14" } @@ -5960,6 +6183,21 @@ "node": ">=14" } }, + "node_modules/@posthog/core": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.18.0.tgz", + "integrity": "sha512-irPbrcopCT0LCRgGM4V8jFuMNCFos6EM4QFf5KA2sHQFC/6pGaHZYoyHcjRUDUKFw4vmpLlmGEXA5ah8x5K4LQ==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6" + } + }, + "node_modules/@posthog/types": { + "version": "1.337.0", + "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.337.0.tgz", + "integrity": "sha512-R7J5BIeulNbjmUNfc8FICRa57K1IizSpJBRI6IuJvRFnm3eeczWOw6DKH0NCHXHZiE3XzVcUrJUOKaKXBcdQxQ==", + "license": "MIT" + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "license": "BSD-3-Clause" @@ -6295,6 +6533,34 @@ } } }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-dialog": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", @@ -6454,6 +6720,37 @@ } } }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-id": { "version": "1.1.1", "license": "MIT", @@ -6604,6 +6901,42 @@ } } }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popover": { "version": "1.1.15", "license": "MIT", @@ -7159,6 +7492,60 @@ } } }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-tooltip": { "version": "1.2.8", "license": "MIT", @@ -7376,6 +7763,81 @@ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "license": "MIT" }, + "node_modules/@sentry-internal/browser-utils": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.38.0.tgz", + "integrity": "sha512-UOJtYmdcxHCcV0NPfXFff/a95iXl/E0EhuQ1y0uE0BuZDMupWSF5t2BgC4HaE5Aw3RTjDF3XkSHWoIF6ohy7eA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.38.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.38.0.tgz", + "integrity": "sha512-JXneg9zRftyfy1Fyfc39bBlF/Qd8g4UDublFFkVvdc1S6JQPlK+P6q22DKz3Pc8w3ySby+xlIq/eTu9Pzqi4KA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.38.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.38.0.tgz", + "integrity": "sha512-YWIkL6/dnaiQyFiZXJ/nN+NXGv/15z45ia86bE/TMq01CubX/DUOilgsFz0pk2v/pg3tp/U2MskLO9Hz0cnqeg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "10.38.0", + "@sentry/core": "10.38.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.38.0.tgz", + "integrity": "sha512-OXWM9jEqNYh4VTvrMu7v+z1anz+QKQ/fZXIZdsO7JTT2lGNZe58UUMeoq386M+Saxen8F9SUH7yTORy/8KI5qw==", + "license": "MIT", + "dependencies": { + "@sentry-internal/replay": "10.38.0", + "@sentry/core": "10.38.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/browser": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.38.0.tgz", + "integrity": "sha512-3phzp1YX4wcQr9mocGWKbjv0jwtuoDBv7+Y6Yfrys/kwyaL84mDLjjQhRf4gL5SX7JdYkhBp4WaiNlR0UC4kTA==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "10.38.0", + "@sentry-internal/feedback": "10.38.0", + "@sentry-internal/replay": "10.38.0", + "@sentry-internal/replay-canvas": "10.38.0", + "@sentry/core": "10.38.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/core": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.38.0.tgz", + "integrity": "sha512-1pubWDZE5y5HZEPMAZERP4fVl2NH3Ihp1A+vMoVkb3Qc66Diqj1WierAnStlZP7tCx0TBa0dK85GTW/ZFYyB9g==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@so-ric/colorspace": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", @@ -7393,6 +7855,112 @@ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, + "node_modules/@supabase/auth-js": { + "version": "2.93.3", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.93.3.tgz", + "integrity": "sha512-JdnkHZPKexVGSNONtu89RHU4bxz3X9kxx+f5ZnR5osoCIX+vs/MckwWRPZEybAEvlJXt5xjomDb3IB876QCxWQ==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.93.3", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.93.3.tgz", + "integrity": "sha512-qWO0gHNDm/5jRjROv/nv9L6sYabCWS1kzorOLUv3kqCwRvEJLYZga93ppJPrZwOgoZfXmJzvpjY8fODA4HQfBw==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "2.93.3", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.93.3.tgz", + "integrity": "sha512-+iJ96g94skO2e4clsRSmEXg22NUOjh9BziapsJSAvnB1grOBf/BA8vGtCHjNOA+Z6lvKXL1jwBqcL9+fS1W/Lg==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.93.3", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.93.3.tgz", + "integrity": "sha512-gnYpcFzwy8IkezRP4CDbT5I8jOsiOjrWrqTY1B+7jIriXsnpifmlM6RRjLBm9oD7OwPG0/WksniGPdKW67sXOA==", + "license": "MIT", + "dependencies": { + "@types/phoenix": "^1.6.6", + "@types/ws": "^8.18.1", + "tslib": "2.8.1", + "ws": "^8.18.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/ssr": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@supabase/ssr/-/ssr-0.8.0.tgz", + "integrity": "sha512-/PKk8kNFSs8QvvJ2vOww1mF5/c5W8y42duYtXvkOSe+yZKRgTTZywYG2l41pjhNomqESZCpZtXuWmYjFRMV+dw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.2" + }, + "peerDependencies": { + "@supabase/supabase-js": "^2.76.1" + } + }, + "node_modules/@supabase/ssr/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.93.3", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.93.3.tgz", + "integrity": "sha512-cw4qXiLrx3apglDM02Tx/w/stvFlrkKocC6vCvuFAz3JtVEl1zH8MUfDQDTH59kJAQVaVdbewrMWSoBob7REnA==", + "license": "MIT", + "dependencies": { + "iceberg-js": "^0.8.1", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.93.3", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.93.3.tgz", + "integrity": "sha512-paUqEqdBI9ztr/4bbMoCgeJ6M8ZTm2fpfjSOlzarPuzYveKFM20ZfDZqUpi9CFfYagYj5Iv3m3ztUjaI9/tM1w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@supabase/auth-js": "2.93.3", + "@supabase/functions-js": "2.93.3", + "@supabase/postgrest-js": "2.93.3", + "@supabase/realtime-js": "2.93.3", + "@supabase/storage-js": "2.93.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -7635,6 +8203,12 @@ "@types/pg": "*" } }, + "node_modules/@types/phoenix": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz", + "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.2.9", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.9.tgz", @@ -7741,6 +8315,15 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -8521,6 +9104,22 @@ "node": ">=6" } }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/color": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", @@ -8698,6 +9297,17 @@ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, + "node_modules/core-js": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", @@ -9637,6 +10247,12 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", + "license": "MIT" + }, "node_modules/fill-range": { "version": "7.1.1", "license": "MIT", @@ -10637,6 +11253,15 @@ "node": ">= 14" } }, + "node_modules/iceberg-js": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", + "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10700,6 +11325,16 @@ "version": "2.0.4", "license": "ISC" }, + "node_modules/input-otp": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", + "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -11696,6 +12331,16 @@ } } }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "funding": [ @@ -12360,6 +13005,83 @@ "node": ">=0.10.0" } }, + "node_modules/posthog-js": { + "version": "1.337.0", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.337.0.tgz", + "integrity": "sha512-wtzPoMGlCAJGgfjOIjimFRj+8SH4Aojfhc2+s8HdL54ivdQGK24JvwQoz12bKssvDSpFiBPwX1xunkt0f7mpcg==", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.208.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.208.0", + "@opentelemetry/resources": "^2.2.0", + "@opentelemetry/sdk-logs": "^0.208.0", + "@posthog/core": "1.18.0", + "@posthog/types": "1.337.0", + "core-js": "^3.38.1", + "dompurify": "^3.3.1", + "fflate": "^0.4.8", + "preact": "^10.28.2", + "query-selector-shadow-dom": "^1.0.1", + "web-vitals": "^5.1.0" + } + }, + "node_modules/posthog-js/node_modules/@opentelemetry/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.0.tgz", + "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/posthog-js/node_modules/@opentelemetry/resources": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.0.tgz", + "integrity": "sha512-F8W52ApePshpoSrfsSk1H2yJn9aKjCrbpQF1M9Qii0GHzbfVeFUB+rc3X4aggyZD8x9Gu3Slua+s6krmq6Dt8g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.5.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/posthog-js/node_modules/dompurify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/posthog-js/node_modules/web-vitals": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.1.0.tgz", + "integrity": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==", + "license": "Apache-2.0" + }, + "node_modules/preact": { + "version": "10.28.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.3.tgz", + "integrity": "sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -12512,6 +13234,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "funding": [ @@ -12674,6 +13402,16 @@ } } }, + "node_modules/react-resizable-panels": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-4.5.9.tgz", + "integrity": "sha512-7l0w2TxYq032F2o6PnfxDbDEKzi1lohDw3BKx4OBkh6uu7uh+Gj1C0Ubpv0/fOO2bRvo+IIQMOoFE0l2LgpeAg==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, "node_modules/react-smooth": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", @@ -14136,6 +14874,19 @@ "node": ">= 0.8" } }, + "node_modules/vaul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/victory-vendor": { "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", @@ -14374,6 +15125,27 @@ "dev": true, "license": "ISC" }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", diff --git a/package.json b/package.json index 86343b9..324c333 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,13 @@ "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-collapsible": "^1.1.11", + "@radix-ui/react-context-menu": "^2.2.16", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-hover-card": "^1.1.15", "@radix-ui/react-label": "^2.1.2", "@radix-ui/react-menubar": "^1.1.6", + "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-popover": "^1.1.6", "@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-radio-group": "^1.2.3", @@ -37,29 +40,40 @@ "@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-toast": "^1.2.6", + "@radix-ui/react-toggle": "^1.1.10", + "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.1.8", + "@sentry/browser": "^10.38.0", + "@supabase/ssr": "^0.8.0", + "@supabase/supabase-js": "^2.93.3", "@tailwindcss/typography": "^0.5.13", "autoprefixer": "^10.4.23", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "cmdk": "^1.1.1", "date-fns": "^3.6.0", "dotenv": "^16.5.0", "embla-carousel-react": "^8.6.0", "firebase": "^11.9.1", "genkit": "^1.20.0", + "input-otp": "^1.4.2", "lucide-react": "^0.475.0", "marked": "^12.0.2", "next": "15.5.9", + "next-themes": "^0.4.6", "patch-package": "^8.0.0", + "posthog-js": "^1.337.0", "react": "^19.2.1", "react-day-picker": "^9.11.3", "react-dom": "^19.2.1", "react-hook-form": "^7.54.2", + "react-resizable-panels": "^4.5.9", "react-syntax-highlighter": "^15.5.0", "recharts": "^2.15.1", "sonner": "^2.0.7", "tailwind-merge": "^3.0.1", "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.2", "zod": "^3.24.2", "zustand": "^5.0.10" }, diff --git a/src/App.tsx b/src/App.tsx index 4e4d462..d99a3c4 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,3 +1,4 @@ +'use client'; // ...existing code... import React, { useState, lazy, Suspense } from 'react'; import { FileTree } from '../components/FileTree'; @@ -232,7 +233,15 @@ function App() { {/* Main Editor/Preview Split */}
- setShowTemplates(true)} /*...existing code...*/ /> + setShowTemplates(true)} + onPreviewClick={() => setShowPreview(true)} + onNewProjectClick={() => setShowNewProject(true)} + currentPlatform={currentPlatform} + onPlatformChange={setCurrentPlatform} + onTranslateClick={() => setShowTranslation(true)} + />
{activeFileId ? ( @@ -327,14 +336,14 @@ function App() { )} {/* Modals and Drawers */} Loading…
}> - {showTemplates && setShowTemplates(false)} />} + {showTemplates && setShowTemplates(false)} currentPlatform={currentPlatform} />} {showPreview && setShowPreview(false)} />} - {showNewProject && setShowNewProject(false)} />} + {showNewProject && setShowNewProject(false)} onCreateProject={() => {}} />}
Loading…
}> - {showTemplates && setShowTemplates(false)} />} + {showTemplates && setShowTemplates(false)} currentPlatform={currentPlatform} />} {showPreview && setShowPreview(false)} />} {showNewProject && setShowNewProject(false)} onCreateProject={() => {}} />} {showTranslation && setShowTranslation(false)} currentCode={currentCode} currentPlatform={currentPlatform} />} diff --git a/src/app/auth/auth-code-error/page.tsx b/src/app/auth/auth-code-error/page.tsx new file mode 100644 index 0000000..440f7cc --- /dev/null +++ b/src/app/auth/auth-code-error/page.tsx @@ -0,0 +1,66 @@ +"use client"; + +import Link from "next/link"; + +export default function AuthCodeErrorPage() { + return ( +
+
+
+ + + +
+ +

+ Authentication Error +

+ +

+ Something went wrong during sign in. This could happen if: +

+ +
    +
  • + + The sign in link expired or was already used +
  • +
  • + + You denied access to your account +
  • +
  • + + There was a network error during authentication +
  • +
+ +
+ + Try Again + + + + Go Home + +
+
+
+ ); +} diff --git a/src/app/auth/callback/route.ts b/src/app/auth/callback/route.ts new file mode 100644 index 0000000..b1d13ec --- /dev/null +++ b/src/app/auth/callback/route.ts @@ -0,0 +1,21 @@ +import { createClient } from '@/lib/supabase/server'; +import { NextResponse } from 'next/server'; + +export async function GET(request: Request) { + const { searchParams, origin } = new URL(request.url); + const code = searchParams.get('code'); + // Default redirect to /ide after successful OAuth login + const next = searchParams.get('next') ?? '/ide'; + + if (code) { + const supabase = await createClient(); + const { error } = await supabase.auth.exchangeCodeForSession(code); + if (!error) { + return NextResponse.redirect(`${origin}${next}`); + } + console.error('OAuth callback error:', error.message); + } + + // Return the user to an error page with instructions + return NextResponse.redirect(`${origin}/auth/auth-code-error`); +} diff --git a/src/app/auth/login/page.tsx b/src/app/auth/login/page.tsx new file mode 100644 index 0000000..8acff7c --- /dev/null +++ b/src/app/auth/login/page.tsx @@ -0,0 +1,169 @@ +"use client"; + +import { useState } from "react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { useSupabaseAuth } from "@/hooks/use-supabase"; + +export default function LoginPage() { + const router = useRouter(); + const { signIn, signInWithOAuth } = useSupabaseAuth(); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(""); + const [loading, setLoading] = useState(false); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(""); + setLoading(true); + + const { error } = await signIn(email, password); + + if (error) { + setError(error.message); + setLoading(false); + } else { + router.push("/ide"); + } + }; + + const handleOAuth = async (provider: "github" | "google" | "discord") => { + setError(""); + const { error } = await signInWithOAuth(provider); + if (error) { + setError(error.message); + } + }; + + return ( +
+
+ {/* Logo */} +
+ +
+ + + +
+ AeThex Studio + +
+ + {/* Card */} +
+

Welcome back

+

Sign in to your AeThex account

+ + {error && ( +
+ {error} +
+ )} + + {/* OAuth Buttons */} +
+ + + +
+ +
+
+
+
+
+ or continue with email +
+
+ + {/* Email Form */} +
+
+ + setEmail(e.target.value)} + className="w-full bg-[#1b1b1b] border border-[#333] rounded-lg px-4 py-3 text-white placeholder-[#666] focus:outline-none focus:border-purple-500 transition-colors" + placeholder="you@example.com" + required + /> +
+
+ + setPassword(e.target.value)} + className="w-full bg-[#1b1b1b] border border-[#333] rounded-lg px-4 py-3 text-white placeholder-[#666] focus:outline-none focus:border-purple-500 transition-colors" + placeholder="••••••••" + required + /> +
+ +
+ +

+ Don't have an account?{" "} + + Sign up + +

+
+ + {/* Ecosystem Links */} +
+

Part of the AeThex ecosystem

+ +
+
+
+ ); +} diff --git a/src/app/auth/signup/page.tsx b/src/app/auth/signup/page.tsx new file mode 100644 index 0000000..6d4e471 --- /dev/null +++ b/src/app/auth/signup/page.tsx @@ -0,0 +1,230 @@ +"use client"; + +import { useState } from "react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { useSupabaseAuth } from "@/hooks/use-supabase"; + +export default function SignUpPage() { + const router = useRouter(); + const { signUp, signInWithOAuth } = useSupabaseAuth(); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [confirmPassword, setConfirmPassword] = useState(""); + const [error, setError] = useState(""); + const [loading, setLoading] = useState(false); + const [success, setSuccess] = useState(false); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(""); + + if (password !== confirmPassword) { + setError("Passwords do not match"); + return; + } + + if (password.length < 8) { + setError("Password must be at least 8 characters"); + return; + } + + setLoading(true); + + const { error } = await signUp(email, password); + + if (error) { + setError(error.message); + setLoading(false); + } else { + setSuccess(true); + } + }; + + const handleOAuth = async (provider: "github" | "google" | "discord") => { + setError(""); + const { error } = await signInWithOAuth(provider); + if (error) { + setError(error.message); + } + }; + + if (success) { + return ( +
+
+
+
+ + + +
+

Check your email

+

+ We sent a confirmation link to {email} +

+ + Back to login + +
+
+
+ ); + } + + return ( +
+
+ {/* Logo */} +
+ +
+ + + +
+ AeThex Studio + +
+ + {/* Card */} +
+

Create your account

+

Join the AeThex ecosystem

+ + {error && ( +
+ {error} +
+ )} + + {/* OAuth Buttons */} +
+ + + +
+ +
+
+
+
+
+ or continue with email +
+
+ + {/* Email Form */} +
+
+ + setEmail(e.target.value)} + className="w-full bg-[#1b1b1b] border border-[#333] rounded-lg px-4 py-3 text-white placeholder-[#666] focus:outline-none focus:border-purple-500 transition-colors" + placeholder="you@example.com" + required + /> +
+
+ + setPassword(e.target.value)} + className="w-full bg-[#1b1b1b] border border-[#333] rounded-lg px-4 py-3 text-white placeholder-[#666] focus:outline-none focus:border-purple-500 transition-colors" + placeholder="••••••••" + required + /> +
+
+ + setConfirmPassword(e.target.value)} + className="w-full bg-[#1b1b1b] border border-[#333] rounded-lg px-4 py-3 text-white placeholder-[#666] focus:outline-none focus:border-purple-500 transition-colors" + placeholder="••••••••" + required + /> +
+ +
+ +

+ Already have an account?{" "} + + Sign in + +

+
+ + {/* Terms */} +

+ By creating an account, you agree to our{" "} + Terms of Service + {" "}and{" "} + Privacy Policy +

+ + {/* Ecosystem Links */} +
+

Part of the AeThex ecosystem

+ +
+
+
+ ); +} diff --git a/src/app/globals.css b/src/app/globals.css index 8b65a67..c1a702c 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -10,14 +10,136 @@ --card-foreground: 0 0% 3.9%; --popover: 0 0% 100%; --popover-foreground: 0 0% 3.9%; - --primary: 278 52% 49%; + --primary: 262 83% 58%; --primary-foreground: 0 0% 98%; - --secondary: 277 100% 25%; - --secondary-foreground: 0 0% 98%; - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - --accent: 180 100% 25%; - --accent-foreground: 0 0% 9%; + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; --destructive: 0 84.2% 60.2%; --destructive-foreground: 0 0% 98%; - --border: 0 0% 89.8%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 262 83% 58%; + --radius: 0.5rem; + } + + .dark { + --background: 240 6% 6%; + --foreground: 0 0% 95%; + --card: 240 6% 8%; + --card-foreground: 0 0% 95%; + --popover: 240 6% 8%; + --popover-foreground: 0 0% 95%; + --primary: 262 83% 58%; + --primary-foreground: 0 0% 98%; + --secondary: 240 5% 12%; + --secondary-foreground: 0 0% 95%; + --muted: 240 5% 14%; + --muted-foreground: 240 5% 55%; + --accent: 240 5% 14%; + --accent-foreground: 0 0% 95%; + --destructive: 0 62.8% 45%; + --destructive-foreground: 0 0% 98%; + --border: 240 4% 16%; + --input: 240 4% 16%; + --ring: 262 83% 58%; + } + + * { + border-color: hsl(var(--border)); + } + + html, body { + height: 100%; + margin: 0; + padding: 0; + } + + body { + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); + font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} + +/* Custom scrollbar - minimal and modern */ +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.2); +} + +::-webkit-scrollbar-corner { + background: transparent; +} + +/* IDE-specific scrollbar */ +.ide-scroll::-webkit-scrollbar { + width: 10px; +} + +.ide-scroll::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.08); + border: 2px solid transparent; + background-clip: padding-box; + border-radius: 5px; +} + +.ide-scroll::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.15); + border: 2px solid transparent; + background-clip: padding-box; +} + +/* Smooth transitions */ +* { + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +/* Selection styling */ +::selection { + background: rgba(139, 92, 246, 0.3); + color: white; +} + +/* Focus rings */ +:focus-visible { + outline: 2px solid rgba(139, 92, 246, 0.5); + outline-offset: 2px; +} + +/* Hide scrollbar utility */ +.scrollbar-hide { + -ms-overflow-style: none; + scrollbar-width: none; +} + +.scrollbar-hide::-webkit-scrollbar { + display: none; +} + diff --git a/src/app/ide/page.tsx b/src/app/ide/page.tsx index df65764..45a22bd 100644 --- a/src/app/ide/page.tsx +++ b/src/app/ide/page.tsx @@ -1,4 +1,4 @@ -import { AethexStudio } from "@/components/aethex/aethex-studio"; +import { AethexStudio } from "@/src/components/aethex/aethex-studio"; export default function IdePage() { return ( diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 0466ddd..1ad7da6 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -22,11 +22,11 @@ export default function RootLayout({ crossOrigin="anonymous" /> - + {children} diff --git a/src/app/page.tsx b/src/app/page.tsx index 9b7b332..91e54d2 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,34 +1,458 @@ +"use client"; +import { useState } from "react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { useSupabaseAuth, useProfile } from "@/hooks/use-supabase"; export default function Page() { + const router = useRouter(); + const { user, loading } = useSupabaseAuth(); + const { profile } = useProfile(); + const [prompt, setPrompt] = useState(""); + + const handlePromptSubmit = () => { + if (prompt.trim()) { + sessionStorage.setItem("aethex_prompt", prompt); + router.push("/ide"); + } + }; + return ( -
-
-

Welcome to AeThex Studio

-

- The next-generation cross-platform IDE for creators, educators, and teams.
- Download or launch AeThex Studio below. -

-
- - Launch Web IDE - - - Download Desktop App - +
+ {/* Fixed Navbar */} + + + {/* Hero Section - Prompt First */} +
+
+ +

+ Build games for{" "} + + every platform + +

+

+ The AI-powered cross-platform game IDE. Write once, deploy to Roblox, UEFN, Spatial, and the Web.

-
+ + {/* Prompt Input Box */} +
+
+