diff --git a/.mcp.json b/.mcp.json index 9ea125f..16fc2a6 100644 --- a/.mcp.json +++ b/.mcp.json @@ -13,7 +13,10 @@ }, "brave-search": { "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-brave-search"], + "args": [ + "-y", + "@modelcontextprotocol/server-brave-search" + ], "env": { "BRAVE_API_KEY": "BSAcRGGikEzY4B2j3NZ8Qy5NYh9l4HZ" } @@ -36,7 +39,10 @@ "perplexity": { "type": "stdio", "command": "npx", - "args": ["-y", "perplexity-mcp"], + "args": [ + "-y", + "perplexity-mcp" + ], "env": { "PERPLEXITY_API_KEY": "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", "PERPLEXITY_TIMEOUT_MS": "600000" @@ -44,13 +50,23 @@ }, "chrome-devtools": { "command": "npx", - "args": ["-y", "chrome-devtools-mcp@latest"] + "args": [ + "-y", + "chrome-devtools-mcp@latest" + ] }, "browsermcp": { "type": "stdio", "command": "npx", - "args": ["-y", "@browsermcp/mcp@latest"], + "args": [ + "-y", + "@browsermcp/mcp@latest" + ], "env": {} + }, + "shadcn": { + "command": "npx", + "args": ["shadcn@latest", "mcp"] } } } diff --git a/apps/landing/components.json b/apps/landing/components.json new file mode 100644 index 0000000..edcaef2 --- /dev/null +++ b/apps/landing/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/apps/landing/package.json b/apps/landing/package.json index 0f92f17..6c16392 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -10,17 +10,28 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@banatie/database": "workspace:*", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-radio-group": "^1.3.8", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-slot": "^1.2.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.400.0", + "next": "15.5.4", "react": "19.1.0", "react-dom": "19.1.0", - "next": "15.5.4", - "@banatie/database": "workspace:*" + "tailwind-merge": "^3.4.0" }, "devDependencies": { - "typescript": "^5", + "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "@tailwindcss/postcss": "^4", - "tailwindcss": "^4" + "tailwindcss": "^4", + "tw-animate-css": "^1.4.0", + "typescript": "^5" } } diff --git a/apps/landing/src/app/(lab)/CLAUDE.md b/apps/landing/src/app/(lab)/CLAUDE.md new file mode 100644 index 0000000..792f12f --- /dev/null +++ b/apps/landing/src/app/(lab)/CLAUDE.md @@ -0,0 +1,364 @@ +# Lab Section Design System + +The Lab section is a production-ready UI interface for interacting with the Banatie API service. It provides a clean, work-focused experience for image generation, gallery browsing, alias management, and flow control. + +## File Structure + +``` +apps/landing/src/ +├── app/(lab)/ +│ ├── CLAUDE.md # This design documentation +│ ├── layout.tsx # Root lab layout with scroll context +│ └── lab/ +│ ├── layout.tsx # Sub-layout with PageProvider +│ ├── page.tsx # Redirect to /lab/generate +│ ├── generate/page.tsx # Generation workbench +│ ├── images/page.tsx # Image gallery browser +│ ├── live/page.tsx # Live generation testing +│ └── upload/page.tsx # File upload interface +│ +├── components/layout/lab/ +│ ├── LabLayout.tsx # Main layout (sidebar + content + footer) +│ ├── LabSidebar.tsx # Left filter panel +│ └── LabFooter.tsx # Contextual footer with links +│ +├── components/lab/ +│ ├── GenerateFormPlaceholder.tsx # Generation form component +│ └── FilterPlaceholder.tsx # Reusable filter checkbox/radio +│ +└── contexts/ + └── lab-scroll-context.tsx # Scroll state for header collapse +``` + +## Design Principles + +1. **Work-focused, not marketing** - Small typography, efficient spacing +2. **Clean and functional** - Like Google AI Studio +3. **Dual color system** - Zinc for layout, Slate for forms +4. **Consistent icons** - Lucide React only, no emojis +5. **Responsive** - Works on 768px to 1920px+ screens + +--- + +## Color System + +### Layout/Chrome → Zinc (Neutral Gray) +Used for sidebar, footer, and layout borders: +```css +bg-zinc-950 /* Sidebar background */ +bg-zinc-950/50 /* Footer background, layout wrappers */ +border-zinc-800 /* Layout borders, dividers */ +text-zinc-400 /* Sidebar text */ +text-zinc-500 /* Footer text, muted */ +``` + +### Forms/Cards → Slate (Original Style) +Used for cards, inputs, and interactive UI elements: +```css +bg-slate-900/80 /* Card backgrounds */ +bg-slate-900/50 /* Empty states, lighter cards */ +bg-slate-800 /* Input backgrounds, secondary surfaces */ +border-slate-700 /* Card borders, input borders */ +text-gray-400 /* Labels, secondary text */ +text-gray-500 /* Placeholders, hints */ +``` + +### Accent Colors (Purple/Cyan) +```css +/* Primary gradient */ +bg-gradient-to-r from-purple-600 to-cyan-600 +hover:from-purple-500 hover:to-cyan-500 +shadow-lg shadow-purple-900/30 +focus:ring-2 focus:ring-purple-500 + +/* Single-color accents */ +text-purple-400 /* Links, interactive text */ + +/* Info banners */ +bg-purple-900/10 border-purple-700/50 +``` + +### Status Colors +```css +/* Success */ bg-emerald-500/10 border-emerald-500/30 text-emerald-400 +/* Warning */ bg-amber-500/10 border-amber-500/30 text-amber-400 +/* Error */ bg-red-500/10 border-red-500/30 text-red-400 +/* Info */ bg-purple-900/10 border-purple-700/50 text-purple-400 +``` + +--- + +## Typography Scale + +### Headings (Practical Sizes) +```tsx +// Page Title (only on main pages) +text-lg font-semibold text-white + +// Section Title +text-base font-semibold text-white + +// Card Title +text-sm font-medium text-white +``` + +### Body Text +```tsx +// Primary body +text-sm text-gray-300 + +// Secondary/descriptions +text-sm text-gray-400 + +// Small text (hints, metadata) +text-xs text-gray-500 + +// Labels (form fields) +text-xs font-medium text-gray-400 +``` + +### Interactive +```tsx +// Button text +text-sm font-semibold + +// Links +text-sm text-purple-400 hover:text-purple-300 + +// Badge/count +text-xs text-gray-600 +``` + +--- + +## Spacing System + +### Padding +```tsx +// Cards +p-4 md:p-5 + +// Compact cards +p-3 + +// Form inputs +px-3 py-2 + +// Buttons (primary) +px-4 py-2.5 + +// Buttons (secondary) +px-3 py-2 +``` + +### Section Spacing +```tsx +// Page padding +p-4 md:p-6 + +// Between sections +space-y-4 + +// Between cards in grid +gap-3 md:gap-4 + +// Between form fields +gap-2 + +// Label to input +mb-1.5 +``` + +### Border Radius +```tsx +rounded-lg /* Standard (inputs, small cards) */ +rounded-xl /* Medium (cards) */ +``` + +--- + +## Component Patterns + +### Page Header +```tsx +
+
+ +
+

Generate

+

Create AI images from text prompts

+
+
+
+``` + +### Form Card (Slate) +```tsx +
+ {/* content */} +
+``` + +### Form Input (Slate) +```tsx +
+ + +
+``` + +### Textarea (Slate) +```tsx +