import React, { useState, useEffect, useRef } from 'react'; import { Search, Menu, X, ChevronRight, Home, BookOpen, Layers, Database, Layout as LayoutIcon, GitBranch, Map, Eye, FileText, Copy, Check, Terminal, Info, AlertTriangle, ArrowRight, ArrowLeft, Github, Twitter } from 'lucide-react'; // --- CONFIG & DATA --- const GROUPS = [ 'GETTING STARTED', 'CORE CONCEPTS', 'TECHNICAL DETAILS', 'IMPLEMENTATION' ]; const PAGES = { 'home': { id: 'home', title: 'Home', icon: Home, group: null }, 'getting-started': { id: 'getting-started', title: 'Getting Started', icon: Terminal, group: 'GETTING STARTED', excerpt: 'Quick start guide to set up Mixfolio locally and connect to Supabase.' }, 'advanced': { id: 'advanced', title: 'Advanced Concepts & Vision', icon: BookOpen, group: 'CORE CONCEPTS', excerpt: 'The philosophy behind Mixfolio: Magic Switcher, Asset Vault, and more.' }, 'project-vision': { id: 'project-vision', title: 'Project Vision', icon: Eye, group: 'CORE CONCEPTS', excerpt: 'Understand the philosophy behind Mixfolio and the Creative OS concept.' }, 'system-architecture': { id: 'system-architecture', title: 'System Architecture', icon: Layers, group: 'TECHNICAL DETAILS', excerpt: 'Complete guide to how the frontend, backend, and database work together.' }, 'database-architecture': { id: 'database-architecture', title: 'Database Architecture', icon: Database, group: 'TECHNICAL DETAILS', excerpt: 'Deep dive into the 5-table Supabase schema, CASCADE deletion, and logic.' }, 'ui-ux-specifications': { id: 'ui-ux-specifications', title: 'UI/UX Specifications', icon: LayoutIcon, group: 'TECHNICAL DETAILS', excerpt: 'Design specifications for the gallery, detail workspace, and toolbars.' }, 'workflows': { id: 'workflows', title: 'Workflows & Logic', icon: GitBranch, group: 'TECHNICAL DETAILS', excerpt: 'Admin workflows, slugification, template system, and management patterns.' }, 'implementation-roadmap': { id: 'implementation-roadmap', title: 'Implementation Roadmap', icon: Map, group: 'IMPLEMENTATION', excerpt: '4-phase build plan for implementing Mixfolio with timelines and criteria.' }, 'prd': { id: 'prd', title: 'Product Requirements (PRD)', icon: FileText, group: 'IMPLEMENTATION', excerpt: 'The complete product specification, metrics, personas, and business roadmap.' } }; const PAGE_ORDER = Object.keys(PAGES).filter(k => k !== 'home'); // --- SHARED UI COMPONENTS --- const copyToClipboard = (text) => { const textArea = document.createElement("textarea"); textArea.value = text; document.body.appendChild(textArea); textArea.select(); try { document.execCommand('copy'); } catch (err) { console.error('Failed to copy text', err); } document.body.removeChild(textArea); }; const CodeBlock = ({ language = 'bash', code }) => { const [copied, setCopied] = useState(false); const handleCopy = () => { copyToClipboard(code); setCopied(true); setTimeout(() => setCopied(false), 2000); }; return (
{language}
          {code}
        
); }; const Callout = ({ type = 'info', title, children }) => { const styles = { info: 'bg-blue-900/20 border-blue-500/30 text-blue-200', warning: 'bg-orange-900/20 border-orange-500/30 text-orange-200', important: 'bg-red-900/20 border-red-500/30 text-red-200', note: 'bg-gray-800/50 border-gray-600/30 text-gray-300' }; const icons = { info: , warning: , important: , note: }; return (
{icons[type]}
{title &&

{title}

}
{children}
); }; const H2 = ({ id, children }) => (

{children} #

); const H3 = ({ id, children }) => (

{children}

); // --- DOCUMENTATION PAGES --- const HomePage = ({ navigate }) => (
{/* Hero Section */}
Mixfolio Docs v1.0

Welcome to Mixfolio

Mixfolio is a Universal Asset Manager and Creative OS. It is a "Second Brain" for your creative work, unifying your images, videos, code, prompts, and docs into one powerful, 5-table Supabase engine.

{/* Quick Links */}
{/* Grid */}
{PAGE_ORDER.map(key => { const page = PAGES[key]; const Icon = page.icon; return (
navigate(key)} className="group p-6 rounded-xl bg-[#151515] border border-[#2a2a2a] hover:border-blue-500/50 hover:bg-[#1a1a1a] transition-all cursor-pointer hover:-translate-y-1 hover:shadow-[0_8px_30px_rgb(0,0,0,0.12)]" >

{page.title}

{page.excerpt}

); })}
); const GettingStarted = () => (

Welcome to the official setup guide for Mixfolio. This guide will walk you through setting up your local development environment, connecting to your Supabase instance, and preparing your "Creative OS."

Prerequisites

  • Node.js (v18.0.0 or higher)
  • npm, yarn, pnpm, or bun
  • A Supabase account (free tier is sufficient for initial launch)
  • Basic knowledge of React and Next.js/Vite

Step 1: Clone the Repository

Step 2: Set up Supabase Data

Mixfolio relies on a highly interconnected 5-table architecture. You need to create a project and set up the schema.

  1. Go to supabase.com and create a new project.
  2. Navigate to the SQL Editor and paste the contents of schema.sql.
  3. Ensure all Foreign Keys are mapped correctly with CASCADE for deletions and SET NULL for templates.
  4. Go to "Authentication" -> "Policies" and ensure Enable read access for all users is active on all 5 tables so the public can see your portfolio.

Step 3: The Storage Bucket (Crucial)

Your database only stores text links. The actual images need a physical warehouse.

  1. Go to the Storage tab (the folder icon) in Supabase.
  2. Click "New bucket" and name it exactly artwork (all lowercase).
  3. Crucial: Toggle the "Public bucket" switch to ON. If this is OFF, your images will be invisible to visitors.

Step 4: The Dummy Data (The Sandbox)

Before connecting a visual UI builder like Figma Make, you must have dummy data. If your tables are empty, the UI will crash trying to fetch foreign keys.
  1. In the templates table, insert one row: Name = "Standard", active_specs = ["Software", "Tools"].
  2. In the entities table, insert one row: Title = "Test Project", Slug = "test-project", template_id = 1.

Step 5: Configure Environment Variables

Step 6: Run the Development Server

); const AdvancedConcepts = () => (

Mixfolio is a "Portfolio on Steroids." It moves beyond a static gallery into an interactive, app-like experience designed to maximize engagement and monetize your assets instantly.

1. The Triple-State Logic (The Core Filter)

Every asset in Mixfolio is governed by three primary boolean flags. This transforms the platform from a simple website into a Universal Asset Manager:

  • is_managed (The Private State): The asset is in your personal library. It’s used for archiving, organizing, and work-in-progress. It acts as your private "Second Brain."
  • is_project (The Showcase State): The asset is visible in your public portfolio grid. It’s designed to build your brand and professional clout.
  • is_product (The Commercial State): The asset is listed in the Shop section. It automatically activates the paywall logic for linked files.

2. The Magic Switcher (Interaction)

Problem: Traditional portfolios force users to scroll through 5 separate images to see color variations of the same logo or design.

Solution: You show one main image. Below it, there is a row of clean, interactive circles (UI dots) representing different versions. Clicking a "Gold" circle instantly swaps the main image to the Gold version smoothly.

3. The Asset Vault (Micro-Transactions)

We don't put a paywall on the whole project; we put it on the specific files.

You can make the PNG free (for clout and sharing) but keep the SVG or Source File premium (for professional use). The system automatically checks the is_premium status of a file to decide whether to show a download icon or a checkout button.

4. The God-Mode Admin (Efficiency)

Goal: Upload a complex project with 10 colors and 30 file formats in under 2 minutes.

Solution: A template-based admin panel. Instead of manually typing out "Software," "Resolution," and "Time Spent" every time, you select a "Rulebook" template. The UI dynamically generates the exact input fields needed based on a JSONB configuration.

5. Advanced Features (Deep Dive)

  • Deep Linking Variation System: Each color version is its own "state." The URL changes when a user clicks a color circle (e.g., mixfolio.com/logo?color=gold). This allows you to send a link to a client that opens directly to the version you want them to see.
  • SEO-Friendly Slug System: Clean, readable URLs automatically generated from project titles using regex logic, avoiding messy database IDs.
); const SystemArchitecture = () => (

Mixfolio's architecture bridges the gap between complex relational databases and seamless frontend interactions.

1. Frontend Logic

  • Swappable Cover Concept: The site reads the variations table. It maps out the hex_color codes into clickable circles. Clicking one instantly replaces the main_image_url with that variation's preview_image_url without refreshing the page.
  • Contextual Sidebar: The site looks at the project's template_id. If it's a "Standard" template, it knows to only pull "Software" and "Resolution" from the specs_pool table, ignoring irrelevant data like "Video FPS."

2. Backend Logic

  • JSONB Trick: In the templates table, the active_specs column is a jsonb type (storing data like ["Software", "Tools"]). This allows the Admin Panel code to instantly read that list and generate dynamic input boxes on the fly without complex database joins.
  • Direct-to-Storage Uploading: The Admin Panel bypasses the database for heavy lifting. It sends the physical file (.jpg, .png) to the public artwork bucket, grabs the generated URL, and pastes that text link into the table.

3. The Database Wiring (The Glue & Cascade)

entities (Grandparent)
 ├─→ variations (Child) ------ [FK: entity_id → CASCADE]
 │     └─→ files_and_formats (Grandchild) -- [FK: variation_id → CASCADE]
 ├─→ specs_pool (Details) ---- [FK: entity_id → CASCADE]
 └─→ templates (Rulebook) ---- [FK: template_id → SET NULL]
CASCADE: We set deletion rules for variations, files, and specs to CASCADE. If you delete a core Project, the database automatically hunts down and deletes every color circle, download link, and technical spec associated with it. Zero ghost data.

SET NULL: We set the deletion rule for the Template connection to SET NULL. If you decide you don't like the "Icons" template anymore and delete it, you don't want your Project to be deleted too! The project stays alive but just loses its "Template" instructions.

4. Security & Permissions Logic

Read-Only Public Access: We wrote SELECT policies for all 5 tables targeting the public role. Your frontend website is allowed to read the data and draw the screen, but random visitors cannot overwrite your database.

); const DatabaseArchitecture = () => (

The Mixfolio database is built on a 5-table relational structure designed for maximum automation and clean data management. Here is the exact ELI5 breakdown of every table.

1. entities Table (The Grandparent)

The core record for every project or asset. The absolute heart of the project. If this doesn't exist, nothing else can exist.

Column Settings ELI5 Purpose
idint8, Primary, Identity ONThe "Social Security Number" for every project. Auto-counts 1, 2, 3.
titletext, Not NullProject name. A project without a name is just a ghost.
slugtext, Unique, Not NullThe URL-friendly name (e.g., my-cool-logo).
main_image_urltext, Not NullThe "Front Door" image link from your storage bucket.
is_managedbool, Default: falseVisible only to the owner (Private Archive).
is_projectbool, Default: falsePuts this on the Portfolio home page.
is_productbool, Default: falsePuts this in the Shop.
template_idint8, NullableLinks to rulebook (FK). Set Null on delete.

2. variations Table (The Children)

This is where you store the different versions of a project, like the Gold, Silver, or Sketch versions. It powers the Magic Switcher.

idint8, Primary, Identity ON
entity_idThe "Glue". Connects to entities.id. Action: CASCADE.
nametext (e.g., "Deep Space Blue")
hex_colortext, Nullable. The color code for your UI circles.
preview_image_urltext. The image that pops up when this variation is selected.

3. files_and_formats Table (The Vault)

The "Delivery Room". Stores the actual downloadable files. This enables your "Add to Cart" or "Download" checkbox logic.

variation_idThe "Glue". Connects to variations.id. Action: CASCADE.
file_urltext. Link to the file in your Supabase bucket.
format_typetext. Extension (e.g., "SVG", "PNG", "PDF").
is_premiumbool, Default: false. If true, shows a "Buy" button instead of "Download".

4. specs_pool Table (The Details)

Your technical "Backpack". Stores dry facts like "Software Used" or "Resolution".

entity_idThe "Glue". Connects to entities.id. Action: CASCADE.
labeltext. The "Question" (e.g., "Software").
valuetext. The "Answer" (e.g., "Figma").
is_hiddenbool, Default: false. Toggle to hide a stat without deleting it.

5. templates Table (The Rulebook)

Your "God-Mode" control center. Master instructions for your uploads.

nametext. Preset name (e.g., "For Fun", "Client Project").
active_specsjsonb. The "Swiss Army Knife" array: ["Software", "Resolution"].
default_layouttext, Nullable. Tells the website how to arrange images (e.g., "Grid").
); const UIUXSpecs = () => (

The visual language of Mixfolio draws heavy inspiration from top-tier creative tools like Midjourney, Framer, and Freepik. It is built as a Pro-Tool, not just a blog.

1. Masonry Intelligence

  • Aspect Ratio Intelligence: The grid does not crop images into boring squares. It reads the metadata and places assets in a dense, Pinterest-style layout based on their native ratio (1:1, 16:9, 9:16, 2:3, etc.).
  • Multi-Select Filter Chips: Located at the top, these pill-shaped toggles allow users to combine filters. For example, selecting "Motion" + "Free" will instantly filter the entities table for assets where type=video AND is_product=false.

2. The Detail Workspace

Clicking an asset opens a multi-pane overlay that functions like a workspace.

  • The Viewport: A large, central area for the asset against a deep #0f0f0f background.
  • The Dynamic Sidebar (The "Backpack"): The right 30% acts as the control panel. It fetches data from specs_pool. If it's an AI project, it shows the Prompt and Seed. If it's a coding project, it shows the Language and Framework.

3. Floating Toolbars & Inputs

  • Adaptive Actions: Contextual menus that float over the preview (e.g., "Use as Style," "Copy Prompt," "Download Source") with subtle glassmorphism (backdrop-blur) effects.
  • Color Visualization: The hex_color input in the Admin Panel isn't just a text box; it renders a visual Color Picker UI so you can see the exact shade.
  • Toggle Switches: is_project, is_product, and is_premium shouldn't be boring dropdowns—they need to be slick iOS-style toggle switches for fast, frictionless editing.

4. Global Navigation & Interactions

Inspired by Freepik's pro-tool layout, the navigation is a collapsible vertical bar on the far left. Users can "pin" their most-used categories. The entire UI relies on smooth spring animations for opening/closing panels.

); const WorkflowsLogic = () => (

Mixfolio utilizes a phased, systematic approach to data management to prevent "prompt bloat" and ensure the database stays perfectly clean.

1. The "God-Mode" Admin Workflow

Uploading a massive project with 3 colors and 2 files each generates 14 database rows instantly linked together safely. The workflow follows 4 steps:

  1. Select Template: Choose the rulebook (e.g., "UI Kit").
  2. Basic Info: Fill out Title, Description. Slug auto-generates. Upload the main cover.
  3. Variations & Files: Add the Hex Colors. Drag and drop source files (SVG, PNG). Flip the is_premium switches.
  4. Specs: Fill in the dynamically generated fields dictated by the Template's JSON array.

2. Direct-to-Storage Workflow

The Admin Panel doesn't save images directly into the PostgreSQL tables. It sends the physical file (.jpg, .png) to the public artwork Supabase bucket, grabs the public URL that Supabase generates, and pastes that text link into the entities or variations table.

3. Slugification

To ensure clean URLs for SEO (e.g. /logo-design-for-startup instead of messy database IDs), a robust slugify utility runs on the Title input automatically:

4. Data Management Patterns (Cascade)

By utilizing Foreign Keys with ON DELETE CASCADE, we automate housekeeping. If you decide a project is "old" and delete it from the Admin Panel, the system automatically hunts down and deletes all 10 color variations, all 30 download files, and all 5 tech specs linked to it.

); const ImplementationRoadmap = () => (

Building Mixfolio requires a strictly phased, modular approach. Giving an AI builder a giant "God-Prompt" will result in a buggy mess. This roadmap isolates the 5 different tables into 4 sprints.

Sprint 1: The Core Foundation (Projects & Storage)

  • The Goal: Build a page to create, edit, and delete entries in the entities table.
  • Key Tasks: Input fields for title, slug. A drag-and-drop box that sends files to the artwork bucket and saves the URL. Toggles for is_project and is_product.
  • Success Check: Can I upload a title and a cover image and see it appear in Supabase?

Sprint 2: The Variation Engine (Colors & Versions)

  • The Goal: Connect the variations table to each project.
  • Key Tasks: Use the entity_id to "glue" a variation to its parent. Add a Hex Color Picker and a secondary uploader for the preview image.
  • Success Check: Can I add a "Gold" version and a "Sketch" version to Project A?

Sprint 3: The Asset Delivery (Downloads & Formats)

  • The Goal: Connect the files_and_formats table to the variations.
  • Key Tasks: An interface to upload specific files and label them (SVG/PNG). A switch for is_premium (Buy vs Free). Links to variation_id.
  • Success Check: If I delete a Variation, do all its linked files disappear too (Cascade rule)?

Sprint 4: Technical Specs & Rules (The Finishing Touches)

  • The Goal: Link templates and specs_pool.
  • Key Tasks: A dropdown to choose the layout template. A way to add "Label: Software" and "Value: Figma" pairs linked by entity_id.
  • Success Check: Does the project show the correct technical specs based on the chosen template?
); const ProjectVision = () => (

"Most portfolios are dead ends. Most digital shops are clinical. Mixfolio is the bridge."

The Philosophy: A Creative Second Brain

Mixfolio was born from a simple frustration: Creative professionals have to split their identity across platforms. You put your pretty pictures on Behance. You put your source files on Gumroad. You write your case studies on Medium.

This fragmentation destroys context. Mixfolio is not just a custom portfolio or a shop. It is a Universal Asset Manager designed to house everything you ever created: Photos, Videos, GIFs, Motions, Code snippets, Texts, AI Prompts, and Docs.

A "Creative OS"

Mixfolio isn't a theme; it's an operating system for your creative assets.

  • Asset Centralization: Every logo, script, 3D model, and UI kit lives in one tightly linked PostgreSQL database.
  • Frictionless Distribution: When someone sees a beautiful 3D icon you rendered, that is the exact moment of highest intent. The distance between "Wow, that looks cool" and "I want the SVG" is exactly one click.
  • Professional Perception: The Magic Switcher, Floating Toolbars, and immersive dark-mode UI signal high value, allowing creators to charge premium rates for their assets.
); const PRD = () => (

Document Info

ProductMixfolio OS
StatusIn Development
Target LaunchQ3
LeadProduct Team

Product Overview

A self-hosted, headless CMS and frontend explicitly designed for digital creators to showcase multi-variant assets and monetize specific file formats seamlessly.

Target Users

  • The Asset Creator: 3D artists, UI designers, and illustrators with high-volume, multi-format outputs.
  • The Hybrid Engineer: Developers who create both visual templates and premium code snippets.

Success Metrics (KPIs)

Upload Time< 2 minutes for a complex 3-variant project via Admin.
Lighthouse Score90+ Performance (critical for visual heavy sites).
Conversion RateIncrease asset sales by 15% vs separate storefronts.

Technical Constraints

Must operate entirely within the Supabase Free Tier limits for initial deployment (500MB DB space, 1GB Storage). Asset optimization before upload to the artwork bucket is mandatory.
); // --- MAIN APPLICATION --- export default function App() { const [currentPage, setCurrentPage] = useState('home'); const [isSidebarOpen, setIsSidebarOpen] = useState(false); const [isSearchOpen, setIsSearchOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const searchInputRef = useRef(null); // Scroll to top on page change useEffect(() => { window.scrollTo(0, 0); setIsSidebarOpen(false); }, [currentPage]); // Handle Cmd+K useEffect(() => { const handleKeyDown = (e) => { if ((e.metaKey || e.ctrlKey) && e.key === 'k') { e.preventDefault(); setIsSearchOpen(true); } if (e.key === 'Escape' && isSearchOpen) { setIsSearchOpen(false); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [isSearchOpen]); // Focus search input when modal opens useEffect(() => { if (isSearchOpen && searchInputRef.current) { setTimeout(() => searchInputRef.current.focus(), 100); } }, [isSearchOpen]); const navigate = (pageId) => { setCurrentPage(pageId); setIsSearchOpen(false); }; // Extract headings for TOC dynamically based on the component being rendered const generateTOC = (pageId) => { const tocMap = { 'getting-started': [ { id: 'prerequisites', text: 'Prerequisites' }, { id: 'step-1-clone', text: 'Step 1: Clone' }, { id: 'step-2-supabase', text: 'Step 2: Supabase Schema' }, { id: 'step-3-storage', text: 'Step 3: Storage Bucket' }, { id: 'step-4-dummy', text: 'Step 4: Dummy Data' }, { id: 'step-5-env', text: 'Step 5: Env Vars' }, { id: 'step-6-run', text: 'Step 6: Run' }, ], 'advanced': [ { id: 'triple-state', text: 'Triple-State Logic' }, { id: 'magic-switcher', text: 'The Magic Switcher' }, { id: 'asset-vault', text: 'The Asset Vault' }, { id: 'god-mode-admin', text: 'The God-Mode Admin' }, { id: 'deep-dive', text: 'Advanced Features' }, ], 'system-architecture': [ { id: 'frontend-logic', text: 'Frontend Logic' }, { id: 'backend-logic', text: 'Backend Logic' }, { id: 'cascade', text: 'Database Wiring & Cascade' }, { id: 'security', text: 'Security Logic' }, ], 'database-architecture': [ { id: 'entities', text: 'entities Table' }, { id: 'variations', text: 'variations Table' }, { id: 'files', text: 'files_and_formats Table' }, { id: 'specs', text: 'specs_pool Table' }, { id: 'templates', text: 'templates Table' }, ], 'ui-ux-specifications': [ { id: 'masonry', text: 'Masonry Intelligence' }, { id: 'workspace', text: 'Detail Workspace' }, { id: 'toolbars', text: 'Floating Toolbars' }, { id: 'accessibility', text: 'Global Nav & Interactions' }, ], 'workflows': [ { id: 'admin-workflow', text: 'Admin Workflow' }, { id: 'storage-workflow', text: 'Storage Workflow' }, { id: 'slugification', text: 'Slugification' }, { id: 'cascade', text: 'Cascade Patterns' }, ], 'implementation-roadmap': [ { id: 'phase-1', text: 'Sprint 1: Projects & Storage' }, { id: 'phase-2', text: 'Sprint 2: Variation Engine' }, { id: 'phase-3', text: 'Sprint 3: Asset Delivery' }, { id: 'phase-4', text: 'Sprint 4: Tech Specs' }, ], 'project-vision': [ { id: 'philosophy', text: 'The Philosophy' }, { id: 'creative-os', text: 'A "Creative OS"' }, ], 'prd': [ { id: 'overview', text: 'Overview' }, { id: 'personas', text: 'Target Users' }, { id: 'metrics', text: 'Success Metrics' }, { id: 'constraints', text: 'Constraints' }, ] }; return tocMap[pageId] || []; }; const getPageNav = () => { const currentIndex = PAGE_ORDER.indexOf(currentPage); if (currentIndex === -1) return { prev: null, next: null }; return { prev: currentIndex > 0 ? PAGES[PAGE_ORDER[currentIndex - 1]] : null, next: currentIndex < PAGE_ORDER.length - 1 ? PAGES[PAGE_ORDER[currentIndex + 1]] : null }; }; const searchResults = searchQuery.trim() === '' ? [] : Object.values(PAGES).filter(p => p.id !== 'home' && (p.title.toLowerCase().includes(searchQuery.toLowerCase()) || p.excerpt.toLowerCase().includes(searchQuery.toLowerCase())) ); const renderContent = () => { switch (currentPage) { case 'home': return ; case 'getting-started': return ; case 'advanced': return ; case 'project-vision': return ; case 'system-architecture': return ; case 'database-architecture': return ; case 'ui-ux-specifications': return ; case 'workflows': return ; case 'implementation-roadmap': return ; case 'prd': return ; default: return ; } }; return (
{/* Header */}
{/* Main Layout */}
{/* Left Sidebar */} {/* Mobile Sidebar Overlay */} {isSidebarOpen && (
setIsSidebarOpen(false)} /> )} {/* Main Content Area */}
{currentPage !== 'home' && ( <> {/* Breadcrumbs */}
navigate('home')}>Docs {PAGES[currentPage].group} {PAGES[currentPage].title}

{PAGES[currentPage].title}

{PAGES[currentPage].excerpt}

)}
{renderContent()}
{/* Pagination / Prev Next */} {currentPage !== 'home' && (
{getPageNav().prev ? ( ) :
} {getPageNav().next ? ( ) :
}
)} {/* Footer */}
{/* Right Sidebar (Table of Contents) */} {currentPage !== 'home' && generateTOC(currentPage).length > 0 && ( )}
{/* Search Modal */} {isSearchOpen && (
setIsSearchOpen(false)} >
setSearchQuery(e.target.value)} />
{searchQuery.trim() === '' ? (

Start typing to search across all documentation.

) : searchResults.length > 0 ? (
{searchResults.map((page) => (
navigate(page.id)} className="p-3 rounded-lg hover:bg-blue-500/10 cursor-pointer group flex items-center" >
{page.title}
{page.excerpt}
))}
) : (
No results found for "{searchQuery}".
)}
)}
); }