@float.js/core 2.0.7 β†’ 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js","../../src/devtools/index.ts","../../src/cli/index.ts","../../src/server/dev-server.ts","../../src/router/index.ts","../../src/server/ssr.ts","../../src/build/transform.ts","../../src/client/float-indicator.ts","../../src/client/error-overlay.ts","../../src/client/welcome-page.ts","../../src/client/docs-pages.ts","../../src/build/index.ts","../../src/server/prod-server.ts","../../src/version.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Float.js Dev Dashboard\n * Visual development tools integrated into the framework\n * \n * Next.js doesn't have this! πŸš€\n */\n\nimport { IncomingMessage, ServerResponse } from 'http';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface RouteInfo {\n path: string;\n type: 'page' | 'api' | 'layout' | 'error' | 'loading' | 'not-found';\n file: string;\n methods?: string[];\n params?: string[];\n middleware?: boolean;\n}\n\nexport interface BuildInfo {\n duration: number;\n timestamp: Date;\n success: boolean;\n errors?: string[];\n warnings?: string[];\n}\n\nexport interface RequestLog {\n id: string;\n method: string;\n path: string;\n status: number;\n duration: number;\n timestamp: Date;\n headers?: Record<string, string>;\n body?: unknown;\n response?: unknown;\n}\n\nexport interface PerformanceMetrics {\n requests: number;\n avgResponseTime: number;\n errorRate: number;\n activeConnections: number;\n memoryUsage: NodeJS.MemoryUsage;\n uptime: number;\n}\n\nexport interface DevDashboardOptions {\n enabled?: boolean;\n path?: string;\n maxLogs?: number;\n auth?: {\n username: string;\n password: string;\n };\n}\n\n// ============================================================================\n// DEV DASHBOARD STATE\n// ============================================================================\n\nclass DevDashboardState {\n routes: RouteInfo[] = [];\n builds: BuildInfo[] = [];\n requestLogs: RequestLog[] = [];\n startTime: Date = new Date();\n maxLogs: number = 100;\n \n private requestCount = 0;\n private totalResponseTime = 0;\n private errorCount = 0;\n\n addRoute(route: RouteInfo): void {\n const existing = this.routes.findIndex(r => r.path === route.path);\n if (existing >= 0) {\n this.routes[existing] = route;\n } else {\n this.routes.push(route);\n }\n }\n\n addBuild(build: BuildInfo): void {\n this.builds.unshift(build);\n if (this.builds.length > 20) {\n this.builds.pop();\n }\n }\n\n logRequest(log: RequestLog): void {\n this.requestLogs.unshift(log);\n if (this.requestLogs.length > this.maxLogs) {\n this.requestLogs.pop();\n }\n \n this.requestCount++;\n this.totalResponseTime += log.duration;\n if (log.status >= 400) {\n this.errorCount++;\n }\n }\n\n getMetrics(): PerformanceMetrics {\n return {\n requests: this.requestCount,\n avgResponseTime: this.requestCount > 0 \n ? Math.round(this.totalResponseTime / this.requestCount) \n : 0,\n errorRate: this.requestCount > 0 \n ? Math.round((this.errorCount / this.requestCount) * 100) \n : 0,\n activeConnections: 0, // Updated by server\n memoryUsage: process.memoryUsage(),\n uptime: Date.now() - this.startTime.getTime(),\n };\n }\n\n clear(): void {\n this.requestLogs = [];\n this.requestCount = 0;\n this.totalResponseTime = 0;\n this.errorCount = 0;\n }\n}\n\nexport const dashboardState = new DevDashboardState();\n\n// ============================================================================\n// MIDDLEWARE\n// ============================================================================\n\nexport function createRequestLogger() {\n return (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const startTime = Date.now();\n const id = `req_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`;\n\n // Capture response\n const originalEnd = res.end.bind(res);\n res.end = function(chunk?: any, encoding?: any, callback?: any) {\n const duration = Date.now() - startTime;\n \n dashboardState.logRequest({\n id,\n method: req.method || 'GET',\n path: req.url || '/',\n status: res.statusCode,\n duration,\n timestamp: new Date(),\n });\n\n return originalEnd(chunk, encoding, callback);\n } as typeof res.end;\n\n next();\n };\n}\n\n// ============================================================================\n// DASHBOARD HTML\n// ============================================================================\n\nfunction generateDashboardHTML(state: DevDashboardState): string {\n const metrics = state.getMetrics();\n const memoryMB = Math.round(metrics.memoryUsage.heapUsed / 1024 / 1024);\n const memoryTotal = Math.round(metrics.memoryUsage.heapTotal / 1024 / 1024);\n const uptimeSeconds = Math.round(metrics.uptime / 1000);\n const uptimeFormatted = uptimeSeconds < 60 \n ? `${uptimeSeconds}s` \n : uptimeSeconds < 3600 \n ? `${Math.floor(uptimeSeconds / 60)}m ${uptimeSeconds % 60}s`\n : `${Math.floor(uptimeSeconds / 3600)}h ${Math.floor((uptimeSeconds % 3600) / 60)}m`;\n \n const lastBuild = state.builds.length > 0 ? state.builds[0] : null;\n const lastBuildTime = lastBuild \n ? new Date(lastBuild.timestamp).toLocaleTimeString() \n : 'Never';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Float.js Dev Dashboard</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n \n :root {\n --bg-dark: #09090b;\n --bg-card: #18181b;\n --bg-card-hover: #1f1f23;\n --bg-sidebar: #0f0f12;\n --text-primary: #fafafa;\n --text-secondary: #71717a;\n --text-muted: #52525b;\n --accent: #a855f7;\n --accent-glow: rgba(168, 85, 247, 0.15);\n --success: #22c55e;\n --warning: #f59e0b;\n --error: #ef4444;\n --border: #27272a;\n --border-subtle: #1f1f23;\n }\n\n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n background: var(--bg-dark);\n color: var(--text-primary);\n min-height: 100vh;\n display: flex;\n }\n\n /* Sidebar */\n .sidebar {\n width: 280px;\n background: var(--bg-sidebar);\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n position: fixed;\n height: 100vh;\n z-index: 100;\n }\n\n .sidebar-header {\n padding: 1.5rem;\n border-bottom: 1px solid var(--border);\n }\n\n .logo {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .logo-icon {\n width: 40px;\n height: 40px;\n background: linear-gradient(135deg, #a855f7 0%, #ec4899 50%, #f97316 100%);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n font-size: 1.25rem;\n box-shadow: 0 0 20px rgba(168, 85, 247, 0.3);\n }\n\n .logo-text {\n display: flex;\n flex-direction: column;\n }\n\n .logo-title {\n font-weight: 700;\n font-size: 1.125rem;\n background: linear-gradient(135deg, #fff 0%, #a1a1aa 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n .logo-version {\n font-size: 0.75rem;\n color: var(--text-muted);\n font-family: 'JetBrains Mono', monospace;\n }\n\n /* Status Cards */\n .status-section {\n padding: 1.5rem;\n border-bottom: 1px solid var(--border);\n }\n\n .status-grid {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .status-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n background: var(--bg-card);\n border-radius: 10px;\n border: 1px solid var(--border-subtle);\n }\n\n .status-label {\n font-size: 0.8rem;\n color: var(--text-secondary);\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .status-value {\n font-size: 0.875rem;\n font-weight: 600;\n font-family: 'JetBrains Mono', monospace;\n }\n\n .status-value.connected {\n color: var(--success);\n }\n\n .status-value.active {\n color: var(--accent);\n }\n\n .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n animation: pulse 2s infinite;\n }\n\n .status-dot.green { background: var(--success); box-shadow: 0 0 8px var(--success); }\n .status-dot.purple { background: var(--accent); box-shadow: 0 0 8px var(--accent); }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.7; transform: scale(0.95); }\n }\n\n /* Navigation */\n .nav-section {\n padding: 1rem;\n flex: 1;\n }\n\n .nav-label {\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--text-muted);\n padding: 0.5rem 1rem;\n margin-bottom: 0.5rem;\n }\n\n .nav-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n border-radius: 10px;\n color: var(--text-secondary);\n text-decoration: none;\n font-size: 0.875rem;\n font-weight: 500;\n transition: all 0.2s;\n cursor: pointer;\n margin-bottom: 0.25rem;\n }\n\n .nav-item:hover {\n background: var(--bg-card);\n color: var(--text-primary);\n }\n\n .nav-item.active {\n background: var(--accent-glow);\n color: var(--accent);\n border: 1px solid rgba(168, 85, 247, 0.2);\n }\n\n .nav-icon {\n font-size: 1.1rem;\n }\n\n .nav-badge {\n margin-left: auto;\n background: var(--bg-card);\n padding: 0.125rem 0.5rem;\n border-radius: 6px;\n font-size: 0.7rem;\n font-family: 'JetBrains Mono', monospace;\n color: var(--text-muted);\n }\n\n /* Sidebar Footer */\n .sidebar-footer {\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--border);\n }\n\n .docs-link {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem;\n background: linear-gradient(135deg, rgba(168, 85, 247, 0.1), rgba(236, 72, 153, 0.1));\n border: 1px solid rgba(168, 85, 247, 0.2);\n border-radius: 10px;\n color: var(--accent);\n text-decoration: none;\n font-size: 0.875rem;\n font-weight: 500;\n transition: all 0.2s;\n }\n\n .docs-link:hover {\n background: linear-gradient(135deg, rgba(168, 85, 247, 0.2), rgba(236, 72, 153, 0.2));\n transform: translateY(-1px);\n }\n\n /* Main Content */\n .main {\n margin-left: 280px;\n flex: 1;\n padding: 2rem;\n min-height: 100vh;\n }\n\n .page-header {\n margin-bottom: 2rem;\n }\n\n .page-title {\n font-size: 1.75rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n }\n\n .page-subtitle {\n color: var(--text-secondary);\n font-size: 0.9rem;\n }\n\n /* Metrics Grid */\n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 1rem;\n margin-bottom: 2rem;\n }\n\n .metric-card {\n background: var(--bg-card);\n border: 1px solid var(--border-subtle);\n border-radius: 16px;\n padding: 1.5rem;\n transition: all 0.3s;\n position: relative;\n overflow: hidden;\n }\n\n .metric-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 2px;\n background: linear-gradient(90deg, var(--accent), #ec4899);\n opacity: 0;\n transition: opacity 0.3s;\n }\n\n .metric-card:hover {\n border-color: var(--accent);\n transform: translateY(-2px);\n box-shadow: 0 8px 32px rgba(168, 85, 247, 0.1);\n }\n\n .metric-card:hover::before {\n opacity: 1;\n }\n\n .metric-icon {\n font-size: 1.5rem;\n margin-bottom: 1rem;\n }\n\n .metric-value {\n font-size: 2rem;\n font-weight: 700;\n font-family: 'JetBrains Mono', monospace;\n margin-bottom: 0.25rem;\n }\n\n .metric-label {\n font-size: 0.8rem;\n color: var(--text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .metric-change {\n position: absolute;\n top: 1rem;\n right: 1rem;\n font-size: 0.75rem;\n padding: 0.25rem 0.5rem;\n border-radius: 6px;\n font-weight: 500;\n }\n\n .metric-change.up { background: rgba(34, 197, 94, 0.1); color: var(--success); }\n .metric-change.down { background: rgba(239, 68, 68, 0.1); color: var(--error); }\n\n /* Sections */\n .content-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n }\n\n .section {\n background: var(--bg-card);\n border: 1px solid var(--border-subtle);\n border-radius: 16px;\n overflow: hidden;\n }\n\n .section.full-width {\n grid-column: 1 / -1;\n }\n\n .section-header {\n padding: 1.25rem 1.5rem;\n border-bottom: 1px solid var(--border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .section-title {\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .section-badge {\n background: var(--bg-dark);\n padding: 0.25rem 0.75rem;\n border-radius: 8px;\n font-size: 0.75rem;\n color: var(--text-muted);\n font-family: 'JetBrains Mono', monospace;\n }\n\n .section-content {\n max-height: 400px;\n overflow-y: auto;\n }\n\n /* Routes List */\n .route-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid var(--border-subtle);\n transition: background 0.2s;\n }\n\n .route-item:last-child {\n border-bottom: none;\n }\n\n .route-item:hover {\n background: var(--bg-card-hover);\n }\n\n .route-type {\n padding: 0.25rem 0.75rem;\n border-radius: 6px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n min-width: 60px;\n text-align: center;\n }\n\n .route-type.page { background: rgba(59, 130, 246, 0.15); color: #60a5fa; }\n .route-type.api { background: rgba(34, 197, 94, 0.15); color: #4ade80; }\n .route-type.layout { background: rgba(168, 85, 247, 0.15); color: #c084fc; }\n\n .route-path {\n font-family: 'JetBrains Mono', monospace;\n font-size: 0.875rem;\n flex: 1;\n }\n\n .route-file {\n color: var(--text-muted);\n font-size: 0.75rem;\n font-family: 'JetBrains Mono', monospace;\n }\n\n /* Request Logs */\n .log-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0.875rem 1.5rem;\n border-bottom: 1px solid var(--border-subtle);\n font-size: 0.875rem;\n transition: background 0.2s;\n }\n\n .log-item:hover {\n background: var(--bg-card-hover);\n }\n\n .log-method {\n font-weight: 600;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.7rem;\n min-width: 50px;\n text-align: center;\n font-family: 'JetBrains Mono', monospace;\n }\n\n .log-method.GET { background: rgba(59, 130, 246, 0.15); color: #60a5fa; }\n .log-method.POST { background: rgba(34, 197, 94, 0.15); color: #4ade80; }\n .log-method.PUT { background: rgba(245, 158, 11, 0.15); color: #fbbf24; }\n .log-method.DELETE { background: rgba(239, 68, 68, 0.15); color: #f87171; }\n\n .log-status {\n font-weight: 600;\n font-family: 'JetBrains Mono', monospace;\n font-size: 0.8rem;\n }\n\n .log-status.s2xx { color: var(--success); }\n .log-status.s3xx { color: #60a5fa; }\n .log-status.s4xx { color: var(--warning); }\n .log-status.s5xx { color: var(--error); }\n\n .log-path {\n font-family: 'JetBrains Mono', monospace;\n flex: 1;\n color: var(--text-secondary);\n }\n\n .log-duration {\n font-family: 'JetBrains Mono', monospace;\n color: var(--text-muted);\n font-size: 0.8rem;\n }\n\n .log-time {\n color: var(--text-muted);\n font-size: 0.75rem;\n }\n\n /* Empty State */\n .empty-state {\n text-align: center;\n padding: 3rem;\n color: var(--text-muted);\n }\n\n .empty-icon {\n font-size: 2.5rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n /* Scrollbar */\n ::-webkit-scrollbar { width: 6px; }\n ::-webkit-scrollbar-track { background: transparent; }\n ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }\n ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }\n\n /* Responsive */\n @media (max-width: 1200px) {\n .metrics-grid { grid-template-columns: repeat(2, 1fr); }\n .content-grid { grid-template-columns: 1fr; }\n }\n </style>\n</head>\n<body>\n <!-- Sidebar -->\n <aside class=\"sidebar\">\n <div class=\"sidebar-header\">\n <div class=\"logo\">\n <div class=\"logo-icon\">⚑</div>\n <div class=\"logo-text\">\n <span class=\"logo-title\">Float.js</span>\n <span class=\"logo-version\">v2.0.4</span>\n </div>\n </div>\n </div>\n\n <div class=\"status-section\">\n <div class=\"status-grid\">\n <div class=\"status-item\">\n <span class=\"status-label\">\n <span class=\"status-dot green\"></span>\n Estado\n </span>\n <span class=\"status-value connected\">Conectado</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">\n <span class=\"status-dot purple\"></span>\n HMR\n </span>\n <span class=\"status-value active\">Activo</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Último build</span>\n <span class=\"status-value\">${lastBuildTime}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Uptime</span>\n <span class=\"status-value\">${uptimeFormatted}</span>\n </div>\n </div>\n </div>\n\n <nav class=\"nav-section\">\n <div class=\"nav-label\">Dashboard</div>\n <div class=\"nav-item active\">\n <span class=\"nav-icon\">πŸ“Š</span>\n Overview\n </div>\n <div class=\"nav-item\">\n <span class=\"nav-icon\">πŸ›€οΈ</span>\n Routes\n <span class=\"nav-badge\">${state.routes.length}</span>\n </div>\n <div class=\"nav-item\">\n <span class=\"nav-icon\">πŸ“</span>\n Logs\n <span class=\"nav-badge\">${state.requestLogs.length}</span>\n </div>\n <div class=\"nav-item\">\n <span class=\"nav-icon\">βš™οΈ</span>\n Settings\n </div>\n </nav>\n\n <div class=\"sidebar-footer\">\n <a href=\"https://floatjs.dev/docs\" target=\"_blank\" class=\"docs-link\">\n <span>πŸ“š</span>\n Documentation\n </a>\n </div>\n </aside>\n\n <!-- Main Content -->\n <main class=\"main\">\n <div class=\"page-header\">\n <h1 class=\"page-title\">Dev Dashboard</h1>\n <p class=\"page-subtitle\">Monitor your Float.js application in real-time</p>\n </div>\n\n <!-- Metrics -->\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-icon\">πŸ“‘</div>\n <div class=\"metric-value\">${metrics.requests}</div>\n <div class=\"metric-label\">Total Requests</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">⚑</div>\n <div class=\"metric-value\">${metrics.avgResponseTime}ms</div>\n <div class=\"metric-label\">Avg Response</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">πŸ’Ύ</div>\n <div class=\"metric-value\">${memoryMB}/${memoryTotal}</div>\n <div class=\"metric-label\">Memory (MB)</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">${metrics.errorRate > 0 ? '⚠️' : 'βœ…'}</div>\n <div class=\"metric-value\">${metrics.errorRate}%</div>\n <div class=\"metric-label\">Error Rate</div>\n </div>\n </div>\n\n <!-- Content Grid -->\n <div class=\"content-grid\">\n <!-- Routes -->\n <div class=\"section\">\n <div class=\"section-header\">\n <span class=\"section-title\">πŸ›€οΈ Routes</span>\n <span class=\"section-badge\">${state.routes.length} registered</span>\n </div>\n <div class=\"section-content\">\n ${state.routes.length === 0 ? `\n <div class=\"empty-state\">\n <div class=\"empty-icon\">πŸ›€οΈ</div>\n <p>No routes registered</p>\n </div>\n ` : state.routes.map(route => `\n <div class=\"route-item\">\n <span class=\"route-type ${route.type}\">${route.type}</span>\n <span class=\"route-path\">${route.path}</span>\n <span class=\"route-file\">${route.file.split('/').pop()}</span>\n </div>\n `).join('')}\n </div>\n </div>\n\n <!-- Request Logs -->\n <div class=\"section\">\n <div class=\"section-header\">\n <span class=\"section-title\">πŸ“ Request Logs</span>\n <span class=\"section-badge\">Live</span>\n </div>\n <div class=\"section-content\">\n ${state.requestLogs.length === 0 ? `\n <div class=\"empty-state\">\n <div class=\"empty-icon\">πŸ“</div>\n <p>No requests yet</p>\n </div>\n ` : state.requestLogs.slice(0, 20).map(log => {\n const statusClass = log.status < 300 ? 's2xx' : log.status < 400 ? 's3xx' : log.status < 500 ? 's4xx' : 's5xx';\n return `\n <div class=\"log-item\">\n <span class=\"log-method ${log.method}\">${log.method}</span>\n <span class=\"log-status ${statusClass}\">${log.status}</span>\n <span class=\"log-path\">${log.path}</span>\n <span class=\"log-duration\">${log.duration}ms</span>\n </div>\n `;\n }).join('')}\n </div>\n </div>\n </div>\n </main>\n\n <script>\n // Auto-refresh every 3 seconds\n setTimeout(() => location.reload(), 3000);\n </script>\n</body>\n</html>`;\n}\n\n// ============================================================================\n// DASHBOARD API\n// ============================================================================\n\nfunction generateAPIResponse(state: DevDashboardState): string {\n return JSON.stringify({\n metrics: state.getMetrics(),\n routes: state.routes,\n builds: state.builds.slice(0, 10),\n requestLogs: state.requestLogs.slice(0, 50),\n });\n}\n\n// ============================================================================\n// DASHBOARD HANDLER\n// ============================================================================\n\nexport function createDevDashboard(options: DevDashboardOptions = {}) {\n const {\n enabled = process.env.NODE_ENV !== 'production',\n path = '/__float',\n auth,\n } = options;\n\n if (!enabled) {\n return (_req: IncomingMessage, _res: ServerResponse, next: () => void) => next();\n }\n\n return (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const url = req.url || '';\n \n // Check if this is a dashboard request\n if (!url.startsWith(path)) {\n return next();\n }\n\n // Basic auth if configured\n if (auth) {\n const authHeader = req.headers.authorization;\n if (!authHeader || !authHeader.startsWith('Basic ')) {\n res.setHeader('WWW-Authenticate', 'Basic realm=\"Float.js Dev Dashboard\"');\n res.statusCode = 401;\n res.end('Unauthorized');\n return;\n }\n\n const credentials = Buffer.from(authHeader.slice(6), 'base64').toString();\n const [username, password] = credentials.split(':');\n \n if (username !== auth.username || password !== auth.password) {\n res.statusCode = 401;\n res.end('Invalid credentials');\n return;\n }\n }\n\n // Route dashboard requests\n const subPath = url.slice(path.length);\n\n if (subPath === '' || subPath === '/') {\n // Main dashboard\n res.setHeader('Content-Type', 'text/html');\n res.end(generateDashboardHTML(dashboardState));\n return;\n }\n\n if (subPath === '/api' || subPath === '/api/') {\n // API endpoint\n res.setHeader('Content-Type', 'application/json');\n res.end(generateAPIResponse(dashboardState));\n return;\n }\n\n if (subPath === '/api/routes') {\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(dashboardState.routes));\n return;\n }\n\n if (subPath === '/api/metrics') {\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(dashboardState.getMetrics()));\n return;\n }\n\n if (subPath === '/api/logs') {\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(dashboardState.requestLogs.slice(0, 100)));\n return;\n }\n\n if (subPath === '/api/clear' && req.method === 'POST') {\n dashboardState.clear();\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ success: true }));\n return;\n }\n\n // 404 for unknown dashboard routes\n res.statusCode = 404;\n res.end('Not found');\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport const devtools = {\n dashboard: createDevDashboard,\n logger: createRequestLogger,\n state: dashboardState,\n \n // Helpers for manual logging\n logRoute: (route: RouteInfo) => dashboardState.addRoute(route),\n logBuild: (build: BuildInfo) => dashboardState.addBuild(build),\n logRequest: (log: RequestLog) => dashboardState.logRequest(log),\n getMetrics: () => dashboardState.getMetrics(),\n clear: () => dashboardState.clear(),\n};\n","/**\n * Float.js CLI\n * Ultra Modern Web Framework\n */\n\nimport { cac } from 'cac';\nimport pc from 'picocolors';\nimport { createDevServer } from '../server/dev-server.js';\nimport { build } from '../build/index.js';\nimport { startProductionServer } from '../server/prod-server.js';\nimport { VERSION } from '../version.js';\n\nconst cli = cac('float');\n\n// ASCII Art Banner\nconst banner = `\n${pc.cyan('╔═══════════════════════════════════════╗')}\n${pc.cyan('β•‘')} ${pc.bold(pc.magenta('⚑ Float.js'))} ${pc.dim(`v${VERSION}`)} ${pc.cyan('β•‘')}\n${pc.cyan('β•‘')} ${pc.dim('Ultra Modern Web Framework')} ${pc.cyan('β•‘')}\n${pc.cyan('β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•')}\n`;\n\n// float dev - Development server\ncli\n .command('dev', 'Start development server')\n .option('-p, --port <port>', 'Port to listen on', { default: 3000 })\n .option('-h, --host <host>', 'Host to bind to', { default: 'localhost' })\n .option('--open', 'Open browser on start', { default: false })\n .action(async (options) => {\n console.log(banner);\n console.log(pc.cyan('πŸš€ Starting development server...\\n'));\n \n try {\n const server = await createDevServer({\n port: Number(options.port),\n host: options.host,\n open: options.open,\n });\n \n await server.start();\n } catch (error) {\n console.error(pc.red('❌ Failed to start dev server:'), error);\n process.exit(1);\n }\n });\n\n// float build - Build for production\ncli\n .command('build', 'Build for production')\n .option('--analyze', 'Analyze bundle size', { default: false })\n .action(async (options) => {\n console.log(banner);\n console.log(pc.cyan('πŸ“¦ Building for production...\\n'));\n \n try {\n const startTime = Date.now();\n await build({ analyze: options.analyze });\n const duration = Date.now() - startTime;\n \n console.log(pc.green(`\\nβœ… Build completed in ${duration}ms`));\n } catch (error) {\n console.error(pc.red('❌ Build failed:'), error);\n process.exit(1);\n }\n });\n\n// float start - Production server\ncli\n .command('start', 'Start production server')\n .option('-p, --port <port>', 'Port to listen on', { default: 3000 })\n .option('-h, --host <host>', 'Host to bind to', { default: '0.0.0.0' })\n .action(async (options) => {\n console.log(banner);\n console.log(pc.cyan('🌐 Starting production server...\\n'));\n \n try {\n await startProductionServer({\n port: Number(options.port),\n host: options.host,\n });\n } catch (error) {\n console.error(pc.red('❌ Failed to start server:'), error);\n process.exit(1);\n }\n });\n\n// float info - Show environment info\ncli\n .command('info', 'Show environment information')\n .action(() => {\n console.log(banner);\n console.log(pc.bold('Environment Info:\\n'));\n console.log(` ${pc.dim('Float.js:')} v${VERSION}`);\n console.log(` ${pc.dim('Node.js:')} ${process.version}`);\n console.log(` ${pc.dim('Platform:')} ${process.platform}`);\n console.log(` ${pc.dim('Arch:')} ${process.arch}`);\n console.log(` ${pc.dim('CWD:')} ${process.cwd()}`);\n });\n\ncli.help();\ncli.version(VERSION);\n\ncli.parse();\n","/**\n * Float.js Development Server\n * Fast development experience with HMR\n */\n\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport chokidar from 'chokidar';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport mime from 'mime-types';\nimport { scanRoutes, matchRoute, type Route } from '../router/index.js';\nimport { renderPage } from './ssr.js';\nimport { transformFile } from '../build/transform.js';\nimport { FLOAT_INDICATOR_SCRIPT } from '../client/float-indicator.js';\nimport { FLOAT_ERROR_OVERLAY } from '../client/error-overlay.js';\nimport { generateWelcomePage } from '../client/welcome-page.js';\nimport { generateDocsPage, generateLearnPage, generateExamplesPage } from '../client/docs-pages.js';\n\nexport interface DevServerOptions {\n port: number;\n host: string;\n open?: boolean;\n}\n\nexport interface DevServer {\n start: () => Promise<void>;\n stop: () => Promise<void>;\n restart: () => Promise<void>;\n}\n\nexport async function createDevServer(options: DevServerOptions): Promise<DevServer> {\n const { port, host, open } = options;\n const rootDir = process.cwd();\n const publicDir = path.join(rootDir, 'public');\n \n let routes: Route[] = [];\n let server: http.Server | null = null;\n let wss: WebSocketServer | null = null;\n const clients = new Set<WebSocket>();\n\n // Scan routes on startup\n async function refreshRoutes() {\n try {\n routes = await scanRoutes(rootDir);\n console.log(pc.dim(` πŸ“ Found ${routes.length} routes`));\n } catch (error) {\n console.error(pc.red('Failed to scan routes:'), error);\n }\n }\n\n // Notify all clients to reload\n function notifyClients(type: 'reload' | 'update' | 'error' | 'clear-errors' | 'building', data?: any) {\n const message = JSON.stringify({ type, data, error: data?.error, timestamp: Date.now() });\n clients.forEach(client => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(message);\n }\n });\n }\n\n // HMR client script injected into HTML\n const hmrClientScript = `\n<script>\n(function() {\n const ws = new WebSocket('ws://${host}:${port + 1}');\n \n ws.onmessage = function(event) {\n const data = JSON.parse(event.data);\n \n // Update Float indicator if available\n if (window.__FLOAT_UPDATE_STATUS) {\n window.__FLOAT_UPDATE_STATUS(data);\n }\n \n if (data.type === 'reload') {\n console.log('[Float HMR] Reloading...');\n window.location.reload();\n }\n if (data.type === 'update') {\n console.log('[Float HMR] Update received:', data.data);\n }\n if (data.type === 'error' && window.__FLOAT_SHOW_ERROR) {\n window.__FLOAT_SHOW_ERROR(data.error);\n }\n if (data.type === 'clear-errors' && window.__FLOAT_CLEAR_ERRORS) {\n window.__FLOAT_CLEAR_ERRORS();\n }\n };\n \n ws.onopen = function() {\n console.log('[Float HMR] Connected');\n if (window.__FLOAT_SET_CONNECTED) {\n window.__FLOAT_SET_CONNECTED(true);\n }\n };\n \n ws.onclose = function() {\n console.log('[Float HMR] Disconnected. Attempting reconnect...');\n if (window.__FLOAT_SET_CONNECTED) {\n window.__FLOAT_SET_CONNECTED(false);\n }\n setTimeout(() => window.location.reload(), 1000);\n };\n})();\n</script>\n${FLOAT_INDICATOR_SCRIPT}\n${FLOAT_ERROR_OVERLAY}\n`;\n\n // Request handler\n async function handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ) {\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const pathname = url.pathname;\n\n console.log(pc.dim(` ${req.method} ${pathname}`));\n\n try {\n // Serve static files from public/\n const publicFilePath = path.join(publicDir, pathname);\n if (fs.existsSync(publicFilePath) && fs.statSync(publicFilePath).isFile()) {\n const content = fs.readFileSync(publicFilePath);\n const contentType = mime.lookup(publicFilePath) || 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n return;\n }\n\n // Serve /_float/ internal assets\n if (pathname.startsWith('/_float/')) {\n // Handle internal float assets\n res.writeHead(200, { 'Content-Type': 'application/javascript' });\n res.end('// Float.js internal asset');\n return;\n }\n\n // Serve Dev Dashboard at /__float\n if (pathname === '/__float' || pathname.startsWith('/__float/')) {\n const { dashboardState } = await import('../devtools/index.js');\n \n // Sync current routes to dashboard\n dashboardState.routes = routes.map(r => ({\n path: r.path,\n type: r.type,\n file: r.filePath || r.absolutePath,\n hasLayout: r.layouts && r.layouts.length > 0\n }));\n \n // Use the dashboard handler via middleware pattern\n const { createDevDashboard } = await import('../devtools/index.js');\n const handler = createDevDashboard({ path: '/__float' });\n \n handler(req, res, () => {\n res.writeHead(404);\n res.end('Not Found');\n });\n return;\n }\n\n // Match route\n const { route, params } = matchRoute(pathname, routes);\n\n // Show welcome page if no routes configured and visiting root\n if (!route && pathname === '/' && routes.length === 0) {\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(generateWelcomePage());\n return;\n }\n\n // Internal Float.js pages (docs, learn, examples)\n if (pathname === '/__docs') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(generateDocsPage());\n return;\n }\n if (pathname === '/__learn') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(generateLearnPage());\n return;\n }\n if (pathname === '/__examples') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(generateExamplesPage());\n return;\n }\n\n if (!route) {\n res.writeHead(404, { 'Content-Type': 'text/html' });\n res.end(create404Page(pathname));\n return;\n }\n\n // Handle API routes\n if (route.type === 'api') {\n await handleApiRoute(req, res, route, params);\n return;\n }\n\n // Render page with SSR\n const html = await renderPage(route, params, { \n hmrScript: hmrClientScript,\n isDev: true,\n });\n\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(html);\n\n } catch (error) {\n console.error(pc.red('Request error:'), error);\n res.writeHead(500, { 'Content-Type': 'text/html' });\n res.end(createErrorPage(error as Error));\n }\n }\n\n // Handle API routes\n async function handleApiRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n route: Route,\n params: Record<string, string>\n ) {\n try {\n const module = await transformFile(route.absolutePath);\n const method = req.method?.toUpperCase() || 'GET';\n \n // Create Request object\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const body = await getRequestBody(req);\n \n const request = new Request(url.toString(), {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).filter(([_, v]) => v !== undefined) as [string, string][]\n ),\n body: method !== 'GET' && method !== 'HEAD' ? body : undefined,\n });\n\n // Find handler\n const handler = module[method] || module.default;\n \n if (!handler) {\n res.writeHead(405, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Method not allowed' }));\n return;\n }\n\n // Execute handler\n const response: Response = await handler(request, { params });\n \n // Send response\n res.writeHead(response.status, Object.fromEntries(response.headers));\n const responseBody = await response.text();\n res.end(responseBody);\n\n } catch (error) {\n console.error(pc.red('API route error:'), error);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Internal server error' }));\n }\n }\n\n async function start() {\n await refreshRoutes();\n\n // Create HTTP server\n server = http.createServer(handleRequest);\n \n // Create WebSocket server for HMR\n wss = new WebSocketServer({ port: port + 1 });\n wss.on('connection', (ws) => {\n clients.add(ws);\n ws.on('close', () => clients.delete(ws));\n });\n\n // Watch for file changes\n const watcher = chokidar.watch(\n [\n path.join(rootDir, 'app/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'components/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'lib/**/*.{ts,tsx,js,jsx}'),\n ],\n {\n ignored: /node_modules/,\n persistent: true,\n }\n );\n\n watcher.on('change', async (filePath) => {\n console.log(pc.yellow(`\\n ⚑ File changed: ${path.relative(rootDir, filePath)}`));\n \n // Check if it's a route file\n if (filePath.includes('/app/')) {\n await refreshRoutes();\n }\n \n notifyClients('reload');\n });\n\n watcher.on('add', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.green(`\\n βž• File added: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n watcher.on('unlink', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.red(`\\n βž– File removed: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n // Start server\n return new Promise<void>((resolve, reject) => {\n server!.listen(port, host, () => {\n console.log(pc.green(` βœ… Server running at ${pc.cyan(`http://${host}:${port}`)}`));\n console.log(pc.dim(` ⚑ HMR enabled on ws://${host}:${port + 1}\\n`));\n \n // Print routes\n console.log(pc.bold(' Routes:'));\n routes.forEach(route => {\n if (route.type === 'page') {\n console.log(pc.dim(` ${pc.green('●')} ${route.path}`));\n } else if (route.type === 'api') {\n console.log(pc.dim(` ${pc.blue('β—†')} ${route.path} (API)`));\n }\n });\n console.log('');\n\n if (open) {\n import('child_process').then(({ exec }) => {\n exec(`open http://${host}:${port}`);\n });\n }\n\n resolve();\n });\n\n server!.on('error', reject);\n });\n }\n\n async function stop() {\n return new Promise<void>((resolve) => {\n wss?.close();\n server?.close(() => resolve());\n });\n }\n\n async function restart() {\n await stop();\n await start();\n }\n\n return { start, stop, restart };\n}\n\n// Helper functions\nfunction getRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', chunk => body += chunk);\n req.on('end', () => resolve(body));\n req.on('error', reject);\n });\n}\n\nfunction create404Page(pathname: string): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>404 - Not Found | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);\n color: white;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .container { text-align: center; padding: 2rem; }\n h1 { font-size: 8rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); \n -webkit-background-clip: text; -webkit-text-fill-color: transparent; }\n h2 { font-size: 1.5rem; margin: 1rem 0; opacity: 0.8; }\n code { background: rgba(255,255,255,0.1); padding: 0.5rem 1rem; border-radius: 0.5rem; }\n .tip { margin-top: 2rem; opacity: 0.6; font-size: 0.9rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <code>${pathname}</code>\n <p class=\"tip\">Create <code>app${pathname === '/' ? '' : pathname}/page.tsx</code> to add this route</p>\n </div>\n</body>\n</html>`;\n}\n\nfunction createErrorPage(error: Error): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Error | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: 'Monaco', 'Menlo', monospace;\n background: #1a1a1a;\n color: #ff6b6b;\n min-height: 100vh;\n padding: 2rem;\n }\n .header { display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem; }\n .icon { font-size: 2rem; }\n h1 { font-size: 1.5rem; }\n .message { color: #ffa94d; font-size: 1.25rem; margin-bottom: 1rem; }\n .stack { \n background: #2d2d2d; \n padding: 1rem; \n border-radius: 0.5rem; \n overflow-x: auto;\n color: #888;\n font-size: 0.875rem;\n line-height: 1.6;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <span class=\"icon\">⚠️</span>\n <h1>Server Error</h1>\n </div>\n <p class=\"message\">${escapeHtml(error.message)}</p>\n <pre class=\"stack\">${escapeHtml(error.stack || '')}</pre>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n","/**\n * Float.js Router\n * File-based routing system\n */\n\nimport fg from 'fast-glob';\nimport path from 'node:path';\n\nexport interface Route {\n /** URL path pattern (e.g., /users/:id) */\n path: string;\n /** File path relative to app directory */\n filePath: string;\n /** Absolute file path */\n absolutePath: string;\n /** Route type */\n type: 'page' | 'layout' | 'api' | 'error' | 'loading';\n /** Dynamic segments */\n params: string[];\n /** Is catch-all route */\n isCatchAll: boolean;\n /** Is optional catch-all */\n isOptionalCatchAll: boolean;\n /** Nested layouts */\n layouts: string[];\n}\n\nexport interface RouterOptions {\n /** Root directory of the app (default: 'app') */\n appDir?: string;\n /** Base path for all routes */\n basePath?: string;\n /** File extensions to consider */\n extensions?: string[];\n}\n\nconst DEFAULT_OPTIONS: Required<RouterOptions> = {\n appDir: 'app',\n basePath: '',\n extensions: ['.tsx', '.ts', '.jsx', '.js'],\n};\n\n/**\n * Convert file path to URL path\n * \n * Examples:\n * - app/page.tsx -> /\n * - app/about/page.tsx -> /about\n * - app/users/[id]/page.tsx -> /users/:id\n * - app/docs/[...slug]/page.tsx -> /docs/*\n * - app/shop/[[...slug]]/page.tsx -> /shop/*?\n */\nfunction filePathToUrlPath(filePath: string, appDir: string): { \n urlPath: string; \n params: string[];\n isCatchAll: boolean;\n isOptionalCatchAll: boolean;\n} {\n // Remove app dir prefix and file name\n let urlPath = filePath\n .replace(new RegExp(`^${appDir}/`), '')\n .replace(/\\/?(page|layout|route|error|loading|not-found)\\.(tsx?|jsx?)$/, '');\n\n const params: string[] = [];\n let isCatchAll = false;\n let isOptionalCatchAll = false;\n\n // Convert [param] to :param\n urlPath = urlPath.replace(/\\[([^\\]]+)\\]/g, (_, param) => {\n // Optional catch-all [[...slug]]\n if (param.startsWith('...') && filePath.includes('[[')) {\n isOptionalCatchAll = true;\n const paramName = param.replace('...', '');\n params.push(paramName);\n return `*${paramName}?`;\n }\n // Catch-all [...slug]\n if (param.startsWith('...')) {\n isCatchAll = true;\n const paramName = param.replace('...', '');\n params.push(paramName);\n return `*${paramName}`;\n }\n // Regular dynamic param [id]\n params.push(param);\n return `:${param}`;\n });\n\n // Ensure leading slash\n urlPath = '/' + urlPath;\n \n // Clean up double slashes and trailing slash\n urlPath = urlPath.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\n\n return { urlPath, params, isCatchAll, isOptionalCatchAll };\n}\n\n/**\n * Determine route type from file name\n */\nfunction getRouteType(filePath: string): Route['type'] {\n // Check if file name (without path) matches special file types\n const fileName = filePath.split('/').pop() || filePath;\n \n if (fileName.match(/^route\\.(tsx?|jsx?)$/)) return 'api';\n if (fileName.match(/^layout\\.(tsx?|jsx?)$/)) return 'layout';\n if (fileName.match(/^error\\.(tsx?|jsx?)$/)) return 'error';\n if (fileName.match(/^loading\\.(tsx?|jsx?)$/)) return 'loading';\n return 'page';\n}\n\n/**\n * Find all layouts that apply to a route\n */\nfunction findLayouts(routePath: string, allLayouts: Map<string, string>): string[] {\n const layouts: string[] = [];\n const segments = routePath.split('/').filter(Boolean);\n \n // Check from root to deepest\n let currentPath = '';\n \n // Root layout\n if (allLayouts.has('/')) {\n layouts.push(allLayouts.get('/')!);\n }\n \n for (const segment of segments) {\n currentPath += '/' + segment;\n if (allLayouts.has(currentPath)) {\n layouts.push(allLayouts.get(currentPath)!);\n }\n }\n \n return layouts;\n}\n\n/**\n * Scan app directory and build routes\n */\nexport async function scanRoutes(\n rootDir: string,\n options: RouterOptions = {}\n): Promise<Route[]> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const appDir = path.join(rootDir, opts.appDir);\n const extensions = opts.extensions.map(ext => ext.replace('.', '')).join(',');\n\n // Find all route files\n const pattern = `**/{page,layout,route,error,loading}.{${extensions}}`;\n const files = await fg(pattern, {\n cwd: appDir,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/_*/**'],\n });\n\n // First pass: collect all layouts\n const layoutMap = new Map<string, string>();\n \n for (const file of files) {\n const type = getRouteType(file);\n if (type === 'layout') {\n const { urlPath } = filePathToUrlPath(file, '');\n const layoutPath = urlPath === '/' ? '/' : urlPath.replace(/\\/layout$/, '') || '/';\n layoutMap.set(layoutPath, path.join(appDir, file));\n }\n }\n\n // Second pass: build all routes (only pages and API routes)\n const routes: Route[] = [];\n\n for (const file of files) {\n const type = getRouteType(file);\n \n // Skip layouts, errors, loading - they are not matchable routes\n if (type === 'layout' || type === 'error' || type === 'loading') {\n continue;\n }\n const { urlPath, params, isCatchAll, isOptionalCatchAll } = filePathToUrlPath(file, '');\n \n const route: Route = {\n path: opts.basePath + urlPath,\n filePath: file,\n absolutePath: path.join(appDir, file),\n type,\n params,\n isCatchAll,\n isOptionalCatchAll,\n layouts: type === 'page' ? findLayouts(urlPath, layoutMap) : [],\n };\n\n routes.push(route);\n }\n\n // Sort routes: static first, then dynamic, catch-all last\n routes.sort((a, b) => {\n if (a.isCatchAll !== b.isCatchAll) return a.isCatchAll ? 1 : -1;\n if (a.params.length !== b.params.length) return a.params.length - b.params.length;\n return a.path.localeCompare(b.path);\n });\n\n return routes;\n}\n\n/**\n * Match a URL path to a route\n */\nexport function matchRoute(url: string, routes: Route[]): { \n route: Route | null; \n params: Record<string, string>;\n} {\n const urlParts = url.split('/').filter(Boolean);\n\n for (const route of routes) {\n if (route.type !== 'page' && route.type !== 'api') continue;\n\n const routeParts = route.path.split('/').filter(Boolean);\n const params: Record<string, string> = {};\n let matched = true;\n let urlIndex = 0;\n\n for (let i = 0; i < routeParts.length; i++) {\n const routePart = routeParts[i];\n\n // Catch-all\n if (routePart.startsWith('*')) {\n const paramName = routePart.replace(/^\\*/, '').replace(/\\?$/, '');\n params[paramName] = urlParts.slice(urlIndex).join('/');\n return { route, params };\n }\n\n // Dynamic segment\n if (routePart.startsWith(':')) {\n const paramName = routePart.slice(1);\n if (urlIndex >= urlParts.length) {\n matched = false;\n break;\n }\n params[paramName] = urlParts[urlIndex];\n urlIndex++;\n continue;\n }\n\n // Static segment\n if (urlParts[urlIndex] !== routePart) {\n matched = false;\n break;\n }\n urlIndex++;\n }\n\n // Check if we consumed all URL parts\n if (matched && urlIndex === urlParts.length) {\n return { route, params };\n }\n }\n\n return { route: null, params: {} };\n}\n\nexport type { Route as FloatRoute, RouterOptions as FloatRouterOptions };\n","/**\n * Float.js SSR Engine\n * Server-Side Rendering with React 18 Streaming\n */\n\nimport React from 'react';\nimport { renderToPipeableStream, renderToString } from 'react-dom/server';\nimport { Writable } from 'node:stream';\nimport type { Route } from '../router/index.js';\nimport { transformFile } from '../build/transform.js';\n\nexport interface RenderOptions {\n hmrScript?: string;\n isDev?: boolean;\n streaming?: boolean;\n}\n\nexport interface PageProps {\n params: Record<string, string>;\n searchParams: Record<string, string>;\n}\n\n/**\n * Render a page to HTML string\n */\nexport async function renderPage(\n route: Route,\n params: Record<string, string>,\n options: RenderOptions = {}\n): Promise<string> {\n const { hmrScript = '', isDev = false, streaming = false } = options;\n void streaming; // Reserved for future streaming implementation\n\n try {\n // Load the page component\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n throw new Error(`No default export found in ${route.filePath}`);\n }\n\n // Load layouts (from root to current)\n const layouts = await Promise.all(\n route.layouts.map(async (layoutPath) => {\n const layoutModule = await transformFile(layoutPath);\n return layoutModule.default;\n })\n );\n\n // Get metadata if exported\n const metadata = pageModule.metadata || {};\n const generateMetadata = pageModule.generateMetadata;\n \n let pageMetadata = metadata;\n if (generateMetadata) {\n pageMetadata = await generateMetadata({ params });\n }\n\n // Create props\n const props: PageProps = {\n params,\n searchParams: {},\n };\n\n // Build component tree with layouts\n let element: React.ReactElement = React.createElement(PageComponent, props);\n \n // Wrap with layouts (innermost to outermost)\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i];\n if (Layout) {\n element = React.createElement(Layout, { children: element }) as React.ReactElement;\n }\n }\n\n // Render to HTML\n const content = renderToString(element);\n\n // Generate full HTML document\n const html = generateHtmlDocument({\n content,\n metadata: pageMetadata,\n hmrScript: isDev ? hmrScript : '',\n isDev,\n });\n\n return html;\n\n } catch (error) {\n console.error('SSR Error:', error);\n throw error;\n }\n}\n\n/**\n * Render with streaming (React 18 Suspense)\n */\nexport async function renderPageStream(\n route: Route,\n params: Record<string, string>,\n _options: RenderOptions = {}\n): Promise<NodeJS.ReadableStream> {\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n const props: PageProps = { params, searchParams: {} };\n const element = React.createElement(PageComponent, props);\n\n return new Promise((resolve, reject) => {\n let html = '';\n \n const writable = new Writable({\n write(chunk, _encoding, callback) {\n html += chunk.toString();\n callback();\n },\n final(callback) {\n callback();\n }\n });\n\n const { pipe, abort } = renderToPipeableStream(element, {\n onShellReady() {\n pipe(writable);\n },\n onShellError(error) {\n reject(error);\n },\n onAllReady() {\n resolve(writable as any);\n },\n onError(error) {\n console.error('Streaming error:', error);\n }\n });\n\n // Timeout after 10 seconds\n setTimeout(() => abort(), 10000);\n });\n}\n\ninterface HtmlDocumentOptions {\n content: string;\n metadata: Record<string, any>;\n hmrScript: string;\n isDev: boolean;\n styles?: string;\n scripts?: string[];\n}\n\n/**\n * Generate full HTML document\n */\nfunction generateHtmlDocument(options: HtmlDocumentOptions): string {\n const { content, metadata, hmrScript, isDev, styles = '', scripts = [] } = options;\n \n // Handle title which can be string or object with default/template\n let title = 'Float.js App';\n if (metadata.title) {\n if (typeof metadata.title === 'string') {\n title = metadata.title;\n } else if (typeof metadata.title === 'object' && metadata.title.default) {\n title = metadata.title.default;\n }\n }\n \n const description = metadata.description || '';\n const charset = metadata.charset || 'utf-8';\n const viewport = metadata.viewport || 'width=device-width, initial-scale=1';\n\n // Generate meta tags\n const metaTags = generateMetaTags(metadata);\n\n return `<!DOCTYPE html>\n<html lang=\"${metadata.lang || 'en'}\">\n<head>\n <meta charset=\"${charset}\">\n <meta name=\"viewport\" content=\"${viewport}\">\n <title>${escapeHtml(title)}</title>\n ${description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''}\n ${metaTags}\n <meta name=\"generator\" content=\"Float.js\">\n <style>\n /* Float.js Base Styles */\n *, *::before, *::after { box-sizing: border-box; }\n html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }\n body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }\n ${styles}\n </style>\n ${isDev ? `\n <style>\n /* Dev mode indicator */\n body::after {\n content: 'DEV';\n position: fixed;\n bottom: 8px;\n right: 8px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n font-size: 10px;\n font-weight: bold;\n padding: 4px 8px;\n border-radius: 4px;\n z-index: 99999;\n font-family: monospace;\n }\n </style>\n ` : ''}\n</head>\n<body>\n <div id=\"__float\">${content}</div>\n ${hmrScript}\n ${scripts.map(src => `<script src=\"${src}\"></script>`).join('\\n ')}\n</body>\n</html>`;\n}\n\n/**\n * Generate meta tags from metadata object\n */\nfunction generateMetaTags(metadata: Record<string, any>): string {\n const tags: string[] = [];\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.image) tags.push(`<meta property=\"og:image\" content=\"${escapeHtml(og.image)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${escapeHtml(og.url)}\">`);\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${escapeHtml(og.type)}\">`);\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${escapeHtml(tw.card)}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.image) tags.push(`<meta name=\"twitter:image\" content=\"${escapeHtml(tw.image)}\">`);\n }\n\n // Robots\n if (metadata.robots) {\n const robots = typeof metadata.robots === 'string' \n ? metadata.robots \n : Object.entries(metadata.robots).map(([k, v]) => v ? k : `no${k}`).join(', ');\n tags.push(`<meta name=\"robots\" content=\"${escapeHtml(robots)}\">`);\n }\n\n // Icons\n if (metadata.icons) {\n const icons = metadata.icons;\n if (icons.icon) tags.push(`<link rel=\"icon\" href=\"${escapeHtml(icons.icon)}\">`);\n if (icons.apple) tags.push(`<link rel=\"apple-touch-icon\" href=\"${escapeHtml(icons.apple)}\">`);\n }\n\n // Canonical\n if (metadata.canonical) {\n tags.push(`<link rel=\"canonical\" href=\"${escapeHtml(metadata.canonical)}\">`);\n }\n\n return tags.join('\\n ');\n}\n\nfunction escapeHtml(text: string): string {\n return String(text)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nexport type { PageProps as FloatPageProps };\n","/**\n * Float.js Transform\n * On-the-fly TypeScript/JSX transformation\n */\n\nimport * as esbuild from 'esbuild';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\n// Module cache for dev mode\nconst moduleCache = new Map<string, { module: any; mtime: number }>();\n\n/**\n * Transform and import a file\n * Handles .ts, .tsx, .js, .jsx files\n */\nexport async function transformFile(filePath: string): Promise<any> {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n \n // Check if file exists\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n const stats = fs.statSync(absolutePath);\n const mtime = stats.mtimeMs;\n\n // Check cache\n const cached = moduleCache.get(absolutePath);\n if (cached && cached.mtime === mtime) {\n return cached.module;\n }\n\n // Read source\n const source = fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath);\n\n // Determine loader\n const loader = getLoader(ext);\n\n // Transform with esbuild\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: absolutePath,\n });\n\n // Create temporary file for import\n const tempDir = path.join(process.cwd(), '.float', '.cache');\n fs.mkdirSync(tempDir, { recursive: true });\n \n const tempFile = path.join(tempDir, `${path.basename(absolutePath, ext)}_${Date.now()}.mjs`);\n \n // Rewrite imports to absolute paths\n let code = result.code;\n code = rewriteImports(code, path.dirname(absolutePath));\n \n fs.writeFileSync(tempFile, code);\n\n try {\n // Dynamic import\n const module = await import(pathToFileURL(tempFile).href);\n \n // Cache the result\n moduleCache.set(absolutePath, { module, mtime });\n \n // Clean up temp file (async)\n setImmediate(() => {\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n });\n\n return module;\n } catch (error) {\n // Clean up on error\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n throw error;\n }\n}\n\n/**\n * Get esbuild loader for file extension\n */\nfunction getLoader(ext: string): esbuild.Loader {\n switch (ext) {\n case '.ts': return 'ts';\n case '.tsx': return 'tsx';\n case '.jsx': return 'jsx';\n case '.js': return 'js';\n case '.mjs': return 'js';\n case '.json': return 'json';\n case '.css': return 'css';\n default: return 'ts';\n }\n}\n\n/**\n * Rewrite relative imports to absolute paths\n */\nfunction rewriteImports(code: string, baseDir: string): string {\n // Match import statements\n const importRegex = /from\\s+['\"](\\.[^'\"]+)['\"]/g;\n \n return code.replace(importRegex, (match, importPath) => {\n // Resolve relative path\n let resolvedPath = path.resolve(baseDir, importPath);\n \n // Try to find the file with various extensions\n const extensions = ['.tsx', '.ts', '.jsx', '.js', '.mjs', ''];\n let found = false;\n \n for (const ext of extensions) {\n const tryPath = resolvedPath + ext;\n if (fs.existsSync(tryPath)) {\n resolvedPath = tryPath;\n found = true;\n break;\n }\n // Try index file\n const indexPath = path.join(resolvedPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n resolvedPath = indexPath;\n found = true;\n break;\n }\n }\n \n if (!found) {\n // Keep original for node_modules imports\n return match;\n }\n \n return `from '${pathToFileURL(resolvedPath).href}'`;\n });\n}\n\n/**\n * Clear module cache (for HMR)\n */\nexport function clearModuleCache(filePath?: string) {\n if (filePath) {\n moduleCache.delete(path.resolve(filePath));\n } else {\n moduleCache.clear();\n }\n}\n\n/**\n * Transform source code without file operations\n */\nexport async function transformSource(\n source: string,\n options: { filename?: string; loader?: esbuild.Loader } = {}\n): Promise<string> {\n const { filename = 'module.tsx', loader = 'tsx' } = options;\n\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: filename,\n });\n\n return result.code;\n}\n","/**\n * Float.js Dev Indicator\n * Minimalist indicator inspired by Next.js\n */\n\nexport const FLOAT_INDICATOR_SCRIPT = `\n<script id=\"__float-indicator\">\n(function() {\n var isConnected = false;\n var isOpen = false;\n var buildTime = null;\n var startTime = Date.now();\n \n var indicator = document.createElement('div');\n indicator.id = '__float-dev-indicator';\n indicator.innerHTML = '<div class=\"float-btn\" id=\"float-btn\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span class=\"float-dot\" id=\"float-dot\"></span></div><div class=\"float-panel\" id=\"float-panel\"><div class=\"float-panel-header\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span>Float.js</span><span class=\"float-version\">v2.0.4</span></div><div class=\"float-panel-body\"><div class=\"float-row\"><span class=\"float-label\">Estado</span><span class=\"float-value\" id=\"float-state\">Conectando...</span></div><div class=\"float-row\"><span class=\"float-label\">HMR</span><span class=\"float-value\" id=\"float-hmr\">β€”</span></div><div class=\"float-row\"><span class=\"float-label\">Build</span><span class=\"float-value\" id=\"float-build\">β€”</span></div></div><div class=\"float-panel-footer\"><a href=\"/__float\" class=\"float-link\">Dashboard</a><a href=\"https://floatjs.dev/docs\" target=\"_blank\" class=\"float-link\">Docs</a></div></div>';\n \n var styles = document.createElement('style');\n styles.textContent = '#__float-dev-indicator{position:fixed;bottom:16px;left:16px;z-index:99999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:13px}.float-btn{display:flex;align-items:center;gap:6px;padding:8px 10px;background:#fff;border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 1px 2px rgba(0,0,0,0.05);cursor:pointer;transition:all 0.15s}.float-btn:hover{border-color:#d1d5db;box-shadow:0 2px 8px rgba(0,0,0,0.08)}.float-dot{width:8px;height:8px;border-radius:50%;background:#d1d5db;transition:background 0.2s}.float-dot.connected{background:#22c55e}.float-dot.error{background:#ef4444}.float-dot.building{background:#eab308;animation:blink 0.8s infinite}@keyframes blink{0%,100%{opacity:1}50%{opacity:0.4}}.float-panel{position:absolute;bottom:48px;left:0;width:240px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,0.1);opacity:0;visibility:hidden;transform:translateY(8px);transition:all 0.2s ease}.float-panel.open{opacity:1;visibility:visible;transform:translateY(0)}.float-panel-header{display:flex;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid #f3f4f6;font-weight:600;color:#111827}.float-version{margin-left:auto;font-size:11px;font-weight:400;color:#9ca3af}.float-panel-body{padding:8px 0}.float-row{display:flex;justify-content:space-between;padding:8px 14px}.float-label{color:#6b7280}.float-value{color:#111827;font-weight:500}.float-value.success{color:#16a34a}.float-value.error{color:#dc2626}.float-panel-footer{display:flex;gap:8px;padding:12px 14px;border-top:1px solid #f3f4f6}.float-link{flex:1;text-align:center;padding:8px;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;color:#374151;text-decoration:none;font-size:12px;font-weight:500;transition:all 0.15s}.float-link:hover{background:#f3f4f6;border-color:#d1d5db}';\n \n document.head.appendChild(styles);\n document.body.appendChild(indicator);\n \n var btn = document.getElementById('float-btn');\n var panel = document.getElementById('float-panel');\n var dot = document.getElementById('float-dot');\n var stateEl = document.getElementById('float-state');\n var hmrEl = document.getElementById('float-hmr');\n var buildEl = document.getElementById('float-build');\n \n btn.addEventListener('click', function(e) {\n e.stopPropagation();\n isOpen = !isOpen;\n panel.classList.toggle('open', isOpen);\n });\n \n document.addEventListener('click', function(e) {\n if (!indicator.contains(e.target) && isOpen) {\n isOpen = false;\n panel.classList.remove('open');\n }\n });\n \n function updateStatus(state) {\n dot.className = 'float-dot ' + state;\n if (state === 'connected') {\n stateEl.textContent = 'Conectado';\n stateEl.className = 'float-value success';\n hmrEl.textContent = 'Activo';\n hmrEl.className = 'float-value success';\n } else if (state === 'building') {\n stateEl.textContent = 'Compilando...';\n stateEl.className = 'float-value';\n } else if (state === 'error') {\n stateEl.textContent = 'Error';\n stateEl.className = 'float-value error';\n } else {\n stateEl.textContent = 'Desconectado';\n stateEl.className = 'float-value';\n hmrEl.textContent = 'Inactivo';\n hmrEl.className = 'float-value';\n }\n }\n \n var wsUrl = 'ws://' + window.location.hostname + ':' + (parseInt(window.location.port) + 1);\n var ws;\n var reconnectAttempts = 0;\n \n function connect() {\n ws = new WebSocket(wsUrl);\n \n ws.onopen = function() {\n isConnected = true;\n reconnectAttempts = 0;\n buildTime = new Date();\n updateStatus('connected');\n buildEl.textContent = 'Ahora';\n };\n \n ws.onmessage = function(event) {\n try {\n var data = JSON.parse(event.data);\n if (data.type === 'reload') window.location.reload();\n if (data.type === 'building') updateStatus('building');\n if (data.type === 'update' || data.type === 'clear-errors') {\n buildTime = new Date();\n buildEl.textContent = 'Ahora';\n updateStatus('connected');\n }\n if (data.type === 'error') updateStatus('error');\n } catch (e) {}\n };\n \n ws.onclose = function() {\n isConnected = false;\n updateStatus('');\n var delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 10000);\n reconnectAttempts++;\n setTimeout(connect, delay);\n };\n \n ws.onerror = function() { ws.close(); };\n }\n \n connect();\n \n setInterval(function() {\n if (buildTime && isConnected) {\n var sec = Math.floor((Date.now() - buildTime) / 1000);\n if (sec < 5) buildEl.textContent = 'Ahora';\n else if (sec < 60) buildEl.textContent = sec + 's';\n else buildEl.textContent = Math.floor(sec / 60) + 'm';\n }\n }, 1000);\n})();\n<\\/script>\n`;\n","/**\n * Float.js Error Overlay\n * Beautiful full-screen error display\n */\n\nexport const FLOAT_ERROR_OVERLAY = `\n<script id=\"__float-error-overlay\">\n(function() {\n window.__FLOAT_SHOW_ERROR = function(error) {\n // Remove existing overlay\n const existing = document.getElementById('__float-error-overlay');\n if (existing) existing.remove();\n \n const overlay = document.createElement('div');\n overlay.id = '__float-error-overlay';\n overlay.innerHTML = \\`\n <div class=\"feo-backdrop\"></div>\n <div class=\"feo-container\">\n <div class=\"feo-header\">\n <div class=\"feo-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n </div>\n <div class=\"feo-title-group\">\n <h1 class=\"feo-title\">\\${error.type || 'Error'}</h1>\n <p class=\"feo-subtitle\">\\${error.file || ''}</p>\n </div>\n <button class=\"feo-close\" onclick=\"this.closest('#__float-error-overlay').remove()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n <div class=\"feo-content\">\n <div class=\"feo-message\">\\${error.message}</div>\n \\${error.stack ? \\`<pre class=\"feo-stack\">\\${error.stack}</pre>\\` : ''}\n \\${error.frame ? \\`\n <div class=\"feo-frame\">\n <div class=\"feo-frame-header\">\n <span class=\"feo-frame-file\">\\${error.file || 'source'}</span>\n \\${error.line ? \\`<span class=\"feo-frame-line\">:\\${error.line}\\${error.column ? ':' + error.column : ''}</span>\\` : ''}\n </div>\n <pre class=\"feo-frame-code\">\\${error.frame}</pre>\n </div>\n \\` : ''}\n </div>\n <div class=\"feo-footer\">\n <div class=\"feo-hint\">\n <span class=\"feo-hint-icon\">πŸ’‘</span>\n <span>\\${error.hint || 'Revisa el cΓ³digo y guarda para recargar automΓ‘ticamente'}</span>\n </div>\n <div class=\"feo-actions\">\n <button class=\"feo-btn feo-btn-secondary\" onclick=\"navigator.clipboard.writeText(document.querySelector('.feo-stack')?.textContent || '')\">\n Copiar error\n </button>\n <button class=\"feo-btn feo-btn-primary\" onclick=\"window.location.reload()\">\n Reintentar\n </button>\n </div>\n </div>\n </div>\n \\`;\n \n const styles = document.createElement('style');\n styles.textContent = \\`\n #__float-error-overlay {\n position: fixed;\n inset: 0;\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n \n .feo-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.85);\n backdrop-filter: blur(8px);\n }\n \n .feo-container {\n position: relative;\n width: 100%;\n max-width: 800px;\n max-height: 90vh;\n background: linear-gradient(145deg, #1a1a1a 0%, #0d0d0d 100%);\n border-radius: 20px;\n border: 1px solid rgba(239, 68, 68, 0.3);\n box-shadow: \n 0 0 0 1px rgba(239, 68, 68, 0.1),\n 0 20px 60px rgba(239, 68, 68, 0.2),\n 0 0 100px rgba(239, 68, 68, 0.1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n \n .feo-header {\n padding: 24px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n background: linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, transparent 100%);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n }\n \n .feo-icon {\n width: 48px;\n height: 48px;\n background: rgba(239, 68, 68, 0.2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n \n .feo-icon svg {\n width: 28px;\n height: 28px;\n color: #ef4444;\n }\n \n .feo-title-group {\n flex: 1;\n min-width: 0;\n }\n \n .feo-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #ef4444;\n }\n \n .feo-subtitle {\n margin: 4px 0 0;\n font-size: 13px;\n color: rgba(255,255,255,0.5);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n \n .feo-close {\n width: 36px;\n height: 36px;\n background: rgba(255,255,255,0.05);\n border: none;\n border-radius: 10px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n \n .feo-close:hover {\n background: rgba(255,255,255,0.1);\n }\n \n .feo-close svg {\n width: 18px;\n height: 18px;\n color: rgba(255,255,255,0.5);\n }\n \n .feo-content {\n padding: 24px;\n overflow-y: auto;\n flex: 1;\n }\n \n .feo-message {\n font-size: 16px;\n color: #fca5a5;\n line-height: 1.6;\n margin-bottom: 20px;\n }\n \n .feo-stack {\n background: rgba(0,0,0,0.4);\n border-radius: 12px;\n padding: 16px;\n margin: 0 0 20px;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n font-size: 12px;\n color: rgba(255,255,255,0.7);\n line-height: 1.8;\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-all;\n }\n \n .feo-frame {\n background: rgba(0,0,0,0.3);\n border-radius: 12px;\n overflow: hidden;\n border: 1px solid rgba(255,255,255,0.05);\n }\n \n .feo-frame-header {\n padding: 12px 16px;\n background: rgba(255,255,255,0.03);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n font-size: 12px;\n }\n \n .feo-frame-file {\n color: #f59e0b;\n }\n \n .feo-frame-line {\n color: rgba(255,255,255,0.4);\n }\n \n .feo-frame-code {\n margin: 0;\n padding: 16px;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n font-size: 13px;\n color: rgba(255,255,255,0.8);\n line-height: 1.6;\n overflow-x: auto;\n }\n \n .feo-footer {\n padding: 20px 24px;\n background: rgba(0,0,0,0.3);\n border-top: 1px solid rgba(255,255,255,0.05);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n }\n \n .feo-hint {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: rgba(255,255,255,0.5);\n }\n \n .feo-hint-icon {\n font-size: 16px;\n }\n \n .feo-actions {\n display: flex;\n gap: 10px;\n }\n \n .feo-btn {\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n }\n \n .feo-btn-secondary {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n \n .feo-btn-secondary:hover {\n background: rgba(255,255,255,0.15);\n }\n \n .feo-btn-primary {\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\n color: white;\n }\n \n .feo-btn-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 20px rgba(139, 92, 246, 0.4);\n }\n \\`;\n \n overlay.appendChild(styles);\n document.body.appendChild(overlay);\n };\n \n window.__FLOAT_HIDE_ERROR = function() {\n const overlay = document.getElementById('__float-error-overlay');\n if (overlay) overlay.remove();\n };\n \n // Global error handler\n window.addEventListener('error', (event) => {\n window.__FLOAT_SHOW_ERROR({\n type: 'Runtime Error',\n message: event.message,\n file: event.filename,\n line: event.lineno,\n column: event.colno,\n stack: event.error?.stack\n });\n });\n \n window.addEventListener('unhandledrejection', (event) => {\n window.__FLOAT_SHOW_ERROR({\n type: 'Unhandled Promise Rejection',\n message: String(event.reason),\n stack: event.reason?.stack\n });\n });\n})();\n</script>\n`;\n","/**\n * Float.js Welcome Page\n * Professional welcome screen inspired by Next.js\n * Features: Light/Dark mode, Header, Features section, Footer\n */\n\nexport function generateWelcomePage(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\" class=\"light\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Welcome to Float.js</title>\n <link rel=\"icon\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'><defs><linearGradient id='g' x1='0%25' y1='100%25' x2='100%25' y2='0%25'><stop offset='0%25' stop-color='%233B82F6'/><stop offset='100%25' stop-color='%238B5CF6'/></linearGradient></defs><path d='M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z' fill='url(%23g)'/><path d='M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z' fill='url(%23g)'/><path d='M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z' fill='url(%23g)'/></svg>\">\n <script src=\"https://cdn.tailwindcss.com\"></script>\n <script>\n tailwind.config = {\n darkMode: 'class',\n theme: {\n extend: {\n fontFamily: { sans: ['Inter', 'system-ui', 'sans-serif'] }\n }\n }\n }\n </script>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n <style>\n @keyframes fade-up { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }\n .fade-up { animation: fade-up 0.6s ease-out forwards; }\n .fade-up-1 { animation: fade-up 0.6s ease-out 0.1s forwards; opacity: 0; }\n .fade-up-2 { animation: fade-up 0.6s ease-out 0.2s forwards; opacity: 0; }\n .fade-up-3 { animation: fade-up 0.6s ease-out 0.3s forwards; opacity: 0; }\n .fade-up-4 { animation: fade-up 0.6s ease-out 0.4s forwards; opacity: 0; }\n .logo-float { animation: float 4s ease-in-out infinite; }\n </style>\n</head>\n<body class=\"bg-white dark:bg-zinc-950 text-zinc-900 dark:text-white min-h-screen font-sans transition-colors duration-300\">\n \n <!-- Header -->\n <header class=\"fixed top-0 left-0 right-0 z-50 border-b border-zinc-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-950/80 backdrop-blur-md\">\n <div class=\"max-w-6xl mx-auto px-6 h-16 flex items-center justify-between\">\n <!-- Logo -->\n <div class=\"flex items-center gap-3\">\n <svg class=\"w-8 h-8\" viewBox=\"0 0 200 200\" fill=\"none\">\n <defs>\n <linearGradient id=\"hdr-grad\" x1=\"50\" y1=\"160\" x2=\"170\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3B82F6\"/><stop offset=\"1\" stop-color=\"#8B5CF6\"/>\n </linearGradient>\n </defs>\n <path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"url(#hdr-grad)\"/>\n <path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"url(#hdr-grad)\"/>\n <path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"url(#hdr-grad)\"/>\n </svg>\n <span class=\"font-semibold text-lg\">Float.js</span>\n <span class=\"text-xs px-2 py-0.5 rounded-full bg-gradient-to-r from-blue-500 to-violet-500 text-white font-medium\">v2.0.6</span>\n </div>\n \n <!-- Nav -->\n <nav class=\"hidden sm:flex items-center gap-6\">\n <a href=\"/__docs\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Docs</a>\n <a href=\"/__learn\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Learn</a>\n <a href=\"/__examples\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Examples</a>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">GitHub</a>\n </nav>\n \n <!-- Dark Mode Toggle -->\n <button id=\"theme-toggle\" class=\"p-2 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\" title=\"Toggle theme\">\n <svg class=\"w-5 h-5 hidden dark:block\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"/>\n </svg>\n <svg class=\"w-5 h-5 block dark:hidden\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"/>\n </svg>\n </button>\n </div>\n </header>\n \n <!-- Hero Section -->\n <main class=\"pt-32 pb-20 px-6\">\n <div class=\"max-w-4xl mx-auto text-center\">\n \n <!-- Logo -->\n <div class=\"fade-up logo-float mb-8\">\n <svg class=\"w-24 h-24 mx-auto\" viewBox=\"0 0 200 200\" fill=\"none\">\n <defs>\n <linearGradient id=\"hero-grad\" x1=\"50\" y1=\"160\" x2=\"170\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3B82F6\"/><stop offset=\"1\" stop-color=\"#8B5CF6\"/>\n </linearGradient>\n </defs>\n <path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"url(#hero-grad)\"/>\n <path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"url(#hero-grad)\"/>\n <path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"url(#hero-grad)\"/>\n </svg>\n </div>\n \n <!-- Title -->\n <h1 class=\"fade-up-1 text-4xl sm:text-6xl font-bold tracking-tight mb-6\">\n The React Framework<br/>\n <span class=\"bg-gradient-to-r from-blue-500 to-violet-500 bg-clip-text text-transparent\">for the Modern Web</span>\n </h1>\n \n <!-- Subtitle -->\n <p class=\"fade-up-2 text-lg sm:text-xl text-zinc-600 dark:text-zinc-400 max-w-2xl mx-auto mb-10\">\n Build full-stack React applications with file-based routing, SSR, API routes, \n and lightning-fast HMR. Get started by creating your first page.\n </p>\n \n <!-- CTA Buttons -->\n <div class=\"fade-up-3 flex flex-col sm:flex-row gap-4 justify-center mb-16\">\n <a href=\"/__learn\" \n class=\"inline-flex items-center justify-center gap-2 px-8 py-4 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 font-semibold rounded-xl hover:bg-zinc-800 dark:hover:bg-zinc-100 transition-all shadow-lg hover:shadow-xl\">\n Get Started\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M17 8l4 4m0 0l-4 4m4-4H3\"/>\n </svg>\n </a>\n <a href=\"/__docs\"\n class=\"inline-flex items-center justify-center gap-2 px-8 py-4 bg-zinc-100 dark:bg-zinc-800 text-zinc-900 dark:text-white font-semibold rounded-xl hover:bg-zinc-200 dark:hover:bg-zinc-700 transition-all\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"/>\n </svg>\n Documentation\n </a>\n </div>\n \n <!-- Code Block -->\n <div class=\"fade-up-4 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl p-6 text-left max-w-xl mx-auto shadow-sm\">\n <div class=\"flex items-center gap-2 mb-4\">\n <div class=\"w-3 h-3 rounded-full bg-red-400\"></div>\n <div class=\"w-3 h-3 rounded-full bg-yellow-400\"></div>\n <div class=\"w-3 h-3 rounded-full bg-green-400\"></div>\n <span class=\"ml-3 text-xs text-zinc-500 font-mono\">app/page.tsx</span>\n </div>\n <pre class=\"text-sm font-mono overflow-x-auto text-zinc-800 dark:text-zinc-200\"><code><span class=\"text-violet-600 dark:text-violet-400\">export default</span> <span class=\"text-blue-600 dark:text-blue-400\">function</span> <span class=\"text-amber-600 dark:text-yellow-300\">Page</span>() {\n <span class=\"text-violet-600 dark:text-violet-400\">return</span> (\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-600 dark:text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>Hello, Float.js!<span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-600 dark:text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>\n );\n}</code></pre>\n </div>\n \n </div>\n </main>\n \n <!-- Features Section -->\n <section class=\"py-20 px-6 bg-zinc-50 dark:bg-zinc-900/50\">\n <div class=\"max-w-6xl mx-auto\">\n <h2 class=\"text-2xl sm:text-3xl font-bold text-center mb-4\">Built for Performance</h2>\n <p class=\"text-zinc-600 dark:text-zinc-400 text-center mb-12 max-w-xl mx-auto\">\n Everything you need to build fast, modern web applications\n </p>\n \n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n \n <!-- Feature 1 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-blue-500 dark:hover:border-blue-500 transition-colors\">\n <div class=\"w-12 h-12 bg-blue-100 dark:bg-blue-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-blue-600 dark:text-blue-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Lightning Fast HMR</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Instant hot module replacement. See your changes in milliseconds without losing state.</p>\n </div>\n \n <!-- Feature 2 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-violet-500 dark:hover:border-violet-500 transition-colors\">\n <div class=\"w-12 h-12 bg-violet-100 dark:bg-violet-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-violet-600 dark:text-violet-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">File-Based Routing</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Create routes by adding files to the app directory. Dynamic routes, layouts, and more.</p>\n </div>\n \n <!-- Feature 3 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-emerald-500 dark:hover:border-emerald-500 transition-colors\">\n <div class=\"w-12 h-12 bg-emerald-100 dark:bg-emerald-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-emerald-600 dark:text-emerald-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Server-Side Rendering</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Automatic SSR for optimal SEO and performance. Hybrid rendering strategies.</p>\n </div>\n \n <!-- Feature 4 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-amber-500 dark:hover:border-amber-500 transition-colors\">\n <div class=\"w-12 h-12 bg-amber-100 dark:bg-amber-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-amber-600 dark:text-amber-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">API Routes</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Build your backend API with simple route handlers. Full TypeScript support.</p>\n </div>\n \n <!-- Feature 5 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-pink-500 dark:hover:border-pink-500 transition-colors\">\n <div class=\"w-12 h-12 bg-pink-100 dark:bg-pink-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-pink-600 dark:text-pink-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Built-in AI Integration</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">First-class support for AI streaming, OpenAI, Anthropic, and more.</p>\n </div>\n \n <!-- Feature 6 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-cyan-500 dark:hover:border-cyan-500 transition-colors\">\n <div class=\"w-12 h-12 bg-cyan-100 dark:bg-cyan-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-cyan-600 dark:text-cyan-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Developer Experience</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Error overlay, DevTools, and debugging utilities built-in for a smooth workflow.</p>\n </div>\n \n </div>\n </div>\n </section>\n \n <!-- Quick Start Section -->\n <section class=\"py-20 px-6\">\n <div class=\"max-w-4xl mx-auto\">\n <h2 class=\"text-2xl sm:text-3xl font-bold text-center mb-4\">Get Started in Seconds</h2>\n <p class=\"text-zinc-600 dark:text-zinc-400 text-center mb-12\">Create your first page and see it live</p>\n \n <div class=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div class=\"p-5 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl\">\n <div class=\"text-xs text-zinc-500 mb-2 uppercase tracking-wider\">1. Create page</div>\n <code class=\"text-sm font-mono text-zinc-700 dark:text-zinc-300\">touch app/page.tsx</code>\n </div>\n <div class=\"p-5 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl\">\n <div class=\"text-xs text-zinc-500 mb-2 uppercase tracking-wider\">2. Add route</div>\n <code class=\"text-sm font-mono text-zinc-700 dark:text-zinc-300\">mkdir app/about</code>\n </div>\n <div class=\"p-5 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl\">\n <div class=\"text-xs text-zinc-500 mb-2 uppercase tracking-wider\">3. API route</div>\n <code class=\"text-sm font-mono text-zinc-700 dark:text-zinc-300\">touch app/api/route.ts</code>\n </div>\n </div>\n </div>\n </section>\n \n <!-- Footer -->\n <footer class=\"border-t border-zinc-200 dark:border-zinc-800 py-12 px-6 bg-zinc-50 dark:bg-zinc-900/50\">\n <div class=\"max-w-6xl mx-auto\">\n <div class=\"grid grid-cols-1 sm:grid-cols-4 gap-8 mb-12\">\n \n <!-- Brand -->\n <div class=\"sm:col-span-1\">\n <div class=\"flex items-center gap-2 mb-4\">\n <svg class=\"w-8 h-8\" viewBox=\"0 0 200 200\" fill=\"none\">\n <defs>\n <linearGradient id=\"ftr-grad\" x1=\"50\" y1=\"160\" x2=\"170\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3B82F6\"/><stop offset=\"1\" stop-color=\"#8B5CF6\"/>\n </linearGradient>\n </defs>\n <path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"url(#ftr-grad)\"/>\n <path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"url(#ftr-grad)\"/>\n <path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"url(#ftr-grad)\"/>\n </svg>\n <span class=\"font-semibold text-lg\">Float.js</span>\n </div>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">\n The React framework for the modern web.\n </p>\n </div>\n \n <!-- Resources -->\n <div>\n <h4 class=\"font-semibold mb-4 text-sm\">Resources</h4>\n <ul class=\"space-y-2\">\n <li><a href=\"/__docs\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Documentation</a></li>\n <li><a href=\"/__learn\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Learn Float.js</a></li>\n <li><a href=\"/__examples\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Examples</a></li>\n <li><a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Blog</a></li>\n </ul>\n </div>\n \n <!-- More -->\n <div>\n <h4 class=\"font-semibold mb-4 text-sm\">More</h4>\n <ul class=\"space-y-2\">\n <li><a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">GitHub</a></li>\n <li><a href=\"https://github.com/float-js/float-js/releases\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Releases</a></li>\n <li><a href=\"https://x.com/floatjs\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Twitter</a></li>\n </ul>\n </div>\n \n <!-- Legal -->\n <div>\n <h4 class=\"font-semibold mb-4 text-sm\">Legal</h4>\n <ul class=\"space-y-2\">\n <li><a href=\"https://github.com/float-js/float-js/blob/main/LICENSE\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">MIT License</a></li>\n <li><a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Contribute</a></li>\n </ul>\n </div>\n \n </div>\n \n <!-- Bottom -->\n <div class=\"pt-8 border-t border-zinc-200 dark:border-zinc-800 flex flex-col sm:flex-row items-center justify-between gap-4\">\n <p class=\"text-sm text-zinc-500\">\n Β© 2024-2026 Float.js. Created by <span class=\"text-zinc-700 dark:text-zinc-300 font-medium\">Peter Fulle</span>\n </p>\n <div class=\"flex items-center gap-4\">\n <a href=\"mailto:prfulle@gmail.com\" class=\"text-sm text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">prfulle@gmail.com</a>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>\n </a>\n <a href=\"https://x.com/floatjs\" target=\"_blank\" class=\"text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/></svg>\n </a>\n </div>\n </div>\n </div>\n </footer>\n \n <!-- Theme Toggle Script -->\n <script>\n const toggle = document.getElementById('theme-toggle');\n const html = document.documentElement;\n \n // Check for saved theme or system preference\n if (localStorage.theme === 'dark' || (!localStorage.theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {\n html.classList.add('dark');\n html.classList.remove('light');\n }\n \n toggle.addEventListener('click', () => {\n html.classList.toggle('dark');\n html.classList.toggle('light');\n localStorage.theme = html.classList.contains('dark') ? 'dark' : 'light';\n });\n </script>\n \n</body>\n</html>`;\n}\n","/**\n * Float.js Documentation Pages\n * Internal pages for Docs, Learn, and Examples\n */\n\nconst baseStyles = `\n<!DOCTYPE html>\n<html lang=\"en\" class=\"light\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>%TITLE% - Float.js</title>\n <link rel=\"icon\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'><defs><linearGradient id='g' x1='0%25' y1='100%25' x2='100%25' y2='0%25'><stop offset='0%25' stop-color='%233B82F6'/><stop offset='100%25' stop-color='%238B5CF6'/></linearGradient></defs><path d='M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z' fill='url(%23g)'/><path d='M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z' fill='url(%23g)'/><path d='M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z' fill='url(%23g)'/></svg>\">\n <script src=\"https://cdn.tailwindcss.com\"></script>\n <script>\n tailwind.config = {\n darkMode: 'class',\n theme: { extend: { fontFamily: { sans: ['Inter', 'system-ui', 'sans-serif'] } } }\n }\n </script>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n <style>\n .prose code { background: #f4f4f5; padding: 2px 6px; border-radius: 4px; font-size: 0.875em; }\n .dark .prose code { background: #27272a; }\n .prose pre { background: #18181b; padding: 1rem; border-radius: 0.75rem; overflow-x: auto; }\n .prose pre code { background: transparent; padding: 0; }\n </style>\n</head>\n<body class=\"bg-white dark:bg-zinc-950 text-zinc-900 dark:text-white min-h-screen font-sans\">\n`;\n\nconst header = `\n <!-- Header -->\n <header class=\"sticky top-0 z-50 border-b border-zinc-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-950/80 backdrop-blur-md\">\n <div class=\"max-w-6xl mx-auto px-6 h-16 flex items-center justify-between\">\n <a href=\"/\" class=\"flex items-center gap-3\">\n <svg class=\"w-8 h-8\" viewBox=\"0 0 200 200\" fill=\"none\">\n <defs>\n <linearGradient id=\"hdr-grad\" x1=\"50\" y1=\"160\" x2=\"170\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3B82F6\"/><stop offset=\"1\" stop-color=\"#8B5CF6\"/>\n </linearGradient>\n </defs>\n <path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"url(#hdr-grad)\"/>\n <path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"url(#hdr-grad)\"/>\n <path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"url(#hdr-grad)\"/>\n </svg>\n <span class=\"font-semibold text-lg\">Float.js</span>\n </a>\n <nav class=\"flex items-center gap-6\">\n <a href=\"/__docs\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Docs</a>\n <a href=\"/__learn\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Learn</a>\n <a href=\"/__examples\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Examples</a>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">GitHub</a>\n <button id=\"theme-toggle\" class=\"p-2 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\">\n <svg class=\"w-5 h-5 hidden dark:block\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"/></svg>\n <svg class=\"w-5 h-5 block dark:hidden\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"/></svg>\n </button>\n </nav>\n </div>\n </header>\n`;\n\nconst footer = `\n <!-- Footer -->\n <footer class=\"border-t border-zinc-200 dark:border-zinc-800 py-8 px-6 bg-zinc-50 dark:bg-zinc-900/50\">\n <div class=\"max-w-6xl mx-auto flex flex-col sm:flex-row items-center justify-between gap-4\">\n <p class=\"text-sm text-zinc-500\">Β© 2024-2026 Float.js. Created by Peter Fulle</p>\n <div class=\"flex items-center gap-4\">\n <a href=\"mailto:prfulle@gmail.com\" class=\"text-sm text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">prfulle@gmail.com</a>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>\n </a>\n </div>\n </div>\n </footer>\n <script>\n const toggle = document.getElementById('theme-toggle');\n const html = document.documentElement;\n if (localStorage.theme === 'dark' || (!localStorage.theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {\n html.classList.add('dark'); html.classList.remove('light');\n }\n toggle?.addEventListener('click', () => {\n html.classList.toggle('dark'); html.classList.toggle('light');\n localStorage.theme = html.classList.contains('dark') ? 'dark' : 'light';\n });\n </script>\n</body>\n</html>\n`;\n\nexport function generateDocsPage(): string {\n return baseStyles.replace('%TITLE%', 'Documentation') + header + `\n <div class=\"flex\">\n <!-- Sidebar -->\n <aside class=\"hidden lg:block w-64 border-r border-zinc-200 dark:border-zinc-800 min-h-[calc(100vh-4rem)] p-6\">\n <nav class=\"space-y-6\">\n <div>\n <h3 class=\"font-semibold text-sm mb-3\">Getting Started</h3>\n <ul class=\"space-y-2\">\n <li><a href=\"#installation\" class=\"text-sm text-blue-600 dark:text-blue-400 font-medium\">Installation</a></li>\n <li><a href=\"#project-structure\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Project Structure</a></li>\n <li><a href=\"#routing\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Routing</a></li>\n </ul>\n </div>\n <div>\n <h3 class=\"font-semibold text-sm mb-3\">Core Concepts</h3>\n <ul class=\"space-y-2\">\n <li><a href=\"#pages\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Pages</a></li>\n <li><a href=\"#layouts\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Layouts</a></li>\n <li><a href=\"#api-routes\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">API Routes</a></li>\n </ul>\n </div>\n <div>\n <h3 class=\"font-semibold text-sm mb-3\">Features</h3>\n <ul class=\"space-y-2\">\n <li><a href=\"#ssr\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Server Rendering</a></li>\n <li><a href=\"#hmr\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Hot Module Replacement</a></li>\n <li><a href=\"#ai\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">AI Integration</a></li>\n </ul>\n </div>\n </nav>\n </aside>\n \n <!-- Main Content -->\n <main class=\"flex-1 max-w-3xl mx-auto px-6 py-12 prose dark:prose-invert\">\n <h1 id=\"installation\" class=\"text-4xl font-bold mb-4\">Documentation</h1>\n <p class=\"text-lg text-zinc-600 dark:text-zinc-400 mb-8\">Learn how to build modern web applications with Float.js</p>\n \n <h2 class=\"text-2xl font-semibold mt-12 mb-4\">Installation</h2>\n <p class=\"mb-4\">Create a new Float.js project with a single command:</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl mb-6\"><code class=\"font-mono\">npx create-float@latest my-app\ncd my-app\nnpm run dev</code></pre>\n \n <h2 id=\"project-structure\" class=\"text-2xl font-semibold mt-12 mb-4\">Project Structure</h2>\n <p class=\"mb-4\">Float.js uses a file-based routing system. Your project structure looks like this:</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl mb-6\"><code class=\"font-mono\">my-app/\nβ”œβ”€β”€ app/\nβ”‚ β”œβ”€β”€ page.tsx # Home page (/)\nβ”‚ β”œβ”€β”€ layout.tsx # Root layout\nβ”‚ β”œβ”€β”€ about/\nβ”‚ β”‚ └── page.tsx # About page (/about)\nβ”‚ └── api/\nβ”‚ └── route.ts # API route (/api)\nβ”œβ”€β”€ public/ # Static assets\n└── package.json</code></pre>\n\n <h2 id=\"routing\" class=\"text-2xl font-semibold mt-12 mb-4\">Routing</h2>\n <p class=\"mb-4\">Routes are automatically generated based on your file structure:</p>\n <div class=\"bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl p-6 mb-6\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"text-left border-b border-zinc-200 dark:border-zinc-700\">\n <th class=\"pb-3 font-semibold\">File</th>\n <th class=\"pb-3 font-semibold\">Route</th>\n </tr>\n </thead>\n <tbody class=\"font-mono\">\n <tr class=\"border-b border-zinc-100 dark:border-zinc-800\"><td class=\"py-3\">app/page.tsx</td><td class=\"py-3 text-blue-600 dark:text-blue-400\">/</td></tr>\n <tr class=\"border-b border-zinc-100 dark:border-zinc-800\"><td class=\"py-3\">app/about/page.tsx</td><td class=\"py-3 text-blue-600 dark:text-blue-400\">/about</td></tr>\n <tr class=\"border-b border-zinc-100 dark:border-zinc-800\"><td class=\"py-3\">app/blog/[slug]/page.tsx</td><td class=\"py-3 text-blue-600 dark:text-blue-400\">/blog/:slug</td></tr>\n <tr><td class=\"py-3\">app/api/users/route.ts</td><td class=\"py-3 text-blue-600 dark:text-blue-400\">/api/users</td></tr>\n </tbody>\n </table>\n </div>\n\n <h2 id=\"pages\" class=\"text-2xl font-semibold mt-12 mb-4\">Creating Pages</h2>\n <p class=\"mb-4\">Each page exports a default React component:</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl mb-6\"><code class=\"font-mono\"><span class=\"text-violet-400\">export default</span> <span class=\"text-blue-400\">function</span> <span class=\"text-yellow-300\">Page</span>() {\n <span class=\"text-violet-400\">return</span> (\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">div</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>Welcome to my page<span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">div</span><span class=\"text-zinc-500\">&gt;</span>\n );\n}</code></pre>\n\n <h2 id=\"api-routes\" class=\"text-2xl font-semibold mt-12 mb-4\">API Routes</h2>\n <p class=\"mb-4\">Create API endpoints by exporting HTTP method handlers:</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl mb-6\"><code class=\"font-mono\"><span class=\"text-violet-400\">export async function</span> <span class=\"text-yellow-300\">GET</span>(<span class=\"text-orange-400\">request</span>: Request) {\n <span class=\"text-violet-400\">return</span> Response.json({ message: <span class=\"text-emerald-400\">'Hello from API!'</span> });\n}\n\n<span class=\"text-violet-400\">export async function</span> <span class=\"text-yellow-300\">POST</span>(<span class=\"text-orange-400\">request</span>: Request) {\n <span class=\"text-violet-400\">const</span> body = <span class=\"text-violet-400\">await</span> request.json();\n <span class=\"text-violet-400\">return</span> Response.json({ received: body });\n}</code></pre>\n\n <div class=\"mt-12 p-6 bg-gradient-to-r from-blue-50 to-violet-50 dark:from-blue-950/30 dark:to-violet-950/30 border border-blue-200 dark:border-blue-800 rounded-xl\">\n <h3 class=\"font-semibold text-lg mb-2\">πŸš€ Ready to build?</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Start creating your first page by running:</p>\n <code class=\"bg-white dark:bg-zinc-900 px-4 py-2 rounded-lg border border-zinc-200 dark:border-zinc-700 font-mono text-sm\">touch app/page.tsx</code>\n </div>\n </main>\n </div>\n` + footer;\n}\n\nexport function generateLearnPage(): string {\n return baseStyles.replace('%TITLE%', 'Learn') + header + `\n <main class=\"max-w-4xl mx-auto px-6 py-16\">\n <div class=\"text-center mb-16\">\n <h1 class=\"text-4xl sm:text-5xl font-bold mb-4\">Learn Float.js</h1>\n <p class=\"text-lg text-zinc-600 dark:text-zinc-400 max-w-2xl mx-auto\">\n Follow our step-by-step tutorial to master Float.js and build your first application\n </p>\n </div>\n \n <!-- Tutorial Steps -->\n <div class=\"space-y-6\">\n \n <!-- Step 1 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-blue-100 dark:bg-blue-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-blue-600 dark:text-blue-400\">1</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Create Your Project</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Start by creating a new Float.js project using the CLI</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code>npx create-float@latest my-first-app</code></pre>\n </div>\n </div>\n </div>\n \n <!-- Step 2 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-violet-100 dark:bg-violet-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-violet-600 dark:text-violet-400\">2</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Start the Development Server</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Navigate to your project and start the dev server</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code>cd my-first-app\nnpm run dev</code></pre>\n </div>\n </div>\n </div>\n \n <!-- Step 3 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-emerald-100 dark:bg-emerald-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-emerald-600 dark:text-emerald-400\">3</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Create Your First Page</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Create a page component in the app directory</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code><span class=\"text-zinc-500\">// app/page.tsx</span>\n<span class=\"text-violet-400\">export default</span> <span class=\"text-blue-400\">function</span> <span class=\"text-yellow-300\">HomePage</span>() {\n <span class=\"text-violet-400\">return</span> (\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">main</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>Hello, Float.js!<span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">p</span><span class=\"text-zinc-500\">&gt;</span>Welcome to my first app<span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">p</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">main</span><span class=\"text-zinc-500\">&gt;</span>\n );\n}</code></pre>\n </div>\n </div>\n </div>\n \n <!-- Step 4 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-amber-100 dark:bg-amber-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-amber-600 dark:text-amber-400\">4</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Add an API Route</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Create your backend API with simple handlers</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code><span class=\"text-zinc-500\">// app/api/hello/route.ts</span>\n<span class=\"text-violet-400\">export async function</span> <span class=\"text-yellow-300\">GET</span>() {\n <span class=\"text-violet-400\">return</span> Response.json({\n message: <span class=\"text-emerald-400\">'Hello from the API!'</span>,\n timestamp: <span class=\"text-violet-400\">new</span> Date().toISOString()\n });\n}</code></pre>\n </div>\n </div>\n </div>\n \n <!-- Step 5 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-pink-100 dark:bg-pink-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-pink-600 dark:text-pink-400\">5</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Build for Production</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Ready to deploy? Build your application</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code>npm run build\nnpm start</code></pre>\n </div>\n </div>\n </div>\n \n </div>\n \n <!-- Next Steps -->\n <div class=\"mt-16 text-center\">\n <h2 class=\"text-2xl font-bold mb-4\">What's Next?</h2>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-8\">Explore more features and capabilities</p>\n <div class=\"flex flex-wrap justify-center gap-4\">\n <a href=\"/__docs\" class=\"px-6 py-3 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 font-semibold rounded-xl hover:bg-zinc-800 dark:hover:bg-zinc-100 transition-colors\">\n Read the Docs\n </a>\n <a href=\"/__examples\" class=\"px-6 py-3 bg-zinc-100 dark:bg-zinc-800 text-zinc-900 dark:text-white font-semibold rounded-xl hover:bg-zinc-200 dark:hover:bg-zinc-700 transition-colors\">\n View Examples\n </a>\n </div>\n </div>\n </main>\n` + footer;\n}\n\nexport function generateExamplesPage(): string {\n return baseStyles.replace('%TITLE%', 'Examples') + header + `\n <main class=\"max-w-6xl mx-auto px-6 py-16\">\n <div class=\"text-center mb-16\">\n <h1 class=\"text-4xl sm:text-5xl font-bold mb-4\">Examples</h1>\n <p class=\"text-lg text-zinc-600 dark:text-zinc-400 max-w-2xl mx-auto\">\n Explore example projects to learn common patterns and best practices\n </p>\n </div>\n \n <!-- Examples Grid -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n \n <!-- Basic App -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-blue-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-blue-100 dark:bg-blue-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-blue-600 dark:text-blue-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Basic App</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Simple starter with pages, layouts, and routing</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">React</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">TypeScript</span>\n </div>\n </div>\n \n <!-- Blog -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-violet-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-violet-100 dark:bg-violet-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-violet-600 dark:text-violet-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Blog</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Full blog with MDX, dynamic routes, and SSG</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">MDX</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">SSG</span>\n </div>\n </div>\n \n <!-- API Backend -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-emerald-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-emerald-100 dark:bg-emerald-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-emerald-600 dark:text-emerald-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">API Backend</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">REST API with authentication and database</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">API</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Auth</span>\n </div>\n </div>\n \n <!-- AI Chat -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-pink-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-pink-100 dark:bg-pink-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-pink-600 dark:text-pink-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">AI Chat</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Streaming chat with OpenAI integration</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">AI</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Streaming</span>\n </div>\n </div>\n \n <!-- E-commerce -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-amber-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-amber-100 dark:bg-amber-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-amber-600 dark:text-amber-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">E-commerce</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Store with cart, checkout, and payments</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Stripe</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Cart</span>\n </div>\n </div>\n \n <!-- Dashboard -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-cyan-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-cyan-100 dark:bg-cyan-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-cyan-600 dark:text-cyan-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Dashboard</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Admin panel with charts and real-time data</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Charts</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Realtime</span>\n </div>\n </div>\n \n </div>\n \n <!-- CTA -->\n <div class=\"mt-16 text-center p-8 bg-gradient-to-r from-blue-50 to-violet-50 dark:from-blue-950/30 dark:to-violet-950/30 border border-blue-200 dark:border-blue-800 rounded-2xl\">\n <h2 class=\"text-2xl font-bold mb-4\">Want to contribute?</h2>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-6\">Share your example with the community</p>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"inline-flex items-center gap-2 px-6 py-3 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 font-semibold rounded-xl hover:bg-zinc-800 dark:hover:bg-zinc-100 transition-colors\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>\n View on GitHub\n </a>\n </div>\n </main>\n` + footer;\n}\n","/**\n * Float.js Build System\n * Fast builds with esbuild\n */\n\nimport * as esbuild from 'esbuild';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { scanRoutes, type Route } from '../router/index.js';\nimport { renderPage } from '../server/ssr.js';\n\nexport interface BuildOptions {\n analyze?: boolean;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\nexport interface BuildResult {\n routes: Route[];\n duration: number;\n outputDir: string;\n pages: string[];\n assets: string[];\n}\n\nconst DEFAULT_BUILD_OPTIONS: Required<BuildOptions> = {\n analyze: false,\n minify: true,\n sourcemap: true,\n};\n\nexport async function build(options: BuildOptions = {}): Promise<BuildResult> {\n const opts = { ...DEFAULT_BUILD_OPTIONS, ...options };\n const startTime = Date.now();\n const rootDir = process.cwd();\n const outputDir = path.join(rootDir, '.float');\n\n // Clean output directory\n if (fs.existsSync(outputDir)) {\n fs.rmSync(outputDir, { recursive: true });\n }\n fs.mkdirSync(outputDir, { recursive: true });\n fs.mkdirSync(path.join(outputDir, 'pages'), { recursive: true });\n fs.mkdirSync(path.join(outputDir, 'static'), { recursive: true });\n fs.mkdirSync(path.join(outputDir, 'server'), { recursive: true });\n\n console.log(pc.dim(' Scanning routes...'));\n\n // Scan routes\n const routes = await scanRoutes(rootDir);\n const pageRoutes = routes.filter(r => r.type === 'page' && !r.params.length);\n const dynamicRoutes = routes.filter(r => r.type === 'page' && r.params.length > 0);\n const apiRoutes = routes.filter(r => r.type === 'api');\n\n console.log(pc.dim(` Found ${pageRoutes.length} static pages, ${dynamicRoutes.length} dynamic routes, ${apiRoutes.length} API routes`));\n\n // Build client bundle\n console.log(pc.dim(' Building client bundle...'));\n \n const clientEntryPoints = routes\n .filter(r => r.type === 'page')\n .map(r => r.absolutePath);\n\n if (clientEntryPoints.length > 0) {\n await esbuild.build({\n entryPoints: clientEntryPoints,\n bundle: true,\n outdir: path.join(outputDir, 'static', '_float'),\n format: 'esm',\n splitting: true,\n minify: opts.minify,\n sourcemap: opts.sourcemap,\n target: ['es2020'],\n platform: 'browser',\n jsx: 'automatic',\n loader: {\n '.tsx': 'tsx',\n '.ts': 'ts',\n '.jsx': 'jsx',\n '.js': 'js',\n '.css': 'css',\n '.svg': 'dataurl',\n '.png': 'dataurl',\n '.jpg': 'dataurl',\n },\n external: ['react', 'react-dom'],\n metafile: opts.analyze,\n });\n }\n\n // Build server bundle\n console.log(pc.dim(' Building server bundle...'));\n\n const serverEntryPoints = routes.map(r => r.absolutePath);\n\n if (serverEntryPoints.length > 0) {\n await esbuild.build({\n entryPoints: serverEntryPoints,\n bundle: true,\n outdir: path.join(outputDir, 'server'),\n format: 'esm',\n platform: 'node',\n target: ['node18'],\n jsx: 'automatic',\n minify: false, // Keep server code readable\n sourcemap: true,\n loader: {\n '.tsx': 'tsx',\n '.ts': 'ts',\n '.jsx': 'jsx',\n '.js': 'js',\n },\n external: ['react', 'react-dom', '@float/core'],\n });\n }\n\n // Pre-render static pages (SSG)\n console.log(pc.dim(' Pre-rendering static pages...'));\n const prerenderedPages: string[] = [];\n\n for (const route of pageRoutes) {\n try {\n const html = await renderPage(route, {}, { isDev: false });\n const outputPath = route.path === '/' \n ? path.join(outputDir, 'pages', 'index.html')\n : path.join(outputDir, 'pages', route.path, 'index.html');\n \n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, html);\n prerenderedPages.push(route.path);\n \n console.log(pc.dim(` βœ“ ${route.path}`));\n } catch (error) {\n console.log(pc.yellow(` ⚠ ${route.path} (will render at runtime)`));\n }\n }\n\n // Build API routes for edge\n console.log(pc.dim(' Building API routes...'));\n\n for (const route of apiRoutes) {\n await esbuild.build({\n entryPoints: [route.absolutePath],\n bundle: true,\n outfile: path.join(outputDir, 'server', 'api', `${route.path.replace(/\\//g, '_')}.js`),\n format: 'esm',\n platform: 'neutral', // Edge compatible\n target: ['es2020'],\n minify: true,\n });\n }\n\n // Copy public files\n const publicDir = path.join(rootDir, 'public');\n if (fs.existsSync(publicDir)) {\n console.log(pc.dim(' Copying public assets...'));\n copyDir(publicDir, path.join(outputDir, 'static'));\n }\n\n // Generate routes manifest\n const manifest = {\n version: 1,\n buildTime: new Date().toISOString(),\n routes: routes.map(r => ({\n path: r.path,\n type: r.type,\n filePath: r.filePath,\n absolutePath: path.relative(rootDir, r.absolutePath),\n params: r.params,\n isCatchAll: r.isCatchAll,\n isOptionalCatchAll: r.isOptionalCatchAll,\n layouts: r.layouts.map(l => path.relative(rootDir, l)),\n prerendered: prerenderedPages.includes(r.path),\n })),\n staticPages: prerenderedPages,\n dynamicRoutes: dynamicRoutes.map(r => r.path),\n apiRoutes: apiRoutes.map(r => r.path),\n };\n\n fs.writeFileSync(\n path.join(outputDir, 'routes-manifest.json'),\n JSON.stringify(manifest, null, 2)\n );\n\n // Generate build info\n const duration = Date.now() - startTime;\n \n const buildInfo = {\n duration,\n timestamp: new Date().toISOString(),\n routes: routes.length,\n pages: prerenderedPages.length,\n };\n\n fs.writeFileSync(\n path.join(outputDir, 'build-info.json'),\n JSON.stringify(buildInfo, null, 2)\n );\n\n // Print summary\n console.log('');\n console.log(pc.bold(' Build Summary:'));\n console.log(pc.dim(` Static Pages: ${prerenderedPages.length}`));\n console.log(pc.dim(` Dynamic Routes: ${dynamicRoutes.length}`));\n console.log(pc.dim(` API Routes: ${apiRoutes.length}`));\n console.log(pc.dim(` Output: .float/`));\n\n return {\n routes,\n duration,\n outputDir,\n pages: prerenderedPages,\n assets: [],\n };\n}\n\nfunction copyDir(src: string, dest: string) {\n fs.mkdirSync(dest, { recursive: true });\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath);\n } else {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n}\n","/**\n * Float.js Production Server\n */\n\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport mime from 'mime-types';\nimport { matchRoute, type Route } from '../router/index.js';\nimport { renderPage } from './ssr.js';\n\nexport interface ProdServerOptions {\n port: number;\n host: string;\n}\n\n// Pre-built routes cache\nlet cachedRoutes: Route[] = [];\nlet pageCache = new Map<string, string>();\n\nexport async function startProductionServer(options: ProdServerOptions): Promise<void> {\n const { port, host } = options;\n const rootDir = process.cwd();\n const distDir = path.join(rootDir, '.float');\n const publicDir = path.join(rootDir, 'public');\n\n // Load pre-built routes manifest\n const manifestPath = path.join(distDir, 'routes-manifest.json');\n if (fs.existsSync(manifestPath)) {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));\n cachedRoutes = manifest.routes;\n console.log(pc.dim(` πŸ“¦ Loaded ${cachedRoutes.length} routes from manifest`));\n } else {\n console.error(pc.red(' ❌ No build manifest found. Run `float build` first.'));\n process.exit(1);\n }\n\n // Load pre-rendered pages\n const pagesDir = path.join(distDir, 'pages');\n if (fs.existsSync(pagesDir)) {\n const prerenderedFiles = fs.readdirSync(pagesDir, { recursive: true }) as string[];\n for (const file of prerenderedFiles) {\n if (file.endsWith('.html')) {\n const routePath = '/' + file.replace(/\\.html$/, '').replace(/index$/, '');\n const content = fs.readFileSync(path.join(pagesDir, file), 'utf-8');\n pageCache.set(routePath, content);\n }\n }\n console.log(pc.dim(` πŸ“„ Loaded ${pageCache.size} pre-rendered pages`));\n }\n\n const server = http.createServer(async (req, res) => {\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const pathname = url.pathname;\n\n try {\n // Serve static assets from .float/static\n const staticPath = path.join(distDir, 'static', pathname);\n if (fs.existsSync(staticPath) && fs.statSync(staticPath).isFile()) {\n const content = fs.readFileSync(staticPath);\n const contentType = mime.lookup(staticPath) || 'application/octet-stream';\n res.writeHead(200, { \n 'Content-Type': contentType,\n 'Cache-Control': 'public, max-age=31536000, immutable',\n });\n res.end(content);\n return;\n }\n\n // Serve public files\n const publicFilePath = path.join(publicDir, pathname);\n if (fs.existsSync(publicFilePath) && fs.statSync(publicFilePath).isFile()) {\n const content = fs.readFileSync(publicFilePath);\n const contentType = mime.lookup(publicFilePath) || 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n return;\n }\n\n // Check pre-rendered cache\n const cachedPage = pageCache.get(pathname) || pageCache.get(pathname + '/');\n if (cachedPage) {\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'public, s-maxage=3600, stale-while-revalidate',\n });\n res.end(cachedPage);\n return;\n }\n\n // Match and render route (SSR)\n const { route, params } = matchRoute(pathname, cachedRoutes);\n\n if (!route) {\n res.writeHead(404, { 'Content-Type': 'text/html' });\n res.end('<h1>404 - Not Found</h1>');\n return;\n }\n\n // Handle API routes\n if (route.type === 'api') {\n // API routes handled by edge functions in production\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ message: 'API route' }));\n return;\n }\n\n // SSR render\n const html = await renderPage(route, params, { isDev: false });\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=30',\n });\n res.end(html);\n\n } catch (error) {\n console.error(pc.red('Request error:'), error);\n res.writeHead(500, { 'Content-Type': 'text/html' });\n res.end('<h1>500 - Internal Server Error</h1>');\n }\n });\n\n server.listen(port, host, () => {\n console.log(pc.green(` βœ… Production server running at ${pc.cyan(`http://${host}:${port}`)}\\n`));\n });\n}\n","export const VERSION = '2.0.4';\n"],"mappings":";;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAF9B;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsIO,SAAS,sBAAsB;AACpC,SAAO,CAAC,KAAsB,KAAqB,SAAqB;AACtE,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAG1E,UAAM,cAAc,IAAI,IAAI,KAAK,GAAG;AACpC,QAAI,MAAM,SAAS,OAAa,UAAgB,UAAgB;AAC9D,YAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,qBAAe,WAAW;AAAA,QACxB;AAAA,QACA,QAAQ,IAAI,UAAU;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,QAAQ,IAAI;AAAA,QACZ;AAAA,QACA,WAAW,oBAAI,KAAK;AAAA,MACtB,CAAC;AAED,aAAO,YAAY,OAAO,UAAU,QAAQ;AAAA,IAC9C;AAEA,SAAK;AAAA,EACP;AACF;AAMA,SAAS,sBAAsB,OAAkC;AAC/D,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,WAAW,KAAK,MAAM,QAAQ,YAAY,WAAW,OAAO,IAAI;AACtE,QAAM,cAAc,KAAK,MAAM,QAAQ,YAAY,YAAY,OAAO,IAAI;AAC1E,QAAM,gBAAgB,KAAK,MAAM,QAAQ,SAAS,GAAI;AACtD,QAAM,kBAAkB,gBAAgB,KACpC,GAAG,aAAa,MAChB,gBAAgB,OACd,GAAG,KAAK,MAAM,gBAAgB,EAAE,CAAC,KAAK,gBAAgB,EAAE,MACxD,GAAG,KAAK,MAAM,gBAAgB,IAAI,CAAC,KAAK,KAAK,MAAO,gBAAgB,OAAQ,EAAE,CAAC;AAErF,QAAM,YAAY,MAAM,OAAO,SAAS,IAAI,MAAM,OAAO,CAAC,IAAI;AAC9D,QAAM,gBAAgB,YAClB,IAAI,KAAK,UAAU,SAAS,EAAE,mBAAmB,IACjD;AAEJ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACLnC;AAMO,SAAS,sBAA8B;AAC5C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["path","build","pc","fs","path","path","path","path","fs","dashboardState","createDevDashboard","escapeHtml","esbuild","fs","path","pc","build","path","fs","pc","http","fs","path","pc","mime","path","fs","pc","http","mime","pc","build"]}
1
+ {"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js","../../src/devtools/index.ts","../../src/cli/index.ts","../../src/server/dev-server.ts","../../src/router/index.ts","../../src/server/ssr.ts","../../src/build/transform.ts","../../src/client/float-indicator.ts","../../src/client/error-overlay.ts","../../src/client/welcome-page.ts","../../src/client/docs-pages.ts","../../src/build/css-processor.ts","../../src/build/tailwind-setup.ts","../../src/build/index.ts","../../src/server/prod-server.ts","../../src/version.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Float.js Dev Dashboard\n * Visual development tools integrated into the framework\n * \n * Next.js doesn't have this! πŸš€\n */\n\nimport { IncomingMessage, ServerResponse } from 'http';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface RouteInfo {\n path: string;\n type: 'page' | 'api' | 'layout' | 'error' | 'loading' | 'not-found';\n file: string;\n methods?: string[];\n params?: string[];\n middleware?: boolean;\n}\n\nexport interface BuildInfo {\n duration: number;\n timestamp: Date;\n success: boolean;\n errors?: string[];\n warnings?: string[];\n}\n\nexport interface RequestLog {\n id: string;\n method: string;\n path: string;\n status: number;\n duration: number;\n timestamp: Date;\n headers?: Record<string, string>;\n body?: unknown;\n response?: unknown;\n}\n\nexport interface PerformanceMetrics {\n requests: number;\n avgResponseTime: number;\n errorRate: number;\n activeConnections: number;\n memoryUsage: NodeJS.MemoryUsage;\n uptime: number;\n}\n\nexport interface DevDashboardOptions {\n enabled?: boolean;\n path?: string;\n maxLogs?: number;\n auth?: {\n username: string;\n password: string;\n };\n}\n\n// ============================================================================\n// DEV DASHBOARD STATE\n// ============================================================================\n\nclass DevDashboardState {\n routes: RouteInfo[] = [];\n builds: BuildInfo[] = [];\n requestLogs: RequestLog[] = [];\n startTime: Date = new Date();\n maxLogs: number = 100;\n \n private requestCount = 0;\n private totalResponseTime = 0;\n private errorCount = 0;\n\n addRoute(route: RouteInfo): void {\n const existing = this.routes.findIndex(r => r.path === route.path);\n if (existing >= 0) {\n this.routes[existing] = route;\n } else {\n this.routes.push(route);\n }\n }\n\n addBuild(build: BuildInfo): void {\n this.builds.unshift(build);\n if (this.builds.length > 20) {\n this.builds.pop();\n }\n }\n\n logRequest(log: RequestLog): void {\n this.requestLogs.unshift(log);\n if (this.requestLogs.length > this.maxLogs) {\n this.requestLogs.pop();\n }\n \n this.requestCount++;\n this.totalResponseTime += log.duration;\n if (log.status >= 400) {\n this.errorCount++;\n }\n }\n\n getMetrics(): PerformanceMetrics {\n return {\n requests: this.requestCount,\n avgResponseTime: this.requestCount > 0 \n ? Math.round(this.totalResponseTime / this.requestCount) \n : 0,\n errorRate: this.requestCount > 0 \n ? Math.round((this.errorCount / this.requestCount) * 100) \n : 0,\n activeConnections: 0, // Updated by server\n memoryUsage: process.memoryUsage(),\n uptime: Date.now() - this.startTime.getTime(),\n };\n }\n\n clear(): void {\n this.requestLogs = [];\n this.requestCount = 0;\n this.totalResponseTime = 0;\n this.errorCount = 0;\n }\n}\n\nexport const dashboardState = new DevDashboardState();\n\n// ============================================================================\n// MIDDLEWARE\n// ============================================================================\n\nexport function createRequestLogger() {\n return (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const startTime = Date.now();\n const id = `req_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`;\n\n // Capture response\n const originalEnd = res.end.bind(res);\n res.end = function(chunk?: any, encoding?: any, callback?: any) {\n const duration = Date.now() - startTime;\n \n dashboardState.logRequest({\n id,\n method: req.method || 'GET',\n path: req.url || '/',\n status: res.statusCode,\n duration,\n timestamp: new Date(),\n });\n\n return originalEnd(chunk, encoding, callback);\n } as typeof res.end;\n\n next();\n };\n}\n\n// ============================================================================\n// DASHBOARD HTML\n// ============================================================================\n\nfunction generateDashboardHTML(state: DevDashboardState): string {\n const metrics = state.getMetrics();\n const memoryMB = Math.round(metrics.memoryUsage.heapUsed / 1024 / 1024);\n const memoryTotal = Math.round(metrics.memoryUsage.heapTotal / 1024 / 1024);\n const uptimeSeconds = Math.round(metrics.uptime / 1000);\n const uptimeFormatted = uptimeSeconds < 60 \n ? `${uptimeSeconds}s` \n : uptimeSeconds < 3600 \n ? `${Math.floor(uptimeSeconds / 60)}m ${uptimeSeconds % 60}s`\n : `${Math.floor(uptimeSeconds / 3600)}h ${Math.floor((uptimeSeconds % 3600) / 60)}m`;\n \n const lastBuild = state.builds.length > 0 ? state.builds[0] : null;\n const lastBuildTime = lastBuild \n ? new Date(lastBuild.timestamp).toLocaleTimeString() \n : 'Never';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Float.js Dev Dashboard</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n \n :root {\n --bg-dark: #09090b;\n --bg-card: #18181b;\n --bg-card-hover: #1f1f23;\n --bg-sidebar: #0f0f12;\n --text-primary: #fafafa;\n --text-secondary: #71717a;\n --text-muted: #52525b;\n --accent: #a855f7;\n --accent-glow: rgba(168, 85, 247, 0.15);\n --success: #22c55e;\n --warning: #f59e0b;\n --error: #ef4444;\n --border: #27272a;\n --border-subtle: #1f1f23;\n }\n\n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n background: var(--bg-dark);\n color: var(--text-primary);\n min-height: 100vh;\n display: flex;\n }\n\n /* Sidebar */\n .sidebar {\n width: 280px;\n background: var(--bg-sidebar);\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n position: fixed;\n height: 100vh;\n z-index: 100;\n }\n\n .sidebar-header {\n padding: 1.5rem;\n border-bottom: 1px solid var(--border);\n }\n\n .logo {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .logo-icon {\n width: 40px;\n height: 40px;\n background: linear-gradient(135deg, #a855f7 0%, #ec4899 50%, #f97316 100%);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n font-size: 1.25rem;\n box-shadow: 0 0 20px rgba(168, 85, 247, 0.3);\n }\n\n .logo-text {\n display: flex;\n flex-direction: column;\n }\n\n .logo-title {\n font-weight: 700;\n font-size: 1.125rem;\n background: linear-gradient(135deg, #fff 0%, #a1a1aa 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n .logo-version {\n font-size: 0.75rem;\n color: var(--text-muted);\n font-family: 'JetBrains Mono', monospace;\n }\n\n /* Status Cards */\n .status-section {\n padding: 1.5rem;\n border-bottom: 1px solid var(--border);\n }\n\n .status-grid {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .status-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n background: var(--bg-card);\n border-radius: 10px;\n border: 1px solid var(--border-subtle);\n }\n\n .status-label {\n font-size: 0.8rem;\n color: var(--text-secondary);\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .status-value {\n font-size: 0.875rem;\n font-weight: 600;\n font-family: 'JetBrains Mono', monospace;\n }\n\n .status-value.connected {\n color: var(--success);\n }\n\n .status-value.active {\n color: var(--accent);\n }\n\n .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n animation: pulse 2s infinite;\n }\n\n .status-dot.green { background: var(--success); box-shadow: 0 0 8px var(--success); }\n .status-dot.purple { background: var(--accent); box-shadow: 0 0 8px var(--accent); }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.7; transform: scale(0.95); }\n }\n\n /* Navigation */\n .nav-section {\n padding: 1rem;\n flex: 1;\n }\n\n .nav-label {\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--text-muted);\n padding: 0.5rem 1rem;\n margin-bottom: 0.5rem;\n }\n\n .nav-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n border-radius: 10px;\n color: var(--text-secondary);\n text-decoration: none;\n font-size: 0.875rem;\n font-weight: 500;\n transition: all 0.2s;\n cursor: pointer;\n margin-bottom: 0.25rem;\n }\n\n .nav-item:hover {\n background: var(--bg-card);\n color: var(--text-primary);\n }\n\n .nav-item.active {\n background: var(--accent-glow);\n color: var(--accent);\n border: 1px solid rgba(168, 85, 247, 0.2);\n }\n\n .nav-icon {\n font-size: 1.1rem;\n }\n\n .nav-badge {\n margin-left: auto;\n background: var(--bg-card);\n padding: 0.125rem 0.5rem;\n border-radius: 6px;\n font-size: 0.7rem;\n font-family: 'JetBrains Mono', monospace;\n color: var(--text-muted);\n }\n\n /* Sidebar Footer */\n .sidebar-footer {\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--border);\n }\n\n .docs-link {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem;\n background: linear-gradient(135deg, rgba(168, 85, 247, 0.1), rgba(236, 72, 153, 0.1));\n border: 1px solid rgba(168, 85, 247, 0.2);\n border-radius: 10px;\n color: var(--accent);\n text-decoration: none;\n font-size: 0.875rem;\n font-weight: 500;\n transition: all 0.2s;\n }\n\n .docs-link:hover {\n background: linear-gradient(135deg, rgba(168, 85, 247, 0.2), rgba(236, 72, 153, 0.2));\n transform: translateY(-1px);\n }\n\n /* Main Content */\n .main {\n margin-left: 280px;\n flex: 1;\n padding: 2rem;\n min-height: 100vh;\n }\n\n .page-header {\n margin-bottom: 2rem;\n }\n\n .page-title {\n font-size: 1.75rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n }\n\n .page-subtitle {\n color: var(--text-secondary);\n font-size: 0.9rem;\n }\n\n /* Metrics Grid */\n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 1rem;\n margin-bottom: 2rem;\n }\n\n .metric-card {\n background: var(--bg-card);\n border: 1px solid var(--border-subtle);\n border-radius: 16px;\n padding: 1.5rem;\n transition: all 0.3s;\n position: relative;\n overflow: hidden;\n }\n\n .metric-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 2px;\n background: linear-gradient(90deg, var(--accent), #ec4899);\n opacity: 0;\n transition: opacity 0.3s;\n }\n\n .metric-card:hover {\n border-color: var(--accent);\n transform: translateY(-2px);\n box-shadow: 0 8px 32px rgba(168, 85, 247, 0.1);\n }\n\n .metric-card:hover::before {\n opacity: 1;\n }\n\n .metric-icon {\n font-size: 1.5rem;\n margin-bottom: 1rem;\n }\n\n .metric-value {\n font-size: 2rem;\n font-weight: 700;\n font-family: 'JetBrains Mono', monospace;\n margin-bottom: 0.25rem;\n }\n\n .metric-label {\n font-size: 0.8rem;\n color: var(--text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .metric-change {\n position: absolute;\n top: 1rem;\n right: 1rem;\n font-size: 0.75rem;\n padding: 0.25rem 0.5rem;\n border-radius: 6px;\n font-weight: 500;\n }\n\n .metric-change.up { background: rgba(34, 197, 94, 0.1); color: var(--success); }\n .metric-change.down { background: rgba(239, 68, 68, 0.1); color: var(--error); }\n\n /* Sections */\n .content-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n }\n\n .section {\n background: var(--bg-card);\n border: 1px solid var(--border-subtle);\n border-radius: 16px;\n overflow: hidden;\n }\n\n .section.full-width {\n grid-column: 1 / -1;\n }\n\n .section-header {\n padding: 1.25rem 1.5rem;\n border-bottom: 1px solid var(--border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .section-title {\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .section-badge {\n background: var(--bg-dark);\n padding: 0.25rem 0.75rem;\n border-radius: 8px;\n font-size: 0.75rem;\n color: var(--text-muted);\n font-family: 'JetBrains Mono', monospace;\n }\n\n .section-content {\n max-height: 400px;\n overflow-y: auto;\n }\n\n /* Routes List */\n .route-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid var(--border-subtle);\n transition: background 0.2s;\n }\n\n .route-item:last-child {\n border-bottom: none;\n }\n\n .route-item:hover {\n background: var(--bg-card-hover);\n }\n\n .route-type {\n padding: 0.25rem 0.75rem;\n border-radius: 6px;\n font-size: 0.7rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n min-width: 60px;\n text-align: center;\n }\n\n .route-type.page { background: rgba(59, 130, 246, 0.15); color: #60a5fa; }\n .route-type.api { background: rgba(34, 197, 94, 0.15); color: #4ade80; }\n .route-type.layout { background: rgba(168, 85, 247, 0.15); color: #c084fc; }\n\n .route-path {\n font-family: 'JetBrains Mono', monospace;\n font-size: 0.875rem;\n flex: 1;\n }\n\n .route-file {\n color: var(--text-muted);\n font-size: 0.75rem;\n font-family: 'JetBrains Mono', monospace;\n }\n\n /* Request Logs */\n .log-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0.875rem 1.5rem;\n border-bottom: 1px solid var(--border-subtle);\n font-size: 0.875rem;\n transition: background 0.2s;\n }\n\n .log-item:hover {\n background: var(--bg-card-hover);\n }\n\n .log-method {\n font-weight: 600;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.7rem;\n min-width: 50px;\n text-align: center;\n font-family: 'JetBrains Mono', monospace;\n }\n\n .log-method.GET { background: rgba(59, 130, 246, 0.15); color: #60a5fa; }\n .log-method.POST { background: rgba(34, 197, 94, 0.15); color: #4ade80; }\n .log-method.PUT { background: rgba(245, 158, 11, 0.15); color: #fbbf24; }\n .log-method.DELETE { background: rgba(239, 68, 68, 0.15); color: #f87171; }\n\n .log-status {\n font-weight: 600;\n font-family: 'JetBrains Mono', monospace;\n font-size: 0.8rem;\n }\n\n .log-status.s2xx { color: var(--success); }\n .log-status.s3xx { color: #60a5fa; }\n .log-status.s4xx { color: var(--warning); }\n .log-status.s5xx { color: var(--error); }\n\n .log-path {\n font-family: 'JetBrains Mono', monospace;\n flex: 1;\n color: var(--text-secondary);\n }\n\n .log-duration {\n font-family: 'JetBrains Mono', monospace;\n color: var(--text-muted);\n font-size: 0.8rem;\n }\n\n .log-time {\n color: var(--text-muted);\n font-size: 0.75rem;\n }\n\n /* Empty State */\n .empty-state {\n text-align: center;\n padding: 3rem;\n color: var(--text-muted);\n }\n\n .empty-icon {\n font-size: 2.5rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n /* Scrollbar */\n ::-webkit-scrollbar { width: 6px; }\n ::-webkit-scrollbar-track { background: transparent; }\n ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }\n ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }\n\n /* Responsive */\n @media (max-width: 1200px) {\n .metrics-grid { grid-template-columns: repeat(2, 1fr); }\n .content-grid { grid-template-columns: 1fr; }\n }\n </style>\n</head>\n<body>\n <!-- Sidebar -->\n <aside class=\"sidebar\">\n <div class=\"sidebar-header\">\n <div class=\"logo\">\n <div class=\"logo-icon\">⚑</div>\n <div class=\"logo-text\">\n <span class=\"logo-title\">Float.js</span>\n <span class=\"logo-version\">v2.0.4</span>\n </div>\n </div>\n </div>\n\n <div class=\"status-section\">\n <div class=\"status-grid\">\n <div class=\"status-item\">\n <span class=\"status-label\">\n <span class=\"status-dot green\"></span>\n Estado\n </span>\n <span class=\"status-value connected\">Conectado</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">\n <span class=\"status-dot purple\"></span>\n HMR\n </span>\n <span class=\"status-value active\">Activo</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Último build</span>\n <span class=\"status-value\">${lastBuildTime}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Uptime</span>\n <span class=\"status-value\">${uptimeFormatted}</span>\n </div>\n </div>\n </div>\n\n <nav class=\"nav-section\">\n <div class=\"nav-label\">Dashboard</div>\n <div class=\"nav-item active\">\n <span class=\"nav-icon\">πŸ“Š</span>\n Overview\n </div>\n <div class=\"nav-item\">\n <span class=\"nav-icon\">πŸ›€οΈ</span>\n Routes\n <span class=\"nav-badge\">${state.routes.length}</span>\n </div>\n <div class=\"nav-item\">\n <span class=\"nav-icon\">πŸ“</span>\n Logs\n <span class=\"nav-badge\">${state.requestLogs.length}</span>\n </div>\n <div class=\"nav-item\">\n <span class=\"nav-icon\">βš™οΈ</span>\n Settings\n </div>\n </nav>\n\n <div class=\"sidebar-footer\">\n <a href=\"https://floatjs.dev/docs\" target=\"_blank\" class=\"docs-link\">\n <span>πŸ“š</span>\n Documentation\n </a>\n </div>\n </aside>\n\n <!-- Main Content -->\n <main class=\"main\">\n <div class=\"page-header\">\n <h1 class=\"page-title\">Dev Dashboard</h1>\n <p class=\"page-subtitle\">Monitor your Float.js application in real-time</p>\n </div>\n\n <!-- Metrics -->\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-icon\">πŸ“‘</div>\n <div class=\"metric-value\">${metrics.requests}</div>\n <div class=\"metric-label\">Total Requests</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">⚑</div>\n <div class=\"metric-value\">${metrics.avgResponseTime}ms</div>\n <div class=\"metric-label\">Avg Response</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">πŸ’Ύ</div>\n <div class=\"metric-value\">${memoryMB}/${memoryTotal}</div>\n <div class=\"metric-label\">Memory (MB)</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-icon\">${metrics.errorRate > 0 ? '⚠️' : 'βœ…'}</div>\n <div class=\"metric-value\">${metrics.errorRate}%</div>\n <div class=\"metric-label\">Error Rate</div>\n </div>\n </div>\n\n <!-- Content Grid -->\n <div class=\"content-grid\">\n <!-- Routes -->\n <div class=\"section\">\n <div class=\"section-header\">\n <span class=\"section-title\">πŸ›€οΈ Routes</span>\n <span class=\"section-badge\">${state.routes.length} registered</span>\n </div>\n <div class=\"section-content\">\n ${state.routes.length === 0 ? `\n <div class=\"empty-state\">\n <div class=\"empty-icon\">πŸ›€οΈ</div>\n <p>No routes registered</p>\n </div>\n ` : state.routes.map(route => `\n <div class=\"route-item\">\n <span class=\"route-type ${route.type}\">${route.type}</span>\n <span class=\"route-path\">${route.path}</span>\n <span class=\"route-file\">${route.file.split('/').pop()}</span>\n </div>\n `).join('')}\n </div>\n </div>\n\n <!-- Request Logs -->\n <div class=\"section\">\n <div class=\"section-header\">\n <span class=\"section-title\">πŸ“ Request Logs</span>\n <span class=\"section-badge\">Live</span>\n </div>\n <div class=\"section-content\">\n ${state.requestLogs.length === 0 ? `\n <div class=\"empty-state\">\n <div class=\"empty-icon\">πŸ“</div>\n <p>No requests yet</p>\n </div>\n ` : state.requestLogs.slice(0, 20).map(log => {\n const statusClass = log.status < 300 ? 's2xx' : log.status < 400 ? 's3xx' : log.status < 500 ? 's4xx' : 's5xx';\n return `\n <div class=\"log-item\">\n <span class=\"log-method ${log.method}\">${log.method}</span>\n <span class=\"log-status ${statusClass}\">${log.status}</span>\n <span class=\"log-path\">${log.path}</span>\n <span class=\"log-duration\">${log.duration}ms</span>\n </div>\n `;\n }).join('')}\n </div>\n </div>\n </div>\n </main>\n\n <script>\n // Auto-refresh every 3 seconds\n setTimeout(() => location.reload(), 3000);\n </script>\n</body>\n</html>`;\n}\n\n// ============================================================================\n// DASHBOARD API\n// ============================================================================\n\nfunction generateAPIResponse(state: DevDashboardState): string {\n return JSON.stringify({\n metrics: state.getMetrics(),\n routes: state.routes,\n builds: state.builds.slice(0, 10),\n requestLogs: state.requestLogs.slice(0, 50),\n });\n}\n\n// ============================================================================\n// DASHBOARD HANDLER\n// ============================================================================\n\nexport function createDevDashboard(options: DevDashboardOptions = {}) {\n const {\n enabled = process.env.NODE_ENV !== 'production',\n path = '/__float',\n auth,\n } = options;\n\n if (!enabled) {\n return (_req: IncomingMessage, _res: ServerResponse, next: () => void) => next();\n }\n\n return (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const url = req.url || '';\n \n // Check if this is a dashboard request\n if (!url.startsWith(path)) {\n return next();\n }\n\n // Basic auth if configured\n if (auth) {\n const authHeader = req.headers.authorization;\n if (!authHeader || !authHeader.startsWith('Basic ')) {\n res.setHeader('WWW-Authenticate', 'Basic realm=\"Float.js Dev Dashboard\"');\n res.statusCode = 401;\n res.end('Unauthorized');\n return;\n }\n\n const credentials = Buffer.from(authHeader.slice(6), 'base64').toString();\n const [username, password] = credentials.split(':');\n \n if (username !== auth.username || password !== auth.password) {\n res.statusCode = 401;\n res.end('Invalid credentials');\n return;\n }\n }\n\n // Route dashboard requests\n const subPath = url.slice(path.length);\n\n if (subPath === '' || subPath === '/') {\n // Main dashboard\n res.setHeader('Content-Type', 'text/html');\n res.end(generateDashboardHTML(dashboardState));\n return;\n }\n\n if (subPath === '/api' || subPath === '/api/') {\n // API endpoint\n res.setHeader('Content-Type', 'application/json');\n res.end(generateAPIResponse(dashboardState));\n return;\n }\n\n if (subPath === '/api/routes') {\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(dashboardState.routes));\n return;\n }\n\n if (subPath === '/api/metrics') {\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(dashboardState.getMetrics()));\n return;\n }\n\n if (subPath === '/api/logs') {\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(dashboardState.requestLogs.slice(0, 100)));\n return;\n }\n\n if (subPath === '/api/clear' && req.method === 'POST') {\n dashboardState.clear();\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ success: true }));\n return;\n }\n\n // 404 for unknown dashboard routes\n res.statusCode = 404;\n res.end('Not found');\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport const devtools = {\n dashboard: createDevDashboard,\n logger: createRequestLogger,\n state: dashboardState,\n \n // Helpers for manual logging\n logRoute: (route: RouteInfo) => dashboardState.addRoute(route),\n logBuild: (build: BuildInfo) => dashboardState.addBuild(build),\n logRequest: (log: RequestLog) => dashboardState.logRequest(log),\n getMetrics: () => dashboardState.getMetrics(),\n clear: () => dashboardState.clear(),\n};\n","/**\n * Float.js CLI\n * Ultra Modern Web Framework\n */\n\nimport { cac } from 'cac';\nimport pc from 'picocolors';\nimport { createDevServer } from '../server/dev-server.js';\nimport { build } from '../build/index.js';\nimport { startProductionServer } from '../server/prod-server.js';\nimport { VERSION } from '../version.js';\n\nconst cli = cac('float');\n\n// ASCII Art Banner\nconst banner = `\n${pc.cyan('╔═══════════════════════════════════════╗')}\n${pc.cyan('β•‘')} ${pc.bold(pc.magenta('⚑ Float.js'))} ${pc.dim(`v${VERSION}`)} ${pc.cyan('β•‘')}\n${pc.cyan('β•‘')} ${pc.dim('Ultra Modern Web Framework')} ${pc.cyan('β•‘')}\n${pc.cyan('β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•')}\n`;\n\n// float dev - Development server\ncli\n .command('dev', 'Start development server')\n .option('-p, --port <port>', 'Port to listen on', { default: 3000 })\n .option('-h, --host <host>', 'Host to bind to', { default: 'localhost' })\n .option('--open', 'Open browser on start', { default: false })\n .action(async (options) => {\n console.log(banner);\n console.log(pc.cyan('πŸš€ Starting development server...\\n'));\n \n try {\n const server = await createDevServer({\n port: Number(options.port),\n host: options.host,\n open: options.open,\n });\n \n await server.start();\n } catch (error) {\n console.error(pc.red('❌ Failed to start dev server:'), error);\n process.exit(1);\n }\n });\n\n// float build - Build for production\ncli\n .command('build', 'Build for production')\n .option('--analyze', 'Analyze bundle size', { default: false })\n .action(async (options) => {\n console.log(banner);\n console.log(pc.cyan('πŸ“¦ Building for production...\\n'));\n \n try {\n const startTime = Date.now();\n await build({ analyze: options.analyze });\n const duration = Date.now() - startTime;\n \n console.log(pc.green(`\\nβœ… Build completed in ${duration}ms`));\n } catch (error) {\n console.error(pc.red('❌ Build failed:'), error);\n process.exit(1);\n }\n });\n\n// float start - Production server\ncli\n .command('start', 'Start production server')\n .option('-p, --port <port>', 'Port to listen on', { default: 3000 })\n .option('-h, --host <host>', 'Host to bind to', { default: '0.0.0.0' })\n .action(async (options) => {\n console.log(banner);\n console.log(pc.cyan('🌐 Starting production server...\\n'));\n \n try {\n await startProductionServer({\n port: Number(options.port),\n host: options.host,\n });\n } catch (error) {\n console.error(pc.red('❌ Failed to start server:'), error);\n process.exit(1);\n }\n });\n\n// float info - Show environment info\ncli\n .command('info', 'Show environment information')\n .action(() => {\n console.log(banner);\n console.log(pc.bold('Environment Info:\\n'));\n console.log(` ${pc.dim('Float.js:')} v${VERSION}`);\n console.log(` ${pc.dim('Node.js:')} ${process.version}`);\n console.log(` ${pc.dim('Platform:')} ${process.platform}`);\n console.log(` ${pc.dim('Arch:')} ${process.arch}`);\n console.log(` ${pc.dim('CWD:')} ${process.cwd()}`);\n });\n\ncli.help();\ncli.version(VERSION);\n\ncli.parse();\n","/**\n * Float.js Development Server\n * Fast development experience with HMR\n */\n\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport chokidar from 'chokidar';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport mime from 'mime-types';\nimport { scanRoutes, matchRoute, type Route } from '../router/index.js';\nimport { renderPage } from './ssr.js';\nimport { transformFile } from '../build/transform.js';\nimport { FLOAT_INDICATOR_SCRIPT } from '../client/float-indicator.js';\nimport { FLOAT_ERROR_OVERLAY } from '../client/error-overlay.js';\nimport { generateWelcomePage } from '../client/welcome-page.js';\nimport { generateDocsPage, generateLearnPage, generateExamplesPage } from '../client/docs-pages.js';\nimport { processCSS, needsCSSProcessing } from '../build/css-processor.js';\nimport { setupTailwind, checkTailwindSetup, getTailwindInstallCommand } from '../build/tailwind-setup.js';\n\nexport interface DevServerOptions {\n port: number;\n host: string;\n open?: boolean;\n}\n\nexport interface DevServer {\n start: () => Promise<void>;\n stop: () => Promise<void>;\n restart: () => Promise<void>;\n}\n\nexport async function createDevServer(options: DevServerOptions): Promise<DevServer> {\n const { port, host, open } = options;\n const rootDir = process.cwd();\n const publicDir = path.join(rootDir, 'public');\n \n let routes: Route[] = [];\n let server: http.Server | null = null;\n let wss: WebSocketServer | null = null;\n const clients = new Set<WebSocket>();\n\n // Scan routes on startup\n async function refreshRoutes() {\n try {\n routes = await scanRoutes(rootDir);\n console.log(pc.dim(` πŸ“ Found ${routes.length} routes`));\n \n // Auto-setup Tailwind if needed\n const tailwindConfig = checkTailwindSetup(rootDir);\n if (tailwindConfig.needsSetup) {\n console.log(pc.yellow(' ⚠️ Tailwind not configured'));\n const installCmd = getTailwindInstallCommand(rootDir);\n if (installCmd) {\n console.log(pc.dim(` πŸ’‘ Run: ${installCmd}`));\n console.log(pc.dim(` πŸ’‘ Then: npx float dev`));\n } else {\n // Setup files automatically\n await setupTailwind(rootDir);\n }\n }\n } catch (error) {\n console.error(pc.red('Failed to scan routes:'), error);\n }\n }\n\n // Notify all clients to reload\n function notifyClients(type: 'reload' | 'update' | 'error' | 'clear-errors' | 'building', data?: any) {\n const message = JSON.stringify({ type, data, error: data?.error, timestamp: Date.now() });\n clients.forEach(client => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(message);\n }\n });\n }\n\n // HMR client script injected into HTML\n const hmrClientScript = `\n<script>\n(function() {\n const ws = new WebSocket('ws://${host}:${port + 1}');\n \n ws.onmessage = function(event) {\n const data = JSON.parse(event.data);\n \n // Update Float indicator if available\n if (window.__FLOAT_UPDATE_STATUS) {\n window.__FLOAT_UPDATE_STATUS(data);\n }\n \n if (data.type === 'reload') {\n console.log('[Float HMR] Reloading...');\n window.location.reload();\n }\n if (data.type === 'update') {\n console.log('[Float HMR] Update received:', data.data);\n }\n if (data.type === 'error' && window.__FLOAT_SHOW_ERROR) {\n window.__FLOAT_SHOW_ERROR(data.error);\n }\n if (data.type === 'clear-errors' && window.__FLOAT_CLEAR_ERRORS) {\n window.__FLOAT_CLEAR_ERRORS();\n }\n };\n \n ws.onopen = function() {\n console.log('[Float HMR] Connected');\n if (window.__FLOAT_SET_CONNECTED) {\n window.__FLOAT_SET_CONNECTED(true);\n }\n };\n \n ws.onclose = function() {\n console.log('[Float HMR] Disconnected. Attempting reconnect...');\n if (window.__FLOAT_SET_CONNECTED) {\n window.__FLOAT_SET_CONNECTED(false);\n }\n setTimeout(() => window.location.reload(), 1000);\n };\n})();\n</script>\n${FLOAT_INDICATOR_SCRIPT}\n${FLOAT_ERROR_OVERLAY}\n`;\n\n // Request handler\n async function handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ) {\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const pathname = url.pathname;\n\n console.log(pc.dim(` ${req.method} ${pathname}`));\n\n try {\n // Serve static files from public/\n const publicFilePath = path.join(publicDir, pathname);\n if (fs.existsSync(publicFilePath) && fs.statSync(publicFilePath).isFile()) {\n const content = fs.readFileSync(publicFilePath);\n const contentType = mime.lookup(publicFilePath) || 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n return;\n }\n\n // Serve CSS files (with processing for Tailwind)\n if (pathname.endsWith('.css')) {\n const cssPath = path.join(rootDir, 'app', pathname.replace(/^\\//, ''));\n if (fs.existsSync(cssPath)) {\n try {\n const needsProcessing = needsCSSProcessing(cssPath, rootDir);\n if (needsProcessing) {\n const result = await processCSS(cssPath, rootDir);\n res.writeHead(200, { \n 'Content-Type': 'text/css',\n 'Cache-Control': 'no-cache',\n });\n res.end(result.code);\n } else {\n const content = fs.readFileSync(cssPath, 'utf-8');\n res.writeHead(200, { \n 'Content-Type': 'text/css',\n 'Cache-Control': 'no-cache',\n });\n res.end(content);\n }\n return;\n } catch (error) {\n console.error(pc.red('CSS processing error:'), error);\n // Fallback to raw CSS\n const content = fs.readFileSync(cssPath, 'utf-8');\n res.writeHead(200, { 'Content-Type': 'text/css' });\n res.end(content);\n return;\n }\n }\n }\n\n // Serve /_float/ internal assets\n if (pathname.startsWith('/_float/')) {\n // Handle internal float assets\n res.writeHead(200, { 'Content-Type': 'application/javascript' });\n res.end('// Float.js internal asset');\n return;\n }\n\n // Serve Dev Dashboard at /__float\n if (pathname === '/__float' || pathname.startsWith('/__float/')) {\n const { dashboardState } = await import('../devtools/index.js');\n \n // Sync current routes to dashboard\n dashboardState.routes = routes.map(r => ({\n path: r.path,\n type: r.type,\n file: r.filePath || r.absolutePath,\n hasLayout: r.layouts && r.layouts.length > 0\n }));\n \n // Use the dashboard handler via middleware pattern\n const { createDevDashboard } = await import('../devtools/index.js');\n const handler = createDevDashboard({ path: '/__float' });\n \n handler(req, res, () => {\n res.writeHead(404);\n res.end('Not Found');\n });\n return;\n }\n\n // Match route\n const { route, params } = matchRoute(pathname, routes);\n\n // Show welcome page if no routes configured and visiting root\n if (!route && pathname === '/' && routes.length === 0) {\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(generateWelcomePage());\n return;\n }\n\n // Internal Float.js pages (docs, learn, examples)\n if (pathname === '/__docs') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(generateDocsPage());\n return;\n }\n if (pathname === '/__learn') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(generateLearnPage());\n return;\n }\n if (pathname === '/__examples') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(generateExamplesPage());\n return;\n }\n\n if (!route) {\n res.writeHead(404, { 'Content-Type': 'text/html' });\n res.end(create404Page(pathname));\n return;\n }\n\n // Handle API routes\n if (route.type === 'api') {\n await handleApiRoute(req, res, route, params);\n return;\n }\n\n // Render page with SSR\n const html = await renderPage(route, params, { \n hmrScript: hmrClientScript,\n isDev: true,\n });\n\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(html);\n\n } catch (error) {\n console.error(pc.red('Request error:'), error);\n res.writeHead(500, { 'Content-Type': 'text/html' });\n res.end(createErrorPage(error as Error));\n }\n }\n\n // Handle API routes\n async function handleApiRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n route: Route,\n params: Record<string, string>\n ) {\n try {\n const module = await transformFile(route.absolutePath);\n const method = req.method?.toUpperCase() || 'GET';\n \n // Create Request object\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const body = await getRequestBody(req);\n \n const request = new Request(url.toString(), {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).filter(([_, v]) => v !== undefined) as [string, string][]\n ),\n body: method !== 'GET' && method !== 'HEAD' ? body : undefined,\n });\n\n // Find handler\n const handler = module[method] || module.default;\n \n if (!handler) {\n res.writeHead(405, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Method not allowed' }));\n return;\n }\n\n // Execute handler\n const response: Response = await handler(request, { params });\n \n // Send response\n res.writeHead(response.status, Object.fromEntries(response.headers));\n const responseBody = await response.text();\n res.end(responseBody);\n\n } catch (error) {\n console.error(pc.red('API route error:'), error);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Internal server error' }));\n }\n }\n\n async function start() {\n await refreshRoutes();\n\n // Create HTTP server\n server = http.createServer(handleRequest);\n \n // Create WebSocket server for HMR\n wss = new WebSocketServer({ port: port + 1 });\n wss.on('connection', (ws) => {\n clients.add(ws);\n ws.on('close', () => clients.delete(ws));\n });\n\n // Watch for file changes\n const watcher = chokidar.watch(\n [\n path.join(rootDir, 'app/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'components/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'lib/**/*.{ts,tsx,js,jsx}'),\n ],\n {\n ignored: /node_modules/,\n persistent: true,\n }\n );\n\n watcher.on('change', async (filePath) => {\n console.log(pc.yellow(`\\n ⚑ File changed: ${path.relative(rootDir, filePath)}`));\n \n // Check if it's a route file\n if (filePath.includes('/app/')) {\n await refreshRoutes();\n }\n \n notifyClients('reload');\n });\n\n watcher.on('add', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.green(`\\n βž• File added: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n watcher.on('unlink', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.red(`\\n βž– File removed: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n // Start server\n return new Promise<void>((resolve, reject) => {\n server!.listen(port, host, () => {\n console.log(pc.green(` βœ… Server running at ${pc.cyan(`http://${host}:${port}`)}`));\n console.log(pc.dim(` ⚑ HMR enabled on ws://${host}:${port + 1}\\n`));\n \n // Print routes\n console.log(pc.bold(' Routes:'));\n routes.forEach(route => {\n if (route.type === 'page') {\n console.log(pc.dim(` ${pc.green('●')} ${route.path}`));\n } else if (route.type === 'api') {\n console.log(pc.dim(` ${pc.blue('β—†')} ${route.path} (API)`));\n }\n });\n console.log('');\n\n if (open) {\n import('child_process').then(({ exec }) => {\n exec(`open http://${host}:${port}`);\n });\n }\n\n resolve();\n });\n\n server!.on('error', reject);\n });\n }\n\n async function stop() {\n return new Promise<void>((resolve) => {\n wss?.close();\n server?.close(() => resolve());\n });\n }\n\n async function restart() {\n await stop();\n await start();\n }\n\n return { start, stop, restart };\n}\n\n// Helper functions\nfunction getRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', chunk => body += chunk);\n req.on('end', () => resolve(body));\n req.on('error', reject);\n });\n}\n\nfunction create404Page(pathname: string): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>404 - Not Found | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);\n color: white;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .container { text-align: center; padding: 2rem; }\n h1 { font-size: 8rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); \n -webkit-background-clip: text; -webkit-text-fill-color: transparent; }\n h2 { font-size: 1.5rem; margin: 1rem 0; opacity: 0.8; }\n code { background: rgba(255,255,255,0.1); padding: 0.5rem 1rem; border-radius: 0.5rem; }\n .tip { margin-top: 2rem; opacity: 0.6; font-size: 0.9rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <code>${pathname}</code>\n <p class=\"tip\">Create <code>app${pathname === '/' ? '' : pathname}/page.tsx</code> to add this route</p>\n </div>\n</body>\n</html>`;\n}\n\nfunction createErrorPage(error: Error): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Error | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: 'Monaco', 'Menlo', monospace;\n background: #1a1a1a;\n color: #ff6b6b;\n min-height: 100vh;\n padding: 2rem;\n }\n .header { display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem; }\n .icon { font-size: 2rem; }\n h1 { font-size: 1.5rem; }\n .message { color: #ffa94d; font-size: 1.25rem; margin-bottom: 1rem; }\n .stack { \n background: #2d2d2d; \n padding: 1rem; \n border-radius: 0.5rem; \n overflow-x: auto;\n color: #888;\n font-size: 0.875rem;\n line-height: 1.6;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <span class=\"icon\">⚠️</span>\n <h1>Server Error</h1>\n </div>\n <p class=\"message\">${escapeHtml(error.message)}</p>\n <pre class=\"stack\">${escapeHtml(error.stack || '')}</pre>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n","/**\n * Float.js Router\n * File-based routing system\n */\n\nimport fg from 'fast-glob';\nimport path from 'node:path';\n\nexport interface Route {\n /** URL path pattern (e.g., /users/:id) */\n path: string;\n /** File path relative to app directory */\n filePath: string;\n /** Absolute file path */\n absolutePath: string;\n /** Route type */\n type: 'page' | 'layout' | 'api' | 'error' | 'loading';\n /** Dynamic segments */\n params: string[];\n /** Is catch-all route */\n isCatchAll: boolean;\n /** Is optional catch-all */\n isOptionalCatchAll: boolean;\n /** Nested layouts */\n layouts: string[];\n}\n\nexport interface RouterOptions {\n /** Root directory of the app (default: 'app') */\n appDir?: string;\n /** Base path for all routes */\n basePath?: string;\n /** File extensions to consider */\n extensions?: string[];\n}\n\nconst DEFAULT_OPTIONS: Required<RouterOptions> = {\n appDir: 'app',\n basePath: '',\n extensions: ['.tsx', '.ts', '.jsx', '.js'],\n};\n\n/**\n * Convert file path to URL path\n * \n * Examples:\n * - app/page.tsx -> /\n * - app/about/page.tsx -> /about\n * - app/users/[id]/page.tsx -> /users/:id\n * - app/docs/[...slug]/page.tsx -> /docs/*\n * - app/shop/[[...slug]]/page.tsx -> /shop/*?\n */\nfunction filePathToUrlPath(filePath: string, appDir: string): { \n urlPath: string; \n params: string[];\n isCatchAll: boolean;\n isOptionalCatchAll: boolean;\n} {\n // Remove app dir prefix and file name\n let urlPath = filePath\n .replace(new RegExp(`^${appDir}/`), '')\n .replace(/\\/?(page|layout|route|error|loading|not-found)\\.(tsx?|jsx?)$/, '');\n\n const params: string[] = [];\n let isCatchAll = false;\n let isOptionalCatchAll = false;\n\n // Convert [param] to :param\n urlPath = urlPath.replace(/\\[([^\\]]+)\\]/g, (_, param) => {\n // Optional catch-all [[...slug]]\n if (param.startsWith('...') && filePath.includes('[[')) {\n isOptionalCatchAll = true;\n const paramName = param.replace('...', '');\n params.push(paramName);\n return `*${paramName}?`;\n }\n // Catch-all [...slug]\n if (param.startsWith('...')) {\n isCatchAll = true;\n const paramName = param.replace('...', '');\n params.push(paramName);\n return `*${paramName}`;\n }\n // Regular dynamic param [id]\n params.push(param);\n return `:${param}`;\n });\n\n // Ensure leading slash\n urlPath = '/' + urlPath;\n \n // Clean up double slashes and trailing slash\n urlPath = urlPath.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\n\n return { urlPath, params, isCatchAll, isOptionalCatchAll };\n}\n\n/**\n * Determine route type from file name\n */\nfunction getRouteType(filePath: string): Route['type'] {\n // Check if file name (without path) matches special file types\n const fileName = filePath.split('/').pop() || filePath;\n \n if (fileName.match(/^route\\.(tsx?|jsx?)$/)) return 'api';\n if (fileName.match(/^layout\\.(tsx?|jsx?)$/)) return 'layout';\n if (fileName.match(/^error\\.(tsx?|jsx?)$/)) return 'error';\n if (fileName.match(/^loading\\.(tsx?|jsx?)$/)) return 'loading';\n return 'page';\n}\n\n/**\n * Find all layouts that apply to a route\n */\nfunction findLayouts(routePath: string, allLayouts: Map<string, string>): string[] {\n const layouts: string[] = [];\n const segments = routePath.split('/').filter(Boolean);\n \n // Check from root to deepest\n let currentPath = '';\n \n // Root layout\n if (allLayouts.has('/')) {\n layouts.push(allLayouts.get('/')!);\n }\n \n for (const segment of segments) {\n currentPath += '/' + segment;\n if (allLayouts.has(currentPath)) {\n layouts.push(allLayouts.get(currentPath)!);\n }\n }\n \n return layouts;\n}\n\n/**\n * Scan app directory and build routes\n */\nexport async function scanRoutes(\n rootDir: string,\n options: RouterOptions = {}\n): Promise<Route[]> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const appDir = path.join(rootDir, opts.appDir);\n const extensions = opts.extensions.map(ext => ext.replace('.', '')).join(',');\n\n // Find all route files\n const pattern = `**/{page,layout,route,error,loading}.{${extensions}}`;\n const files = await fg(pattern, {\n cwd: appDir,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/_*/**'],\n });\n\n // First pass: collect all layouts\n const layoutMap = new Map<string, string>();\n \n for (const file of files) {\n const type = getRouteType(file);\n if (type === 'layout') {\n const { urlPath } = filePathToUrlPath(file, '');\n const layoutPath = urlPath === '/' ? '/' : urlPath.replace(/\\/layout$/, '') || '/';\n layoutMap.set(layoutPath, path.join(appDir, file));\n }\n }\n\n // Second pass: build all routes (only pages and API routes)\n const routes: Route[] = [];\n\n for (const file of files) {\n const type = getRouteType(file);\n \n // Skip layouts, errors, loading - they are not matchable routes\n if (type === 'layout' || type === 'error' || type === 'loading') {\n continue;\n }\n const { urlPath, params, isCatchAll, isOptionalCatchAll } = filePathToUrlPath(file, '');\n \n const route: Route = {\n path: opts.basePath + urlPath,\n filePath: file,\n absolutePath: path.join(appDir, file),\n type,\n params,\n isCatchAll,\n isOptionalCatchAll,\n layouts: type === 'page' ? findLayouts(urlPath, layoutMap) : [],\n };\n\n routes.push(route);\n }\n\n // Sort routes: static first, then dynamic, catch-all last\n routes.sort((a, b) => {\n if (a.isCatchAll !== b.isCatchAll) return a.isCatchAll ? 1 : -1;\n if (a.params.length !== b.params.length) return a.params.length - b.params.length;\n return a.path.localeCompare(b.path);\n });\n\n return routes;\n}\n\n/**\n * Match a URL path to a route\n */\nexport function matchRoute(url: string, routes: Route[]): { \n route: Route | null; \n params: Record<string, string>;\n} {\n const urlParts = url.split('/').filter(Boolean);\n\n for (const route of routes) {\n if (route.type !== 'page' && route.type !== 'api') continue;\n\n const routeParts = route.path.split('/').filter(Boolean);\n const params: Record<string, string> = {};\n let matched = true;\n let urlIndex = 0;\n\n for (let i = 0; i < routeParts.length; i++) {\n const routePart = routeParts[i];\n\n // Catch-all\n if (routePart.startsWith('*')) {\n const paramName = routePart.replace(/^\\*/, '').replace(/\\?$/, '');\n params[paramName] = urlParts.slice(urlIndex).join('/');\n return { route, params };\n }\n\n // Dynamic segment\n if (routePart.startsWith(':')) {\n const paramName = routePart.slice(1);\n if (urlIndex >= urlParts.length) {\n matched = false;\n break;\n }\n params[paramName] = urlParts[urlIndex];\n urlIndex++;\n continue;\n }\n\n // Static segment\n if (urlParts[urlIndex] !== routePart) {\n matched = false;\n break;\n }\n urlIndex++;\n }\n\n // Check if we consumed all URL parts\n if (matched && urlIndex === urlParts.length) {\n return { route, params };\n }\n }\n\n return { route: null, params: {} };\n}\n\nexport type { Route as FloatRoute, RouterOptions as FloatRouterOptions };\n","/**\n * Float.js SSR Engine\n * Server-Side Rendering with React 18 Streaming\n */\n\nimport React from 'react';\nimport { renderToPipeableStream, renderToString } from 'react-dom/server';\nimport { Writable } from 'node:stream';\nimport type { Route } from '../router/index.js';\nimport { transformFile } from '../build/transform.js';\n\nexport interface RenderOptions {\n hmrScript?: string;\n isDev?: boolean;\n streaming?: boolean;\n}\n\nexport interface PageProps {\n params: Record<string, string>;\n searchParams: Record<string, string>;\n}\n\n/**\n * Render a page to HTML string\n */\nexport async function renderPage(\n route: Route,\n params: Record<string, string>,\n options: RenderOptions = {}\n): Promise<string> {\n const { hmrScript = '', isDev = false, streaming = false } = options;\n void streaming; // Reserved for future streaming implementation\n\n try {\n // Load the page component\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n throw new Error(`No default export found in ${route.filePath}`);\n }\n\n // Load layouts (from root to current)\n const layouts = await Promise.all(\n route.layouts.map(async (layoutPath) => {\n const layoutModule = await transformFile(layoutPath);\n return layoutModule.default;\n })\n );\n\n // Get metadata if exported\n const metadata = pageModule.metadata || {};\n const generateMetadata = pageModule.generateMetadata;\n \n let pageMetadata = metadata;\n if (generateMetadata) {\n pageMetadata = await generateMetadata({ params });\n }\n\n // Create props\n const props: PageProps = {\n params,\n searchParams: {},\n };\n\n // Build component tree with layouts\n let element: React.ReactElement = React.createElement(PageComponent, props);\n \n // Wrap with layouts (innermost to outermost)\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i];\n if (Layout) {\n element = React.createElement(Layout, { children: element }) as React.ReactElement;\n }\n }\n\n // Render to HTML\n const content = renderToString(element);\n\n // Generate full HTML document\n const html = generateHtmlDocument({\n content,\n metadata: pageMetadata,\n hmrScript: isDev ? hmrScript : '',\n isDev,\n });\n\n return html;\n\n } catch (error) {\n console.error('SSR Error:', error);\n throw error;\n }\n}\n\n/**\n * Render with streaming (React 18 Suspense)\n */\nexport async function renderPageStream(\n route: Route,\n params: Record<string, string>,\n _options: RenderOptions = {}\n): Promise<NodeJS.ReadableStream> {\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n const props: PageProps = { params, searchParams: {} };\n const element = React.createElement(PageComponent, props);\n\n return new Promise((resolve, reject) => {\n let html = '';\n \n const writable = new Writable({\n write(chunk, _encoding, callback) {\n html += chunk.toString();\n callback();\n },\n final(callback) {\n callback();\n }\n });\n\n const { pipe, abort } = renderToPipeableStream(element, {\n onShellReady() {\n pipe(writable);\n },\n onShellError(error) {\n reject(error);\n },\n onAllReady() {\n resolve(writable as any);\n },\n onError(error) {\n console.error('Streaming error:', error);\n }\n });\n\n // Timeout after 10 seconds\n setTimeout(() => abort(), 10000);\n });\n}\n\ninterface HtmlDocumentOptions {\n content: string;\n metadata: Record<string, any>;\n hmrScript: string;\n isDev: boolean;\n styles?: string;\n scripts?: string[];\n}\n\n/**\n * Generate full HTML document\n */\nfunction generateHtmlDocument(options: HtmlDocumentOptions): string {\n const { content, metadata, hmrScript, isDev, styles = '', scripts = [] } = options;\n \n // Handle title which can be string or object with default/template\n let title = 'Float.js App';\n if (metadata.title) {\n if (typeof metadata.title === 'string') {\n title = metadata.title;\n } else if (typeof metadata.title === 'object' && metadata.title.default) {\n title = metadata.title.default;\n }\n }\n \n const description = metadata.description || '';\n const charset = metadata.charset || 'utf-8';\n const viewport = metadata.viewport || 'width=device-width, initial-scale=1';\n\n // Generate meta tags\n const metaTags = generateMetaTags(metadata);\n\n return `<!DOCTYPE html>\n<html lang=\"${metadata.lang || 'en'}\">\n<head>\n <meta charset=\"${charset}\">\n <meta name=\"viewport\" content=\"${viewport}\">\n <title>${escapeHtml(title)}</title>\n ${description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''}\n ${metaTags}\n <meta name=\"generator\" content=\"Float.js\">\n <style>\n /* Float.js Base Styles */\n *, *::before, *::after { box-sizing: border-box; }\n html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }\n body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }\n ${styles}\n </style>\n ${isDev ? `\n <style>\n /* Dev mode indicator */\n body::after {\n content: 'DEV';\n position: fixed;\n bottom: 8px;\n right: 8px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n font-size: 10px;\n font-weight: bold;\n padding: 4px 8px;\n border-radius: 4px;\n z-index: 99999;\n font-family: monospace;\n }\n </style>\n ` : ''}\n</head>\n<body>\n <div id=\"__float\">${content}</div>\n ${hmrScript}\n ${scripts.map(src => `<script src=\"${src}\"></script>`).join('\\n ')}\n</body>\n</html>`;\n}\n\n/**\n * Generate meta tags from metadata object\n */\nfunction generateMetaTags(metadata: Record<string, any>): string {\n const tags: string[] = [];\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.image) tags.push(`<meta property=\"og:image\" content=\"${escapeHtml(og.image)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${escapeHtml(og.url)}\">`);\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${escapeHtml(og.type)}\">`);\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${escapeHtml(tw.card)}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.image) tags.push(`<meta name=\"twitter:image\" content=\"${escapeHtml(tw.image)}\">`);\n }\n\n // Robots\n if (metadata.robots) {\n const robots = typeof metadata.robots === 'string' \n ? metadata.robots \n : Object.entries(metadata.robots).map(([k, v]) => v ? k : `no${k}`).join(', ');\n tags.push(`<meta name=\"robots\" content=\"${escapeHtml(robots)}\">`);\n }\n\n // Icons\n if (metadata.icons) {\n const icons = metadata.icons;\n if (icons.icon) tags.push(`<link rel=\"icon\" href=\"${escapeHtml(icons.icon)}\">`);\n if (icons.apple) tags.push(`<link rel=\"apple-touch-icon\" href=\"${escapeHtml(icons.apple)}\">`);\n }\n\n // Canonical\n if (metadata.canonical) {\n tags.push(`<link rel=\"canonical\" href=\"${escapeHtml(metadata.canonical)}\">`);\n }\n\n return tags.join('\\n ');\n}\n\nfunction escapeHtml(text: string): string {\n return String(text)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nexport type { PageProps as FloatPageProps };\n","/**\n * Float.js Transform\n * On-the-fly TypeScript/JSX transformation\n */\n\nimport * as esbuild from 'esbuild';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\n// Module cache for dev mode\nconst moduleCache = new Map<string, { module: any; mtime: number }>();\n\n/**\n * Transform and import a file\n * Handles .ts, .tsx, .js, .jsx files\n */\nexport async function transformFile(filePath: string): Promise<any> {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n \n // Check if file exists\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n const stats = fs.statSync(absolutePath);\n const mtime = stats.mtimeMs;\n\n // Check cache\n const cached = moduleCache.get(absolutePath);\n if (cached && cached.mtime === mtime) {\n return cached.module;\n }\n\n // Read source\n const source = fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath);\n\n // Determine loader\n const loader = getLoader(ext);\n\n // Transform with esbuild\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: absolutePath,\n });\n\n // Create temporary file for import\n const tempDir = path.join(process.cwd(), '.float', '.cache');\n fs.mkdirSync(tempDir, { recursive: true });\n \n const tempFile = path.join(tempDir, `${path.basename(absolutePath, ext)}_${Date.now()}.mjs`);\n \n // Rewrite imports to absolute paths\n let code = result.code;\n code = rewriteImports(code, path.dirname(absolutePath));\n \n fs.writeFileSync(tempFile, code);\n\n try {\n // Dynamic import\n const module = await import(pathToFileURL(tempFile).href);\n \n // Cache the result\n moduleCache.set(absolutePath, { module, mtime });\n \n // Clean up temp file (async)\n setImmediate(() => {\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n });\n\n return module;\n } catch (error) {\n // Clean up on error\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n throw error;\n }\n}\n\n/**\n * Get esbuild loader for file extension\n */\nfunction getLoader(ext: string): esbuild.Loader {\n switch (ext) {\n case '.ts': return 'ts';\n case '.tsx': return 'tsx';\n case '.jsx': return 'jsx';\n case '.js': return 'js';\n case '.mjs': return 'js';\n case '.json': return 'json';\n case '.css': return 'css';\n default: return 'ts';\n }\n}\n\n/**\n * Rewrite relative imports to absolute paths\n */\nfunction rewriteImports(code: string, baseDir: string): string {\n // Match import statements\n const importRegex = /from\\s+['\"](\\.[^'\"]+)['\"]/g;\n \n return code.replace(importRegex, (match, importPath) => {\n // Resolve relative path\n let resolvedPath = path.resolve(baseDir, importPath);\n \n // Try to find the file with various extensions\n const extensions = ['.tsx', '.ts', '.jsx', '.js', '.mjs', ''];\n let found = false;\n \n for (const ext of extensions) {\n const tryPath = resolvedPath + ext;\n if (fs.existsSync(tryPath)) {\n resolvedPath = tryPath;\n found = true;\n break;\n }\n // Try index file\n const indexPath = path.join(resolvedPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n resolvedPath = indexPath;\n found = true;\n break;\n }\n }\n \n if (!found) {\n // Keep original for node_modules imports\n return match;\n }\n \n return `from '${pathToFileURL(resolvedPath).href}'`;\n });\n}\n\n/**\n * Clear module cache (for HMR)\n */\nexport function clearModuleCache(filePath?: string) {\n if (filePath) {\n moduleCache.delete(path.resolve(filePath));\n } else {\n moduleCache.clear();\n }\n}\n\n/**\n * Transform source code without file operations\n */\nexport async function transformSource(\n source: string,\n options: { filename?: string; loader?: esbuild.Loader } = {}\n): Promise<string> {\n const { filename = 'module.tsx', loader = 'tsx' } = options;\n\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: filename,\n });\n\n return result.code;\n}\n","/**\n * Float.js Dev Indicator\n * Minimalist indicator inspired by Next.js\n */\n\nexport const FLOAT_INDICATOR_SCRIPT = `\n<script id=\"__float-indicator\">\n(function() {\n var isConnected = false;\n var isOpen = false;\n var buildTime = null;\n var startTime = Date.now();\n \n var indicator = document.createElement('div');\n indicator.id = '__float-dev-indicator';\n indicator.innerHTML = '<div class=\"float-btn\" id=\"float-btn\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span class=\"float-dot\" id=\"float-dot\"></span></div><div class=\"float-panel\" id=\"float-panel\"><div class=\"float-panel-header\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span>Float.js</span><span class=\"float-version\">v2.0.4</span></div><div class=\"float-panel-body\"><div class=\"float-row\"><span class=\"float-label\">Estado</span><span class=\"float-value\" id=\"float-state\">Conectando...</span></div><div class=\"float-row\"><span class=\"float-label\">HMR</span><span class=\"float-value\" id=\"float-hmr\">β€”</span></div><div class=\"float-row\"><span class=\"float-label\">Build</span><span class=\"float-value\" id=\"float-build\">β€”</span></div></div><div class=\"float-panel-footer\"><a href=\"/__float\" class=\"float-link\">Dashboard</a><a href=\"https://floatjs.dev/docs\" target=\"_blank\" class=\"float-link\">Docs</a></div></div>';\n \n var styles = document.createElement('style');\n styles.textContent = '#__float-dev-indicator{position:fixed;bottom:16px;left:16px;z-index:99999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:13px}.float-btn{display:flex;align-items:center;gap:6px;padding:8px 10px;background:#fff;border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 1px 2px rgba(0,0,0,0.05);cursor:pointer;transition:all 0.15s}.float-btn:hover{border-color:#d1d5db;box-shadow:0 2px 8px rgba(0,0,0,0.08)}.float-dot{width:8px;height:8px;border-radius:50%;background:#d1d5db;transition:background 0.2s}.float-dot.connected{background:#22c55e}.float-dot.error{background:#ef4444}.float-dot.building{background:#eab308;animation:blink 0.8s infinite}@keyframes blink{0%,100%{opacity:1}50%{opacity:0.4}}.float-panel{position:absolute;bottom:48px;left:0;width:240px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,0.1);opacity:0;visibility:hidden;transform:translateY(8px);transition:all 0.2s ease}.float-panel.open{opacity:1;visibility:visible;transform:translateY(0)}.float-panel-header{display:flex;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid #f3f4f6;font-weight:600;color:#111827}.float-version{margin-left:auto;font-size:11px;font-weight:400;color:#9ca3af}.float-panel-body{padding:8px 0}.float-row{display:flex;justify-content:space-between;padding:8px 14px}.float-label{color:#6b7280}.float-value{color:#111827;font-weight:500}.float-value.success{color:#16a34a}.float-value.error{color:#dc2626}.float-panel-footer{display:flex;gap:8px;padding:12px 14px;border-top:1px solid #f3f4f6}.float-link{flex:1;text-align:center;padding:8px;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;color:#374151;text-decoration:none;font-size:12px;font-weight:500;transition:all 0.15s}.float-link:hover{background:#f3f4f6;border-color:#d1d5db}';\n \n document.head.appendChild(styles);\n document.body.appendChild(indicator);\n \n var btn = document.getElementById('float-btn');\n var panel = document.getElementById('float-panel');\n var dot = document.getElementById('float-dot');\n var stateEl = document.getElementById('float-state');\n var hmrEl = document.getElementById('float-hmr');\n var buildEl = document.getElementById('float-build');\n \n btn.addEventListener('click', function(e) {\n e.stopPropagation();\n isOpen = !isOpen;\n panel.classList.toggle('open', isOpen);\n });\n \n document.addEventListener('click', function(e) {\n if (!indicator.contains(e.target) && isOpen) {\n isOpen = false;\n panel.classList.remove('open');\n }\n });\n \n function updateStatus(state) {\n dot.className = 'float-dot ' + state;\n if (state === 'connected') {\n stateEl.textContent = 'Conectado';\n stateEl.className = 'float-value success';\n hmrEl.textContent = 'Activo';\n hmrEl.className = 'float-value success';\n } else if (state === 'building') {\n stateEl.textContent = 'Compilando...';\n stateEl.className = 'float-value';\n } else if (state === 'error') {\n stateEl.textContent = 'Error';\n stateEl.className = 'float-value error';\n } else {\n stateEl.textContent = 'Desconectado';\n stateEl.className = 'float-value';\n hmrEl.textContent = 'Inactivo';\n hmrEl.className = 'float-value';\n }\n }\n \n var wsUrl = 'ws://' + window.location.hostname + ':' + (parseInt(window.location.port) + 1);\n var ws;\n var reconnectAttempts = 0;\n \n function connect() {\n ws = new WebSocket(wsUrl);\n \n ws.onopen = function() {\n isConnected = true;\n reconnectAttempts = 0;\n buildTime = new Date();\n updateStatus('connected');\n buildEl.textContent = 'Ahora';\n };\n \n ws.onmessage = function(event) {\n try {\n var data = JSON.parse(event.data);\n if (data.type === 'reload') window.location.reload();\n if (data.type === 'building') updateStatus('building');\n if (data.type === 'update' || data.type === 'clear-errors') {\n buildTime = new Date();\n buildEl.textContent = 'Ahora';\n updateStatus('connected');\n }\n if (data.type === 'error') updateStatus('error');\n } catch (e) {}\n };\n \n ws.onclose = function() {\n isConnected = false;\n updateStatus('');\n var delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 10000);\n reconnectAttempts++;\n setTimeout(connect, delay);\n };\n \n ws.onerror = function() { ws.close(); };\n }\n \n connect();\n \n setInterval(function() {\n if (buildTime && isConnected) {\n var sec = Math.floor((Date.now() - buildTime) / 1000);\n if (sec < 5) buildEl.textContent = 'Ahora';\n else if (sec < 60) buildEl.textContent = sec + 's';\n else buildEl.textContent = Math.floor(sec / 60) + 'm';\n }\n }, 1000);\n})();\n<\\/script>\n`;\n","/**\n * Float.js Error Overlay\n * Beautiful full-screen error display\n */\n\nexport const FLOAT_ERROR_OVERLAY = `\n<script id=\"__float-error-overlay\">\n(function() {\n window.__FLOAT_SHOW_ERROR = function(error) {\n // Remove existing overlay\n const existing = document.getElementById('__float-error-overlay');\n if (existing) existing.remove();\n \n const overlay = document.createElement('div');\n overlay.id = '__float-error-overlay';\n overlay.innerHTML = \\`\n <div class=\"feo-backdrop\"></div>\n <div class=\"feo-container\">\n <div class=\"feo-header\">\n <div class=\"feo-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n </div>\n <div class=\"feo-title-group\">\n <h1 class=\"feo-title\">\\${error.type || 'Error'}</h1>\n <p class=\"feo-subtitle\">\\${error.file || ''}</p>\n </div>\n <button class=\"feo-close\" onclick=\"this.closest('#__float-error-overlay').remove()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n <div class=\"feo-content\">\n <div class=\"feo-message\">\\${error.message}</div>\n \\${error.stack ? \\`<pre class=\"feo-stack\">\\${error.stack}</pre>\\` : ''}\n \\${error.frame ? \\`\n <div class=\"feo-frame\">\n <div class=\"feo-frame-header\">\n <span class=\"feo-frame-file\">\\${error.file || 'source'}</span>\n \\${error.line ? \\`<span class=\"feo-frame-line\">:\\${error.line}\\${error.column ? ':' + error.column : ''}</span>\\` : ''}\n </div>\n <pre class=\"feo-frame-code\">\\${error.frame}</pre>\n </div>\n \\` : ''}\n </div>\n <div class=\"feo-footer\">\n <div class=\"feo-hint\">\n <span class=\"feo-hint-icon\">πŸ’‘</span>\n <span>\\${error.hint || 'Revisa el cΓ³digo y guarda para recargar automΓ‘ticamente'}</span>\n </div>\n <div class=\"feo-actions\">\n <button class=\"feo-btn feo-btn-secondary\" onclick=\"navigator.clipboard.writeText(document.querySelector('.feo-stack')?.textContent || '')\">\n Copiar error\n </button>\n <button class=\"feo-btn feo-btn-primary\" onclick=\"window.location.reload()\">\n Reintentar\n </button>\n </div>\n </div>\n </div>\n \\`;\n \n const styles = document.createElement('style');\n styles.textContent = \\`\n #__float-error-overlay {\n position: fixed;\n inset: 0;\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n \n .feo-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.85);\n backdrop-filter: blur(8px);\n }\n \n .feo-container {\n position: relative;\n width: 100%;\n max-width: 800px;\n max-height: 90vh;\n background: linear-gradient(145deg, #1a1a1a 0%, #0d0d0d 100%);\n border-radius: 20px;\n border: 1px solid rgba(239, 68, 68, 0.3);\n box-shadow: \n 0 0 0 1px rgba(239, 68, 68, 0.1),\n 0 20px 60px rgba(239, 68, 68, 0.2),\n 0 0 100px rgba(239, 68, 68, 0.1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n \n .feo-header {\n padding: 24px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n background: linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, transparent 100%);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n }\n \n .feo-icon {\n width: 48px;\n height: 48px;\n background: rgba(239, 68, 68, 0.2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n \n .feo-icon svg {\n width: 28px;\n height: 28px;\n color: #ef4444;\n }\n \n .feo-title-group {\n flex: 1;\n min-width: 0;\n }\n \n .feo-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #ef4444;\n }\n \n .feo-subtitle {\n margin: 4px 0 0;\n font-size: 13px;\n color: rgba(255,255,255,0.5);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n \n .feo-close {\n width: 36px;\n height: 36px;\n background: rgba(255,255,255,0.05);\n border: none;\n border-radius: 10px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n \n .feo-close:hover {\n background: rgba(255,255,255,0.1);\n }\n \n .feo-close svg {\n width: 18px;\n height: 18px;\n color: rgba(255,255,255,0.5);\n }\n \n .feo-content {\n padding: 24px;\n overflow-y: auto;\n flex: 1;\n }\n \n .feo-message {\n font-size: 16px;\n color: #fca5a5;\n line-height: 1.6;\n margin-bottom: 20px;\n }\n \n .feo-stack {\n background: rgba(0,0,0,0.4);\n border-radius: 12px;\n padding: 16px;\n margin: 0 0 20px;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n font-size: 12px;\n color: rgba(255,255,255,0.7);\n line-height: 1.8;\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-all;\n }\n \n .feo-frame {\n background: rgba(0,0,0,0.3);\n border-radius: 12px;\n overflow: hidden;\n border: 1px solid rgba(255,255,255,0.05);\n }\n \n .feo-frame-header {\n padding: 12px 16px;\n background: rgba(255,255,255,0.03);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n font-size: 12px;\n }\n \n .feo-frame-file {\n color: #f59e0b;\n }\n \n .feo-frame-line {\n color: rgba(255,255,255,0.4);\n }\n \n .feo-frame-code {\n margin: 0;\n padding: 16px;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n font-size: 13px;\n color: rgba(255,255,255,0.8);\n line-height: 1.6;\n overflow-x: auto;\n }\n \n .feo-footer {\n padding: 20px 24px;\n background: rgba(0,0,0,0.3);\n border-top: 1px solid rgba(255,255,255,0.05);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n }\n \n .feo-hint {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: rgba(255,255,255,0.5);\n }\n \n .feo-hint-icon {\n font-size: 16px;\n }\n \n .feo-actions {\n display: flex;\n gap: 10px;\n }\n \n .feo-btn {\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n }\n \n .feo-btn-secondary {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n \n .feo-btn-secondary:hover {\n background: rgba(255,255,255,0.15);\n }\n \n .feo-btn-primary {\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\n color: white;\n }\n \n .feo-btn-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 20px rgba(139, 92, 246, 0.4);\n }\n \\`;\n \n overlay.appendChild(styles);\n document.body.appendChild(overlay);\n };\n \n window.__FLOAT_HIDE_ERROR = function() {\n const overlay = document.getElementById('__float-error-overlay');\n if (overlay) overlay.remove();\n };\n \n // Global error handler\n window.addEventListener('error', (event) => {\n window.__FLOAT_SHOW_ERROR({\n type: 'Runtime Error',\n message: event.message,\n file: event.filename,\n line: event.lineno,\n column: event.colno,\n stack: event.error?.stack\n });\n });\n \n window.addEventListener('unhandledrejection', (event) => {\n window.__FLOAT_SHOW_ERROR({\n type: 'Unhandled Promise Rejection',\n message: String(event.reason),\n stack: event.reason?.stack\n });\n });\n})();\n</script>\n`;\n","/**\n * Float.js Welcome Page\n * Professional welcome screen inspired by Next.js\n * Features: Light/Dark mode, Header, Features section, Footer\n */\n\nexport function generateWelcomePage(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\" class=\"light\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Welcome to Float.js</title>\n <link rel=\"icon\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'><defs><linearGradient id='g' x1='0%25' y1='100%25' x2='100%25' y2='0%25'><stop offset='0%25' stop-color='%233B82F6'/><stop offset='100%25' stop-color='%238B5CF6'/></linearGradient></defs><path d='M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z' fill='url(%23g)'/><path d='M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z' fill='url(%23g)'/><path d='M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z' fill='url(%23g)'/></svg>\">\n <script src=\"https://cdn.tailwindcss.com\"></script>\n <script>\n tailwind.config = {\n darkMode: 'class',\n theme: {\n extend: {\n fontFamily: { sans: ['Inter', 'system-ui', 'sans-serif'] }\n }\n }\n }\n </script>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n <style>\n @keyframes fade-up { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }\n @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }\n .fade-up { animation: fade-up 0.6s ease-out forwards; }\n .fade-up-1 { animation: fade-up 0.6s ease-out 0.1s forwards; opacity: 0; }\n .fade-up-2 { animation: fade-up 0.6s ease-out 0.2s forwards; opacity: 0; }\n .fade-up-3 { animation: fade-up 0.6s ease-out 0.3s forwards; opacity: 0; }\n .fade-up-4 { animation: fade-up 0.6s ease-out 0.4s forwards; opacity: 0; }\n .logo-float { animation: float 4s ease-in-out infinite; }\n </style>\n</head>\n<body class=\"bg-white dark:bg-zinc-950 text-zinc-900 dark:text-white min-h-screen font-sans transition-colors duration-300\">\n \n <!-- Header -->\n <header class=\"fixed top-0 left-0 right-0 z-50 border-b border-zinc-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-950/80 backdrop-blur-md\">\n <div class=\"max-w-6xl mx-auto px-6 h-16 flex items-center justify-between\">\n <!-- Logo -->\n <div class=\"flex items-center gap-3\">\n <svg class=\"w-8 h-8\" viewBox=\"0 0 200 200\" fill=\"none\">\n <defs>\n <linearGradient id=\"hdr-grad\" x1=\"50\" y1=\"160\" x2=\"170\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3B82F6\"/><stop offset=\"1\" stop-color=\"#8B5CF6\"/>\n </linearGradient>\n </defs>\n <path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"url(#hdr-grad)\"/>\n <path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"url(#hdr-grad)\"/>\n <path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"url(#hdr-grad)\"/>\n </svg>\n <span class=\"font-semibold text-lg\">Float.js</span>\n <span class=\"text-xs px-2 py-0.5 rounded-full bg-gradient-to-r from-blue-500 to-violet-500 text-white font-medium\">v2.0.6</span>\n </div>\n \n <!-- Nav -->\n <nav class=\"hidden sm:flex items-center gap-6\">\n <a href=\"/__docs\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Docs</a>\n <a href=\"/__learn\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Learn</a>\n <a href=\"/__examples\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Examples</a>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">GitHub</a>\n </nav>\n \n <!-- Dark Mode Toggle -->\n <button id=\"theme-toggle\" class=\"p-2 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\" title=\"Toggle theme\">\n <svg class=\"w-5 h-5 hidden dark:block\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"/>\n </svg>\n <svg class=\"w-5 h-5 block dark:hidden\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"/>\n </svg>\n </button>\n </div>\n </header>\n \n <!-- Hero Section -->\n <main class=\"pt-32 pb-20 px-6\">\n <div class=\"max-w-4xl mx-auto text-center\">\n \n <!-- Logo -->\n <div class=\"fade-up logo-float mb-8\">\n <svg class=\"w-24 h-24 mx-auto\" viewBox=\"0 0 200 200\" fill=\"none\">\n <defs>\n <linearGradient id=\"hero-grad\" x1=\"50\" y1=\"160\" x2=\"170\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3B82F6\"/><stop offset=\"1\" stop-color=\"#8B5CF6\"/>\n </linearGradient>\n </defs>\n <path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"url(#hero-grad)\"/>\n <path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"url(#hero-grad)\"/>\n <path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"url(#hero-grad)\"/>\n </svg>\n </div>\n \n <!-- Title -->\n <h1 class=\"fade-up-1 text-4xl sm:text-6xl font-bold tracking-tight mb-6\">\n The React Framework<br/>\n <span class=\"bg-gradient-to-r from-blue-500 to-violet-500 bg-clip-text text-transparent\">for the Modern Web</span>\n </h1>\n \n <!-- Subtitle -->\n <p class=\"fade-up-2 text-lg sm:text-xl text-zinc-600 dark:text-zinc-400 max-w-2xl mx-auto mb-10\">\n Build full-stack React applications with file-based routing, SSR, API routes, \n and lightning-fast HMR. Get started by creating your first page.\n </p>\n \n <!-- CTA Buttons -->\n <div class=\"fade-up-3 flex flex-col sm:flex-row gap-4 justify-center mb-16\">\n <a href=\"/__learn\" \n class=\"inline-flex items-center justify-center gap-2 px-8 py-4 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 font-semibold rounded-xl hover:bg-zinc-800 dark:hover:bg-zinc-100 transition-all shadow-lg hover:shadow-xl\">\n Get Started\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M17 8l4 4m0 0l-4 4m4-4H3\"/>\n </svg>\n </a>\n <a href=\"/__docs\"\n class=\"inline-flex items-center justify-center gap-2 px-8 py-4 bg-zinc-100 dark:bg-zinc-800 text-zinc-900 dark:text-white font-semibold rounded-xl hover:bg-zinc-200 dark:hover:bg-zinc-700 transition-all\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"/>\n </svg>\n Documentation\n </a>\n </div>\n \n <!-- Code Block -->\n <div class=\"fade-up-4 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl p-6 text-left max-w-xl mx-auto shadow-sm\">\n <div class=\"flex items-center gap-2 mb-4\">\n <div class=\"w-3 h-3 rounded-full bg-red-400\"></div>\n <div class=\"w-3 h-3 rounded-full bg-yellow-400\"></div>\n <div class=\"w-3 h-3 rounded-full bg-green-400\"></div>\n <span class=\"ml-3 text-xs text-zinc-500 font-mono\">app/page.tsx</span>\n </div>\n <pre class=\"text-sm font-mono overflow-x-auto text-zinc-800 dark:text-zinc-200\"><code><span class=\"text-violet-600 dark:text-violet-400\">export default</span> <span class=\"text-blue-600 dark:text-blue-400\">function</span> <span class=\"text-amber-600 dark:text-yellow-300\">Page</span>() {\n <span class=\"text-violet-600 dark:text-violet-400\">return</span> (\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-600 dark:text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>Hello, Float.js!<span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-600 dark:text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>\n );\n}</code></pre>\n </div>\n \n </div>\n </main>\n \n <!-- Features Section -->\n <section class=\"py-20 px-6 bg-zinc-50 dark:bg-zinc-900/50\">\n <div class=\"max-w-6xl mx-auto\">\n <h2 class=\"text-2xl sm:text-3xl font-bold text-center mb-4\">Built for Performance</h2>\n <p class=\"text-zinc-600 dark:text-zinc-400 text-center mb-12 max-w-xl mx-auto\">\n Everything you need to build fast, modern web applications\n </p>\n \n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n \n <!-- Feature 1 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-blue-500 dark:hover:border-blue-500 transition-colors\">\n <div class=\"w-12 h-12 bg-blue-100 dark:bg-blue-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-blue-600 dark:text-blue-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Lightning Fast HMR</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Instant hot module replacement. See your changes in milliseconds without losing state.</p>\n </div>\n \n <!-- Feature 2 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-violet-500 dark:hover:border-violet-500 transition-colors\">\n <div class=\"w-12 h-12 bg-violet-100 dark:bg-violet-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-violet-600 dark:text-violet-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">File-Based Routing</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Create routes by adding files to the app directory. Dynamic routes, layouts, and more.</p>\n </div>\n \n <!-- Feature 3 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-emerald-500 dark:hover:border-emerald-500 transition-colors\">\n <div class=\"w-12 h-12 bg-emerald-100 dark:bg-emerald-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-emerald-600 dark:text-emerald-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Server-Side Rendering</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Automatic SSR for optimal SEO and performance. Hybrid rendering strategies.</p>\n </div>\n \n <!-- Feature 4 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-amber-500 dark:hover:border-amber-500 transition-colors\">\n <div class=\"w-12 h-12 bg-amber-100 dark:bg-amber-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-amber-600 dark:text-amber-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">API Routes</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Build your backend API with simple route handlers. Full TypeScript support.</p>\n </div>\n \n <!-- Feature 5 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-pink-500 dark:hover:border-pink-500 transition-colors\">\n <div class=\"w-12 h-12 bg-pink-100 dark:bg-pink-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-pink-600 dark:text-pink-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Built-in AI Integration</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">First-class support for AI streaming, OpenAI, Anthropic, and more.</p>\n </div>\n \n <!-- Feature 6 -->\n <div class=\"p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl hover:border-cyan-500 dark:hover:border-cyan-500 transition-colors\">\n <div class=\"w-12 h-12 bg-cyan-100 dark:bg-cyan-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-cyan-600 dark:text-cyan-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Developer Experience</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400\">Error overlay, DevTools, and debugging utilities built-in for a smooth workflow.</p>\n </div>\n \n </div>\n </div>\n </section>\n \n <!-- Quick Start Section -->\n <section class=\"py-20 px-6\">\n <div class=\"max-w-4xl mx-auto\">\n <h2 class=\"text-2xl sm:text-3xl font-bold text-center mb-4\">Get Started in Seconds</h2>\n <p class=\"text-zinc-600 dark:text-zinc-400 text-center mb-12\">Create your first page and see it live</p>\n \n <div class=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div class=\"p-5 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl\">\n <div class=\"text-xs text-zinc-500 mb-2 uppercase tracking-wider\">1. Create page</div>\n <code class=\"text-sm font-mono text-zinc-700 dark:text-zinc-300\">touch app/page.tsx</code>\n </div>\n <div class=\"p-5 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl\">\n <div class=\"text-xs text-zinc-500 mb-2 uppercase tracking-wider\">2. Add route</div>\n <code class=\"text-sm font-mono text-zinc-700 dark:text-zinc-300\">mkdir app/about</code>\n </div>\n <div class=\"p-5 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl\">\n <div class=\"text-xs text-zinc-500 mb-2 uppercase tracking-wider\">3. API route</div>\n <code class=\"text-sm font-mono text-zinc-700 dark:text-zinc-300\">touch app/api/route.ts</code>\n </div>\n </div>\n </div>\n </section>\n \n <!-- Footer -->\n <footer class=\"border-t border-zinc-200 dark:border-zinc-800 py-12 px-6 bg-zinc-50 dark:bg-zinc-900/50\">\n <div class=\"max-w-6xl mx-auto\">\n <div class=\"grid grid-cols-1 sm:grid-cols-4 gap-8 mb-12\">\n \n <!-- Brand -->\n <div class=\"sm:col-span-1\">\n <div class=\"flex items-center gap-2 mb-4\">\n <svg class=\"w-8 h-8\" viewBox=\"0 0 200 200\" fill=\"none\">\n <defs>\n <linearGradient id=\"ftr-grad\" x1=\"50\" y1=\"160\" x2=\"170\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3B82F6\"/><stop offset=\"1\" stop-color=\"#8B5CF6\"/>\n </linearGradient>\n </defs>\n <path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"url(#ftr-grad)\"/>\n <path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"url(#ftr-grad)\"/>\n <path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"url(#ftr-grad)\"/>\n </svg>\n <span class=\"font-semibold text-lg\">Float.js</span>\n </div>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">\n The React framework for the modern web.\n </p>\n </div>\n \n <!-- Resources -->\n <div>\n <h4 class=\"font-semibold mb-4 text-sm\">Resources</h4>\n <ul class=\"space-y-2\">\n <li><a href=\"/__docs\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Documentation</a></li>\n <li><a href=\"/__learn\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Learn Float.js</a></li>\n <li><a href=\"/__examples\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Examples</a></li>\n <li><a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Blog</a></li>\n </ul>\n </div>\n \n <!-- More -->\n <div>\n <h4 class=\"font-semibold mb-4 text-sm\">More</h4>\n <ul class=\"space-y-2\">\n <li><a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">GitHub</a></li>\n <li><a href=\"https://github.com/float-js/float-js/releases\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Releases</a></li>\n <li><a href=\"https://x.com/floatjs\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Twitter</a></li>\n </ul>\n </div>\n \n <!-- Legal -->\n <div>\n <h4 class=\"font-semibold mb-4 text-sm\">Legal</h4>\n <ul class=\"space-y-2\">\n <li><a href=\"https://github.com/float-js/float-js/blob/main/LICENSE\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">MIT License</a></li>\n <li><a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Contribute</a></li>\n </ul>\n </div>\n \n </div>\n \n <!-- Bottom -->\n <div class=\"pt-8 border-t border-zinc-200 dark:border-zinc-800 flex flex-col sm:flex-row items-center justify-between gap-4\">\n <p class=\"text-sm text-zinc-500\">\n Β© 2024-2026 Float.js. Created by <span class=\"text-zinc-700 dark:text-zinc-300 font-medium\">Peter Fulle</span>\n </p>\n <div class=\"flex items-center gap-4\">\n <a href=\"mailto:prfulle@gmail.com\" class=\"text-sm text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">prfulle@gmail.com</a>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>\n </a>\n <a href=\"https://x.com/floatjs\" target=\"_blank\" class=\"text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/></svg>\n </a>\n </div>\n </div>\n </div>\n </footer>\n \n <!-- Theme Toggle Script -->\n <script>\n const toggle = document.getElementById('theme-toggle');\n const html = document.documentElement;\n \n // Check for saved theme or system preference\n if (localStorage.theme === 'dark' || (!localStorage.theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {\n html.classList.add('dark');\n html.classList.remove('light');\n }\n \n toggle.addEventListener('click', () => {\n html.classList.toggle('dark');\n html.classList.toggle('light');\n localStorage.theme = html.classList.contains('dark') ? 'dark' : 'light';\n });\n </script>\n \n</body>\n</html>`;\n}\n","/**\n * Float.js Documentation Pages\n * Internal pages for Docs, Learn, and Examples\n */\n\nconst baseStyles = `\n<!DOCTYPE html>\n<html lang=\"en\" class=\"light\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>%TITLE% - Float.js</title>\n <link rel=\"icon\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'><defs><linearGradient id='g' x1='0%25' y1='100%25' x2='100%25' y2='0%25'><stop offset='0%25' stop-color='%233B82F6'/><stop offset='100%25' stop-color='%238B5CF6'/></linearGradient></defs><path d='M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z' fill='url(%23g)'/><path d='M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z' fill='url(%23g)'/><path d='M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z' fill='url(%23g)'/></svg>\">\n <script src=\"https://cdn.tailwindcss.com\"></script>\n <script>\n tailwind.config = {\n darkMode: 'class',\n theme: { extend: { fontFamily: { sans: ['Inter', 'system-ui', 'sans-serif'] } } }\n }\n </script>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n <style>\n .prose code { background: #f4f4f5; padding: 2px 6px; border-radius: 4px; font-size: 0.875em; }\n .dark .prose code { background: #27272a; }\n .prose pre { background: #18181b; padding: 1rem; border-radius: 0.75rem; overflow-x: auto; }\n .prose pre code { background: transparent; padding: 0; }\n </style>\n</head>\n<body class=\"bg-white dark:bg-zinc-950 text-zinc-900 dark:text-white min-h-screen font-sans\">\n`;\n\nconst header = `\n <!-- Header -->\n <header class=\"sticky top-0 z-50 border-b border-zinc-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-950/80 backdrop-blur-md\">\n <div class=\"max-w-6xl mx-auto px-6 h-16 flex items-center justify-between\">\n <a href=\"/\" class=\"flex items-center gap-3\">\n <svg class=\"w-8 h-8\" viewBox=\"0 0 200 200\" fill=\"none\">\n <defs>\n <linearGradient id=\"hdr-grad\" x1=\"50\" y1=\"160\" x2=\"170\" y2=\"40\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#3B82F6\"/><stop offset=\"1\" stop-color=\"#8B5CF6\"/>\n </linearGradient>\n </defs>\n <path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"url(#hdr-grad)\"/>\n <path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"url(#hdr-grad)\"/>\n <path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"url(#hdr-grad)\"/>\n </svg>\n <span class=\"font-semibold text-lg\">Float.js</span>\n </a>\n <nav class=\"flex items-center gap-6\">\n <a href=\"/__docs\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Docs</a>\n <a href=\"/__learn\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Learn</a>\n <a href=\"/__examples\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">Examples</a>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition-colors\">GitHub</a>\n <button id=\"theme-toggle\" class=\"p-2 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\">\n <svg class=\"w-5 h-5 hidden dark:block\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"/></svg>\n <svg class=\"w-5 h-5 block dark:hidden\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"/></svg>\n </button>\n </nav>\n </div>\n </header>\n`;\n\nconst footer = `\n <!-- Footer -->\n <footer class=\"border-t border-zinc-200 dark:border-zinc-800 py-8 px-6 bg-zinc-50 dark:bg-zinc-900/50\">\n <div class=\"max-w-6xl mx-auto flex flex-col sm:flex-row items-center justify-between gap-4\">\n <p class=\"text-sm text-zinc-500\">Β© 2024-2026 Float.js. Created by Peter Fulle</p>\n <div class=\"flex items-center gap-4\">\n <a href=\"mailto:prfulle@gmail.com\" class=\"text-sm text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">prfulle@gmail.com</a>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition-colors\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>\n </a>\n </div>\n </div>\n </footer>\n <script>\n const toggle = document.getElementById('theme-toggle');\n const html = document.documentElement;\n if (localStorage.theme === 'dark' || (!localStorage.theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {\n html.classList.add('dark'); html.classList.remove('light');\n }\n toggle?.addEventListener('click', () => {\n html.classList.toggle('dark'); html.classList.toggle('light');\n localStorage.theme = html.classList.contains('dark') ? 'dark' : 'light';\n });\n </script>\n</body>\n</html>\n`;\n\nexport function generateDocsPage(): string {\n return baseStyles.replace('%TITLE%', 'Documentation') + header + `\n <div class=\"flex\">\n <!-- Sidebar -->\n <aside class=\"hidden lg:block w-64 border-r border-zinc-200 dark:border-zinc-800 min-h-[calc(100vh-4rem)] p-6\">\n <nav class=\"space-y-6\">\n <div>\n <h3 class=\"font-semibold text-sm mb-3\">Getting Started</h3>\n <ul class=\"space-y-2\">\n <li><a href=\"#installation\" class=\"text-sm text-blue-600 dark:text-blue-400 font-medium\">Installation</a></li>\n <li><a href=\"#project-structure\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Project Structure</a></li>\n <li><a href=\"#routing\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Routing</a></li>\n </ul>\n </div>\n <div>\n <h3 class=\"font-semibold text-sm mb-3\">Core Concepts</h3>\n <ul class=\"space-y-2\">\n <li><a href=\"#pages\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Pages</a></li>\n <li><a href=\"#layouts\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Layouts</a></li>\n <li><a href=\"#api-routes\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">API Routes</a></li>\n </ul>\n </div>\n <div>\n <h3 class=\"font-semibold text-sm mb-3\">Features</h3>\n <ul class=\"space-y-2\">\n <li><a href=\"#ssr\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Server Rendering</a></li>\n <li><a href=\"#hmr\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">Hot Module Replacement</a></li>\n <li><a href=\"#ai\" class=\"text-sm text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white\">AI Integration</a></li>\n </ul>\n </div>\n </nav>\n </aside>\n \n <!-- Main Content -->\n <main class=\"flex-1 max-w-3xl mx-auto px-6 py-12 prose dark:prose-invert\">\n <h1 id=\"installation\" class=\"text-4xl font-bold mb-4\">Documentation</h1>\n <p class=\"text-lg text-zinc-600 dark:text-zinc-400 mb-8\">Learn how to build modern web applications with Float.js</p>\n \n <h2 class=\"text-2xl font-semibold mt-12 mb-4\">Installation</h2>\n <p class=\"mb-4\">Create a new Float.js project with a single command:</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl mb-6\"><code class=\"font-mono\">npx create-float@latest my-app\ncd my-app\nnpm run dev</code></pre>\n \n <h2 id=\"project-structure\" class=\"text-2xl font-semibold mt-12 mb-4\">Project Structure</h2>\n <p class=\"mb-4\">Float.js uses a file-based routing system. Your project structure looks like this:</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl mb-6\"><code class=\"font-mono\">my-app/\nβ”œβ”€β”€ app/\nβ”‚ β”œβ”€β”€ page.tsx # Home page (/)\nβ”‚ β”œβ”€β”€ layout.tsx # Root layout\nβ”‚ β”œβ”€β”€ about/\nβ”‚ β”‚ └── page.tsx # About page (/about)\nβ”‚ └── api/\nβ”‚ └── route.ts # API route (/api)\nβ”œβ”€β”€ public/ # Static assets\n└── package.json</code></pre>\n\n <h2 id=\"routing\" class=\"text-2xl font-semibold mt-12 mb-4\">Routing</h2>\n <p class=\"mb-4\">Routes are automatically generated based on your file structure:</p>\n <div class=\"bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl p-6 mb-6\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"text-left border-b border-zinc-200 dark:border-zinc-700\">\n <th class=\"pb-3 font-semibold\">File</th>\n <th class=\"pb-3 font-semibold\">Route</th>\n </tr>\n </thead>\n <tbody class=\"font-mono\">\n <tr class=\"border-b border-zinc-100 dark:border-zinc-800\"><td class=\"py-3\">app/page.tsx</td><td class=\"py-3 text-blue-600 dark:text-blue-400\">/</td></tr>\n <tr class=\"border-b border-zinc-100 dark:border-zinc-800\"><td class=\"py-3\">app/about/page.tsx</td><td class=\"py-3 text-blue-600 dark:text-blue-400\">/about</td></tr>\n <tr class=\"border-b border-zinc-100 dark:border-zinc-800\"><td class=\"py-3\">app/blog/[slug]/page.tsx</td><td class=\"py-3 text-blue-600 dark:text-blue-400\">/blog/:slug</td></tr>\n <tr><td class=\"py-3\">app/api/users/route.ts</td><td class=\"py-3 text-blue-600 dark:text-blue-400\">/api/users</td></tr>\n </tbody>\n </table>\n </div>\n\n <h2 id=\"pages\" class=\"text-2xl font-semibold mt-12 mb-4\">Creating Pages</h2>\n <p class=\"mb-4\">Each page exports a default React component:</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl mb-6\"><code class=\"font-mono\"><span class=\"text-violet-400\">export default</span> <span class=\"text-blue-400\">function</span> <span class=\"text-yellow-300\">Page</span>() {\n <span class=\"text-violet-400\">return</span> (\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">div</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>Welcome to my page<span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">div</span><span class=\"text-zinc-500\">&gt;</span>\n );\n}</code></pre>\n\n <h2 id=\"api-routes\" class=\"text-2xl font-semibold mt-12 mb-4\">API Routes</h2>\n <p class=\"mb-4\">Create API endpoints by exporting HTTP method handlers:</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl mb-6\"><code class=\"font-mono\"><span class=\"text-violet-400\">export async function</span> <span class=\"text-yellow-300\">GET</span>(<span class=\"text-orange-400\">request</span>: Request) {\n <span class=\"text-violet-400\">return</span> Response.json({ message: <span class=\"text-emerald-400\">'Hello from API!'</span> });\n}\n\n<span class=\"text-violet-400\">export async function</span> <span class=\"text-yellow-300\">POST</span>(<span class=\"text-orange-400\">request</span>: Request) {\n <span class=\"text-violet-400\">const</span> body = <span class=\"text-violet-400\">await</span> request.json();\n <span class=\"text-violet-400\">return</span> Response.json({ received: body });\n}</code></pre>\n\n <div class=\"mt-12 p-6 bg-gradient-to-r from-blue-50 to-violet-50 dark:from-blue-950/30 dark:to-violet-950/30 border border-blue-200 dark:border-blue-800 rounded-xl\">\n <h3 class=\"font-semibold text-lg mb-2\">πŸš€ Ready to build?</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Start creating your first page by running:</p>\n <code class=\"bg-white dark:bg-zinc-900 px-4 py-2 rounded-lg border border-zinc-200 dark:border-zinc-700 font-mono text-sm\">touch app/page.tsx</code>\n </div>\n </main>\n </div>\n` + footer;\n}\n\nexport function generateLearnPage(): string {\n return baseStyles.replace('%TITLE%', 'Learn') + header + `\n <main class=\"max-w-4xl mx-auto px-6 py-16\">\n <div class=\"text-center mb-16\">\n <h1 class=\"text-4xl sm:text-5xl font-bold mb-4\">Learn Float.js</h1>\n <p class=\"text-lg text-zinc-600 dark:text-zinc-400 max-w-2xl mx-auto\">\n Follow our step-by-step tutorial to master Float.js and build your first application\n </p>\n </div>\n \n <!-- Tutorial Steps -->\n <div class=\"space-y-6\">\n \n <!-- Step 1 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-blue-100 dark:bg-blue-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-blue-600 dark:text-blue-400\">1</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Create Your Project</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Start by creating a new Float.js project using the CLI</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code>npx create-float@latest my-first-app</code></pre>\n </div>\n </div>\n </div>\n \n <!-- Step 2 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-violet-100 dark:bg-violet-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-violet-600 dark:text-violet-400\">2</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Start the Development Server</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Navigate to your project and start the dev server</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code>cd my-first-app\nnpm run dev</code></pre>\n </div>\n </div>\n </div>\n \n <!-- Step 3 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-emerald-100 dark:bg-emerald-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-emerald-600 dark:text-emerald-400\">3</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Create Your First Page</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Create a page component in the app directory</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code><span class=\"text-zinc-500\">// app/page.tsx</span>\n<span class=\"text-violet-400\">export default</span> <span class=\"text-blue-400\">function</span> <span class=\"text-yellow-300\">HomePage</span>() {\n <span class=\"text-violet-400\">return</span> (\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">main</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>Hello, Float.js!<span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;</span><span class=\"text-emerald-400\">p</span><span class=\"text-zinc-500\">&gt;</span>Welcome to my first app<span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">p</span><span class=\"text-zinc-500\">&gt;</span>\n <span class=\"text-zinc-500\">&lt;/</span><span class=\"text-emerald-400\">main</span><span class=\"text-zinc-500\">&gt;</span>\n );\n}</code></pre>\n </div>\n </div>\n </div>\n \n <!-- Step 4 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-amber-100 dark:bg-amber-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-amber-600 dark:text-amber-400\">4</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Add an API Route</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Create your backend API with simple handlers</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code><span class=\"text-zinc-500\">// app/api/hello/route.ts</span>\n<span class=\"text-violet-400\">export async function</span> <span class=\"text-yellow-300\">GET</span>() {\n <span class=\"text-violet-400\">return</span> Response.json({\n message: <span class=\"text-emerald-400\">'Hello from the API!'</span>,\n timestamp: <span class=\"text-violet-400\">new</span> Date().toISOString()\n });\n}</code></pre>\n </div>\n </div>\n </div>\n \n <!-- Step 5 -->\n <div class=\"p-6 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl\">\n <div class=\"flex items-start gap-4\">\n <div class=\"w-10 h-10 bg-pink-100 dark:bg-pink-500/20 rounded-xl flex items-center justify-center flex-shrink-0\">\n <span class=\"font-bold text-pink-600 dark:text-pink-400\">5</span>\n </div>\n <div class=\"flex-1\">\n <h3 class=\"font-semibold text-xl mb-2\">Build for Production</h3>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-4\">Ready to deploy? Build your application</p>\n <pre class=\"bg-zinc-900 text-zinc-100 p-4 rounded-xl text-sm font-mono overflow-x-auto\"><code>npm run build\nnpm start</code></pre>\n </div>\n </div>\n </div>\n \n </div>\n \n <!-- Next Steps -->\n <div class=\"mt-16 text-center\">\n <h2 class=\"text-2xl font-bold mb-4\">What's Next?</h2>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-8\">Explore more features and capabilities</p>\n <div class=\"flex flex-wrap justify-center gap-4\">\n <a href=\"/__docs\" class=\"px-6 py-3 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 font-semibold rounded-xl hover:bg-zinc-800 dark:hover:bg-zinc-100 transition-colors\">\n Read the Docs\n </a>\n <a href=\"/__examples\" class=\"px-6 py-3 bg-zinc-100 dark:bg-zinc-800 text-zinc-900 dark:text-white font-semibold rounded-xl hover:bg-zinc-200 dark:hover:bg-zinc-700 transition-colors\">\n View Examples\n </a>\n </div>\n </div>\n </main>\n` + footer;\n}\n\nexport function generateExamplesPage(): string {\n return baseStyles.replace('%TITLE%', 'Examples') + header + `\n <main class=\"max-w-6xl mx-auto px-6 py-16\">\n <div class=\"text-center mb-16\">\n <h1 class=\"text-4xl sm:text-5xl font-bold mb-4\">Examples</h1>\n <p class=\"text-lg text-zinc-600 dark:text-zinc-400 max-w-2xl mx-auto\">\n Explore example projects to learn common patterns and best practices\n </p>\n </div>\n \n <!-- Examples Grid -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n \n <!-- Basic App -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-blue-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-blue-100 dark:bg-blue-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-blue-600 dark:text-blue-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Basic App</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Simple starter with pages, layouts, and routing</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">React</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">TypeScript</span>\n </div>\n </div>\n \n <!-- Blog -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-violet-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-violet-100 dark:bg-violet-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-violet-600 dark:text-violet-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Blog</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Full blog with MDX, dynamic routes, and SSG</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">MDX</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">SSG</span>\n </div>\n </div>\n \n <!-- API Backend -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-emerald-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-emerald-100 dark:bg-emerald-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-emerald-600 dark:text-emerald-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">API Backend</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">REST API with authentication and database</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">API</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Auth</span>\n </div>\n </div>\n \n <!-- AI Chat -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-pink-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-pink-100 dark:bg-pink-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-pink-600 dark:text-pink-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">AI Chat</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Streaming chat with OpenAI integration</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">AI</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Streaming</span>\n </div>\n </div>\n \n <!-- E-commerce -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-amber-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-amber-100 dark:bg-amber-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-amber-600 dark:text-amber-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">E-commerce</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Store with cart, checkout, and payments</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Stripe</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Cart</span>\n </div>\n </div>\n \n <!-- Dashboard -->\n <div class=\"group p-6 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-2xl hover:border-cyan-500 transition-all hover:shadow-lg\">\n <div class=\"w-12 h-12 bg-cyan-100 dark:bg-cyan-500/20 rounded-xl flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-cyan-600 dark:text-cyan-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"/>\n </svg>\n </div>\n <h3 class=\"font-semibold text-lg mb-2\">Dashboard</h3>\n <p class=\"text-sm text-zinc-600 dark:text-zinc-400 mb-4\">Admin panel with charts and real-time data</p>\n <div class=\"flex flex-wrap gap-2\">\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Charts</span>\n <span class=\"text-xs px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded-md\">Realtime</span>\n </div>\n </div>\n \n </div>\n \n <!-- CTA -->\n <div class=\"mt-16 text-center p-8 bg-gradient-to-r from-blue-50 to-violet-50 dark:from-blue-950/30 dark:to-violet-950/30 border border-blue-200 dark:border-blue-800 rounded-2xl\">\n <h2 class=\"text-2xl font-bold mb-4\">Want to contribute?</h2>\n <p class=\"text-zinc-600 dark:text-zinc-400 mb-6\">Share your example with the community</p>\n <a href=\"https://github.com/float-js/float-js\" target=\"_blank\" class=\"inline-flex items-center gap-2 px-6 py-3 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 font-semibold rounded-xl hover:bg-zinc-800 dark:hover:bg-zinc-100 transition-colors\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>\n View on GitHub\n </a>\n </div>\n </main>\n` + footer;\n}\n","/**\n * Float.js CSS Processing\n * Handles CSS with PostCSS and Tailwind\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { checkTailwindSetup } from './tailwind-setup.js';\n\ninterface CSSProcessResult {\n code: string;\n map?: string;\n}\n\n/**\n * Process CSS file with PostCSS and Tailwind\n */\nexport async function processCSS(\n filePath: string,\n rootDir: string = process.cwd()\n): Promise<CSSProcessResult> {\n const content = fs.readFileSync(filePath, 'utf-8');\n \n // Check if project has Tailwind setup\n const tailwindConfig = checkTailwindSetup(rootDir);\n \n if (!tailwindConfig.hasTailwind) {\n // Return raw CSS if no Tailwind\n return { code: content };\n }\n\n try {\n // Dynamic import of PostCSS and Tailwind\n const postcss = await import('postcss').then(m => m.default);\n const tailwindcss = await import('tailwindcss').then(m => m.default);\n const autoprefixer = await import('autoprefixer').then(m => m.default);\n\n // Load Tailwind config\n const configPath = tailwindConfig.configPath || path.join(rootDir, 'tailwind.config.js');\n let tailwindConfigModule = {};\n \n if (fs.existsSync(configPath)) {\n // Use dynamic import for config\n const configUrl = new URL(`file://${configPath}`);\n tailwindConfigModule = await import(configUrl.href).then(m => m.default || m);\n }\n\n // Process with PostCSS\n const result = await postcss([\n tailwindcss(tailwindConfigModule),\n autoprefixer(),\n ]).process(content, {\n from: filePath,\n to: filePath,\n map: { inline: false },\n });\n\n return {\n code: result.css,\n map: result.map?.toString(),\n };\n } catch (error) {\n // If PostCSS/Tailwind not available, return raw CSS\n console.warn('CSS processing failed, serving raw CSS:', error);\n return { code: content };\n }\n}\n\n/**\n * Check if CSS file needs processing\n */\nexport function needsCSSProcessing(filePath: string, rootDir: string): boolean {\n const config = checkTailwindSetup(rootDir);\n \n // Process if:\n // 1. Project has Tailwind setup\n // 2. File is globals.css or contains @tailwind directives\n if (!config.hasTailwind) {\n return false;\n }\n\n const content = fs.readFileSync(filePath, 'utf-8');\n return content.includes('@tailwind') || content.includes('@apply');\n}\n\n/**\n * Get cache key for processed CSS\n */\nexport function getCSSCacheKey(filePath: string): string {\n const stats = fs.statSync(filePath);\n return `${filePath}_${stats.mtimeMs}`;\n}\n","/**\n * Float.js Tailwind CSS Auto-Setup\n * Automatically configures Tailwind CSS for projects\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\n\nexport interface TailwindSetupOptions {\n force?: boolean;\n silent?: boolean;\n}\n\nexport interface TailwindConfig {\n hasTailwind: boolean;\n configPath: string | null;\n globalsPath: string | null;\n needsSetup: boolean;\n}\n\n/**\n * Check if project has Tailwind configured\n */\nexport function checkTailwindSetup(rootDir: string): TailwindConfig {\n const possibleConfigs = [\n 'tailwind.config.js',\n 'tailwind.config.ts',\n 'tailwind.config.mjs',\n 'tailwind.config.cjs',\n ];\n\n let configPath: string | null = null;\n \n for (const config of possibleConfigs) {\n const fullPath = path.join(rootDir, config);\n if (fs.existsSync(fullPath)) {\n configPath = fullPath;\n break;\n }\n }\n\n const globalsPath = path.join(rootDir, 'app', 'globals.css');\n const hasGlobals = fs.existsSync(globalsPath);\n\n return {\n hasTailwind: !!configPath,\n configPath,\n globalsPath: hasGlobals ? globalsPath : null,\n needsSetup: !configPath || !hasGlobals,\n };\n}\n\n/**\n * Auto-setup Tailwind CSS in project\n */\nexport async function setupTailwind(\n rootDir: string,\n options: TailwindSetupOptions = {}\n): Promise<void> {\n const { force = false, silent = false } = options;\n const config = checkTailwindSetup(rootDir);\n\n if (!force && !config.needsSetup) {\n return;\n }\n\n if (!silent) {\n console.log(pc.cyan('\\n🎨 Setting up Tailwind CSS...'));\n }\n\n // Create tailwind.config.js\n if (!config.configPath || force) {\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\nexport default {\n content: [\n './app/**/*.{js,ts,jsx,tsx}',\n './components/**/*.{js,ts,jsx,tsx}',\n ],\n theme: {\n extend: {},\n },\n plugins: [],\n}\n`;\n\n const configPath = path.join(rootDir, 'tailwind.config.js');\n fs.writeFileSync(configPath, tailwindConfig);\n \n if (!silent) {\n console.log(pc.green(' βœ“ Created tailwind.config.js'));\n }\n }\n\n // Create postcss.config.js\n const postcssPath = path.join(rootDir, 'postcss.config.js');\n if (!fs.existsSync(postcssPath) || force) {\n const postcssConfig = `export default {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n}\n`;\n\n fs.writeFileSync(postcssPath, postcssConfig);\n \n if (!silent) {\n console.log(pc.green(' βœ“ Created postcss.config.js'));\n }\n }\n\n // Create app/globals.css\n const appDir = path.join(rootDir, 'app');\n if (!fs.existsSync(appDir)) {\n fs.mkdirSync(appDir, { recursive: true });\n }\n\n const globalsPath = path.join(appDir, 'globals.css');\n if (!fs.existsSync(globalsPath) || force) {\n const globalsCss = `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n`;\n\n fs.writeFileSync(globalsPath, globalsCss);\n \n if (!silent) {\n console.log(pc.green(' βœ“ Created app/globals.css'));\n }\n }\n\n // Create app/layout.tsx if it doesn't exist\n const layoutPath = path.join(appDir, 'layout.tsx');\n if (!fs.existsSync(layoutPath)) {\n const layoutContent = `import './globals.css'\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n )\n}\n`;\n\n fs.writeFileSync(layoutPath, layoutContent);\n \n if (!silent) {\n console.log(pc.green(' βœ“ Created app/layout.tsx'));\n }\n }\n\n if (!silent) {\n console.log(pc.green('\\n✨ Tailwind CSS ready!\\n'));\n }\n}\n\n/**\n * Check if Tailwind dependencies are installed\n */\nexport function checkTailwindDeps(rootDir: string): {\n hasPackageJson: boolean;\n hasTailwind: boolean;\n hasPostCSS: boolean;\n hasAutoprefixer: boolean;\n} {\n const packageJsonPath = path.join(rootDir, 'package.json');\n \n if (!fs.existsSync(packageJsonPath)) {\n return {\n hasPackageJson: false,\n hasTailwind: false,\n hasPostCSS: false,\n hasAutoprefixer: false,\n };\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return {\n hasPackageJson: true,\n hasTailwind: !!allDeps['tailwindcss'],\n hasPostCSS: !!allDeps['postcss'],\n hasAutoprefixer: !!allDeps['autoprefixer'],\n };\n}\n\n/**\n * Get install command for missing Tailwind dependencies\n */\nexport function getTailwindInstallCommand(rootDir: string): string | null {\n const deps = checkTailwindDeps(rootDir);\n \n if (!deps.hasPackageJson) {\n return null;\n }\n\n const missing: string[] = [];\n if (!deps.hasTailwind) missing.push('tailwindcss');\n if (!deps.hasPostCSS) missing.push('postcss');\n if (!deps.hasAutoprefixer) missing.push('autoprefixer');\n\n if (missing.length === 0) {\n return null;\n }\n\n // Detect package manager\n const hasYarnLock = fs.existsSync(path.join(rootDir, 'yarn.lock'));\n const hasPnpmLock = fs.existsSync(path.join(rootDir, 'pnpm-lock.yaml'));\n const hasBunLock = fs.existsSync(path.join(rootDir, 'bun.lockb'));\n\n let pm = 'npm install -D';\n if (hasBunLock) pm = 'bun add -d';\n else if (hasPnpmLock) pm = 'pnpm add -D';\n else if (hasYarnLock) pm = 'yarn add -D';\n\n return `${pm} ${missing.join(' ')}`;\n}\n","/**\n * Float.js Build System\n * Fast builds with esbuild\n */\n\nimport * as esbuild from 'esbuild';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { scanRoutes, type Route } from '../router/index.js';\nimport { renderPage } from '../server/ssr.js';\n\nexport interface BuildOptions {\n analyze?: boolean;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\nexport interface BuildResult {\n routes: Route[];\n duration: number;\n outputDir: string;\n pages: string[];\n assets: string[];\n}\n\nconst DEFAULT_BUILD_OPTIONS: Required<BuildOptions> = {\n analyze: false,\n minify: true,\n sourcemap: true,\n};\n\nexport async function build(options: BuildOptions = {}): Promise<BuildResult> {\n const opts = { ...DEFAULT_BUILD_OPTIONS, ...options };\n const startTime = Date.now();\n const rootDir = process.cwd();\n const outputDir = path.join(rootDir, '.float');\n\n // Clean output directory\n if (fs.existsSync(outputDir)) {\n fs.rmSync(outputDir, { recursive: true });\n }\n fs.mkdirSync(outputDir, { recursive: true });\n fs.mkdirSync(path.join(outputDir, 'pages'), { recursive: true });\n fs.mkdirSync(path.join(outputDir, 'static'), { recursive: true });\n fs.mkdirSync(path.join(outputDir, 'server'), { recursive: true });\n\n console.log(pc.dim(' Scanning routes...'));\n\n // Scan routes\n const routes = await scanRoutes(rootDir);\n const pageRoutes = routes.filter(r => r.type === 'page' && !r.params.length);\n const dynamicRoutes = routes.filter(r => r.type === 'page' && r.params.length > 0);\n const apiRoutes = routes.filter(r => r.type === 'api');\n\n console.log(pc.dim(` Found ${pageRoutes.length} static pages, ${dynamicRoutes.length} dynamic routes, ${apiRoutes.length} API routes`));\n\n // Build client bundle\n console.log(pc.dim(' Building client bundle...'));\n \n const clientEntryPoints = routes\n .filter(r => r.type === 'page')\n .map(r => r.absolutePath);\n\n if (clientEntryPoints.length > 0) {\n await esbuild.build({\n entryPoints: clientEntryPoints,\n bundle: true,\n outdir: path.join(outputDir, 'static', '_float'),\n format: 'esm',\n splitting: true,\n minify: opts.minify,\n sourcemap: opts.sourcemap,\n target: ['es2020'],\n platform: 'browser',\n jsx: 'automatic',\n loader: {\n '.tsx': 'tsx',\n '.ts': 'ts',\n '.jsx': 'jsx',\n '.js': 'js',\n '.css': 'css',\n '.svg': 'dataurl',\n '.png': 'dataurl',\n '.jpg': 'dataurl',\n },\n external: ['react', 'react-dom'],\n metafile: opts.analyze,\n });\n }\n\n // Build server bundle\n console.log(pc.dim(' Building server bundle...'));\n\n const serverEntryPoints = routes.map(r => r.absolutePath);\n\n if (serverEntryPoints.length > 0) {\n await esbuild.build({\n entryPoints: serverEntryPoints,\n bundle: true,\n outdir: path.join(outputDir, 'server'),\n format: 'esm',\n platform: 'node',\n target: ['node18'],\n jsx: 'automatic',\n minify: false, // Keep server code readable\n sourcemap: true,\n loader: {\n '.tsx': 'tsx',\n '.ts': 'ts',\n '.jsx': 'jsx',\n '.js': 'js',\n },\n external: ['react', 'react-dom', '@float/core'],\n });\n }\n\n // Pre-render static pages (SSG)\n console.log(pc.dim(' Pre-rendering static pages...'));\n const prerenderedPages: string[] = [];\n\n for (const route of pageRoutes) {\n try {\n const html = await renderPage(route, {}, { isDev: false });\n const outputPath = route.path === '/' \n ? path.join(outputDir, 'pages', 'index.html')\n : path.join(outputDir, 'pages', route.path, 'index.html');\n \n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, html);\n prerenderedPages.push(route.path);\n \n console.log(pc.dim(` βœ“ ${route.path}`));\n } catch (error) {\n console.log(pc.yellow(` ⚠ ${route.path} (will render at runtime)`));\n }\n }\n\n // Build API routes for edge\n console.log(pc.dim(' Building API routes...'));\n\n for (const route of apiRoutes) {\n await esbuild.build({\n entryPoints: [route.absolutePath],\n bundle: true,\n outfile: path.join(outputDir, 'server', 'api', `${route.path.replace(/\\//g, '_')}.js`),\n format: 'esm',\n platform: 'neutral', // Edge compatible\n target: ['es2020'],\n minify: true,\n });\n }\n\n // Copy public files\n const publicDir = path.join(rootDir, 'public');\n if (fs.existsSync(publicDir)) {\n console.log(pc.dim(' Copying public assets...'));\n copyDir(publicDir, path.join(outputDir, 'static'));\n }\n\n // Generate routes manifest\n const manifest = {\n version: 1,\n buildTime: new Date().toISOString(),\n routes: routes.map(r => ({\n path: r.path,\n type: r.type,\n filePath: r.filePath,\n absolutePath: path.relative(rootDir, r.absolutePath),\n params: r.params,\n isCatchAll: r.isCatchAll,\n isOptionalCatchAll: r.isOptionalCatchAll,\n layouts: r.layouts.map(l => path.relative(rootDir, l)),\n prerendered: prerenderedPages.includes(r.path),\n })),\n staticPages: prerenderedPages,\n dynamicRoutes: dynamicRoutes.map(r => r.path),\n apiRoutes: apiRoutes.map(r => r.path),\n };\n\n fs.writeFileSync(\n path.join(outputDir, 'routes-manifest.json'),\n JSON.stringify(manifest, null, 2)\n );\n\n // Generate build info\n const duration = Date.now() - startTime;\n \n const buildInfo = {\n duration,\n timestamp: new Date().toISOString(),\n routes: routes.length,\n pages: prerenderedPages.length,\n };\n\n fs.writeFileSync(\n path.join(outputDir, 'build-info.json'),\n JSON.stringify(buildInfo, null, 2)\n );\n\n // Print summary\n console.log('');\n console.log(pc.bold(' Build Summary:'));\n console.log(pc.dim(` Static Pages: ${prerenderedPages.length}`));\n console.log(pc.dim(` Dynamic Routes: ${dynamicRoutes.length}`));\n console.log(pc.dim(` API Routes: ${apiRoutes.length}`));\n console.log(pc.dim(` Output: .float/`));\n\n return {\n routes,\n duration,\n outputDir,\n pages: prerenderedPages,\n assets: [],\n };\n}\n\nfunction copyDir(src: string, dest: string) {\n fs.mkdirSync(dest, { recursive: true });\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath);\n } else {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n}\n","/**\n * Float.js Production Server\n */\n\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport mime from 'mime-types';\nimport { matchRoute, type Route } from '../router/index.js';\nimport { renderPage } from './ssr.js';\n\nexport interface ProdServerOptions {\n port: number;\n host: string;\n}\n\n// Pre-built routes cache\nlet cachedRoutes: Route[] = [];\nlet pageCache = new Map<string, string>();\n\nexport async function startProductionServer(options: ProdServerOptions): Promise<void> {\n const { port, host } = options;\n const rootDir = process.cwd();\n const distDir = path.join(rootDir, '.float');\n const publicDir = path.join(rootDir, 'public');\n\n // Load pre-built routes manifest\n const manifestPath = path.join(distDir, 'routes-manifest.json');\n if (fs.existsSync(manifestPath)) {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));\n cachedRoutes = manifest.routes;\n console.log(pc.dim(` πŸ“¦ Loaded ${cachedRoutes.length} routes from manifest`));\n } else {\n console.error(pc.red(' ❌ No build manifest found. Run `float build` first.'));\n process.exit(1);\n }\n\n // Load pre-rendered pages\n const pagesDir = path.join(distDir, 'pages');\n if (fs.existsSync(pagesDir)) {\n const prerenderedFiles = fs.readdirSync(pagesDir, { recursive: true }) as string[];\n for (const file of prerenderedFiles) {\n if (file.endsWith('.html')) {\n const routePath = '/' + file.replace(/\\.html$/, '').replace(/index$/, '');\n const content = fs.readFileSync(path.join(pagesDir, file), 'utf-8');\n pageCache.set(routePath, content);\n }\n }\n console.log(pc.dim(` πŸ“„ Loaded ${pageCache.size} pre-rendered pages`));\n }\n\n const server = http.createServer(async (req, res) => {\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const pathname = url.pathname;\n\n try {\n // Serve static assets from .float/static\n const staticPath = path.join(distDir, 'static', pathname);\n if (fs.existsSync(staticPath) && fs.statSync(staticPath).isFile()) {\n const content = fs.readFileSync(staticPath);\n const contentType = mime.lookup(staticPath) || 'application/octet-stream';\n res.writeHead(200, { \n 'Content-Type': contentType,\n 'Cache-Control': 'public, max-age=31536000, immutable',\n });\n res.end(content);\n return;\n }\n\n // Serve public files\n const publicFilePath = path.join(publicDir, pathname);\n if (fs.existsSync(publicFilePath) && fs.statSync(publicFilePath).isFile()) {\n const content = fs.readFileSync(publicFilePath);\n const contentType = mime.lookup(publicFilePath) || 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n return;\n }\n\n // Check pre-rendered cache\n const cachedPage = pageCache.get(pathname) || pageCache.get(pathname + '/');\n if (cachedPage) {\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'public, s-maxage=3600, stale-while-revalidate',\n });\n res.end(cachedPage);\n return;\n }\n\n // Match and render route (SSR)\n const { route, params } = matchRoute(pathname, cachedRoutes);\n\n if (!route) {\n res.writeHead(404, { 'Content-Type': 'text/html' });\n res.end('<h1>404 - Not Found</h1>');\n return;\n }\n\n // Handle API routes\n if (route.type === 'api') {\n // API routes handled by edge functions in production\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ message: 'API route' }));\n return;\n }\n\n // SSR render\n const html = await renderPage(route, params, { isDev: false });\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=30',\n });\n res.end(html);\n\n } catch (error) {\n console.error(pc.red('Request error:'), error);\n res.writeHead(500, { 'Content-Type': 'text/html' });\n res.end('<h1>500 - Internal Server Error</h1>');\n }\n });\n\n server.listen(port, host, () => {\n console.log(pc.green(` βœ… Production server running at ${pc.cyan(`http://${host}:${port}`)}\\n`));\n });\n}\n","export const VERSION = '2.0.4';\n"],"mappings":";;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAF9B;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsIO,SAAS,sBAAsB;AACpC,SAAO,CAAC,KAAsB,KAAqB,SAAqB;AACtE,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAG1E,UAAM,cAAc,IAAI,IAAI,KAAK,GAAG;AACpC,QAAI,MAAM,SAAS,OAAa,UAAgB,UAAgB;AAC9D,YAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,qBAAe,WAAW;AAAA,QACxB;AAAA,QACA,QAAQ,IAAI,UAAU;AAAA,QACtB,MAAM,IAAI,OAAO;AAAA,QACjB,QAAQ,IAAI;AAAA,QACZ;AAAA,QACA,WAAW,oBAAI,KAAK;AAAA,MACtB,CAAC;AAED,aAAO,YAAY,OAAO,UAAU,QAAQ;AAAA,IAC9C;AAEA,SAAK;AAAA,EACP;AACF;AAMA,SAAS,sBAAsB,OAAkC;AAC/D,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,WAAW,KAAK,MAAM,QAAQ,YAAY,WAAW,OAAO,IAAI;AACtE,QAAM,cAAc,KAAK,MAAM,QAAQ,YAAY,YAAY,OAAO,IAAI;AAC1E,QAAM,gBAAgB,KAAK,MAAM,QAAQ,SAAS,GAAI;AACtD,QAAM,kBAAkB,gBAAgB,KACpC,GAAG,aAAa,MAChB,gBAAgB,OACd,GAAG,KAAK,MAAM,gBAAgB,EAAE,CAAC,KAAK,gBAAgB,EAAE,MACxD,GAAG,KAAK,MAAM,gBAAgB,IAAI,CAAC,KAAK,KAAK,MAAO,gBAAgB,OAAQ,EAAE,CAAC;AAErF,QAAM,YAAY,MAAM,OAAO,SAAS,IAAI,MAAM,OAAO,CAAC,IAAI;AAC9D,QAAM,gBAAgB,YAClB,IAAI,KAAK,UAAU,SAAS,EAAE,mBAAmB,IACjD;AAEJ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACLnC;AAMO,SAAS,sBAA8B;AAC5C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+UT;;;ACtVA;AAKA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BnB,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+Bf,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BR,SAAS,mBAA2B;AACzC,SAAO,WAAW,QAAQ,WAAW,eAAe,IAAI,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAuG/D;AACJ;AAEO,SAAS,oBAA4B;AAC1C,SAAO,WAAW,QAAQ,WAAW,OAAO,IAAI,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkHvD;AACJ;AAEO,SAAS,uBAA+B;AAC7C,SAAO,WAAW,QAAQ,WAAW,UAAU,IAAI,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkH1D;AACJ;;;AC/aA;AAKA,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACNjB;AAKA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,QAAQ;AAiBR,SAAS,mBAAmB,SAAiC;AAClE,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAA4B;AAEhC,aAAW,UAAU,iBAAiB;AACpC,UAAM,WAAWA,MAAK,KAAK,SAAS,MAAM;AAC1C,QAAID,IAAG,WAAW,QAAQ,GAAG;AAC3B,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAcC,MAAK,KAAK,SAAS,OAAO,aAAa;AAC3D,QAAM,aAAaD,IAAG,WAAW,WAAW;AAE5C,SAAO;AAAA,IACL,aAAa,CAAC,CAAC;AAAA,IACf;AAAA,IACA,aAAa,aAAa,cAAc;AAAA,IACxC,YAAY,CAAC,cAAc,CAAC;AAAA,EAC9B;AACF;AAKA,eAAsB,cACpB,SACA,UAAgC,CAAC,GAClB;AACf,QAAM,EAAE,QAAQ,OAAO,SAAS,MAAM,IAAI;AAC1C,QAAM,SAAS,mBAAmB,OAAO;AAEzC,MAAI,CAAC,SAAS,CAAC,OAAO,YAAY;AAChC;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAI,GAAG,KAAK,wCAAiC,CAAC;AAAA,EACxD;AAGA,MAAI,CAAC,OAAO,cAAc,OAAO;AAC/B,UAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAavB,UAAM,aAAaC,MAAK,KAAK,SAAS,oBAAoB;AAC1D,IAAAD,IAAG,cAAc,YAAY,cAAc;AAE3C,QAAI,CAAC,QAAQ;AACX,cAAQ,IAAI,GAAG,MAAM,qCAAgC,CAAC;AAAA,IACxD;AAAA,EACF;AAGA,QAAM,cAAcC,MAAK,KAAK,SAAS,mBAAmB;AAC1D,MAAI,CAACD,IAAG,WAAW,WAAW,KAAK,OAAO;AACxC,UAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQtB,IAAAA,IAAG,cAAc,aAAa,aAAa;AAE3C,QAAI,CAAC,QAAQ;AACX,cAAQ,IAAI,GAAG,MAAM,oCAA+B,CAAC;AAAA,IACvD;AAAA,EACF;AAGA,QAAM,SAASC,MAAK,KAAK,SAAS,KAAK;AACvC,MAAI,CAACD,IAAG,WAAW,MAAM,GAAG;AAC1B,IAAAA,IAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,cAAcC,MAAK,KAAK,QAAQ,aAAa;AACnD,MAAI,CAACD,IAAG,WAAW,WAAW,KAAK,OAAO;AACxC,UAAM,aAAa;AAAA;AAAA;AAAA;AAKnB,IAAAA,IAAG,cAAc,aAAa,UAAU;AAExC,QAAI,CAAC,QAAQ;AACX,cAAQ,IAAI,GAAG,MAAM,kCAA6B,CAAC;AAAA,IACrD;AAAA,EACF;AAGA,QAAM,aAAaC,MAAK,KAAK,QAAQ,YAAY;AACjD,MAAI,CAACD,IAAG,WAAW,UAAU,GAAG;AAC9B,UAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAetB,IAAAA,IAAG,cAAc,YAAY,aAAa;AAE1C,QAAI,CAAC,QAAQ;AACX,cAAQ,IAAI,GAAG,MAAM,iCAA4B,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAI,GAAG,MAAM,gCAA2B,CAAC;AAAA,EACnD;AACF;AAKO,SAAS,kBAAkB,SAKhC;AACA,QAAM,kBAAkBC,MAAK,KAAK,SAAS,cAAc;AAEzD,MAAI,CAACD,IAAG,WAAW,eAAe,GAAG;AACnC,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,MAAMA,IAAG,aAAa,iBAAiB,OAAO,CAAC;AACxE,QAAM,UAAU;AAAA,IACd,GAAG,YAAY;AAAA,IACf,GAAG,YAAY;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,aAAa,CAAC,CAAC,QAAQ,aAAa;AAAA,IACpC,YAAY,CAAC,CAAC,QAAQ,SAAS;AAAA,IAC/B,iBAAiB,CAAC,CAAC,QAAQ,cAAc;AAAA,EAC3C;AACF;AAKO,SAAS,0BAA0B,SAAgC;AACxE,QAAM,OAAO,kBAAkB,OAAO;AAEtC,MAAI,CAAC,KAAK,gBAAgB;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,UAAoB,CAAC;AAC3B,MAAI,CAAC,KAAK,YAAa,SAAQ,KAAK,aAAa;AACjD,MAAI,CAAC,KAAK,WAAY,SAAQ,KAAK,SAAS;AAC5C,MAAI,CAAC,KAAK,gBAAiB,SAAQ,KAAK,cAAc;AAEtD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,cAAcA,IAAG,WAAWC,MAAK,KAAK,SAAS,WAAW,CAAC;AACjE,QAAM,cAAcD,IAAG,WAAWC,MAAK,KAAK,SAAS,gBAAgB,CAAC;AACtE,QAAM,aAAaD,IAAG,WAAWC,MAAK,KAAK,SAAS,WAAW,CAAC;AAEhE,MAAI,KAAK;AACT,MAAI,WAAY,MAAK;AAAA,WACZ,YAAa,MAAK;AAAA,WAClB,YAAa,MAAK;AAE3B,SAAO,GAAG,EAAE,IAAI,QAAQ,KAAK,GAAG,CAAC;AACnC;;;ADjNA,eAAsB,WACpB,UACA,UAAkB,QAAQ,IAAI,GACH;AAC3B,QAAM,UAAUC,IAAG,aAAa,UAAU,OAAO;AAGjD,QAAM,iBAAiB,mBAAmB,OAAO;AAEjD,MAAI,CAAC,eAAe,aAAa;AAE/B,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AAEA,MAAI;AAEF,UAAM,UAAU,MAAM,OAAO,SAAS,EAAE,KAAK,OAAK,EAAE,OAAO;AAC3D,UAAM,cAAc,MAAM,OAAO,aAAa,EAAE,KAAK,OAAK,EAAE,OAAO;AACnE,UAAM,eAAe,MAAM,OAAO,cAAc,EAAE,KAAK,OAAK,EAAE,OAAO;AAGrE,UAAM,aAAa,eAAe,cAAcC,MAAK,KAAK,SAAS,oBAAoB;AACvF,QAAI,uBAAuB,CAAC;AAE5B,QAAID,IAAG,WAAW,UAAU,GAAG;AAE7B,YAAM,YAAY,IAAI,IAAI,UAAU,UAAU,EAAE;AAChD,6BAAuB,MAAM,OAAO,UAAU,MAAM,KAAK,OAAK,EAAE,WAAW,CAAC;AAAA,IAC9E;AAGA,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC3B,YAAY,oBAAoB;AAAA,MAChC,aAAa;AAAA,IACf,CAAC,EAAE,QAAQ,SAAS;AAAA,MAClB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,KAAK,EAAE,QAAQ,MAAM;AAAA,IACvB,CAAC;AAED,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,KAAK,OAAO,KAAK,SAAS;AAAA,IAC5B;AAAA,EACF,SAAS,OAAO;AAEd,YAAQ,KAAK,2CAA2C,KAAK;AAC7D,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AACF;AAKO,SAAS,mBAAmB,UAAkB,SAA0B;AAC7E,QAAM,SAAS,mBAAmB,OAAO;AAKzC,MAAI,CAAC,OAAO,aAAa;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,UAAUA,IAAG,aAAa,UAAU,OAAO;AACjD,SAAO,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,QAAQ;AACnE;;;ARjDA,eAAsB,gBAAgB,SAA+C;AACnF,QAAM,EAAE,MAAM,MAAM,KAAK,IAAI;AAC7B,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,YAAYE,MAAK,KAAK,SAAS,QAAQ;AAE7C,MAAI,SAAkB,CAAC;AACvB,MAAI,SAA6B;AACjC,MAAI,MAA8B;AAClC,QAAM,UAAU,oBAAI,IAAe;AAGnC,iBAAe,gBAAgB;AAC7B,QAAI;AACF,eAAS,MAAM,WAAW,OAAO;AACjC,cAAQ,IAAIC,IAAG,IAAI,qBAAc,OAAO,MAAM,SAAS,CAAC;AAGxD,YAAM,iBAAiB,mBAAmB,OAAO;AACjD,UAAI,eAAe,YAAY;AAC7B,gBAAQ,IAAIA,IAAG,OAAO,yCAA+B,CAAC;AACtD,cAAM,aAAa,0BAA0B,OAAO;AACpD,YAAI,YAAY;AACd,kBAAQ,IAAIA,IAAG,IAAI,oBAAa,UAAU,EAAE,CAAC;AAC7C,kBAAQ,IAAIA,IAAG,IAAI,iCAA0B,CAAC;AAAA,QAChD,OAAO;AAEL,gBAAM,cAAc,OAAO;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAMA,IAAG,IAAI,wBAAwB,GAAG,KAAK;AAAA,IACvD;AAAA,EACF;AAGA,WAAS,cAAc,MAAmE,MAAY;AACpG,UAAM,UAAU,KAAK,UAAU,EAAE,MAAM,MAAM,OAAO,MAAM,OAAO,WAAW,KAAK,IAAI,EAAE,CAAC;AACxF,YAAQ,QAAQ,YAAU;AACxB,UAAI,OAAO,eAAe,UAAU,MAAM;AACxC,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,kBAAkB;AAAA;AAAA;AAAA,mCAGS,IAAI,IAAI,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCjD,sBAAsB;AAAA,EACtB,mBAAmB;AAAA;AAInB,iBAAe,cACb,KACA,KACA;AACA,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,IAAI,IAAI,EAAE;AAC5D,UAAM,WAAW,IAAI;AAErB,YAAQ,IAAIA,IAAG,IAAI,KAAK,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;AAEjD,QAAI;AAEF,YAAM,iBAAiBD,MAAK,KAAK,WAAW,QAAQ;AACpD,UAAIE,IAAG,WAAW,cAAc,KAAKA,IAAG,SAAS,cAAc,EAAE,OAAO,GAAG;AACzE,cAAM,UAAUA,IAAG,aAAa,cAAc;AAC9C,cAAM,cAAc,KAAK,OAAO,cAAc,KAAK;AACnD,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,YAAI,IAAI,OAAO;AACf;AAAA,MACF;AAGA,UAAI,SAAS,SAAS,MAAM,GAAG;AAC7B,cAAM,UAAUF,MAAK,KAAK,SAAS,OAAO,SAAS,QAAQ,OAAO,EAAE,CAAC;AACrE,YAAIE,IAAG,WAAW,OAAO,GAAG;AAC1B,cAAI;AACF,kBAAM,kBAAkB,mBAAmB,SAAS,OAAO;AAC3D,gBAAI,iBAAiB;AACnB,oBAAM,SAAS,MAAM,WAAW,SAAS,OAAO;AAChD,kBAAI,UAAU,KAAK;AAAA,gBACjB,gBAAgB;AAAA,gBAChB,iBAAiB;AAAA,cACnB,CAAC;AACD,kBAAI,IAAI,OAAO,IAAI;AAAA,YACrB,OAAO;AACL,oBAAM,UAAUA,IAAG,aAAa,SAAS,OAAO;AAChD,kBAAI,UAAU,KAAK;AAAA,gBACjB,gBAAgB;AAAA,gBAChB,iBAAiB;AAAA,cACnB,CAAC;AACD,kBAAI,IAAI,OAAO;AAAA,YACjB;AACA;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ,MAAMD,IAAG,IAAI,uBAAuB,GAAG,KAAK;AAEpD,kBAAM,UAAUC,IAAG,aAAa,SAAS,OAAO;AAChD,gBAAI,UAAU,KAAK,EAAE,gBAAgB,WAAW,CAAC;AACjD,gBAAI,IAAI,OAAO;AACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,SAAS,WAAW,UAAU,GAAG;AAEnC,YAAI,UAAU,KAAK,EAAE,gBAAgB,yBAAyB,CAAC;AAC/D,YAAI,IAAI,4BAA4B;AACpC;AAAA,MACF;AAGA,UAAI,aAAa,cAAc,SAAS,WAAW,WAAW,GAAG;AAC/D,cAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AAGjC,QAAAA,gBAAe,SAAS,OAAO,IAAI,QAAM;AAAA,UACvC,MAAM,EAAE;AAAA,UACR,MAAM,EAAE;AAAA,UACR,MAAM,EAAE,YAAY,EAAE;AAAA,UACtB,WAAW,EAAE,WAAW,EAAE,QAAQ,SAAS;AAAA,QAC7C,EAAE;AAGF,cAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,cAAM,UAAUA,oBAAmB,EAAE,MAAM,WAAW,CAAC;AAEvD,gBAAQ,KAAK,KAAK,MAAM;AACtB,cAAI,UAAU,GAAG;AACjB,cAAI,IAAI,WAAW;AAAA,QACrB,CAAC;AACD;AAAA,MACF;AAGA,YAAM,EAAE,OAAO,OAAO,IAAI,WAAW,UAAU,MAAM;AAGrD,UAAI,CAAC,SAAS,aAAa,OAAO,OAAO,WAAW,GAAG;AACrD,YAAI,UAAU,KAAK;AAAA,UACjB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,QACnB,CAAC;AACD,YAAI,IAAI,oBAAoB,CAAC;AAC7B;AAAA,MACF;AAGA,UAAI,aAAa,WAAW;AAC1B,YAAI,UAAU,KAAK,EAAE,gBAAgB,4BAA4B,iBAAiB,WAAW,CAAC;AAC9F,YAAI,IAAI,iBAAiB,CAAC;AAC1B;AAAA,MACF;AACA,UAAI,aAAa,YAAY;AAC3B,YAAI,UAAU,KAAK,EAAE,gBAAgB,4BAA4B,iBAAiB,WAAW,CAAC;AAC9F,YAAI,IAAI,kBAAkB,CAAC;AAC3B;AAAA,MACF;AACA,UAAI,aAAa,eAAe;AAC9B,YAAI,UAAU,KAAK,EAAE,gBAAgB,4BAA4B,iBAAiB,WAAW,CAAC;AAC9F,YAAI,IAAI,qBAAqB,CAAC;AAC9B;AAAA,MACF;AAEA,UAAI,CAAC,OAAO;AACV,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,YAAI,IAAI,cAAc,QAAQ,CAAC;AAC/B;AAAA,MACF;AAGA,UAAI,MAAM,SAAS,OAAO;AACxB,cAAM,eAAe,KAAK,KAAK,OAAO,MAAM;AAC5C;AAAA,MACF;AAGA,YAAM,OAAO,MAAM,WAAW,OAAO,QAAQ;AAAA,QAC3C,WAAW;AAAA,QACX,OAAO;AAAA,MACT,CAAC;AAED,UAAI,UAAU,KAAK;AAAA,QACjB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB,CAAC;AACD,UAAI,IAAI,IAAI;AAAA,IAEd,SAAS,OAAO;AACd,cAAQ,MAAMH,IAAG,IAAI,gBAAgB,GAAG,KAAK;AAC7C,UAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,UAAI,IAAI,gBAAgB,KAAc,CAAC;AAAA,IACzC;AAAA,EACF;AAGA,iBAAe,eACb,KACA,KACA,OACA,QACA;AACA,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,MAAM,YAAY;AACrD,YAAM,SAAS,IAAI,QAAQ,YAAY,KAAK;AAG5C,YAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,IAAI,IAAI,EAAE;AAC5D,YAAM,OAAO,MAAM,eAAe,GAAG;AAErC,YAAM,UAAU,IAAI,QAAQ,IAAI,SAAS,GAAG;AAAA,QAC1C;AAAA,QACA,SAAS,OAAO;AAAA,UACd,OAAO,QAAQ,IAAI,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,MAAS;AAAA,QAChE;AAAA,QACA,MAAM,WAAW,SAAS,WAAW,SAAS,OAAO;AAAA,MACvD,CAAC;AAGD,YAAM,UAAU,OAAO,MAAM,KAAK,OAAO;AAEzC,UAAI,CAAC,SAAS;AACZ,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,CAAC,CAAC;AACvD;AAAA,MACF;AAGA,YAAM,WAAqB,MAAM,QAAQ,SAAS,EAAE,OAAO,CAAC;AAG5D,UAAI,UAAU,SAAS,QAAQ,OAAO,YAAY,SAAS,OAAO,CAAC;AACnE,YAAM,eAAe,MAAM,SAAS,KAAK;AACzC,UAAI,IAAI,YAAY;AAAA,IAEtB,SAAS,OAAO;AACd,cAAQ,MAAMA,IAAG,IAAI,kBAAkB,GAAG,KAAK;AAC/C,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,iBAAe,QAAQ;AACrB,UAAM,cAAc;AAGpB,aAAS,KAAK,aAAa,aAAa;AAGxC,UAAM,IAAI,gBAAgB,EAAE,MAAM,OAAO,EAAE,CAAC;AAC5C,QAAI,GAAG,cAAc,CAAC,OAAO;AAC3B,cAAQ,IAAI,EAAE;AACd,SAAG,GAAG,SAAS,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,IACzC,CAAC;AAGD,UAAM,UAAU,SAAS;AAAA,MACvB;AAAA,QACED,MAAK,KAAK,SAAS,0BAA0B;AAAA,QAC7CA,MAAK,KAAK,SAAS,iCAAiC;AAAA,QACpDA,MAAK,KAAK,SAAS,0BAA0B;AAAA,MAC/C;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,IACF;AAEA,YAAQ,GAAG,UAAU,OAAO,aAAa;AACvC,cAAQ,IAAIC,IAAG,OAAO;AAAA,yBAAuBD,MAAK,SAAS,SAAS,QAAQ,CAAC,EAAE,CAAC;AAGhF,UAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,cAAM,cAAc;AAAA,MACtB;AAEA,oBAAc,QAAQ;AAAA,IACxB,CAAC;AAED,YAAQ,GAAG,OAAO,OAAO,aAAa;AACpC,UAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,gBAAQ,IAAIC,IAAG,MAAM;AAAA,uBAAqBD,MAAK,SAAS,SAAS,QAAQ,CAAC,EAAE,CAAC;AAC7E,cAAM,cAAc;AACpB,sBAAc,QAAQ;AAAA,MACxB;AAAA,IACF,CAAC;AAED,YAAQ,GAAG,UAAU,OAAO,aAAa;AACvC,UAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,gBAAQ,IAAIC,IAAG,IAAI;AAAA,yBAAuBD,MAAK,SAAS,SAAS,QAAQ,CAAC,EAAE,CAAC;AAC7E,cAAM,cAAc;AACpB,sBAAc,QAAQ;AAAA,MACxB;AAAA,IACF,CAAC;AAGD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,aAAQ,OAAO,MAAM,MAAM,MAAM;AAC/B,gBAAQ,IAAIC,IAAG,MAAM,8BAAyBA,IAAG,KAAK,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;AAClF,gBAAQ,IAAIA,IAAG,IAAI,gCAA2B,IAAI,IAAI,OAAO,CAAC;AAAA,CAAI,CAAC;AAGnE,gBAAQ,IAAIA,IAAG,KAAK,WAAW,CAAC;AAChC,eAAO,QAAQ,WAAS;AACtB,cAAI,MAAM,SAAS,QAAQ;AACzB,oBAAQ,IAAIA,IAAG,IAAI,OAAOA,IAAG,MAAM,QAAG,CAAC,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,UAC1D,WAAW,MAAM,SAAS,OAAO;AAC/B,oBAAQ,IAAIA,IAAG,IAAI,OAAOA,IAAG,KAAK,QAAG,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC;AAAA,UAC/D;AAAA,QACF,CAAC;AACD,gBAAQ,IAAI,EAAE;AAEd,YAAI,MAAM;AACR,iBAAO,eAAe,EAAE,KAAK,CAAC,EAAE,KAAK,MAAM;AACzC,iBAAK,eAAe,IAAI,IAAI,IAAI,EAAE;AAAA,UACpC,CAAC;AAAA,QACH;AAEA,gBAAQ;AAAA,MACV,CAAC;AAED,aAAQ,GAAG,SAAS,MAAM;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,iBAAe,OAAO;AACpB,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,WAAK,MAAM;AACX,cAAQ,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,iBAAe,UAAU;AACvB,UAAM,KAAK;AACX,UAAM,MAAM;AAAA,EACd;AAEA,SAAO,EAAE,OAAO,MAAM,QAAQ;AAChC;AAGA,SAAS,eAAe,KAA4C;AAClE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO;AACX,QAAI,GAAG,QAAQ,WAAS,QAAQ,KAAK;AACrC,QAAI,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AACjC,QAAI,GAAG,SAAS,MAAM;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,cAAc,UAA0B;AAC/C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YA8BG,QAAQ;AAAA,qCACiB,aAAa,MAAM,KAAK,QAAQ;AAAA;AAAA;AAAA;AAIrE;AAEA,SAAS,gBAAgB,OAAsB;AAC7C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAoCcI,YAAW,MAAM,OAAO,CAAC;AAAA,uBACzBA,YAAW,MAAM,SAAS,EAAE,CAAC;AAAA;AAAA;AAGpD;AAEA,SAASA,YAAW,MAAsB;AACxC,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;;;AUpgBA;AAKA,YAAYC,cAAa;AACzB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAkBf,IAAM,wBAAgD;AAAA,EACpD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AACb;AAEA,eAAsBC,OAAM,UAAwB,CAAC,GAAyB;AAC5E,QAAM,OAAO,EAAE,GAAG,uBAAuB,GAAG,QAAQ;AACpD,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,YAAYC,MAAK,KAAK,SAAS,QAAQ;AAG7C,MAAIC,IAAG,WAAW,SAAS,GAAG;AAC5B,IAAAA,IAAG,OAAO,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AACA,EAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC3C,EAAAA,IAAG,UAAUD,MAAK,KAAK,WAAW,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,EAAAC,IAAG,UAAUD,MAAK,KAAK,WAAW,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,EAAAC,IAAG,UAAUD,MAAK,KAAK,WAAW,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAEhE,UAAQ,IAAIE,IAAG,IAAI,sBAAsB,CAAC;AAG1C,QAAM,SAAS,MAAM,WAAW,OAAO;AACvC,QAAM,aAAa,OAAO,OAAO,OAAK,EAAE,SAAS,UAAU,CAAC,EAAE,OAAO,MAAM;AAC3E,QAAM,gBAAgB,OAAO,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE,OAAO,SAAS,CAAC;AACjF,QAAM,YAAY,OAAO,OAAO,OAAK,EAAE,SAAS,KAAK;AAErD,UAAQ,IAAIA,IAAG,IAAI,WAAW,WAAW,MAAM,kBAAkB,cAAc,MAAM,oBAAoB,UAAU,MAAM,aAAa,CAAC;AAGvI,UAAQ,IAAIA,IAAG,IAAI,6BAA6B,CAAC;AAEjD,QAAM,oBAAoB,OACvB,OAAO,OAAK,EAAE,SAAS,MAAM,EAC7B,IAAI,OAAK,EAAE,YAAY;AAE1B,MAAI,kBAAkB,SAAS,GAAG;AAChC,UAAc,eAAM;AAAA,MAClB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,QAAQF,MAAK,KAAK,WAAW,UAAU,QAAQ;AAAA,MAC/C,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,QAAQ,CAAC,QAAQ;AAAA,MACjB,UAAU;AAAA,MACV,KAAK;AAAA,MACL,QAAQ;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA,UAAU,CAAC,SAAS,WAAW;AAAA,MAC/B,UAAU,KAAK;AAAA,IACjB,CAAC;AAAA,EACH;AAGA,UAAQ,IAAIE,IAAG,IAAI,6BAA6B,CAAC;AAEjD,QAAM,oBAAoB,OAAO,IAAI,OAAK,EAAE,YAAY;AAExD,MAAI,kBAAkB,SAAS,GAAG;AAChC,UAAc,eAAM;AAAA,MAClB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,QAAQF,MAAK,KAAK,WAAW,QAAQ;AAAA,MACrC,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,CAAC,QAAQ;AAAA,MACjB,KAAK;AAAA,MACL,QAAQ;AAAA;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,UAAU,CAAC,SAAS,aAAa,aAAa;AAAA,IAChD,CAAC;AAAA,EACH;AAGA,UAAQ,IAAIE,IAAG,IAAI,iCAAiC,CAAC;AACrD,QAAM,mBAA6B,CAAC;AAEpC,aAAW,SAAS,YAAY;AAC9B,QAAI;AACF,YAAM,OAAO,MAAM,WAAW,OAAO,CAAC,GAAG,EAAE,OAAO,MAAM,CAAC;AACzD,YAAM,aAAa,MAAM,SAAS,MAC9BF,MAAK,KAAK,WAAW,SAAS,YAAY,IAC1CA,MAAK,KAAK,WAAW,SAAS,MAAM,MAAM,YAAY;AAE1D,MAAAC,IAAG,UAAUD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,MAAAC,IAAG,cAAc,YAAY,IAAI;AACjC,uBAAiB,KAAK,MAAM,IAAI;AAEhC,cAAQ,IAAIC,IAAG,IAAI,cAAS,MAAM,IAAI,EAAE,CAAC;AAAA,IAC3C,SAAS,OAAO;AACd,cAAQ,IAAIA,IAAG,OAAO,cAAS,MAAM,IAAI,2BAA2B,CAAC;AAAA,IACvE;AAAA,EACF;AAGA,UAAQ,IAAIA,IAAG,IAAI,0BAA0B,CAAC;AAE9C,aAAW,SAAS,WAAW;AAC7B,UAAc,eAAM;AAAA,MAClB,aAAa,CAAC,MAAM,YAAY;AAAA,MAChC,QAAQ;AAAA,MACR,SAASF,MAAK,KAAK,WAAW,UAAU,OAAO,GAAG,MAAM,KAAK,QAAQ,OAAO,GAAG,CAAC,KAAK;AAAA,MACrF,QAAQ;AAAA,MACR,UAAU;AAAA;AAAA,MACV,QAAQ,CAAC,QAAQ;AAAA,MACjB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAGA,QAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ;AAC7C,MAAIC,IAAG,WAAW,SAAS,GAAG;AAC5B,YAAQ,IAAIC,IAAG,IAAI,4BAA4B,CAAC;AAChD,YAAQ,WAAWF,MAAK,KAAK,WAAW,QAAQ,CAAC;AAAA,EACnD;AAGA,QAAM,WAAW;AAAA,IACf,SAAS;AAAA,IACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,QAAQ,OAAO,IAAI,QAAM;AAAA,MACvB,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,MACR,UAAU,EAAE;AAAA,MACZ,cAAcA,MAAK,SAAS,SAAS,EAAE,YAAY;AAAA,MACnD,QAAQ,EAAE;AAAA,MACV,YAAY,EAAE;AAAA,MACd,oBAAoB,EAAE;AAAA,MACtB,SAAS,EAAE,QAAQ,IAAI,OAAKA,MAAK,SAAS,SAAS,CAAC,CAAC;AAAA,MACrD,aAAa,iBAAiB,SAAS,EAAE,IAAI;AAAA,IAC/C,EAAE;AAAA,IACF,aAAa;AAAA,IACb,eAAe,cAAc,IAAI,OAAK,EAAE,IAAI;AAAA,IAC5C,WAAW,UAAU,IAAI,OAAK,EAAE,IAAI;AAAA,EACtC;AAEA,EAAAC,IAAG;AAAA,IACDD,MAAK,KAAK,WAAW,sBAAsB;AAAA,IAC3C,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,EAClC;AAGA,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,QAAQ,OAAO;AAAA,IACf,OAAO,iBAAiB;AAAA,EAC1B;AAEA,EAAAC,IAAG;AAAA,IACDD,MAAK,KAAK,WAAW,iBAAiB;AAAA,IACtC,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,EACnC;AAGA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAIE,IAAG,KAAK,kBAAkB,CAAC;AACvC,UAAQ,IAAIA,IAAG,IAAI,uBAAuB,iBAAiB,MAAM,EAAE,CAAC;AACpE,UAAQ,IAAIA,IAAG,IAAI,uBAAuB,cAAc,MAAM,EAAE,CAAC;AACjE,UAAQ,IAAIA,IAAG,IAAI,uBAAuB,UAAU,MAAM,EAAE,CAAC;AAC7D,UAAQ,IAAIA,IAAG,IAAI,6BAA6B,CAAC;AAEjD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,EACX;AACF;AAEA,SAAS,QAAQ,KAAa,MAAc;AAC1C,EAAAD,IAAG,UAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AACtC,QAAM,UAAUA,IAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAE3D,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAUD,MAAK,KAAK,KAAK,MAAM,IAAI;AACzC,UAAM,WAAWA,MAAK,KAAK,MAAM,MAAM,IAAI;AAE3C,QAAI,MAAM,YAAY,GAAG;AACvB,cAAQ,SAAS,QAAQ;AAAA,IAC3B,OAAO;AACL,MAAAC,IAAG,aAAa,SAAS,QAAQ;AAAA,IACnC;AAAA,EACF;AACF;;;ACvOA;AAIA,OAAOE,WAAU;AACjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAUjB,IAAI,eAAwB,CAAC;AAC7B,IAAI,YAAY,oBAAI,IAAoB;AAExC,eAAsB,sBAAsB,SAA2C;AACrF,QAAM,EAAE,MAAM,KAAK,IAAI;AACvB,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,UAAUC,MAAK,KAAK,SAAS,QAAQ;AAC3C,QAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ;AAG7C,QAAM,eAAeA,MAAK,KAAK,SAAS,sBAAsB;AAC9D,MAAIC,IAAG,WAAW,YAAY,GAAG;AAC/B,UAAM,WAAW,KAAK,MAAMA,IAAG,aAAa,cAAc,OAAO,CAAC;AAClE,mBAAe,SAAS;AACxB,YAAQ,IAAIC,IAAG,IAAI,sBAAe,aAAa,MAAM,uBAAuB,CAAC;AAAA,EAC/E,OAAO;AACL,YAAQ,MAAMA,IAAG,IAAI,4DAAuD,CAAC;AAC7E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,WAAWF,MAAK,KAAK,SAAS,OAAO;AAC3C,MAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,UAAM,mBAAmBA,IAAG,YAAY,UAAU,EAAE,WAAW,KAAK,CAAC;AACrE,eAAW,QAAQ,kBAAkB;AACnC,UAAI,KAAK,SAAS,OAAO,GAAG;AAC1B,cAAM,YAAY,MAAM,KAAK,QAAQ,WAAW,EAAE,EAAE,QAAQ,UAAU,EAAE;AACxE,cAAM,UAAUA,IAAG,aAAaD,MAAK,KAAK,UAAU,IAAI,GAAG,OAAO;AAClE,kBAAU,IAAI,WAAW,OAAO;AAAA,MAClC;AAAA,IACF;AACA,YAAQ,IAAIE,IAAG,IAAI,sBAAe,UAAU,IAAI,qBAAqB,CAAC;AAAA,EACxE;AAEA,QAAM,SAASC,MAAK,aAAa,OAAO,KAAK,QAAQ;AACnD,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,IAAI,IAAI,EAAE;AAC5D,UAAM,WAAW,IAAI;AAErB,QAAI;AAEF,YAAM,aAAaH,MAAK,KAAK,SAAS,UAAU,QAAQ;AACxD,UAAIC,IAAG,WAAW,UAAU,KAAKA,IAAG,SAAS,UAAU,EAAE,OAAO,GAAG;AACjE,cAAM,UAAUA,IAAG,aAAa,UAAU;AAC1C,cAAM,cAAcG,MAAK,OAAO,UAAU,KAAK;AAC/C,YAAI,UAAU,KAAK;AAAA,UACjB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,QACnB,CAAC;AACD,YAAI,IAAI,OAAO;AACf;AAAA,MACF;AAGA,YAAM,iBAAiBJ,MAAK,KAAK,WAAW,QAAQ;AACpD,UAAIC,IAAG,WAAW,cAAc,KAAKA,IAAG,SAAS,cAAc,EAAE,OAAO,GAAG;AACzE,cAAM,UAAUA,IAAG,aAAa,cAAc;AAC9C,cAAM,cAAcG,MAAK,OAAO,cAAc,KAAK;AACnD,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,YAAI,IAAI,OAAO;AACf;AAAA,MACF;AAGA,YAAM,aAAa,UAAU,IAAI,QAAQ,KAAK,UAAU,IAAI,WAAW,GAAG;AAC1E,UAAI,YAAY;AACd,YAAI,UAAU,KAAK;AAAA,UACjB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,QACnB,CAAC;AACD,YAAI,IAAI,UAAU;AAClB;AAAA,MACF;AAGA,YAAM,EAAE,OAAO,OAAO,IAAI,WAAW,UAAU,YAAY;AAE3D,UAAI,CAAC,OAAO;AACV,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,YAAI,IAAI,0BAA0B;AAClC;AAAA,MACF;AAGA,UAAI,MAAM,SAAS,OAAO;AAExB,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,SAAS,YAAY,CAAC,CAAC;AAChD;AAAA,MACF;AAGA,YAAM,OAAO,MAAM,WAAW,OAAO,QAAQ,EAAE,OAAO,MAAM,CAAC;AAC7D,UAAI,UAAU,KAAK;AAAA,QACjB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB,CAAC;AACD,UAAI,IAAI,IAAI;AAAA,IAEd,SAAS,OAAO;AACd,cAAQ,MAAMF,IAAG,IAAI,gBAAgB,GAAG,KAAK;AAC7C,UAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,UAAI,IAAI,sCAAsC;AAAA,IAChD;AAAA,EACF,CAAC;AAED,SAAO,OAAO,MAAM,MAAM,MAAM;AAC9B,YAAQ,IAAIA,IAAG,MAAM,yCAAoCA,IAAG,KAAK,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,CAAI,CAAC;AAAA,EACjG,CAAC;AACH;;;AC9HA;AAAO,IAAM,UAAU;;;AbYvB,IAAM,MAAM,IAAI,OAAO;AAGvB,IAAM,SAAS;AAAA,EACbG,IAAG,KAAK,wPAA2C,CAAC;AAAA,EACpDA,IAAG,KAAK,QAAG,CAAC,KAAKA,IAAG,KAAKA,IAAG,QAAQ,iBAAY,CAAC,CAAC,IAAIA,IAAG,IAAI,IAAI,OAAO,EAAE,CAAC,qBAAqBA,IAAG,KAAK,QAAG,CAAC;AAAA,EAC5GA,IAAG,KAAK,QAAG,CAAC,KAAKA,IAAG,IAAI,4BAA4B,CAAC,aAAaA,IAAG,KAAK,QAAG,CAAC;AAAA,EAC9EA,IAAG,KAAK,wPAA2C,CAAC;AAAA;AAItD,IACG,QAAQ,OAAO,0BAA0B,EACzC,OAAO,qBAAqB,qBAAqB,EAAE,SAAS,IAAK,CAAC,EAClE,OAAO,qBAAqB,mBAAmB,EAAE,SAAS,YAAY,CAAC,EACvE,OAAO,UAAU,yBAAyB,EAAE,SAAS,MAAM,CAAC,EAC5D,OAAO,OAAO,YAAY;AACzB,UAAQ,IAAI,MAAM;AAClB,UAAQ,IAAIA,IAAG,KAAK,4CAAqC,CAAC;AAE1D,MAAI;AACF,UAAM,SAAS,MAAM,gBAAgB;AAAA,MACnC,MAAM,OAAO,QAAQ,IAAI;AAAA,MACzB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,IAChB,CAAC;AAED,UAAM,OAAO,MAAM;AAAA,EACrB,SAAS,OAAO;AACd,YAAQ,MAAMA,IAAG,IAAI,oCAA+B,GAAG,KAAK;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,SAAS,sBAAsB,EACvC,OAAO,aAAa,uBAAuB,EAAE,SAAS,MAAM,CAAC,EAC7D,OAAO,OAAO,YAAY;AACzB,UAAQ,IAAI,MAAM;AAClB,UAAQ,IAAIA,IAAG,KAAK,wCAAiC,CAAC;AAEtD,MAAI;AACF,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAMC,OAAM,EAAE,SAAS,QAAQ,QAAQ,CAAC;AACxC,UAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,YAAQ,IAAID,IAAG,MAAM;AAAA,4BAA0B,QAAQ,IAAI,CAAC;AAAA,EAC9D,SAAS,OAAO;AACd,YAAQ,MAAMA,IAAG,IAAI,sBAAiB,GAAG,KAAK;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,SAAS,yBAAyB,EAC1C,OAAO,qBAAqB,qBAAqB,EAAE,SAAS,IAAK,CAAC,EAClE,OAAO,qBAAqB,mBAAmB,EAAE,SAAS,UAAU,CAAC,EACrE,OAAO,OAAO,YAAY;AACzB,UAAQ,IAAI,MAAM;AAClB,UAAQ,IAAIA,IAAG,KAAK,2CAAoC,CAAC;AAEzD,MAAI;AACF,UAAM,sBAAsB;AAAA,MAC1B,MAAM,OAAO,QAAQ,IAAI;AAAA,MACzB,MAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAMA,IAAG,IAAI,gCAA2B,GAAG,KAAK;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,QAAQ,8BAA8B,EAC9C,OAAO,MAAM;AACZ,UAAQ,IAAI,MAAM;AAClB,UAAQ,IAAIA,IAAG,KAAK,qBAAqB,CAAC;AAC1C,UAAQ,IAAI,KAAKA,IAAG,IAAI,WAAW,CAAC,QAAQ,OAAO,EAAE;AACrD,UAAQ,IAAI,KAAKA,IAAG,IAAI,UAAU,CAAC,QAAQ,QAAQ,OAAO,EAAE;AAC5D,UAAQ,IAAI,KAAKA,IAAG,IAAI,WAAW,CAAC,OAAO,QAAQ,QAAQ,EAAE;AAC7D,UAAQ,IAAI,KAAKA,IAAG,IAAI,OAAO,CAAC,WAAW,QAAQ,IAAI,EAAE;AACzD,UAAQ,IAAI,KAAKA,IAAG,IAAI,MAAM,CAAC,YAAY,QAAQ,IAAI,CAAC,EAAE;AAC5D,CAAC;AAEH,IAAI,KAAK;AACT,IAAI,QAAQ,OAAO;AAEnB,IAAI,MAAM;","names":["path","build","pc","fs","path","pc","path","path","fs","path","fs","path","fs","path","path","pc","fs","dashboardState","createDevDashboard","escapeHtml","esbuild","fs","path","pc","build","path","fs","pc","http","fs","path","pc","mime","path","fs","pc","http","mime","pc","build"]}