@float.js/core 2.1.0 β 2.2.1
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.
- package/README.md +38 -0
- package/dist/cli/index.js +361 -120
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +389 -148
- package/dist/index.js.map +1 -1
- package/dist/router/index.d.ts +4 -0
- package/dist/router/index.js +32 -2
- package/dist/router/index.js.map +1 -1
- package/dist/server/index.js +331 -90
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -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/index.ts","../src/version.ts","../src/router/index.ts","../src/server/index.ts","../src/server/dev-server.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/server/prod-server.ts","../src/build/index.ts","../src/hooks/index.ts","../src/hooks/use-router.ts","../src/hooks/use-data.ts","../src/hooks/use-form.ts","../src/hooks/use-async.ts","../src/hooks/use-store.ts","../src/ai/index.ts","../src/api/index.ts","../src/realtime/index.ts","../src/image/index.ts","../src/middleware/index.ts","../src/ssg/index.ts","../src/analytics/index.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 - Ultra Modern Web Framework\n * \n * @packageDocumentation\n */\n\n// Core exports\nexport { VERSION } from './version.js';\n\n// Router\nexport { \n scanRoutes, \n matchRoute,\n type Route as FloatRoute,\n type RouterOptions as FloatRouterOptions,\n} from './router/index.js';\n\n// Server\nexport {\n createDevServer,\n startProductionServer,\n renderPage,\n renderPageStream,\n type DevServer,\n type DevServerOptions,\n type ProdServerOptions,\n type RenderOptions,\n type PageProps,\n} from './server/index.js';\n\n// Build\nexport { \n build,\n type BuildOptions,\n type BuildResult,\n} from './build/index.js';\n\nexport {\n transformFile,\n transformSource,\n clearModuleCache,\n} from './build/transform.js';\n\n// Types for user applications\nexport interface FloatConfig {\n /** App directory (default: 'app') */\n appDir?: string;\n /** Base path for all routes */\n basePath?: string;\n /** Enable React strict mode */\n reactStrictMode?: boolean;\n /** Internationalization config */\n i18n?: {\n locales: string[];\n defaultLocale: string;\n };\n /** Custom headers */\n headers?: () => Promise<Array<{\n source: string;\n headers: Array<{ key: string; value: string }>;\n }>>;\n /** Redirects */\n redirects?: () => Promise<Array<{\n source: string;\n destination: string;\n permanent: boolean;\n }>>;\n /** Environment variables to expose to client */\n env?: Record<string, string>;\n /** Experimental features */\n experimental?: {\n serverActions?: boolean;\n ppr?: boolean; // Partial Pre-rendering\n };\n}\n\n// Metadata types\nexport interface Metadata {\n title?: string | { default: string; template?: string };\n description?: string;\n keywords?: string[];\n authors?: Array<{ name: string; url?: string }>;\n creator?: string;\n publisher?: string;\n robots?: string | {\n index?: boolean;\n follow?: boolean;\n googleBot?: {\n index?: boolean;\n follow?: boolean;\n };\n };\n openGraph?: {\n title?: string;\n description?: string;\n url?: string;\n siteName?: string;\n images?: Array<{\n url: string;\n width?: number;\n height?: number;\n alt?: string;\n }>;\n locale?: string;\n type?: 'website' | 'article' | 'book' | 'profile';\n };\n twitter?: {\n card?: 'summary' | 'summary_large_image' | 'app' | 'player';\n title?: string;\n description?: string;\n images?: string[];\n creator?: string;\n };\n icons?: {\n icon?: string | Array<{ url: string; sizes?: string }>;\n apple?: string | Array<{ url: string; sizes?: string }>;\n };\n manifest?: string;\n canonical?: string;\n}\n\n// Re-export React types for convenience\nexport type { \n ReactNode, \n ReactElement, \n FC, \n ComponentType \n} from 'react';\n\n// Float.js Hooks - Modern utilities for applications\nexport {\n useFloatRouter,\n useFloatData,\n useFloatForm,\n useFloatAsync,\n useFloatDebounce,\n useFloatThrottle,\n createFloatStore,\n useFloatStore,\n combineFloatStores,\n floatMiddleware,\n validators,\n} from './hooks/index.js';\n\n// AI Module - Native AI integration\nexport {\n ai,\n streamResponse,\n sseResponse,\n aiAction,\n OpenAIProvider,\n AnthropicProvider,\n type AIProvider,\n type ChatOptions,\n type Message,\n type AIResponse,\n} from './ai/index.js';\n\n// Type-Safe API Module\nexport {\n f,\n typedRoute,\n json,\n error,\n redirect,\n FloatValidationError,\n type Infer,\n} from './api/index.js';\n\n// Real-time Module - Built-in WebSocket support\nexport {\n FloatRealtime,\n realtime,\n getRealtimeServer,\n createRealtimeClient,\n type RealtimeClient,\n type RealtimeMessage,\n type RealtimeRoom,\n type PresenceState,\n type RealtimeOptions,\n} from './realtime/index.js';\n\n// Dev Tools - Visual dashboard for development\nexport {\n devtools,\n dashboardState,\n createDevDashboard,\n createRequestLogger,\n type RouteInfo,\n type BuildInfo,\n type RequestLog,\n type PerformanceMetrics,\n type DevDashboardOptions,\n} from './devtools/index.js';\n\n// Image Optimization\nexport {\n image,\n configureImages,\n getImageConfig,\n createImageHandler,\n floatImageLoader,\n generateSrcSet,\n getImageProps,\n renderImageToString,\n type ImageConfig,\n type ImageProps,\n type OptimizedImage,\n type StaticImageData,\n} from './image/index.js';\n\n// Edge Middleware\nexport {\n middleware,\n middlewareHelpers,\n NextResponse,\n registerMiddleware,\n clearMiddleware,\n createMiddlewareHandler,\n type MiddlewareRequest,\n type MiddlewareHandler,\n type MiddlewareConfig,\n type NextURL,\n type GeoData,\n} from './middleware/index.js';\n\n// Static Site Generation (SSG) & ISR\nexport {\n ssg,\n SSGEngine,\n getSSGEngine,\n configureSSG,\n defineStaticPaths,\n defineStaticProps,\n createSSGHandler,\n createRevalidateHandler,\n type StaticPath,\n type GetStaticPathsResult,\n type GetStaticPropsContext,\n type GetStaticPropsResult,\n type CachedPage,\n type SSGConfig,\n type GenerateResult,\n} from './ssg/index.js';\n\n// Built-in Analytics\nexport {\n analytics,\n AnalyticsEngine,\n getAnalytics,\n configureAnalytics,\n createAnalyticsMiddleware,\n createAnalyticsHandler,\n analyticsClientScript,\n type PageView,\n type WebVitals,\n type CustomEvent,\n type AnalyticsData,\n type AnalyticsConfig,\n type AnalyticsSummary,\n} from './analytics/index.js';\n\n// Client utilities\nexport { generateWelcomePage } from './client/welcome-page.js';\n","export const VERSION = '2.0.4';\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 Server Exports\n */\n\nexport { createDevServer, type DevServerOptions, type DevServer } from './dev-server.js';\nexport { renderPage, renderPageStream, type RenderOptions, type PageProps } from './ssr.js';\nexport { startProductionServer, type ProdServerOptions } from './prod-server.js';\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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\"><</span><span class=\"text-emerald-600 dark:text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>Hello, Float.js!<span class=\"text-zinc-500\"></</span><span class=\"text-emerald-600 dark:text-emerald-400\">h1</span><span class=\"text-zinc-500\">></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\"><</span><span class=\"text-emerald-400\">div</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"><</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>Welcome to my page<span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">div</span><span class=\"text-zinc-500\">></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\"><</span><span class=\"text-emerald-400\">main</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"><</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>Hello, Float.js!<span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"><</span><span class=\"text-emerald-400\">p</span><span class=\"text-zinc-500\">></span>Welcome to my first app<span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">p</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">main</span><span class=\"text-zinc-500\">></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 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","/**\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 Hooks\n * Modern React hooks for Float.js applications\n */\n\n// Router\nexport { useFloatRouter, type FloatRouter, type FloatRouterState, type NavigateOptions } from './use-router.js';\n\n// Data fetching\nexport { useFloatData, type FloatDataOptions, type FloatDataResult } from './use-data.js';\n\n// Forms\nexport { useFloatForm, validators, type FloatFormOptions, type FloatFormResult, type FieldState, type ValidationRule } from './use-form.js';\n\n// Async operations\nexport { useFloatAsync, useFloatDebounce, useFloatThrottle, type AsyncState, type FloatAsyncResult, type FloatAsyncOptions } from './use-async.js';\n\n// Store\nexport { createFloatStore, useFloatStore, combineFloatStores, floatMiddleware, type FloatStore, type FloatStoreOptions } from './use-store.js';\n","/**\n * Float.js Router Hook\n * Modern client-side routing utilities\n */\n\nimport { useCallback, useMemo } from 'react';\n\nexport interface FloatRouterState {\n pathname: string;\n search: string;\n hash: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\nexport interface FloatRouter extends FloatRouterState {\n push: (url: string, options?: NavigateOptions) => void;\n replace: (url: string, options?: NavigateOptions) => void;\n back: () => void;\n forward: () => void;\n prefetch: (url: string) => void;\n refresh: () => void;\n}\n\nexport interface NavigateOptions {\n scroll?: boolean;\n shallow?: boolean;\n}\n\n/**\n * Access Float.js router for client-side navigation\n * @example\n * const router = useFloatRouter();\n * router.push('/dashboard');\n */\nexport function useFloatRouter(): FloatRouter {\n // Get current location\n const getLocation = useCallback((): FloatRouterState => {\n if (typeof window === 'undefined') {\n return {\n pathname: '/',\n search: '',\n hash: '',\n params: {},\n query: {},\n };\n }\n\n const url = new URL(window.location.href);\n const query: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n params: {}, // Populated by server\n query,\n };\n }, []);\n\n const state = useMemo(() => getLocation(), [getLocation]);\n\n const push = useCallback((url: string, options?: NavigateOptions) => {\n if (typeof window === 'undefined') return;\n \n window.history.pushState({}, '', url);\n window.dispatchEvent(new PopStateEvent('popstate'));\n \n if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n }, []);\n\n const replace = useCallback((url: string, options?: NavigateOptions) => {\n if (typeof window === 'undefined') return;\n \n window.history.replaceState({}, '', url);\n window.dispatchEvent(new PopStateEvent('popstate'));\n \n if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n }, []);\n\n const back = useCallback(() => {\n if (typeof window === 'undefined') return;\n window.history.back();\n }, []);\n\n const forward = useCallback(() => {\n if (typeof window === 'undefined') return;\n window.history.forward();\n }, []);\n\n const prefetch = useCallback((url: string) => {\n if (typeof window === 'undefined') return;\n \n // Create hidden link for prefetch\n const link = document.createElement('link');\n link.rel = 'prefetch';\n link.href = url;\n document.head.appendChild(link);\n }, []);\n\n const refresh = useCallback(() => {\n if (typeof window === 'undefined') return;\n window.location.reload();\n }, []);\n\n return {\n ...state,\n push,\n replace,\n back,\n forward,\n prefetch,\n refresh,\n };\n}\n","/**\n * Float.js Data Hook\n * SWR-like data fetching with caching\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\n\nexport interface FloatDataOptions<T> {\n /** Initial data before fetching */\n fallbackData?: T;\n /** Revalidate on window focus */\n revalidateOnFocus?: boolean;\n /** Revalidate on network reconnect */\n revalidateOnReconnect?: boolean;\n /** Refresh interval in milliseconds */\n refreshInterval?: number;\n /** Dedupe requests within this time window (ms) */\n dedupingInterval?: number;\n /** Keep previous data when revalidating */\n keepPreviousData?: boolean;\n /** Custom fetcher function */\n fetcher?: (url: string) => Promise<T>;\n}\n\nexport interface FloatDataResult<T> {\n data: T | undefined;\n error: Error | undefined;\n isLoading: boolean;\n isValidating: boolean;\n mutate: (data?: T | Promise<T> | ((current?: T) => T | Promise<T>)) => Promise<T | undefined>;\n refresh: () => Promise<void>;\n}\n\n// Global cache for data\nconst cache = new Map<string, { data: any; timestamp: number }>();\nconst listeners = new Map<string, Set<() => void>>();\n\n/**\n * Fetch and cache data with automatic revalidation\n * @example\n * const { data, error, isLoading } = useFloatData('/api/users');\n */\nexport function useFloatData<T = any>(\n key: string | null,\n options: FloatDataOptions<T> = {}\n): FloatDataResult<T> {\n const {\n fallbackData,\n revalidateOnFocus = true,\n revalidateOnReconnect = true,\n refreshInterval,\n dedupingInterval = 2000,\n keepPreviousData = false,\n fetcher = defaultFetcher,\n } = options;\n\n const [state, setState] = useState<{\n data: T | undefined;\n error: Error | undefined;\n isLoading: boolean;\n isValidating: boolean;\n }>(() => {\n const cached = key ? cache.get(key) : null;\n return {\n data: cached?.data ?? fallbackData,\n error: undefined,\n isLoading: !cached && !!key,\n isValidating: false,\n };\n });\n\n const mountedRef = useRef(true);\n const lastFetchRef = useRef<number>(0);\n\n const revalidate = useCallback(async () => {\n if (!key) return;\n\n // Dedupe requests\n const now = Date.now();\n if (now - lastFetchRef.current < dedupingInterval) {\n return;\n }\n lastFetchRef.current = now;\n\n setState(prev => ({ ...prev, isValidating: true }));\n\n try {\n const data = await fetcher(key);\n \n if (mountedRef.current) {\n cache.set(key, { data, timestamp: now });\n setState({\n data,\n error: undefined,\n isLoading: false,\n isValidating: false,\n });\n\n // Notify other listeners\n listeners.get(key)?.forEach(fn => fn());\n }\n } catch (error) {\n if (mountedRef.current) {\n setState(prev => ({\n ...prev,\n error: error as Error,\n isLoading: false,\n isValidating: false,\n }));\n }\n }\n }, [key, dedupingInterval, fetcher]);\n\n const mutate = useCallback(async (\n data?: T | Promise<T> | ((current?: T) => T | Promise<T>)\n ): Promise<T | undefined> => {\n if (!key) return undefined;\n\n let newData: T | undefined;\n\n if (typeof data === 'function') {\n const current = cache.get(key)?.data;\n newData = await (data as (current?: T) => T | Promise<T>)(current);\n } else if (data !== undefined) {\n newData = await data;\n }\n\n if (newData !== undefined) {\n cache.set(key, { data: newData, timestamp: Date.now() });\n setState(prev => ({ ...prev, data: newData }));\n listeners.get(key)?.forEach(fn => fn());\n } else {\n await revalidate();\n newData = cache.get(key)?.data;\n }\n\n return newData;\n }, [key, revalidate]);\n\n // Initial fetch\n useEffect(() => {\n mountedRef.current = true;\n revalidate();\n\n return () => {\n mountedRef.current = false;\n };\n }, [revalidate]);\n\n // Revalidate on focus\n useEffect(() => {\n if (!revalidateOnFocus || typeof window === 'undefined') return;\n\n const handleFocus = () => revalidate();\n window.addEventListener('focus', handleFocus);\n return () => window.removeEventListener('focus', handleFocus);\n }, [revalidateOnFocus, revalidate]);\n\n // Revalidate on reconnect\n useEffect(() => {\n if (!revalidateOnReconnect || typeof window === 'undefined') return;\n\n const handleOnline = () => revalidate();\n window.addEventListener('online', handleOnline);\n return () => window.removeEventListener('online', handleOnline);\n }, [revalidateOnReconnect, revalidate]);\n\n // Refresh interval\n useEffect(() => {\n if (!refreshInterval) return;\n\n const interval = setInterval(revalidate, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, revalidate]);\n\n // Register listener for cache updates\n useEffect(() => {\n if (!key) return;\n\n const update = () => {\n const cached = cache.get(key);\n if (cached && mountedRef.current) {\n setState(prev => ({ ...prev, data: cached.data }));\n }\n };\n\n if (!listeners.has(key)) {\n listeners.set(key, new Set());\n }\n listeners.get(key)!.add(update);\n\n return () => {\n listeners.get(key)?.delete(update);\n };\n }, [key]);\n\n return {\n data: keepPreviousData && state.data === undefined ? fallbackData : state.data,\n error: state.error,\n isLoading: state.isLoading,\n isValidating: state.isValidating,\n mutate,\n refresh: revalidate,\n };\n}\n\n// Default fetcher\nasync function defaultFetcher<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) {\n const error = new Error('Failed to fetch');\n (error as any).status = res.status;\n throw error;\n }\n return res.json();\n}\n","/**\n * Float.js Form Hook\n * Modern form handling with validation\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\n\nexport type ValidationRule<T> = (value: T, formData: Record<string, any>) => string | undefined | Promise<string | undefined>;\n\nexport interface FieldConfig<T = any> {\n initialValue?: T;\n validate?: ValidationRule<T> | ValidationRule<T>[];\n transform?: (value: any) => T;\n}\n\nexport interface FieldState<T = any> {\n value: T;\n error: string | undefined;\n touched: boolean;\n dirty: boolean;\n}\n\nexport interface FloatFormOptions<T extends Record<string, any>> {\n initialValues?: Partial<T>;\n onSubmit: (values: T) => void | Promise<void>;\n onError?: (errors: Record<keyof T, string | undefined>) => void;\n validateOnChange?: boolean;\n validateOnBlur?: boolean;\n}\n\nexport interface FloatFormResult<T extends Record<string, any>> {\n values: T;\n errors: Partial<Record<keyof T, string>>;\n touched: Partial<Record<keyof T, boolean>>;\n isSubmitting: boolean;\n isValid: boolean;\n isDirty: boolean;\n \n // Field helpers\n register: (name: keyof T) => {\n value: any;\n onChange: (e: React.ChangeEvent<any>) => void;\n onBlur: (e: React.FocusEvent<any>) => void;\n name: string;\n };\n \n // Actions\n setValue: (name: keyof T, value: any) => void;\n setError: (name: keyof T, error: string | undefined) => void;\n setTouched: (name: keyof T, touched?: boolean) => void;\n reset: (values?: Partial<T>) => void;\n handleSubmit: (e?: React.FormEvent) => Promise<void>;\n validate: () => Promise<boolean>;\n getFieldProps: (name: keyof T) => FieldState;\n}\n\n/**\n * Powerful form handling with validation\n * @example\n * const form = useFloatForm({\n * initialValues: { email: '', password: '' },\n * onSubmit: async (values) => await login(values)\n * });\n */\nexport function useFloatForm<T extends Record<string, any>>(\n options: FloatFormOptions<T>\n): FloatFormResult<T> {\n const {\n initialValues = {} as Partial<T>,\n onSubmit,\n onError,\n validateOnChange = true,\n validateOnBlur = true,\n } = options;\n\n const [values, setValues] = useState<T>(initialValues as T);\n const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});\n const [touched, setTouchedState] = useState<Partial<Record<keyof T, boolean>>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n \n const initialValuesRef = useRef(initialValues);\n const validatorsRef = useRef<Map<keyof T, ValidationRule<any>[]>>(new Map());\n\n // Validate a single field\n const validateField = useCallback(async (name: keyof T, value: any): Promise<string | undefined> => {\n const validators = validatorsRef.current.get(name);\n if (!validators) return undefined;\n\n for (const validator of validators) {\n const error = await validator(value, values);\n if (error) return error;\n }\n return undefined;\n }, [values]);\n\n // Validate all fields\n const validate = useCallback(async (): Promise<boolean> => {\n const newErrors: Partial<Record<keyof T, string>> = {};\n let isValid = true;\n\n for (const [name] of validatorsRef.current) {\n const error = await validateField(name, values[name]);\n if (error) {\n newErrors[name] = error;\n isValid = false;\n }\n }\n\n setErrors(newErrors);\n return isValid;\n }, [values, validateField]);\n\n // Set a single value\n const setValue = useCallback((name: keyof T, value: any) => {\n setValues(prev => ({ ...prev, [name]: value }));\n \n if (validateOnChange) {\n validateField(name, value).then(error => {\n setErrors(prev => ({ ...prev, [name]: error }));\n });\n }\n }, [validateOnChange, validateField]);\n\n // Set error\n const setError = useCallback((name: keyof T, error: string | undefined) => {\n setErrors(prev => ({ ...prev, [name]: error }));\n }, []);\n\n // Set touched\n const setTouched = useCallback((name: keyof T, isTouched = true) => {\n setTouchedState(prev => ({ ...prev, [name]: isTouched }));\n }, []);\n\n // Reset form\n const reset = useCallback((newValues?: Partial<T>) => {\n setValues((newValues || initialValuesRef.current) as T);\n setErrors({});\n setTouchedState({});\n setIsSubmitting(false);\n }, []);\n\n // Handle submit\n const handleSubmit = useCallback(async (e?: React.FormEvent) => {\n e?.preventDefault();\n \n // Touch all fields\n const allTouched = Object.keys(values).reduce((acc, key) => {\n acc[key as keyof T] = true;\n return acc;\n }, {} as Record<keyof T, boolean>);\n setTouchedState(allTouched);\n\n setIsSubmitting(true);\n\n const isValid = await validate();\n \n if (isValid) {\n try {\n await onSubmit(values);\n } catch (error) {\n console.error('Form submission error:', error);\n }\n } else if (onError) {\n onError(errors as Record<keyof T, string | undefined>);\n }\n\n setIsSubmitting(false);\n }, [values, validate, onSubmit, onError, errors]);\n\n // Register field\n const register = useCallback((name: keyof T) => {\n return {\n name: String(name),\n value: values[name] ?? '',\n onChange: (e: React.ChangeEvent<any>) => {\n const value = e.target.type === 'checkbox' ? e.target.checked : e.target.value;\n setValue(name, value);\n },\n onBlur: () => {\n setTouched(name, true);\n if (validateOnBlur) {\n validateField(name, values[name]).then(error => {\n setErrors(prev => ({ ...prev, [name]: error }));\n });\n }\n },\n };\n }, [values, setValue, setTouched, validateOnBlur, validateField]);\n\n // Get field props\n const getFieldProps = useCallback((name: keyof T): FieldState => {\n return {\n value: values[name],\n error: errors[name],\n touched: touched[name] ?? false,\n dirty: values[name] !== initialValuesRef.current[name],\n };\n }, [values, errors, touched]);\n\n // Computed\n const isValid = useMemo(() => {\n return Object.values(errors).every(e => !e);\n }, [errors]);\n\n const isDirty = useMemo(() => {\n return Object.keys(values).some(\n key => values[key as keyof T] !== initialValuesRef.current[key as keyof T]\n );\n }, [values]);\n\n return {\n values,\n errors,\n touched,\n isSubmitting,\n isValid,\n isDirty,\n register,\n setValue,\n setError,\n setTouched,\n reset,\n handleSubmit,\n validate,\n getFieldProps,\n };\n}\n\n// Built-in validators\nexport const validators = {\n required: (message = 'This field is required'): ValidationRule<any> => \n (value) => {\n if (value === undefined || value === null || value === '') {\n return message;\n }\n return undefined;\n },\n\n email: (message = 'Invalid email address'): ValidationRule<string> => \n (value) => {\n if (!value) return undefined;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value) ? undefined : message;\n },\n\n minLength: (min: number, message?: string): ValidationRule<string> => \n (value) => {\n if (!value) return undefined;\n return value.length >= min \n ? undefined \n : message || `Must be at least ${min} characters`;\n },\n\n maxLength: (max: number, message?: string): ValidationRule<string> => \n (value) => {\n if (!value) return undefined;\n return value.length <= max \n ? undefined \n : message || `Must be at most ${max} characters`;\n },\n\n pattern: (regex: RegExp, message = 'Invalid format'): ValidationRule<string> => \n (value) => {\n if (!value) return undefined;\n return regex.test(value) ? undefined : message;\n },\n\n match: (field: string, message = 'Fields do not match'): ValidationRule<any> => \n (value, formData) => value === formData[field] ? undefined : message,\n};\n","/**\n * Float.js Async Hook\n * Handle async operations with loading and error states\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface AsyncState<T> {\n data: T | undefined;\n error: Error | undefined;\n isLoading: boolean;\n isSuccess: boolean;\n isError: boolean;\n isIdle: boolean;\n}\n\nexport interface FloatAsyncResult<T, Args extends any[]> extends AsyncState<T> {\n execute: (...args: Args) => Promise<T | undefined>;\n reset: () => void;\n setData: (data: T) => void;\n}\n\nexport interface FloatAsyncOptions<T> {\n /** Initial data */\n initialData?: T;\n /** Execute immediately on mount */\n immediate?: boolean;\n /** Retry count on error */\n retryCount?: number;\n /** Delay between retries (ms) */\n retryDelay?: number;\n /** Callback on success */\n onSuccess?: (data: T) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Callback on settle (success or error) */\n onSettled?: (data: T | undefined, error: Error | undefined) => void;\n}\n\n/**\n * Execute async functions with loading/error states\n * @example\n * const { data, isLoading, execute } = useFloatAsync(\n * async (id) => await fetchUser(id),\n * { immediate: false }\n * );\n */\nexport function useFloatAsync<T, Args extends any[] = []>(\n asyncFn: (...args: Args) => Promise<T>,\n options: FloatAsyncOptions<T> = {}\n): FloatAsyncResult<T, Args> {\n const {\n initialData,\n immediate = false,\n retryCount = 0,\n retryDelay = 1000,\n onSuccess,\n onError,\n onSettled,\n } = options;\n\n const [state, setState] = useState<AsyncState<T>>({\n data: initialData,\n error: undefined,\n isLoading: immediate,\n isSuccess: false,\n isError: false,\n isIdle: !immediate,\n });\n\n const mountedRef = useRef(true);\n const attemptRef = useRef(0);\n\n const execute = useCallback(async (...args: Args): Promise<T | undefined> => {\n setState(prev => ({\n ...prev,\n isLoading: true,\n isIdle: false,\n error: undefined,\n }));\n\n attemptRef.current = 0;\n\n const attempt = async (): Promise<T | undefined> => {\n try {\n const data = await asyncFn(...args);\n \n if (mountedRef.current) {\n setState({\n data,\n error: undefined,\n isLoading: false,\n isSuccess: true,\n isError: false,\n isIdle: false,\n });\n onSuccess?.(data);\n onSettled?.(data, undefined);\n }\n \n return data;\n } catch (error) {\n attemptRef.current++;\n \n if (attemptRef.current <= retryCount) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n return attempt();\n }\n \n if (mountedRef.current) {\n setState(prev => ({\n ...prev,\n error: error as Error,\n isLoading: false,\n isSuccess: false,\n isError: true,\n }));\n onError?.(error as Error);\n onSettled?.(undefined, error as Error);\n }\n \n return undefined;\n }\n };\n\n return attempt();\n }, [asyncFn, retryCount, retryDelay, onSuccess, onError, onSettled]);\n\n const reset = useCallback(() => {\n setState({\n data: initialData,\n error: undefined,\n isLoading: false,\n isSuccess: false,\n isError: false,\n isIdle: true,\n });\n }, [initialData]);\n\n const setData = useCallback((data: T) => {\n setState(prev => ({\n ...prev,\n data,\n isSuccess: true,\n }));\n }, []);\n\n // Execute immediately if requested\n useEffect(() => {\n mountedRef.current = true;\n \n if (immediate) {\n execute(...([] as unknown as Args));\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n ...state,\n execute,\n reset,\n setData,\n };\n}\n\n/**\n * Debounced async execution\n */\nexport function useFloatDebounce<T, Args extends any[]>(\n asyncFn: (...args: Args) => Promise<T>,\n delay: number = 300,\n options: FloatAsyncOptions<T> = {}\n): FloatAsyncResult<T, Args> {\n const timerRef = useRef<NodeJS.Timeout>();\n const result = useFloatAsync(asyncFn, options);\n\n const debouncedExecute = useCallback((...args: Args) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n return new Promise<T | undefined>((resolve) => {\n timerRef.current = setTimeout(async () => {\n const data = await result.execute(...args);\n resolve(data);\n }, delay);\n });\n }, [result.execute, delay]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return {\n ...result,\n execute: debouncedExecute,\n };\n}\n\n/**\n * Throttled async execution\n */\nexport function useFloatThrottle<T, Args extends any[]>(\n asyncFn: (...args: Args) => Promise<T>,\n limit: number = 1000,\n options: FloatAsyncOptions<T> = {}\n): FloatAsyncResult<T, Args> {\n const lastRunRef = useRef<number>(0);\n const result = useFloatAsync(asyncFn, options);\n\n const throttledExecute = useCallback((...args: Args) => {\n const now = Date.now();\n \n if (now - lastRunRef.current >= limit) {\n lastRunRef.current = now;\n return result.execute(...args);\n }\n \n return Promise.resolve(result.data);\n }, [result.execute, result.data, limit]);\n\n return {\n ...result,\n execute: throttledExecute,\n };\n}\n","/**\n * Float.js Store Hook\n * Lightweight global state management (like Zustand but simpler)\n */\n\nimport { useSyncExternalStore, useCallback } from 'react';\n\ntype SetState<T> = (partial: Partial<T> | ((state: T) => Partial<T>)) => void;\ntype GetState<T> = () => T;\ntype Subscribe = (listener: () => void) => () => void;\ntype Selector<T, U> = (state: T) => U;\n\nexport interface FloatStore<T> {\n getState: GetState<T>;\n setState: SetState<T>;\n subscribe: Subscribe;\n reset: () => void;\n}\n\nexport interface FloatStoreOptions<T> {\n /** Persist state to localStorage */\n persist?: string;\n /** Custom equality function */\n equals?: (a: any, b: any) => boolean;\n /** Middleware */\n middleware?: (set: SetState<T>, get: GetState<T>) => SetState<T>;\n}\n\n/**\n * Create a global store\n * @example\n * const useStore = createFloatStore({ count: 0 });\n * \n * // In component\n * const count = useStore(state => state.count);\n */\nexport function createFloatStore<T extends object>(\n initialState: T | (() => T),\n options: FloatStoreOptions<T> = {}\n): {\n (): T;\n <U>(selector: Selector<T, U>): U;\n getState: GetState<T>;\n setState: SetState<T>;\n subscribe: Subscribe;\n reset: () => void;\n} {\n const { persist, middleware } = options;\n\n // Initialize state\n let state: T = typeof initialState === 'function' \n ? (initialState as () => T)()\n : initialState;\n\n // Load persisted state\n if (persist && typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(`float-store:${persist}`);\n if (saved) {\n state = { ...state, ...JSON.parse(saved) };\n }\n } catch (e) {\n console.warn('Float Store: Failed to load persisted state');\n }\n }\n\n const initialStateRef = state;\n const listeners = new Set<() => void>();\n\n const getState: GetState<T> = () => state;\n\n let setState: SetState<T> = (partial) => {\n const nextState = typeof partial === 'function'\n ? (partial as (state: T) => Partial<T>)(state)\n : partial;\n\n if (nextState !== state) {\n state = { ...state, ...nextState };\n\n // Persist\n if (persist && typeof window !== 'undefined') {\n try {\n localStorage.setItem(`float-store:${persist}`, JSON.stringify(state));\n } catch (e) {\n console.warn('Float Store: Failed to persist state');\n }\n }\n\n listeners.forEach((listener) => listener());\n }\n };\n\n // Apply middleware\n if (middleware) {\n setState = middleware(setState, getState);\n }\n\n const subscribe: Subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n\n const reset = () => {\n setState(initialStateRef);\n };\n\n // Hook function\n function useStore(): T;\n function useStore<U>(selector: Selector<T, U>): U;\n function useStore<U>(selector?: Selector<T, U>): T | U {\n const getSnapshot = useCallback(() => {\n const currentState = getState();\n return selector ? selector(currentState) : currentState;\n }, [selector]);\n\n const getServerSnapshot = useCallback(() => {\n const currentState = getState();\n return selector ? selector(currentState) : currentState;\n }, [selector]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n }\n\n // Attach methods to hook\n useStore.getState = getState;\n useStore.setState = setState;\n useStore.subscribe = subscribe;\n useStore.reset = reset;\n\n return useStore;\n}\n\n/**\n * Use a selector on an existing store\n */\nexport function useFloatStore<T, U>(\n store: FloatStore<T>,\n selector: Selector<T, U>\n): U {\n const getSnapshot = useCallback(() => selector(store.getState()), [store, selector]);\n const getServerSnapshot = useCallback(() => selector(store.getState()), [store, selector]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot, getServerSnapshot);\n}\n\n// Middleware helpers\nexport const floatMiddleware = {\n /**\n * Log all state changes\n */\n logger: <T>(name?: string) => (set: SetState<T>, get: GetState<T>): SetState<T> => {\n return (partial) => {\n const prev = get();\n set(partial);\n const next = get();\n console.group(`${name || 'Float Store'} Update`);\n console.log('Prev:', prev);\n console.log('Next:', next);\n console.groupEnd();\n };\n },\n\n /**\n * Add undo/redo capability\n */\n undoable: <T>(maxHistory = 10) => {\n const history: T[] = [];\n let index = -1;\n\n return (set: SetState<T>, get: GetState<T>): SetState<T> => {\n return (partial) => {\n const current = get();\n \n // Add to history\n history.splice(index + 1);\n history.push(current);\n if (history.length > maxHistory) {\n history.shift();\n }\n index = history.length - 1;\n\n set(partial);\n };\n };\n },\n\n /**\n * Debounce state updates\n */\n debounce: <T>(delay: number) => {\n let timeout: NodeJS.Timeout;\n\n return (set: SetState<T>, _get: GetState<T>): SetState<T> => {\n return (partial) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => set(partial), delay);\n };\n };\n },\n};\n\n/**\n * Combine multiple stores\n */\nexport function combineFloatStores<T extends Record<string, FloatStore<any>>>(\n stores: T\n): FloatStore<{ [K in keyof T]: ReturnType<T[K]['getState']> }> {\n type CombinedState = { [K in keyof T]: ReturnType<T[K]['getState']> };\n\n const getState = (): CombinedState => {\n const state = {} as CombinedState;\n for (const [key, store] of Object.entries(stores)) {\n state[key as keyof T] = store.getState();\n }\n return state;\n };\n\n const setState: SetState<CombinedState> = (partial) => {\n const nextState = typeof partial === 'function'\n ? (partial as (state: CombinedState) => Partial<CombinedState>)(getState())\n : partial;\n\n for (const [key, value] of Object.entries(nextState)) {\n if (stores[key as keyof T] && value !== undefined) {\n stores[key as keyof T].setState(value as any);\n }\n }\n };\n\n const subscribe: Subscribe = (listener) => {\n const unsubscribes = Object.values(stores).map(store => store.subscribe(listener));\n return () => unsubscribes.forEach(unsub => unsub());\n };\n\n const reset = () => {\n Object.values(stores).forEach(store => store.reset());\n };\n\n return { getState, setState, subscribe, reset };\n}\n","/**\n * Float.js AI Module\n * Native AI integration with streaming support\n */\n\nexport interface AIProvider {\n name: string;\n chat(options: ChatOptions): Promise<AIResponse>;\n stream(options: ChatOptions): AsyncIterable<string>;\n}\n\nexport interface ChatOptions {\n model?: string;\n messages: Message[];\n temperature?: number;\n maxTokens?: number;\n system?: string;\n}\n\nexport interface Message {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface AIResponse {\n content: string;\n model: string;\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * OpenAI Provider\n */\nexport class OpenAIProvider implements AIProvider {\n name = 'openai';\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey || process.env.OPENAI_API_KEY || '';\n this.baseUrl = options.baseUrl || 'https://api.openai.com/v1';\n }\n\n async chat(options: ChatOptions): Promise<AIResponse> {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: options.model || 'gpt-4o-mini',\n messages: options.system \n ? [{ role: 'system', content: options.system }, ...options.messages]\n : options.messages,\n temperature: options.temperature ?? 0.7,\n max_tokens: options.maxTokens,\n }),\n });\n\n const data = await response.json();\n \n return {\n content: data.choices[0].message.content,\n model: data.model,\n usage: data.usage ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n } : undefined,\n };\n }\n\n async *stream(options: ChatOptions): AsyncIterable<string> {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: options.model || 'gpt-4o-mini',\n messages: options.system \n ? [{ role: 'system', content: options.system }, ...options.messages]\n : options.messages,\n temperature: options.temperature ?? 0.7,\n max_tokens: options.maxTokens,\n stream: true,\n }),\n });\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No response body');\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n \n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices[0]?.delta?.content;\n if (content) yield content;\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n }\n}\n\n/**\n * Anthropic Provider\n */\nexport class AnthropicProvider implements AIProvider {\n name = 'anthropic';\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY || '';\n this.baseUrl = options.baseUrl || 'https://api.anthropic.com/v1';\n }\n\n async chat(options: ChatOptions): Promise<AIResponse> {\n const response = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: options.model || 'claude-3-5-sonnet-20241022',\n messages: options.messages.filter(m => m.role !== 'system'),\n system: options.system || options.messages.find(m => m.role === 'system')?.content,\n max_tokens: options.maxTokens || 4096,\n temperature: options.temperature ?? 0.7,\n }),\n });\n\n const data = await response.json();\n \n return {\n content: data.content[0].text,\n model: data.model,\n usage: data.usage ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n } : undefined,\n };\n }\n\n async *stream(options: ChatOptions): AsyncIterable<string> {\n const response = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: options.model || 'claude-3-5-sonnet-20241022',\n messages: options.messages.filter(m => m.role !== 'system'),\n system: options.system || options.messages.find(m => m.role === 'system')?.content,\n max_tokens: options.maxTokens || 4096,\n temperature: options.temperature ?? 0.7,\n stream: true,\n }),\n });\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No response body');\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const parsed = JSON.parse(line.slice(6));\n if (parsed.type === 'content_block_delta') {\n yield parsed.delta.text;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n }\n}\n\n/**\n * AI Instance - Main entry point\n */\nclass FloatAI {\n private providers: Map<string, AIProvider> = new Map();\n private defaultProvider: string = 'openai';\n\n constructor() {\n // Auto-register providers based on available API keys\n if (process.env.OPENAI_API_KEY) {\n this.register(new OpenAIProvider());\n this.defaultProvider = 'openai';\n }\n if (process.env.ANTHROPIC_API_KEY) {\n this.register(new AnthropicProvider());\n if (!process.env.OPENAI_API_KEY) {\n this.defaultProvider = 'anthropic';\n }\n }\n }\n\n register(provider: AIProvider): void {\n this.providers.set(provider.name, provider);\n }\n\n use(name: string): this {\n if (!this.providers.has(name)) {\n throw new Error(`AI provider \"${name}\" not registered`);\n }\n this.defaultProvider = name;\n return this;\n }\n\n private getProvider(): AIProvider {\n const provider = this.providers.get(this.defaultProvider);\n if (!provider) {\n throw new Error(`No AI provider configured. Set OPENAI_API_KEY or ANTHROPIC_API_KEY`);\n }\n return provider;\n }\n\n /**\n * Simple chat completion\n */\n async chat(prompt: string, options: Partial<ChatOptions> = {}): Promise<string> {\n const response = await this.getProvider().chat({\n ...options,\n messages: [{ role: 'user', content: prompt }],\n });\n return response.content;\n }\n\n /**\n * Chat with message history\n */\n async complete(options: ChatOptions): Promise<AIResponse> {\n return this.getProvider().chat(options);\n }\n\n /**\n * Stream chat completion\n */\n stream(prompt: string, options: Partial<ChatOptions> = {}): AsyncIterable<string> {\n return this.getProvider().stream({\n ...options,\n messages: [{ role: 'user', content: prompt }],\n });\n }\n\n /**\n * Stream with message history\n */\n streamChat(options: ChatOptions): AsyncIterable<string> {\n return this.getProvider().stream(options);\n }\n}\n\n// Singleton instance\nexport const ai = new FloatAI();\n\n/**\n * Create a streaming response for API routes\n */\nexport function streamResponse(\n iterable: AsyncIterable<string>,\n options: { headers?: Record<string, string> } = {}\n): Response {\n const encoder = new TextEncoder();\n \n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of iterable) {\n controller.enqueue(encoder.encode(chunk));\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked',\n 'Cache-Control': 'no-cache',\n ...options.headers,\n },\n });\n}\n\n/**\n * Create a Server-Sent Events response\n */\nexport function sseResponse(\n iterable: AsyncIterable<string>,\n options: { headers?: Record<string, string> } = {}\n): Response {\n const encoder = new TextEncoder();\n \n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of iterable) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\\n\\n`));\n }\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n ...options.headers,\n },\n });\n}\n\n/**\n * AI Action decorator for type-safe AI endpoints\n */\nexport function aiAction<T extends Record<string, unknown>>(\n handler: (input: T) => Promise<string> | AsyncIterable<string>\n) {\n return async (request: Request): Promise<Response> => {\n try {\n const input = await request.json() as T;\n const result = handler(input);\n\n if (Symbol.asyncIterator in Object(result)) {\n return streamResponse(result as AsyncIterable<string>);\n }\n\n const content = await (result as Promise<string>);\n return new Response(JSON.stringify({ content }), {\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n return new Response(\n JSON.stringify({ error: (error as Error).message }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n };\n}\n","/**\n * Float.js Type-Safe API Module\n * Automatic validation and type inference for API routes\n * \n * This is a MAJOR differentiator from Next.js - zero boilerplate API validation!\n */\n\n// ============================================================================\n// SCHEMA TYPES (Zod-like but zero dependencies)\n// ============================================================================\n\ntype SchemaType = 'string' | 'number' | 'boolean' | 'array' | 'object' | 'enum' | 'union' | 'optional';\n\ninterface BaseSchema<T = unknown> {\n _type: SchemaType;\n _output: T;\n optional(): OptionalSchema<T>;\n parse(value: unknown): T;\n safeParse(value: unknown): { success: true; data: T } | { success: false; error: ValidationError };\n}\n\ninterface ValidationError {\n path: string[];\n message: string;\n received: unknown;\n expected: string;\n}\n\n// ============================================================================\n// STRING SCHEMA\n// ============================================================================\n\ninterface StringSchema extends BaseSchema<string> {\n _type: 'string';\n min(length: number, message?: string): StringSchema;\n max(length: number, message?: string): StringSchema;\n email(message?: string): StringSchema;\n url(message?: string): StringSchema;\n uuid(message?: string): StringSchema;\n regex(pattern: RegExp, message?: string): StringSchema;\n trim(): StringSchema;\n toLowerCase(): StringSchema;\n toUpperCase(): StringSchema;\n}\n\nfunction createStringSchema(): StringSchema {\n const validators: Array<(val: string) => string | null> = [];\n const transforms: Array<(val: string) => string> = [];\n\n const schema: StringSchema = {\n _type: 'string',\n _output: '' as string,\n\n min(length: number, message?: string) {\n validators.push((val) => \n val.length >= length ? null : (message || `Must be at least ${length} characters`)\n );\n return schema;\n },\n\n max(length: number, message?: string) {\n validators.push((val) => \n val.length <= length ? null : (message || `Must be at most ${length} characters`)\n );\n return schema;\n },\n\n email(message?: string) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n validators.push((val) => \n emailRegex.test(val) ? null : (message || 'Invalid email address')\n );\n return schema;\n },\n\n url(message?: string) {\n validators.push((val) => {\n try {\n new URL(val);\n return null;\n } catch {\n return message || 'Invalid URL';\n }\n });\n return schema;\n },\n\n uuid(message?: string) {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n validators.push((val) => \n uuidRegex.test(val) ? null : (message || 'Invalid UUID')\n );\n return schema;\n },\n\n regex(pattern: RegExp, message?: string) {\n validators.push((val) => \n pattern.test(val) ? null : (message || `Must match pattern ${pattern}`)\n );\n return schema;\n },\n\n trim() {\n transforms.push((val) => val.trim());\n return schema;\n },\n\n toLowerCase() {\n transforms.push((val) => val.toLowerCase());\n return schema;\n },\n\n toUpperCase() {\n transforms.push((val) => val.toUpperCase());\n return schema;\n },\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): string {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (typeof value !== 'string') {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected string',\n received: value,\n expected: 'string',\n },\n };\n }\n\n // Apply transforms\n let transformed = value;\n for (const transform of transforms) {\n transformed = transform(transformed);\n }\n\n // Run validators\n for (const validator of validators) {\n const error = validator(transformed);\n if (error) {\n return {\n success: false as const,\n error: {\n path: [],\n message: error,\n received: value,\n expected: 'string',\n },\n };\n }\n }\n\n return { success: true as const, data: transformed };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// NUMBER SCHEMA\n// ============================================================================\n\ninterface NumberSchema extends BaseSchema<number> {\n _type: 'number';\n min(value: number, message?: string): NumberSchema;\n max(value: number, message?: string): NumberSchema;\n int(message?: string): NumberSchema;\n positive(message?: string): NumberSchema;\n negative(message?: string): NumberSchema;\n finite(message?: string): NumberSchema;\n}\n\nfunction createNumberSchema(): NumberSchema {\n const validators: Array<(val: number) => string | null> = [];\n\n const schema: NumberSchema = {\n _type: 'number',\n _output: 0 as number,\n\n min(value: number, message?: string) {\n validators.push((val) => \n val >= value ? null : (message || `Must be at least ${value}`)\n );\n return schema;\n },\n\n max(value: number, message?: string) {\n validators.push((val) => \n val <= value ? null : (message || `Must be at most ${value}`)\n );\n return schema;\n },\n\n int(message?: string) {\n validators.push((val) => \n Number.isInteger(val) ? null : (message || 'Must be an integer')\n );\n return schema;\n },\n\n positive(message?: string) {\n validators.push((val) => \n val > 0 ? null : (message || 'Must be positive')\n );\n return schema;\n },\n\n negative(message?: string) {\n validators.push((val) => \n val < 0 ? null : (message || 'Must be negative')\n );\n return schema;\n },\n\n finite(message?: string) {\n validators.push((val) => \n Number.isFinite(val) ? null : (message || 'Must be finite')\n );\n return schema;\n },\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): number {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n const num = typeof value === 'string' ? parseFloat(value) : value;\n \n if (typeof num !== 'number' || isNaN(num)) {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected number',\n received: value,\n expected: 'number',\n },\n };\n }\n\n for (const validator of validators) {\n const error = validator(num);\n if (error) {\n return {\n success: false as const,\n error: {\n path: [],\n message: error,\n received: value,\n expected: 'number',\n },\n };\n }\n }\n\n return { success: true as const, data: num };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// BOOLEAN SCHEMA\n// ============================================================================\n\ninterface BooleanSchema extends BaseSchema<boolean> {\n _type: 'boolean';\n}\n\nfunction createBooleanSchema(): BooleanSchema {\n const schema: BooleanSchema = {\n _type: 'boolean',\n _output: false as boolean,\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): boolean {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n // Handle string booleans\n if (value === 'true') return { success: true as const, data: true };\n if (value === 'false') return { success: true as const, data: false };\n \n if (typeof value !== 'boolean') {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected boolean',\n received: value,\n expected: 'boolean',\n },\n };\n }\n\n return { success: true as const, data: value };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// ARRAY SCHEMA\n// ============================================================================\n\ninterface ArraySchema<T> extends BaseSchema<T[]> {\n _type: 'array';\n min(length: number, message?: string): ArraySchema<T>;\n max(length: number, message?: string): ArraySchema<T>;\n nonempty(message?: string): ArraySchema<T>;\n}\n\nfunction createArraySchema<S extends BaseSchema>(itemSchema: S): ArraySchema<S['_output']> {\n const validators: Array<(val: unknown[]) => string | null> = [];\n\n const schema: ArraySchema<S['_output']> = {\n _type: 'array',\n _output: [] as S['_output'][],\n\n min(length: number, message?: string) {\n validators.push((val) => \n val.length >= length ? null : (message || `Must have at least ${length} items`)\n );\n return schema;\n },\n\n max(length: number, message?: string) {\n validators.push((val) => \n val.length <= length ? null : (message || `Must have at most ${length} items`)\n );\n return schema;\n },\n\n nonempty(message?: string) {\n validators.push((val) => \n val.length > 0 ? null : (message || 'Array must not be empty')\n );\n return schema;\n },\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): S['_output'][] {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (!Array.isArray(value)) {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected array',\n received: value,\n expected: 'array',\n },\n };\n }\n\n // Validate length constraints\n for (const validator of validators) {\n const error = validator(value);\n if (error) {\n return {\n success: false as const,\n error: {\n path: [],\n message: error,\n received: value,\n expected: 'array',\n },\n };\n }\n }\n\n // Validate each item\n const result: S['_output'][] = [];\n for (let i = 0; i < value.length; i++) {\n const itemResult = itemSchema.safeParse(value[i]);\n if (!itemResult.success) {\n return {\n success: false as const,\n error: {\n ...itemResult.error,\n path: [String(i), ...itemResult.error.path],\n },\n };\n }\n result.push(itemResult.data);\n }\n\n return { success: true as const, data: result };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// OBJECT SCHEMA\n// ============================================================================\n\ntype ObjectShape = Record<string, BaseSchema>;\ntype InferObject<T extends ObjectShape> = {\n [K in keyof T]: T[K]['_output'];\n};\n\ninterface ObjectSchema<T extends ObjectShape> extends BaseSchema<InferObject<T>> {\n _type: 'object';\n _shape: T;\n partial(): ObjectSchema<{ [K in keyof T]: OptionalSchema<T[K]['_output']> }>;\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>>;\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>>;\n extend<E extends ObjectShape>(extension: E): ObjectSchema<T & E>;\n merge<E extends ObjectShape>(other: ObjectSchema<E>): ObjectSchema<T & E>;\n passthrough(): ObjectSchema<T>;\n strict(): ObjectSchema<T>;\n}\n\nfunction createObjectSchema<T extends ObjectShape>(shape: T): ObjectSchema<T> {\n let passthroughMode = false;\n let strictMode = false;\n\n const schema: ObjectSchema<T> = {\n _type: 'object',\n _output: {} as InferObject<T>,\n _shape: shape,\n\n partial() {\n const partialShape: Record<string, BaseSchema> = {};\n for (const key in shape) {\n partialShape[key] = shape[key].optional();\n }\n return createObjectSchema(partialShape) as any;\n },\n\n pick<K extends keyof T>(...keys: K[]) {\n const pickedShape: Partial<T> = {};\n for (const key of keys) {\n pickedShape[key] = shape[key];\n }\n return createObjectSchema(pickedShape as Pick<T, K>);\n },\n\n omit<K extends keyof T>(...keys: K[]) {\n const omittedShape = { ...shape };\n for (const key of keys) {\n delete omittedShape[key];\n }\n return createObjectSchema(omittedShape as Omit<T, K>);\n },\n\n extend<E extends ObjectShape>(extension: E) {\n return createObjectSchema({ ...shape, ...extension });\n },\n\n merge<E extends ObjectShape>(other: ObjectSchema<E>) {\n return createObjectSchema({ ...shape, ...other._shape });\n },\n\n passthrough() {\n passthroughMode = true;\n return schema;\n },\n\n strict() {\n strictMode = true;\n return schema;\n },\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): InferObject<T> {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected object',\n received: value,\n expected: 'object',\n },\n };\n }\n\n const obj = value as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n\n // Check for unknown keys in strict mode\n if (strictMode) {\n for (const key in obj) {\n if (!(key in shape)) {\n return {\n success: false as const,\n error: {\n path: [key],\n message: `Unknown key '${key}'`,\n received: obj[key],\n expected: 'undefined',\n },\n };\n }\n }\n }\n\n // Validate each field\n for (const key in shape) {\n const fieldSchema = shape[key];\n const fieldResult = fieldSchema.safeParse(obj[key]);\n \n if (!fieldResult.success) {\n return {\n success: false as const,\n error: {\n ...fieldResult.error,\n path: [key, ...fieldResult.error.path],\n },\n };\n }\n \n result[key] = fieldResult.data;\n }\n\n // Include extra keys in passthrough mode\n if (passthroughMode) {\n for (const key in obj) {\n if (!(key in shape)) {\n result[key] = obj[key];\n }\n }\n }\n\n return { success: true as const, data: result as InferObject<T> };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// OPTIONAL SCHEMA\n// ============================================================================\n\ninterface OptionalSchema<T> extends BaseSchema<T | undefined> {\n _type: 'optional';\n _innerType: BaseSchema<T>;\n default(value: T): BaseSchema<T>;\n}\n\nfunction createOptionalSchema<T>(innerSchema: BaseSchema<T>): OptionalSchema<T> {\n const schema: OptionalSchema<T> = {\n _type: 'optional',\n _output: undefined as T | undefined,\n _innerType: innerSchema,\n\n default(defaultValue: T): BaseSchema<T> {\n return {\n _type: 'optional',\n _output: defaultValue,\n optional: () => schema,\n parse(value: unknown): T {\n if (value === undefined || value === null) {\n return defaultValue;\n }\n return innerSchema.parse(value);\n },\n safeParse(value: unknown) {\n if (value === undefined || value === null) {\n return { success: true as const, data: defaultValue };\n }\n return innerSchema.safeParse(value);\n },\n };\n },\n\n optional() {\n return schema;\n },\n\n parse(value: unknown): T | undefined {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (value === undefined || value === null) {\n return { success: true as const, data: undefined };\n }\n return innerSchema.safeParse(value);\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// ENUM SCHEMA\n// ============================================================================\n\ninterface EnumSchema<T extends readonly string[]> extends BaseSchema<T[number]> {\n _type: 'enum';\n options: T;\n}\n\nfunction createEnumSchema<T extends readonly string[]>(values: T): EnumSchema<T> {\n const schema: EnumSchema<T> = {\n _type: 'enum',\n _output: values[0] as T[number],\n options: values,\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): T[number] {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (typeof value !== 'string' || !values.includes(value as T[number])) {\n return {\n success: false as const,\n error: {\n path: [],\n message: `Expected one of: ${values.join(', ')}`,\n received: value,\n expected: values.join(' | '),\n },\n };\n }\n\n return { success: true as const, data: value as T[number] };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// UNION SCHEMA\n// ============================================================================\n\ninterface UnionSchema<T extends BaseSchema[]> extends BaseSchema<T[number]['_output']> {\n _type: 'union';\n}\n\nfunction createUnionSchema<T extends BaseSchema[]>(schemas: T): UnionSchema<T> {\n const schema: UnionSchema<T> = {\n _type: 'union',\n _output: undefined as T[number]['_output'],\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): T[number]['_output'] {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n const errors: ValidationError[] = [];\n \n for (const s of schemas) {\n const result = s.safeParse(value);\n if (result.success) {\n return result;\n }\n errors.push(result.error);\n }\n\n return {\n success: false as const,\n error: {\n path: [],\n message: `Value did not match any schema in union`,\n received: value,\n expected: schemas.map(s => s._type).join(' | '),\n },\n };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// VALIDATION ERROR\n// ============================================================================\n\nexport class FloatValidationError extends Error {\n public readonly errors: ValidationError[];\n public readonly status = 400;\n\n constructor(errors: ValidationError[]) {\n super('Validation failed');\n this.name = 'FloatValidationError';\n this.errors = errors;\n }\n\n toJSON() {\n return {\n error: 'Validation Error',\n details: this.errors.map(e => ({\n path: e.path.join('.') || 'root',\n message: e.message,\n received: typeof e.received,\n })),\n };\n }\n\n toResponse(): Response {\n return new Response(JSON.stringify(this.toJSON()), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n\n// ============================================================================\n// SCHEMA BUILDER (f - main export)\n// ============================================================================\n\nexport const f = {\n string: createStringSchema,\n number: createNumberSchema,\n boolean: createBooleanSchema,\n array: createArraySchema,\n object: createObjectSchema,\n enum: createEnumSchema,\n union: createUnionSchema,\n};\n\n// ============================================================================\n// TYPE INFERENCE\n// ============================================================================\n\nexport type Infer<T extends BaseSchema> = T['_output'];\n\n// ============================================================================\n// API ROUTE DECORATOR\n// ============================================================================\n\ninterface TypedRouteOptions {\n body?: ObjectSchema<any>;\n query?: ObjectSchema<any>;\n params?: ObjectSchema<any>;\n}\n\ninterface ValidatedData {\n body: any;\n query: any;\n params: any;\n}\n\ninterface TypedRequest extends Request {\n validated: ValidatedData;\n}\n\ntype RouteHandler = (\n request: TypedRequest\n) => Promise<Response> | Response;\n\n/**\n * Create a type-safe API route with automatic validation\n * \n * @example\n * ```typescript\n * import { typedRoute, f } from '@float/core';\n * \n * export const POST = typedRoute({\n * body: f.object({\n * name: f.string().min(2),\n * email: f.string().email(),\n * age: f.number().min(18).optional(),\n * }),\n * }, async (req) => {\n * // req.validated.body is fully typed!\n * const { name, email, age } = req.validated.body;\n * \n * return new Response(JSON.stringify({ \n * message: `Hello ${name}!` \n * }));\n * });\n * ```\n */\nexport function typedRoute(\n options: TypedRouteOptions,\n handler: RouteHandler\n): (request: Request) => Promise<Response> {\n return async (request: Request): Promise<Response> => {\n try {\n const validated: ValidatedData = { body: undefined, query: undefined, params: undefined };\n\n // Parse and validate body\n if (options.body) {\n try {\n const body = await request.json();\n const bodySchema = options.body;\n const result = bodySchema.safeParse(body);\n if (!result.success) {\n return new FloatValidationError([result.error]).toResponse();\n }\n validated.body = result.data;\n } catch {\n return new Response(\n JSON.stringify({ error: 'Invalid JSON body' }),\n { status: 400, headers: { 'Content-Type': 'application/json' } }\n );\n }\n }\n\n // Parse and validate query params\n if (options.query) {\n const url = new URL(request.url);\n const queryObj: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n queryObj[key] = value;\n });\n \n const querySchema = options.query;\n const result = querySchema.safeParse(queryObj);\n if (!result.success) {\n return new FloatValidationError([result.error]).toResponse();\n }\n validated.query = result.data;\n }\n\n // Validate URL params (if provided via request context)\n if (options.params) {\n const params = (request as any).params || {};\n const paramsSchema = options.params;\n const result = paramsSchema.safeParse(params);\n if (!result.success) {\n return new FloatValidationError([result.error]).toResponse();\n }\n validated.params = result.data;\n }\n\n // Create typed request\n const typedRequest = request as TypedRequest;\n typedRequest.validated = validated;\n\n // Call handler\n return await handler(typedRequest);\n } catch (error) {\n if (error instanceof FloatValidationError) {\n return error.toResponse();\n }\n \n console.error('Route error:', error);\n return new Response(\n JSON.stringify({ error: 'Internal server error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n };\n}\n\n// ============================================================================\n// JSON RESPONSE HELPER\n// ============================================================================\n\ninterface JsonResponseOptions {\n status?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * Create a JSON response with automatic serialization\n */\nexport function json<T>(data: T, options: JsonResponseOptions = {}): Response {\n return new Response(JSON.stringify(data), {\n status: options.status || 200,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n}\n\n/**\n * Create an error response\n */\nexport function error(message: string, status = 500): Response {\n return new Response(\n JSON.stringify({ error: message }),\n { \n status, \n headers: { 'Content-Type': 'application/json' } \n }\n );\n}\n\n/**\n * Create a redirect response\n */\nexport function redirect(url: string, status: 301 | 302 | 307 | 308 = 302): Response {\n return new Response(null, {\n status,\n headers: { Location: url },\n });\n}\n","/**\n * Float.js Real-time Module\n * Built-in WebSocket support with rooms, presence, and broadcasting\n * \n * NO plugins needed - real-time is native to Float.js!\n */\n\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { createServer, IncomingMessage } from 'http';\nimport type { Server as HTTPServer } from 'http';\nimport { EventEmitter } from 'events';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface RealtimeClient {\n id: string;\n socket: WebSocket;\n rooms: Set<string>;\n data: Record<string, unknown>;\n isAlive: boolean;\n connectedAt: Date;\n}\n\nexport interface RealtimeMessage<T = unknown> {\n type: string;\n payload: T;\n from?: string;\n room?: string;\n timestamp: number;\n}\n\nexport interface RealtimeRoom {\n name: string;\n clients: Set<string>;\n metadata: Record<string, unknown>;\n createdAt: Date;\n}\n\nexport interface PresenceState {\n clientId: string;\n data: Record<string, unknown>;\n joinedAt: Date;\n lastSeen: Date;\n}\n\nexport interface RealtimeOptions {\n /** Port for WebSocket server (default: 3001) */\n port?: number;\n /** Path for WebSocket endpoint (default: '/ws') */\n path?: string;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n /** Max message size in bytes (default: 1MB) */\n maxPayload?: number;\n /** Enable presence tracking (default: true) */\n presence?: boolean;\n /** Custom authentication handler */\n authenticate?: (request: IncomingMessage) => Promise<{ id: string; data?: Record<string, unknown> } | null>;\n}\n\ntype EventHandler<T = unknown> = (message: RealtimeMessage<T>, client: RealtimeClient) => void | Promise<void>;\ntype ConnectionHandler = (client: RealtimeClient) => void | Promise<void>;\ntype DisconnectHandler = (client: RealtimeClient, code: number, reason: string) => void | Promise<void>;\n\n// ============================================================================\n// REALTIME SERVER\n// ============================================================================\n\nexport class FloatRealtime extends EventEmitter {\n private wss: WebSocketServer | null = null;\n private httpServer: HTTPServer | null = null;\n private clients: Map<string, RealtimeClient> = new Map();\n private rooms: Map<string, RealtimeRoom> = new Map();\n private eventHandlers: Map<string, EventHandler[]> = new Map();\n private connectionHandlers: ConnectionHandler[] = [];\n private disconnectHandlers: DisconnectHandler[] = [];\n private pingInterval: NodeJS.Timeout | null = null;\n private options: Required<RealtimeOptions>;\n\n constructor(options: RealtimeOptions = {}) {\n super();\n this.options = {\n port: options.port ?? 3001,\n path: options.path ?? '/ws',\n pingInterval: options.pingInterval ?? 30000,\n maxPayload: options.maxPayload ?? 1024 * 1024, // 1MB\n presence: options.presence ?? true,\n authenticate: options.authenticate ?? (async () => ({ id: this.generateId() })),\n };\n }\n\n /**\n * Start the WebSocket server\n */\n async start(): Promise<void> {\n return new Promise((resolve) => {\n this.httpServer = createServer();\n \n this.wss = new WebSocketServer({\n server: this.httpServer,\n path: this.options.path,\n maxPayload: this.options.maxPayload,\n });\n\n this.wss.on('connection', (socket, request) => {\n this.handleConnection(socket, request);\n });\n\n // Start ping interval\n this.pingInterval = setInterval(() => {\n this.pingClients();\n }, this.options.pingInterval);\n\n this.httpServer.listen(this.options.port, () => {\n console.log(`π Float.js Realtime running on ws://localhost:${this.options.port}${this.options.path}`);\n resolve();\n });\n });\n }\n\n /**\n * Stop the WebSocket server\n */\n async stop(): Promise<void> {\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n }\n\n // Close all client connections\n for (const client of this.clients.values()) {\n client.socket.close(1000, 'Server shutting down');\n }\n\n return new Promise((resolve) => {\n if (this.wss) {\n this.wss.close(() => {\n if (this.httpServer) {\n this.httpServer.close(() => {\n resolve();\n });\n } else {\n resolve();\n }\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Handle new WebSocket connection\n */\n private async handleConnection(socket: WebSocket, request: IncomingMessage): Promise<void> {\n try {\n // Authenticate\n const authResult = await this.options.authenticate(request);\n if (!authResult) {\n socket.close(4001, 'Unauthorized');\n return;\n }\n\n // Create client\n const client: RealtimeClient = {\n id: authResult.id,\n socket,\n rooms: new Set(),\n data: authResult.data || {},\n isAlive: true,\n connectedAt: new Date(),\n };\n\n this.clients.set(client.id, client);\n\n // Send welcome message\n this.sendToClient(client, {\n type: '_connected',\n payload: {\n id: client.id,\n connectedAt: client.connectedAt,\n },\n timestamp: Date.now(),\n });\n\n // Handle pong\n socket.on('pong', () => {\n client.isAlive = true;\n });\n\n // Handle messages\n socket.on('message', (data) => {\n this.handleMessage(client, data);\n });\n\n // Handle close\n socket.on('close', (code, reason) => {\n this.handleDisconnect(client, code, reason.toString());\n });\n\n // Handle error\n socket.on('error', (error) => {\n console.error(`WebSocket error for client ${client.id}:`, error);\n });\n\n // Notify connection handlers\n for (const handler of this.connectionHandlers) {\n await handler(client);\n }\n\n this.emit('connection', client);\n } catch (error) {\n console.error('Connection error:', error);\n socket.close(4000, 'Connection error');\n }\n }\n\n /**\n * Handle incoming message\n */\n private async handleMessage(client: RealtimeClient, rawData: WebSocket.Data): Promise<void> {\n try {\n const message = JSON.parse(rawData.toString()) as RealtimeMessage;\n message.from = client.id;\n message.timestamp = Date.now();\n\n // Handle built-in message types\n switch (message.type) {\n case '_join':\n await this.handleJoin(client, message.payload as { room: string; data?: Record<string, unknown> });\n return;\n case '_leave':\n await this.handleLeave(client, message.payload as { room: string });\n return;\n case '_broadcast':\n await this.handleBroadcast(client, message);\n return;\n case '_presence':\n await this.handlePresenceUpdate(client, message.payload as Record<string, unknown>);\n return;\n }\n\n // Handle custom events\n const handlers = this.eventHandlers.get(message.type) || [];\n for (const handler of handlers) {\n await handler(message, client);\n }\n\n this.emit('message', message, client);\n } catch (error) {\n console.error('Message handling error:', error);\n }\n }\n\n /**\n * Handle client disconnect\n */\n private async handleDisconnect(client: RealtimeClient, code: number, reason: string): Promise<void> {\n // Leave all rooms\n for (const roomName of client.rooms) {\n const room = this.rooms.get(roomName);\n if (room) {\n room.clients.delete(client.id);\n \n // Notify room members\n this.broadcastToRoom(roomName, {\n type: '_presence_leave',\n payload: { clientId: client.id },\n timestamp: Date.now(),\n }, client.id);\n\n // Delete empty rooms\n if (room.clients.size === 0) {\n this.rooms.delete(roomName);\n }\n }\n }\n\n // Remove client\n this.clients.delete(client.id);\n\n // Notify disconnect handlers\n for (const handler of this.disconnectHandlers) {\n await handler(client, code, reason);\n }\n\n this.emit('disconnect', client, code, reason);\n }\n\n /**\n * Handle room join\n */\n private async handleJoin(client: RealtimeClient, payload: { room: string; data?: Record<string, unknown> }): Promise<void> {\n const { room: roomName, data } = payload;\n\n // Create room if doesn't exist\n let room = this.rooms.get(roomName);\n if (!room) {\n room = {\n name: roomName,\n clients: new Set(),\n metadata: {},\n createdAt: new Date(),\n };\n this.rooms.set(roomName, room);\n }\n\n // Add client to room\n room.clients.add(client.id);\n client.rooms.add(roomName);\n\n // Update client data\n if (data) {\n client.data = { ...client.data, ...data };\n }\n\n // Send confirmation\n this.sendToClient(client, {\n type: '_joined',\n payload: {\n room: roomName,\n members: this.getRoomPresence(roomName),\n },\n timestamp: Date.now(),\n });\n\n // Notify other members\n if (this.options.presence) {\n this.broadcastToRoom(roomName, {\n type: '_presence_join',\n payload: {\n clientId: client.id,\n data: client.data,\n joinedAt: new Date(),\n },\n timestamp: Date.now(),\n }, client.id);\n }\n\n this.emit('join', client, roomName);\n }\n\n /**\n * Handle room leave\n */\n private async handleLeave(client: RealtimeClient, payload: { room: string }): Promise<void> {\n const { room: roomName } = payload;\n const room = this.rooms.get(roomName);\n\n if (room) {\n room.clients.delete(client.id);\n client.rooms.delete(roomName);\n\n // Notify other members\n if (this.options.presence) {\n this.broadcastToRoom(roomName, {\n type: '_presence_leave',\n payload: { clientId: client.id },\n timestamp: Date.now(),\n });\n }\n\n // Delete empty rooms\n if (room.clients.size === 0) {\n this.rooms.delete(roomName);\n }\n }\n\n // Send confirmation\n this.sendToClient(client, {\n type: '_left',\n payload: { room: roomName },\n timestamp: Date.now(),\n });\n\n this.emit('leave', client, roomName);\n }\n\n /**\n * Handle broadcast message\n */\n private async handleBroadcast(client: RealtimeClient, message: RealtimeMessage): Promise<void> {\n const { room } = message.payload as { room?: string; data: unknown };\n const broadcastMessage = {\n ...message,\n type: (message.payload as { type?: string }).type || 'broadcast',\n payload: (message.payload as { data?: unknown }).data,\n };\n\n if (room) {\n this.broadcastToRoom(room, broadcastMessage, client.id);\n } else {\n this.broadcastToAll(broadcastMessage, client.id);\n }\n }\n\n /**\n * Handle presence update\n */\n private async handlePresenceUpdate(client: RealtimeClient, data: Record<string, unknown>): Promise<void> {\n client.data = { ...client.data, ...data };\n\n // Broadcast to all rooms the client is in\n for (const roomName of client.rooms) {\n this.broadcastToRoom(roomName, {\n type: '_presence_update',\n payload: {\n clientId: client.id,\n data: client.data,\n },\n timestamp: Date.now(),\n }, client.id);\n }\n }\n\n /**\n * Ping all clients to check if they're alive\n */\n private pingClients(): void {\n for (const client of this.clients.values()) {\n if (!client.isAlive) {\n client.socket.terminate();\n this.handleDisconnect(client, 4002, 'Ping timeout');\n continue;\n }\n\n client.isAlive = false;\n client.socket.ping();\n }\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n /**\n * Register a handler for connection events\n */\n onConnection(handler: ConnectionHandler): this {\n this.connectionHandlers.push(handler);\n return this;\n }\n\n /**\n * Register a handler for disconnect events\n */\n onDisconnect(handler: DisconnectHandler): this {\n this.disconnectHandlers.push(handler);\n return this;\n }\n\n /**\n * Register a handler for a specific event type\n */\n onEvent<T = unknown>(eventType: string, handler: EventHandler<T>): this {\n const handlers = this.eventHandlers.get(eventType) || [];\n handlers.push(handler as EventHandler);\n this.eventHandlers.set(eventType, handlers);\n return this;\n }\n\n /**\n * Send a message to a specific client\n */\n sendToClient(client: RealtimeClient, message: RealtimeMessage): boolean {\n if (client.socket.readyState === WebSocket.OPEN) {\n client.socket.send(JSON.stringify(message));\n return true;\n }\n return false;\n }\n\n /**\n * Send a message to a client by ID\n */\n sendToId(clientId: string, message: RealtimeMessage): boolean {\n const client = this.clients.get(clientId);\n if (client) {\n return this.sendToClient(client, message);\n }\n return false;\n }\n\n /**\n * Broadcast to all clients in a room\n */\n broadcastToRoom(roomName: string, message: RealtimeMessage, excludeId?: string): void {\n const room = this.rooms.get(roomName);\n if (!room) return;\n\n message.room = roomName;\n\n for (const clientId of room.clients) {\n if (clientId !== excludeId) {\n const client = this.clients.get(clientId);\n if (client) {\n this.sendToClient(client, message);\n }\n }\n }\n }\n\n /**\n * Broadcast to all connected clients\n */\n broadcastToAll(message: RealtimeMessage, excludeId?: string): void {\n for (const [clientId, client] of this.clients) {\n if (clientId !== excludeId) {\n this.sendToClient(client, message);\n }\n }\n }\n\n /**\n * Get all clients in a room\n */\n getRoom(roomName: string): RealtimeRoom | undefined {\n return this.rooms.get(roomName);\n }\n\n /**\n * Get client by ID\n */\n getClient(clientId: string): RealtimeClient | undefined {\n return this.clients.get(clientId);\n }\n\n /**\n * Get presence data for a room\n */\n getRoomPresence(roomName: string): PresenceState[] {\n const room = this.rooms.get(roomName);\n if (!room) return [];\n\n return Array.from(room.clients).map((clientId) => {\n const client = this.clients.get(clientId);\n return {\n clientId,\n data: client?.data || {},\n joinedAt: client?.connectedAt || new Date(),\n lastSeen: new Date(),\n };\n });\n }\n\n /**\n * Get all connected clients count\n */\n get clientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Get all rooms count\n */\n get roomCount(): number {\n return this.rooms.size;\n }\n\n /**\n * Generate a unique client ID\n */\n private generateId(): string {\n return `client_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n}\n\n// ============================================================================\n// CLIENT-SIDE REALTIME (for browser)\n// ============================================================================\n\nexport interface RealtimeClientOptions {\n url: string;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n}\n\n/**\n * Create a client-side realtime connection\n * This code is isomorphic and can run in the browser\n */\nexport function createRealtimeClient(options: RealtimeClientOptions) {\n const {\n url,\n autoReconnect = true,\n reconnectInterval = 3000,\n maxReconnectAttempts = 10,\n } = options;\n\n let ws: WebSocket | null = null;\n let reconnectAttempts = 0;\n let clientId: string | null = null;\n const eventHandlers = new Map<string, Set<(payload: unknown) => void>>();\n const rooms = new Set<string>();\n\n const connect = (): Promise<void> => {\n return new Promise((resolve, reject) => {\n try {\n ws = new WebSocket(url);\n\n ws.onopen = () => {\n reconnectAttempts = 0;\n console.log('π Connected to Float.js Realtime');\n };\n\n ws.onmessage = (event) => {\n try {\n const data = typeof event.data === 'string' ? event.data : String(event.data);\n const message = JSON.parse(data) as RealtimeMessage;\n \n // Handle system messages\n if (message.type === '_connected') {\n clientId = (message.payload as { id: string }).id;\n resolve();\n return;\n }\n\n // Emit to handlers\n const handlers = eventHandlers.get(message.type);\n if (handlers) {\n handlers.forEach(handler => handler(message.payload));\n }\n\n // Also emit to 'message' handlers for all messages\n const allHandlers = eventHandlers.get('*');\n if (allHandlers) {\n allHandlers.forEach(handler => handler(message));\n }\n } catch (error) {\n console.error('Failed to parse message:', error);\n }\n };\n\n ws.onclose = () => {\n console.log('π Disconnected from Float.js Realtime');\n clientId = null;\n\n if (autoReconnect && reconnectAttempts < maxReconnectAttempts) {\n reconnectAttempts++;\n console.log(`Reconnecting in ${reconnectInterval}ms (attempt ${reconnectAttempts}/${maxReconnectAttempts})`);\n setTimeout(() => {\n connect().then(() => {\n // Rejoin rooms after reconnect\n rooms.forEach(room => {\n send({ type: '_join', payload: { room } });\n });\n });\n }, reconnectInterval);\n }\n };\n\n ws.onerror = (error) => {\n console.error('WebSocket error:', error);\n reject(error);\n };\n } catch (error) {\n reject(error);\n }\n });\n };\n\n const disconnect = () => {\n if (ws) {\n ws.close(1000, 'Client disconnect');\n ws = null;\n }\n };\n\n const send = (message: Partial<RealtimeMessage>) => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({\n ...message,\n timestamp: Date.now(),\n }));\n }\n };\n\n const join = (room: string, data?: Record<string, unknown>) => {\n rooms.add(room);\n send({ type: '_join', payload: { room, data } });\n };\n\n const leave = (room: string) => {\n rooms.delete(room);\n send({ type: '_leave', payload: { room } });\n };\n\n const broadcast = (room: string, type: string, data: unknown) => {\n send({\n type: '_broadcast',\n payload: { room, type, data },\n });\n };\n\n const emit = (type: string, data: unknown) => {\n send({ type, payload: data });\n };\n\n const on = <T = unknown>(eventType: string, handler: (payload: T) => void) => {\n if (!eventHandlers.has(eventType)) {\n eventHandlers.set(eventType, new Set());\n }\n eventHandlers.get(eventType)!.add(handler as (payload: unknown) => void);\n\n // Return unsubscribe function\n return () => {\n eventHandlers.get(eventType)?.delete(handler as (payload: unknown) => void);\n };\n };\n\n const updatePresence = (data: Record<string, unknown>) => {\n send({ type: '_presence', payload: data });\n };\n\n return {\n connect,\n disconnect,\n join,\n leave,\n broadcast,\n emit,\n on,\n updatePresence,\n get id() { return clientId; },\n get connected() { return ws?.readyState === WebSocket.OPEN; },\n };\n}\n\n// ============================================================================\n// SINGLETON INSTANCE\n// ============================================================================\n\nlet realtimeInstance: FloatRealtime | null = null;\n\n/**\n * Get or create the realtime server instance\n */\nexport function getRealtimeServer(options?: RealtimeOptions): FloatRealtime {\n if (!realtimeInstance) {\n realtimeInstance = new FloatRealtime(options);\n }\n return realtimeInstance;\n}\n\n/**\n * Shorthand export for easy usage\n */\nexport const realtime = {\n create: (options?: RealtimeOptions) => new FloatRealtime(options),\n server: getRealtimeServer,\n client: createRealtimeClient,\n};\n","/**\n * Float.js Image Optimization\n * Automatic image optimization, resizing, and format conversion\n * \n * Similar to Next.js Image but with more features!\n */\n\nimport { createHash } from 'crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, statSync } from 'fs';\nimport { join } from 'path';\nimport type { IncomingMessage, ServerResponse } from 'http';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ImageConfig {\n /** Supported image widths for responsive images */\n deviceSizes: number[];\n /** Smaller sizes for use with next/image */\n imageSizes: number[];\n /** Supported output formats */\n formats: ImageFormat[];\n /** Quality for lossy formats (1-100) */\n quality: number;\n /** Cache directory for optimized images */\n cacheDir: string;\n /** Base path for images */\n basePath: string;\n /** Remote image domains allowed */\n domains: string[];\n /** Minimum cache TTL in seconds */\n minimumCacheTTL: number;\n /** Disable static image imports */\n disableStaticImages: boolean;\n /** Enable AVIF format (experimental) */\n avif: boolean;\n}\n\nexport type ImageFormat = 'webp' | 'avif' | 'jpeg' | 'png' | 'gif' | 'svg';\n\nexport interface ImageProps {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n fill?: boolean;\n sizes?: string;\n quality?: number;\n priority?: boolean;\n placeholder?: 'blur' | 'empty' | 'data:image/...';\n blurDataURL?: string;\n loading?: 'lazy' | 'eager';\n className?: string;\n style?: Record<string, string>;\n onLoad?: () => void;\n onError?: () => void;\n}\n\nexport interface OptimizedImage {\n src: string;\n width: number;\n height: number;\n blurDataURL?: string;\n}\n\nexport interface ImageLoaderProps {\n src: string;\n width: number;\n quality?: number;\n}\n\n// ============================================================================\n// DEFAULT CONFIG\n// ============================================================================\n\nconst defaultConfig: ImageConfig = {\n deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],\n imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],\n formats: ['webp', 'jpeg'],\n quality: 75,\n cacheDir: '.float/cache/images',\n basePath: '/_float/image',\n domains: [],\n minimumCacheTTL: 60,\n disableStaticImages: false,\n avif: false,\n};\n\nlet imageConfig: ImageConfig = { ...defaultConfig };\n\nexport function configureImages(config: Partial<ImageConfig>): void {\n imageConfig = { ...defaultConfig, ...config };\n \n // Ensure cache directory exists\n if (!existsSync(imageConfig.cacheDir)) {\n mkdirSync(imageConfig.cacheDir, { recursive: true });\n }\n}\n\nexport function getImageConfig(): ImageConfig {\n return imageConfig;\n}\n\n// ============================================================================\n// IMAGE UTILITIES\n// ============================================================================\n\n/**\n * Generate a hash for cache key\n */\nfunction generateCacheKey(url: string, width: number, quality: number, format: string): string {\n const hash = createHash('md5')\n .update(`${url}-${width}-${quality}-${format}`)\n .digest('hex');\n return `${hash}.${format}`;\n}\n\n/**\n * Get the best format for the request\n */\nfunction getBestFormat(acceptHeader: string): ImageFormat {\n if (imageConfig.avif && acceptHeader.includes('image/avif')) {\n return 'avif';\n }\n if (acceptHeader.includes('image/webp')) {\n return 'webp';\n }\n return 'jpeg';\n}\n\n/**\n * Parse image URL parameters\n */\nfunction parseImageParams(url: URL): { src: string; width: number; quality: number } | null {\n const src = url.searchParams.get('url');\n const width = parseInt(url.searchParams.get('w') || '0', 10);\n const quality = parseInt(url.searchParams.get('q') || String(imageConfig.quality), 10);\n\n if (!src || !width) {\n return null;\n }\n\n // Validate width\n const allSizes = [...imageConfig.deviceSizes, ...imageConfig.imageSizes];\n if (!allSizes.includes(width)) {\n return null;\n }\n\n // Validate quality\n if (quality < 1 || quality > 100) {\n return null;\n }\n\n return { src, width, quality };\n}\n\n/**\n * Check if URL is external\n */\nfunction isExternalUrl(url: string): boolean {\n return url.startsWith('http://') || url.startsWith('https://');\n}\n\n/**\n * Validate external domain\n */\nfunction isAllowedDomain(url: string): boolean {\n if (!isExternalUrl(url)) return true;\n \n try {\n const { hostname } = new URL(url);\n return imageConfig.domains.includes(hostname);\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// IMAGE OPTIMIZATION (Sharp-like without Sharp dependency)\n// ============================================================================\n\n/**\n * Simple image resize using canvas (for basic optimization)\n * In production, you'd use Sharp or similar\n */\nasync function optimizeImage(\n input: Buffer,\n _width: number,\n _quality: number,\n _format: ImageFormat\n): Promise<Buffer> {\n // For now, return original with proper content type\n // In real implementation, use Sharp or similar:\n // const sharp = await import('sharp');\n // return sharp(input).resize(_width).toFormat(_format, { quality: _quality }).toBuffer();\n \n // Placeholder - returns original image\n // Users can install sharp for real optimization\n return input;\n}\n\n/**\n * Generate blur placeholder\n */\nexport async function generateBlurDataURL(input: Buffer): Promise<string> {\n // Generate a tiny version for blur placeholder\n // In real implementation, resize to 8x8 or 10x10 and base64 encode\n return `data:image/jpeg;base64,${input.slice(0, 50).toString('base64')}`;\n}\n\n// ============================================================================\n// IMAGE HANDLER\n// ============================================================================\n\nexport function createImageHandler() {\n // Ensure cache directory exists\n if (!existsSync(imageConfig.cacheDir)) {\n mkdirSync(imageConfig.cacheDir, { recursive: true });\n }\n\n return async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const urlString = req.url || '';\n \n // Check if this is an image optimization request\n if (!urlString.startsWith(imageConfig.basePath)) {\n return next();\n }\n\n try {\n const url = new URL(urlString, `http://${req.headers.host}`);\n const params = parseImageParams(url);\n\n if (!params) {\n res.statusCode = 400;\n res.end('Invalid image parameters');\n return;\n }\n\n const { src, width, quality } = params;\n\n // Validate domain for external URLs\n if (!isAllowedDomain(src)) {\n res.statusCode = 400;\n res.end('Domain not allowed');\n return;\n }\n\n // Determine best format\n const acceptHeader = req.headers.accept || '';\n const format = getBestFormat(acceptHeader);\n\n // Check cache\n const cacheKey = generateCacheKey(src, width, quality, format);\n const cachePath = join(imageConfig.cacheDir, cacheKey);\n\n if (existsSync(cachePath)) {\n const cachedImage = readFileSync(cachePath);\n const stat = statSync(cachePath);\n \n res.setHeader('Content-Type', `image/${format}`);\n res.setHeader('Cache-Control', `public, max-age=${imageConfig.minimumCacheTTL}, stale-while-revalidate`);\n res.setHeader('X-Float-Image-Cache', 'HIT');\n res.setHeader('Last-Modified', stat.mtime.toUTCString());\n res.end(cachedImage);\n return;\n }\n\n // Fetch or read image\n let imageBuffer: Buffer;\n\n if (isExternalUrl(src)) {\n const response = await fetch(src);\n if (!response.ok) {\n res.statusCode = 404;\n res.end('Image not found');\n return;\n }\n imageBuffer = Buffer.from(await response.arrayBuffer());\n } else {\n const imagePath = join(process.cwd(), 'public', src);\n if (!existsSync(imagePath)) {\n res.statusCode = 404;\n res.end('Image not found');\n return;\n }\n imageBuffer = readFileSync(imagePath);\n }\n\n // Optimize image\n const optimizedBuffer = await optimizeImage(imageBuffer, width, quality, format);\n\n // Save to cache\n writeFileSync(cachePath, optimizedBuffer);\n\n // Send response\n res.setHeader('Content-Type', `image/${format}`);\n res.setHeader('Cache-Control', `public, max-age=${imageConfig.minimumCacheTTL}, stale-while-revalidate`);\n res.setHeader('X-Float-Image-Cache', 'MISS');\n res.end(optimizedBuffer);\n } catch (error) {\n console.error('Image optimization error:', error);\n res.statusCode = 500;\n res.end('Image optimization failed');\n }\n };\n}\n\n// ============================================================================\n// IMAGE LOADER (for client-side)\n// ============================================================================\n\n/**\n * Default image loader\n */\nexport function floatImageLoader({ src, width, quality }: ImageLoaderProps): string {\n const q = quality || imageConfig.quality;\n return `${imageConfig.basePath}?url=${encodeURIComponent(src)}&w=${width}&q=${q}`;\n}\n\n/**\n * Generate srcset for responsive images\n */\nexport function generateSrcSet(src: string, sizes: number[]): string {\n return sizes\n .map(size => `${floatImageLoader({ src, width: size })} ${size}w`)\n .join(', ');\n}\n\n/**\n * Generate responsive image props\n */\nexport function getImageProps(props: ImageProps): {\n src: string;\n srcSet: string;\n sizes: string;\n width?: number;\n height?: number;\n loading: 'lazy' | 'eager';\n decoding: 'async' | 'sync';\n style?: Record<string, string>;\n} {\n const {\n src,\n width,\n height,\n fill,\n sizes = '100vw',\n quality,\n priority,\n loading = priority ? 'eager' : 'lazy',\n } = props;\n\n const allSizes = [...imageConfig.imageSizes, ...imageConfig.deviceSizes].sort((a, b) => a - b);\n \n // Filter sizes based on image width\n const relevantSizes = width \n ? allSizes.filter(s => s <= width * 2) \n : allSizes;\n\n return {\n src: floatImageLoader({ src, width: width || relevantSizes[relevantSizes.length - 1], quality }),\n srcSet: generateSrcSet(src, relevantSizes),\n sizes,\n width: fill ? undefined : width,\n height: fill ? undefined : height,\n loading,\n decoding: 'async',\n style: fill ? {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n } : undefined,\n };\n}\n\n// ============================================================================\n// REACT COMPONENT (Server Component compatible)\n// ============================================================================\n\n/**\n * Generate Image component HTML (for SSR)\n */\nexport function renderImageToString(props: ImageProps): string {\n const imageProps = getImageProps(props);\n \n const attributes = [\n `src=\"${imageProps.src}\"`,\n `srcset=\"${imageProps.srcSet}\"`,\n `sizes=\"${imageProps.sizes}\"`,\n `alt=\"${props.alt}\"`,\n `loading=\"${imageProps.loading}\"`,\n `decoding=\"${imageProps.decoding}\"`,\n ];\n\n if (imageProps.width) {\n attributes.push(`width=\"${imageProps.width}\"`);\n }\n if (imageProps.height) {\n attributes.push(`height=\"${imageProps.height}\"`);\n }\n if (props.className) {\n attributes.push(`class=\"${props.className}\"`);\n }\n if (imageProps.style) {\n const styleString = Object.entries(imageProps.style)\n .map(([key, value]) => `${key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`)}: ${value}`)\n .join('; ');\n attributes.push(`style=\"${styleString}\"`);\n }\n\n // Wrap in picture element for format fallback\n return `\n <picture>\n <source type=\"image/webp\" srcset=\"${imageProps.srcSet}\">\n <img ${attributes.join(' ')}>\n </picture>\n `.trim();\n}\n\n// ============================================================================\n// STATIC IMPORT HELPERS\n// ============================================================================\n\nexport interface StaticImageData {\n src: string;\n width: number;\n height: number;\n blurDataURL?: string;\n}\n\n/**\n * Import static image (for build-time optimization)\n */\nexport function importImage(imagePath: string): StaticImageData {\n // This would be processed at build time\n // Returns placeholder data for runtime\n return {\n src: imagePath,\n width: 0, // Determined at build time\n height: 0, // Determined at build time\n blurDataURL: undefined,\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport const image = {\n configure: configureImages,\n getConfig: getImageConfig,\n handler: createImageHandler,\n loader: floatImageLoader,\n srcSet: generateSrcSet,\n props: getImageProps,\n render: renderImageToString,\n import: importImage,\n};\n","/**\n * Float.js Edge Middleware\n * Run code at the edge before requests hit your application\n * \n * Inspired by Vercel Edge but works everywhere!\n */\n\nimport type { IncomingMessage, ServerResponse } from 'http';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface MiddlewareRequest {\n /** HTTP method */\n method: string;\n /** Request URL */\n url: string;\n /** Parsed URL */\n nextUrl: NextURL;\n /** Request headers */\n headers: Headers;\n /** Cookies from request */\n cookies: RequestCookies;\n /** Geolocation data (if available) */\n geo?: GeoData;\n /** IP address */\n ip?: string;\n /** Original request */\n request: Request;\n}\n\nexport interface NextURL {\n /** Full URL */\n href: string;\n /** Origin */\n origin: string;\n /** Protocol */\n protocol: string;\n /** Hostname */\n hostname: string;\n /** Port */\n port: string;\n /** Pathname */\n pathname: string;\n /** Search params */\n searchParams: URLSearchParams;\n /** Search string */\n search: string;\n /** Hash */\n hash: string;\n /** Base path */\n basePath: string;\n /** Locale */\n locale?: string;\n /** Clone the URL */\n clone(): NextURL;\n}\n\nexport interface RequestCookies {\n get(name: string): { name: string; value: string } | undefined;\n getAll(): Array<{ name: string; value: string }>;\n has(name: string): boolean;\n set(name: string, value: string, options?: CookieOptions): void;\n delete(name: string): void;\n}\n\nexport interface CookieOptions {\n domain?: string;\n path?: string;\n maxAge?: number;\n expires?: Date;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\nexport interface GeoData {\n city?: string;\n country?: string;\n countryCode?: string;\n region?: string;\n latitude?: number;\n longitude?: number;\n}\n\nexport type MiddlewareHandler = (\n request: MiddlewareRequest\n) => Promise<MiddlewareResponse | void> | MiddlewareResponse | void;\n\nexport type MiddlewareResponse = Response | NextResponse;\n\nexport interface MiddlewareConfig {\n matcher?: string | string[];\n}\n\n// ============================================================================\n// NEXT RESPONSE\n// ============================================================================\n\nexport class NextResponse extends Response {\n private _cookies: Map<string, { value: string; options?: CookieOptions }> = new Map();\n private _headers: Headers;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n super(body, init);\n this._headers = new Headers(init?.headers);\n }\n\n get cookies() {\n const self = this;\n return {\n set(name: string, value: string, options?: CookieOptions) {\n self._cookies.set(name, { value, options });\n self._headers.append('Set-Cookie', self._serializeCookie(name, value, options));\n },\n delete(name: string) {\n self._cookies.delete(name);\n self._headers.append('Set-Cookie', `${name}=; Max-Age=0; Path=/`);\n },\n get(name: string) {\n const cookie = self._cookies.get(name);\n return cookie ? { name, value: cookie.value } : undefined;\n },\n getAll() {\n return Array.from(self._cookies.entries()).map(([name, { value }]) => ({ name, value }));\n },\n };\n }\n\n private _serializeCookie(name: string, value: string, options?: CookieOptions): string {\n let cookie = `${name}=${encodeURIComponent(value)}`;\n \n if (options?.domain) cookie += `; Domain=${options.domain}`;\n if (options?.path) cookie += `; Path=${options.path}`;\n if (options?.maxAge) cookie += `; Max-Age=${options.maxAge}`;\n if (options?.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n if (options?.httpOnly) cookie += '; HttpOnly';\n if (options?.secure) cookie += '; Secure';\n if (options?.sameSite) cookie += `; SameSite=${options.sameSite}`;\n \n return cookie;\n }\n\n /**\n * Continue to the next middleware/handler\n */\n static next(init?: { request?: { headers?: Headers } }): NextResponse {\n const response = new NextResponse(null, { status: 200 });\n \n if (init?.request?.headers) {\n init.request.headers.forEach((value, key) => {\n response._headers.set(`x-middleware-request-${key}`, value);\n });\n }\n \n // Mark as \"continue\"\n response._headers.set('x-middleware-next', '1');\n \n return response;\n }\n\n /**\n * Redirect to a URL\n */\n static redirect(url: string | URL, status: 301 | 302 | 303 | 307 | 308 = 307): NextResponse {\n const urlString = typeof url === 'string' ? url : url.toString();\n return new NextResponse(null, {\n status,\n headers: { Location: urlString },\n });\n }\n\n /**\n * Rewrite to a different URL (internal redirect)\n */\n static rewrite(url: string | URL): NextResponse {\n const urlString = typeof url === 'string' ? url : url.toString();\n const response = new NextResponse(null, { status: 200 });\n response._headers.set('x-middleware-rewrite', urlString);\n return response;\n }\n\n /**\n * Return a JSON response\n */\n static json(data: unknown, init?: ResponseInit): NextResponse {\n const body = JSON.stringify(data);\n return new NextResponse(body, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n}\n\n// ============================================================================\n// MATCHER UTILITIES\n// ============================================================================\n\n/**\n * Convert matcher pattern to regex\n */\nfunction matcherToRegex(pattern: string): RegExp {\n // Handle special patterns\n if (pattern === '*') return /.*/;\n if (pattern === '/') return /^\\/$/;\n \n // Convert Next.js-style patterns to regex\n let regex = pattern\n // Escape special regex chars (except our patterns)\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n // Convert :param to named capture groups\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, '(?<$1>[^/]+)')\n // Convert * to match any characters\n .replace(/\\\\\\*/g, '.*')\n // Handle (group) for optional segments\n .replace(/\\\\\\(([^)]+)\\\\\\)/g, '($1)?');\n \n return new RegExp(`^${regex}$`);\n}\n\n/**\n * Check if path matches any of the patterns\n */\nfunction matchesPath(path: string, matcher?: string | string[]): boolean {\n if (!matcher) return true;\n \n const patterns = Array.isArray(matcher) ? matcher : [matcher];\n return patterns.some(pattern => matcherToRegex(pattern).test(path));\n}\n\n// ============================================================================\n// REQUEST PARSING\n// ============================================================================\n\nfunction parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = new Map<string, string>();\n if (!cookieHeader) return cookies;\n \n cookieHeader.split(';').forEach(cookie => {\n const [name, ...valueParts] = cookie.trim().split('=');\n if (name) {\n cookies.set(name, valueParts.join('='));\n }\n });\n \n return cookies;\n}\n\nfunction createRequestCookies(cookieHeader: string): RequestCookies {\n const cookies = parseCookies(cookieHeader);\n const toSet: Map<string, { value: string; options?: CookieOptions }> = new Map();\n const toDelete: Set<string> = new Set();\n \n return {\n get(name: string) {\n if (toDelete.has(name)) return undefined;\n const value = toSet.get(name)?.value ?? cookies.get(name);\n return value ? { name, value } : undefined;\n },\n getAll() {\n const result: Array<{ name: string; value: string }> = [];\n \n cookies.forEach((value, name) => {\n if (!toDelete.has(name) && !toSet.has(name)) {\n result.push({ name, value });\n }\n });\n \n toSet.forEach(({ value }, name) => {\n result.push({ name, value });\n });\n \n return result;\n },\n has(name: string) {\n if (toDelete.has(name)) return false;\n return toSet.has(name) || cookies.has(name);\n },\n set(name: string, value: string, options?: CookieOptions) {\n toDelete.delete(name);\n toSet.set(name, { value, options });\n },\n delete(name: string) {\n toSet.delete(name);\n toDelete.add(name);\n },\n };\n}\n\nfunction createNextUrl(url: URL, basePath: string = ''): NextURL {\n return {\n href: url.href,\n origin: url.origin,\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port,\n pathname: url.pathname,\n searchParams: url.searchParams,\n search: url.search,\n hash: url.hash,\n basePath,\n locale: undefined,\n clone() {\n return createNextUrl(new URL(url.href), basePath);\n },\n };\n}\n\n// ============================================================================\n// MIDDLEWARE RUNNER\n// ============================================================================\n\nexport interface MiddlewareDefinition {\n handler: MiddlewareHandler;\n config?: MiddlewareConfig;\n}\n\nconst middlewareStack: MiddlewareDefinition[] = [];\n\n/**\n * Register a middleware\n */\nexport function registerMiddleware(\n handler: MiddlewareHandler,\n config?: MiddlewareConfig\n): void {\n middlewareStack.push({ handler, config });\n}\n\n/**\n * Clear all middleware\n */\nexport function clearMiddleware(): void {\n middlewareStack.length = 0;\n}\n\n/**\n * Create middleware handler for server integration\n */\nexport function createMiddlewareHandler(\n middlewares?: MiddlewareDefinition[]\n) {\n const stack = middlewares || middlewareStack;\n \n return async (\n req: IncomingMessage,\n res: ServerResponse,\n next: () => void\n ): Promise<void> => {\n const protocol = (req.socket as any).encrypted ? 'https' : 'http';\n const host = req.headers.host || 'localhost';\n const urlString = req.url || '/';\n const url = new URL(urlString, `${protocol}://${host}`);\n \n // Create middleware request\n const headers = new Headers();\n Object.entries(req.headers).forEach(([key, value]) => {\n if (value) {\n headers.set(key, Array.isArray(value) ? value.join(', ') : value);\n }\n });\n \n const request = new Request(url.href, {\n method: req.method,\n headers,\n });\n \n const middlewareReq: MiddlewareRequest = {\n method: req.method || 'GET',\n url: urlString,\n nextUrl: createNextUrl(url),\n headers,\n cookies: createRequestCookies(req.headers.cookie || ''),\n ip: (req.socket.remoteAddress || '').replace('::ffff:', ''),\n request,\n };\n \n // Run middleware stack\n for (const { handler, config } of stack) {\n // Check if path matches\n if (!matchesPath(url.pathname, config?.matcher)) {\n continue;\n }\n \n try {\n const result = await handler(middlewareReq);\n \n if (!result) {\n continue; // No response, continue to next middleware\n }\n \n // Check for special headers\n const middlewareHeaders = result.headers;\n \n // Handle \"next\" (continue)\n if (middlewareHeaders.get('x-middleware-next')) {\n continue;\n }\n \n // Handle rewrite\n const rewriteUrl = middlewareHeaders.get('x-middleware-rewrite');\n if (rewriteUrl) {\n // Update request URL for downstream handlers\n (req as any).url = rewriteUrl;\n continue;\n }\n \n // Handle redirect\n if (result.status >= 300 && result.status < 400) {\n const location = middlewareHeaders.get('Location');\n if (location) {\n res.setHeader('Location', location);\n res.statusCode = result.status;\n res.end();\n return;\n }\n }\n \n // Handle response\n if (result.body || result.status !== 200) {\n res.statusCode = result.status;\n \n result.headers.forEach((value, key) => {\n if (!key.startsWith('x-middleware-')) {\n res.setHeader(key, value);\n }\n });\n \n if (result.body) {\n const body = await result.text();\n res.end(body);\n } else {\n res.end();\n }\n return;\n }\n } catch (error) {\n console.error('Middleware error:', error);\n res.statusCode = 500;\n res.end('Internal Server Error');\n return;\n }\n }\n \n // No middleware blocked, continue\n next();\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport const middleware = {\n register: registerMiddleware,\n clear: clearMiddleware,\n handler: createMiddlewareHandler,\n NextResponse,\n};\n\n/**\n * Shorthand for common middleware patterns\n */\nexport const middlewareHelpers = {\n /**\n * Basic auth middleware\n */\n basicAuth(username: string, password: string): MiddlewareHandler {\n return (req) => {\n const authHeader = req.headers.get('authorization');\n \n if (!authHeader || !authHeader.startsWith('Basic ')) {\n return new NextResponse('Unauthorized', {\n status: 401,\n headers: { 'WWW-Authenticate': 'Basic realm=\"Secure Area\"' },\n });\n }\n \n const credentials = atob(authHeader.slice(6));\n const [user, pass] = credentials.split(':');\n \n if (user !== username || pass !== password) {\n return new NextResponse('Invalid credentials', { status: 401 });\n }\n \n return NextResponse.next();\n };\n },\n \n /**\n * CORS middleware\n */\n cors(options: {\n origin?: string | string[];\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n } = {}): MiddlewareHandler {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n headers = ['Content-Type', 'Authorization'],\n credentials = false,\n } = options;\n \n return (req) => {\n const response = NextResponse.next();\n \n const requestOrigin = req.headers.get('origin');\n const allowedOrigin = Array.isArray(origin)\n ? (origin.includes(requestOrigin || '') ? requestOrigin : origin[0])\n : origin;\n \n response.headers.set('Access-Control-Allow-Origin', allowedOrigin || '*');\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n \n if (credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n \n // Handle preflight\n if (req.method === 'OPTIONS') {\n return new NextResponse(null, {\n status: 204,\n headers: response.headers,\n });\n }\n \n return response;\n };\n },\n \n /**\n * Rate limiting middleware\n */\n rateLimit(options: {\n limit: number;\n window: number; // seconds\n }): MiddlewareHandler {\n const { limit, window } = options;\n const requests = new Map<string, { count: number; resetAt: number }>();\n \n return (req) => {\n const ip = req.ip || 'unknown';\n const now = Date.now();\n \n let record = requests.get(ip);\n \n if (!record || record.resetAt < now) {\n record = { count: 0, resetAt: now + window * 1000 };\n requests.set(ip, record);\n }\n \n record.count++;\n \n if (record.count > limit) {\n return NextResponse.json(\n { error: 'Too many requests' },\n { \n status: 429,\n headers: {\n 'Retry-After': String(Math.ceil((record.resetAt - now) / 1000)),\n },\n }\n );\n }\n \n const response = NextResponse.next();\n response.headers.set('X-RateLimit-Limit', String(limit));\n response.headers.set('X-RateLimit-Remaining', String(limit - record.count));\n response.headers.set('X-RateLimit-Reset', String(Math.ceil(record.resetAt / 1000)));\n \n return response;\n };\n },\n \n /**\n * Redirect trailing slashes\n */\n trailingSlash(add: boolean = false): MiddlewareHandler {\n return (req) => {\n const path = req.nextUrl.pathname;\n \n if (path === '/') return NextResponse.next();\n \n const hasSlash = path.endsWith('/');\n \n if (add && !hasSlash) {\n return NextResponse.redirect(new URL(path + '/', req.request.url));\n }\n \n if (!add && hasSlash) {\n return NextResponse.redirect(new URL(path.slice(0, -1), req.request.url));\n }\n \n return NextResponse.next();\n };\n },\n};\n","/**\n * Float.js - Static Site Generation (SSG) & Incremental Static Regeneration (ISR)\n * \n * Built-in static generation with automatic revalidation.\n * Simpler API than Next.js with more flexibility.\n */\n\nimport { createHash } from 'crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from 'fs';\nimport { join, dirname } from 'path';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface StaticPath {\n params: Record<string, string | string[]>;\n locale?: string;\n}\n\nexport interface GetStaticPathsResult {\n paths: StaticPath[];\n fallback: boolean | 'blocking';\n}\n\nexport interface GetStaticPropsContext<P = Record<string, string>> {\n params: P;\n locale?: string;\n defaultLocale?: string;\n preview?: boolean;\n previewData?: unknown;\n}\n\nexport interface GetStaticPropsResult<T = unknown> {\n props: T;\n revalidate?: number | false;\n notFound?: boolean;\n redirect?: {\n destination: string;\n permanent?: boolean;\n statusCode?: 301 | 302 | 303 | 307 | 308;\n };\n}\n\nexport interface CachedPage {\n html: string;\n props: unknown;\n generatedAt: number;\n revalidateAfter: number | null;\n etag: string;\n headers?: Record<string, string>;\n}\n\nexport interface SSGConfig {\n /** Directory to store generated pages */\n outDir: string;\n /** Default revalidation time in seconds */\n defaultRevalidate: number;\n /** Enable stale-while-revalidate */\n staleWhileRevalidate: boolean;\n /** Max pages in memory cache */\n maxMemoryCacheSize: number;\n /** Custom render function */\n renderPage?: (component: unknown, props: unknown) => Promise<string>;\n /** Compression for stored pages */\n compression: boolean;\n}\n\nexport interface GenerateResult {\n path: string;\n success: boolean;\n error?: Error;\n duration: number;\n size: number;\n revalidateAt?: Date;\n}\n\nexport interface ISRState {\n revalidating: Set<string>;\n scheduled: Map<string, NodeJS.Timeout>;\n lastRevalidation: Map<string, number>;\n}\n\n// ============================================================================\n// DEFAULT CONFIG\n// ============================================================================\n\nconst DEFAULT_CONFIG: SSGConfig = {\n outDir: '.float/static',\n defaultRevalidate: 60,\n staleWhileRevalidate: true,\n maxMemoryCacheSize: 100,\n compression: false\n};\n\n// ============================================================================\n// SSG ENGINE\n// ============================================================================\n\nexport class SSGEngine {\n private config: SSGConfig;\n private memoryCache: Map<string, CachedPage> = new Map();\n private diskCachePath: string;\n private isrState: ISRState = {\n revalidating: new Set(),\n scheduled: new Map(),\n lastRevalidation: new Map()\n };\n\n constructor(config: Partial<SSGConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.diskCachePath = join(process.cwd(), this.config.outDir);\n this.ensureCacheDir();\n }\n\n private ensureCacheDir(): void {\n if (!existsSync(this.diskCachePath)) {\n mkdirSync(this.diskCachePath, { recursive: true });\n }\n }\n\n private getCacheKey(path: string, locale?: string): string {\n const normalized = path.replace(/^\\/+|\\/+$/g, '') || 'index';\n const key = locale ? `${locale}/${normalized}` : normalized;\n return key.replace(/\\//g, '__');\n }\n\n private getEtag(content: string): string {\n return createHash('md5').update(content).digest('hex').slice(0, 16);\n }\n\n private getCacheFilePath(cacheKey: string): string {\n return join(this.diskCachePath, `${cacheKey}.json`);\n }\n\n /**\n * Generate static page and cache it\n */\n async generatePage<P = unknown>(\n path: string,\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n params: Record<string, string> = {},\n locale?: string\n ): Promise<GenerateResult> {\n const startTime = Date.now();\n const cacheKey = this.getCacheKey(path, locale);\n\n try {\n // Get props\n const propsResult = await getStaticProps({\n params,\n locale,\n preview: false\n });\n\n // Handle redirect/notFound\n if (propsResult.redirect) {\n return {\n path,\n success: true,\n duration: Date.now() - startTime,\n size: 0\n };\n }\n\n if (propsResult.notFound) {\n return {\n path,\n success: false,\n duration: Date.now() - startTime,\n size: 0,\n error: new Error('Page not found')\n };\n }\n\n // Render HTML\n const html = await render(propsResult.props);\n const etag = this.getEtag(html);\n\n // Calculate revalidation\n const revalidate = propsResult.revalidate ?? this.config.defaultRevalidate;\n const revalidateAfter = revalidate === false \n ? null \n : Date.now() + (revalidate * 1000);\n\n // Create cached page\n const cachedPage: CachedPage = {\n html,\n props: propsResult.props,\n generatedAt: Date.now(),\n revalidateAfter,\n etag,\n headers: {\n 'Cache-Control': revalidate === false\n ? 'public, max-age=31536000, immutable'\n : `public, s-maxage=${revalidate}, stale-while-revalidate=${revalidate * 2}`\n }\n };\n\n // Store in memory cache (with LRU eviction)\n this.setMemoryCache(cacheKey, cachedPage);\n\n // Store on disk\n this.writeToDisk(cacheKey, cachedPage);\n\n return {\n path,\n success: true,\n duration: Date.now() - startTime,\n size: html.length,\n revalidateAt: revalidateAfter ? new Date(revalidateAfter) : undefined\n };\n\n } catch (error) {\n return {\n path,\n success: false,\n duration: Date.now() - startTime,\n size: 0,\n error: error instanceof Error ? error : new Error(String(error))\n };\n }\n }\n\n /**\n * Get cached page or generate on-demand\n */\n async getPage<P = unknown>(\n path: string,\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n params: Record<string, string> = {},\n locale?: string,\n fallback: boolean | 'blocking' = false\n ): Promise<{ cached: CachedPage; stale: boolean } | null> {\n const cacheKey = this.getCacheKey(path, locale);\n\n // Try memory cache first\n let cached = this.memoryCache.get(cacheKey);\n\n // Try disk cache if not in memory\n if (!cached) {\n cached = this.readFromDisk(cacheKey) || undefined;\n if (cached) {\n this.setMemoryCache(cacheKey, cached);\n }\n }\n\n // If we have a cached page\n if (cached) {\n const isStale = cached.revalidateAfter !== null && \n Date.now() > cached.revalidateAfter;\n\n // If stale and SWR enabled, trigger background revalidation\n if (isStale && this.config.staleWhileRevalidate) {\n this.triggerRevalidation(path, getStaticProps, render, params, locale);\n }\n\n return { cached, stale: isStale };\n }\n\n // No cached page - handle fallback\n if (fallback === false) {\n return null; // 404\n }\n\n // Generate on-demand (blocking or non-blocking)\n if (fallback === 'blocking') {\n const result = await this.generatePage(path, getStaticProps, render, params, locale);\n if (result.success) {\n const newCached = this.memoryCache.get(cacheKey);\n return newCached ? { cached: newCached, stale: false } : null;\n }\n }\n\n return null;\n }\n\n /**\n * Trigger ISR revalidation in background\n */\n private async triggerRevalidation<P = unknown>(\n path: string,\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n params: Record<string, string> = {},\n locale?: string\n ): Promise<void> {\n const cacheKey = this.getCacheKey(path, locale);\n\n // Prevent concurrent revalidation\n if (this.isrState.revalidating.has(cacheKey)) {\n return;\n }\n\n this.isrState.revalidating.add(cacheKey);\n\n try {\n await this.generatePage(path, getStaticProps, render, params, locale);\n this.isrState.lastRevalidation.set(cacheKey, Date.now());\n } finally {\n this.isrState.revalidating.delete(cacheKey);\n }\n }\n\n /**\n * Force revalidation of a path (On-Demand ISR)\n */\n async revalidate<P = unknown>(\n path: string,\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n params: Record<string, string> = {},\n locale?: string\n ): Promise<{ revalidated: boolean; error?: string }> {\n try {\n const result = await this.generatePage(path, getStaticProps, render, params, locale);\n return { revalidated: result.success, error: result.error?.message };\n } catch (error) {\n return { \n revalidated: false, \n error: error instanceof Error ? error.message : 'Unknown error' \n };\n }\n }\n\n /**\n * Batch generate multiple pages\n */\n async generatePaths<P = unknown>(\n paths: StaticPath[],\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n concurrency: number = 5\n ): Promise<GenerateResult[]> {\n const results: GenerateResult[] = [];\n const queue = [...paths];\n\n const worker = async () => {\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) break;\n\n const pathStr = this.buildPath(item.params);\n const result = await this.generatePage(\n pathStr,\n getStaticProps,\n render,\n item.params as Record<string, string>,\n item.locale\n );\n results.push(result);\n }\n };\n\n // Run workers in parallel\n const workers = Array(Math.min(concurrency, paths.length))\n .fill(null)\n .map(() => worker());\n\n await Promise.all(workers);\n\n return results;\n }\n\n private buildPath(params: Record<string, string | string[]>): string {\n return '/' + Object.values(params)\n .map(v => Array.isArray(v) ? v.join('/') : v)\n .join('/');\n }\n\n /**\n * Memory cache with LRU eviction\n */\n private setMemoryCache(key: string, page: CachedPage): void {\n // Evict if at capacity\n if (this.memoryCache.size >= this.config.maxMemoryCacheSize) {\n const firstKey = this.memoryCache.keys().next().value;\n if (firstKey) {\n this.memoryCache.delete(firstKey);\n }\n }\n\n // Delete and re-add to maintain LRU order\n this.memoryCache.delete(key);\n this.memoryCache.set(key, page);\n }\n\n /**\n * Write cached page to disk\n */\n private writeToDisk(cacheKey: string, page: CachedPage): void {\n try {\n const filePath = this.getCacheFilePath(cacheKey);\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(page));\n } catch {\n // Silently fail disk writes\n }\n }\n\n /**\n * Read cached page from disk\n */\n private readFromDisk(cacheKey: string): CachedPage | null {\n try {\n const filePath = this.getCacheFilePath(cacheKey);\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // Silently fail disk reads\n }\n return null;\n }\n\n /**\n * Clear all caches\n */\n clearCache(): void {\n this.memoryCache.clear();\n \n // Clear scheduled revalidations\n for (const timeout of this.isrState.scheduled.values()) {\n clearTimeout(timeout);\n }\n this.isrState.scheduled.clear();\n this.isrState.lastRevalidation.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): {\n memoryPages: number;\n diskPages: number;\n revalidating: number;\n lastRevalidations: Record<string, Date>;\n } {\n let diskPages = 0;\n try {\n if (existsSync(this.diskCachePath)) {\n diskPages = readdirSync(this.diskCachePath)\n .filter(f => f.endsWith('.json')).length;\n }\n } catch {\n // Ignore\n }\n\n return {\n memoryPages: this.memoryCache.size,\n diskPages,\n revalidating: this.isrState.revalidating.size,\n lastRevalidations: Object.fromEntries(\n Array.from(this.isrState.lastRevalidation.entries())\n .map(([k, v]) => [k, new Date(v)])\n )\n };\n }\n\n /**\n * Purge stale pages from disk\n */\n purgeStale(): number {\n let purged = 0;\n\n try {\n if (!existsSync(this.diskCachePath)) return 0;\n\n const files = readdirSync(this.diskCachePath)\n .filter(f => f.endsWith('.json'));\n\n for (const file of files) {\n const filePath = join(this.diskCachePath, file);\n try {\n const content = readFileSync(filePath, 'utf-8');\n const page: CachedPage = JSON.parse(content);\n \n if (page.revalidateAfter !== null && Date.now() > page.revalidateAfter) {\n unlinkSync(filePath);\n purged++;\n }\n } catch {\n // Invalid file, remove it\n unlinkSync(filePath);\n purged++;\n }\n }\n } catch {\n // Ignore\n }\n\n return purged;\n }\n}\n\n// ============================================================================\n// HELPER FUNCTIONS (like getStaticPaths, getStaticProps)\n// ============================================================================\n\n/**\n * Define static paths for dynamic routes\n */\nexport function defineStaticPaths<_P extends StaticPath = StaticPath>(\n fn: () => Promise<GetStaticPathsResult> | GetStaticPathsResult\n): () => Promise<GetStaticPathsResult> {\n return async () => {\n const result = await fn();\n return result;\n };\n}\n\n/**\n * Define static props for a page\n */\nexport function defineStaticProps<P = unknown, Params = Record<string, string>>(\n fn: (ctx: GetStaticPropsContext<Params>) => Promise<GetStaticPropsResult<P>> | GetStaticPropsResult<P>\n): (ctx: GetStaticPropsContext<Params>) => Promise<GetStaticPropsResult<P>> {\n return async (ctx) => {\n const result = await fn(ctx);\n return result;\n };\n}\n\n// ============================================================================\n// SINGLETON & EXPORTS\n// ============================================================================\n\nlet ssgEngine: SSGEngine | null = null;\n\n/**\n * Get or create SSG engine instance\n */\nexport function getSSGEngine(config?: Partial<SSGConfig>): SSGEngine {\n if (!ssgEngine) {\n ssgEngine = new SSGEngine(config);\n }\n return ssgEngine;\n}\n\n/**\n * Configure SSG engine\n */\nexport function configureSSG(config: Partial<SSGConfig>): SSGEngine {\n ssgEngine = new SSGEngine(config);\n return ssgEngine;\n}\n\n// ============================================================================\n// REQUEST HANDLER\n// ============================================================================\n\nexport interface SSGHandlerOptions {\n getStaticPaths?: () => Promise<GetStaticPathsResult>;\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult>;\n render: (props: unknown) => Promise<string>;\n fallback?: boolean | 'blocking';\n}\n\n/**\n * Create SSG request handler\n */\nexport function createSSGHandler(options: SSGHandlerOptions) {\n const engine = getSSGEngine();\n\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url);\n const path = url.pathname;\n \n // Extract params from path (simplified)\n const params: Record<string, string> = {};\n\n // Try to get cached page\n const result = await engine.getPage(\n path,\n options.getStaticProps as (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<unknown>>,\n options.render,\n params,\n undefined,\n options.fallback ?? false\n );\n\n if (!result) {\n return new Response('Not Found', { status: 404 });\n }\n\n // Check ETag for conditional request\n const ifNoneMatch = req.headers.get('If-None-Match');\n if (ifNoneMatch === result.cached.etag) {\n return new Response(null, { status: 304 });\n }\n\n // Return cached HTML\n return new Response(result.cached.html, {\n status: 200,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'ETag': result.cached.etag,\n 'X-Float-Generated': new Date(result.cached.generatedAt).toISOString(),\n 'X-Float-Stale': result.stale ? 'true' : 'false',\n ...result.cached.headers\n }\n });\n };\n}\n\n// ============================================================================\n// REVALIDATION API\n// ============================================================================\n\nexport interface RevalidateAPIOptions {\n secret?: string;\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult>;\n render: (props: unknown) => Promise<string>;\n}\n\n/**\n * Create on-demand revalidation API handler\n */\nexport function createRevalidateHandler(options: RevalidateAPIOptions) {\n const engine = getSSGEngine();\n\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url);\n \n // Validate secret if configured\n if (options.secret) {\n const providedSecret = url.searchParams.get('secret');\n if (providedSecret !== options.secret) {\n return new Response(JSON.stringify({ error: 'Invalid token' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n }\n\n // Get path to revalidate\n const pathToRevalidate = url.searchParams.get('path');\n if (!pathToRevalidate) {\n return new Response(JSON.stringify({ error: 'Missing path parameter' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n // Trigger revalidation\n const result = await engine.revalidate(\n pathToRevalidate,\n options.getStaticProps as (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<unknown>>,\n options.render\n );\n\n return new Response(JSON.stringify(result), {\n status: result.revalidated ? 200 : 500,\n headers: { 'Content-Type': 'application/json' }\n });\n };\n}\n\n// ============================================================================\n// MAIN EXPORT\n// ============================================================================\n\nexport const ssg = {\n engine: getSSGEngine,\n configure: configureSSG,\n defineStaticPaths,\n defineStaticProps,\n createHandler: createSSGHandler,\n createRevalidateHandler\n};\n\nexport default ssg;\n","/**\n * Float.js - Built-in Analytics\n * \n * Zero-config privacy-focused analytics built into the framework.\n * No external dependencies, no cookies, GDPR-compliant by default.\n */\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface PageView {\n id: string;\n timestamp: number;\n pathname: string;\n referrer?: string;\n userAgent?: string;\n country?: string;\n device: 'desktop' | 'mobile' | 'tablet' | 'unknown';\n browser: string;\n os: string;\n sessionId: string;\n duration?: number;\n}\n\nexport interface WebVitals {\n id: string;\n timestamp: number;\n pathname: string;\n metrics: {\n FCP?: number; // First Contentful Paint\n LCP?: number; // Largest Contentful Paint\n FID?: number; // First Input Delay\n CLS?: number; // Cumulative Layout Shift\n TTFB?: number; // Time to First Byte\n INP?: number; // Interaction to Next Paint\n };\n}\n\nexport interface CustomEvent {\n id: string;\n timestamp: number;\n name: string;\n pathname: string;\n properties?: Record<string, string | number | boolean>;\n sessionId: string;\n}\n\nexport interface AnalyticsData {\n pageviews: PageView[];\n vitals: WebVitals[];\n events: CustomEvent[];\n}\n\nexport interface AnalyticsConfig {\n /** Enable/disable analytics */\n enabled: boolean;\n /** Ignore paths (regex patterns) */\n ignorePaths: (string | RegExp)[];\n /** Max events in memory before flush */\n maxBufferSize: number;\n /** Flush interval in ms */\n flushInterval: number;\n /** Custom event handler */\n onFlush?: (data: AnalyticsData) => Promise<void>;\n /** Hash IP addresses for privacy */\n hashIPs: boolean;\n /** Track web vitals */\n trackVitals: boolean;\n /** Session timeout in minutes */\n sessionTimeout: number;\n /** GeoIP lookup */\n geoIP: boolean;\n}\n\nexport interface AnalyticsSummary {\n period: { start: Date; end: Date };\n pageviews: {\n total: number;\n unique: number;\n byPath: Record<string, number>;\n byReferrer: Record<string, number>;\n byDevice: Record<string, number>;\n byBrowser: Record<string, number>;\n byCountry: Record<string, number>;\n };\n vitals: {\n avgFCP: number;\n avgLCP: number;\n avgFID: number;\n avgCLS: number;\n avgTTFB: number;\n p75LCP: number;\n p75FID: number;\n p75CLS: number;\n };\n events: {\n total: number;\n byName: Record<string, number>;\n };\n sessions: {\n total: number;\n avgDuration: number;\n bounceRate: number;\n };\n}\n\n// ============================================================================\n// DEFAULT CONFIG\n// ============================================================================\n\nconst DEFAULT_CONFIG: AnalyticsConfig = {\n enabled: true,\n ignorePaths: [/^\\/__float/, /^\\/api\\//, /\\.(ico|png|jpg|css|js)$/],\n maxBufferSize: 100,\n flushInterval: 30000, // 30 seconds\n hashIPs: true,\n trackVitals: true,\n sessionTimeout: 30, // minutes\n geoIP: false\n};\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15) + \n Math.random().toString(36).substring(2, 15);\n}\n\nfunction hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n\nfunction parseUserAgent(ua?: string): { device: PageView['device']; browser: string; os: string } {\n if (!ua) {\n return { device: 'unknown', browser: 'Unknown', os: 'Unknown' };\n }\n\n // Device detection\n let device: PageView['device'] = 'desktop';\n if (/Mobile|Android.*Mobile|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua)) {\n device = 'mobile';\n } else if (/iPad|Android(?!.*Mobile)|Tablet/i.test(ua)) {\n device = 'tablet';\n }\n\n // Browser detection\n let browser = 'Unknown';\n if (/Firefox/i.test(ua)) browser = 'Firefox';\n else if (/Edg/i.test(ua)) browser = 'Edge';\n else if (/Chrome/i.test(ua)) browser = 'Chrome';\n else if (/Safari/i.test(ua)) browser = 'Safari';\n else if (/Opera|OPR/i.test(ua)) browser = 'Opera';\n\n // OS detection\n let os = 'Unknown';\n if (/Windows/i.test(ua)) os = 'Windows';\n else if (/Mac OS X/i.test(ua)) os = 'macOS';\n else if (/Linux/i.test(ua)) os = 'Linux';\n else if (/Android/i.test(ua)) os = 'Android';\n else if (/iOS|iPhone|iPad/i.test(ua)) os = 'iOS';\n\n return { device, browser, os };\n}\n\nfunction percentile(arr: number[], p: number): number {\n if (arr.length === 0) return 0;\n const sorted = [...arr].sort((a, b) => a - b);\n const index = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, index)];\n}\n\n// ============================================================================\n// ANALYTICS ENGINE\n// ============================================================================\n\nexport class AnalyticsEngine {\n private config: AnalyticsConfig;\n private buffer: AnalyticsData = {\n pageviews: [],\n vitals: [],\n events: []\n };\n private flushTimer: NodeJS.Timeout | null = null;\n private sessions: Map<string, { lastActivity: number; views: number }> = new Map();\n private allData: AnalyticsData = {\n pageviews: [],\n vitals: [],\n events: []\n };\n\n constructor(config: Partial<AnalyticsConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.startFlushTimer();\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) clearInterval(this.flushTimer);\n \n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n private shouldIgnore(pathname: string): boolean {\n return this.config.ignorePaths.some(pattern => {\n if (typeof pattern === 'string') {\n return pathname.startsWith(pattern);\n }\n return pattern.test(pathname);\n });\n }\n\n private getOrCreateSession(ip: string): string {\n const sessionKey = this.config.hashIPs ? hashString(ip) : ip;\n const existing = this.sessions.get(sessionKey);\n const now = Date.now();\n const timeout = this.config.sessionTimeout * 60 * 1000;\n\n if (existing && (now - existing.lastActivity) < timeout) {\n existing.lastActivity = now;\n existing.views++;\n return sessionKey;\n }\n\n this.sessions.set(sessionKey, { lastActivity: now, views: 1 });\n return sessionKey;\n }\n\n /**\n * Track a page view\n */\n trackPageview(req: Request, options: { country?: string } = {}): PageView | null {\n if (!this.config.enabled) return null;\n\n const url = new URL(req.url);\n \n if (this.shouldIgnore(url.pathname)) return null;\n\n const ip = req.headers.get('x-forwarded-for')?.split(',')[0] || \n req.headers.get('x-real-ip') || \n 'unknown';\n const userAgent = req.headers.get('user-agent') || undefined;\n const { device, browser, os } = parseUserAgent(userAgent);\n const sessionId = this.getOrCreateSession(ip);\n\n const pageview: PageView = {\n id: generateId(),\n timestamp: Date.now(),\n pathname: url.pathname,\n referrer: req.headers.get('referer') || undefined,\n userAgent: userAgent?.substring(0, 200), // Truncate for storage\n country: options.country,\n device,\n browser,\n os,\n sessionId\n };\n\n this.buffer.pageviews.push(pageview);\n this.checkBufferSize();\n\n return pageview;\n }\n\n /**\n * Track Web Vitals\n */\n trackVitals(pathname: string, metrics: WebVitals['metrics']): WebVitals | null {\n if (!this.config.enabled || !this.config.trackVitals) return null;\n\n const vitals: WebVitals = {\n id: generateId(),\n timestamp: Date.now(),\n pathname,\n metrics\n };\n\n this.buffer.vitals.push(vitals);\n this.checkBufferSize();\n\n return vitals;\n }\n\n /**\n * Track custom event\n */\n trackEvent(\n name: string, \n properties?: Record<string, string | number | boolean>,\n req?: Request\n ): CustomEvent | null {\n if (!this.config.enabled) return null;\n\n let pathname = '/';\n let sessionId = generateId();\n\n if (req) {\n const url = new URL(req.url);\n pathname = url.pathname;\n \n const ip = req.headers.get('x-forwarded-for')?.split(',')[0] || \n req.headers.get('x-real-ip') || \n 'unknown';\n sessionId = this.getOrCreateSession(ip);\n }\n\n const event: CustomEvent = {\n id: generateId(),\n timestamp: Date.now(),\n name,\n pathname,\n properties,\n sessionId\n };\n\n this.buffer.events.push(event);\n this.checkBufferSize();\n\n return event;\n }\n\n private checkBufferSize(): void {\n const totalSize = this.buffer.pageviews.length + \n this.buffer.vitals.length + \n this.buffer.events.length;\n \n if (totalSize >= this.config.maxBufferSize) {\n this.flush();\n }\n }\n\n /**\n * Flush buffer to storage/handler\n */\n async flush(): Promise<void> {\n if (this.buffer.pageviews.length === 0 && \n this.buffer.vitals.length === 0 && \n this.buffer.events.length === 0) {\n return;\n }\n\n const dataToFlush = { ...this.buffer };\n \n // Reset buffer\n this.buffer = { pageviews: [], vitals: [], events: [] };\n\n // Add to all data for summary\n this.allData.pageviews.push(...dataToFlush.pageviews);\n this.allData.vitals.push(...dataToFlush.vitals);\n this.allData.events.push(...dataToFlush.events);\n\n // Limit stored data (keep last 10000 of each)\n if (this.allData.pageviews.length > 10000) {\n this.allData.pageviews = this.allData.pageviews.slice(-10000);\n }\n if (this.allData.vitals.length > 10000) {\n this.allData.vitals = this.allData.vitals.slice(-10000);\n }\n if (this.allData.events.length > 10000) {\n this.allData.events = this.allData.events.slice(-10000);\n }\n\n // Call custom handler if provided\n if (this.config.onFlush) {\n await this.config.onFlush(dataToFlush);\n }\n }\n\n /**\n * Get analytics summary\n */\n getSummary(startDate?: Date, endDate?: Date): AnalyticsSummary {\n const start = startDate?.getTime() || Date.now() - (7 * 24 * 60 * 60 * 1000); // Last 7 days\n const end = endDate?.getTime() || Date.now();\n\n // Filter by date range\n const pageviews = this.allData.pageviews.filter(\n pv => pv.timestamp >= start && pv.timestamp <= end\n );\n const vitals = this.allData.vitals.filter(\n v => v.timestamp >= start && v.timestamp <= end\n );\n const events = this.allData.events.filter(\n e => e.timestamp >= start && e.timestamp <= end\n );\n\n // Calculate pageview stats\n const uniqueSessions = new Set(pageviews.map(pv => pv.sessionId));\n const byPath: Record<string, number> = {};\n const byReferrer: Record<string, number> = {};\n const byDevice: Record<string, number> = {};\n const byBrowser: Record<string, number> = {};\n const byCountry: Record<string, number> = {};\n\n for (const pv of pageviews) {\n byPath[pv.pathname] = (byPath[pv.pathname] || 0) + 1;\n if (pv.referrer) {\n try {\n const ref = new URL(pv.referrer).hostname;\n byReferrer[ref] = (byReferrer[ref] || 0) + 1;\n } catch {\n byReferrer['direct'] = (byReferrer['direct'] || 0) + 1;\n }\n } else {\n byReferrer['direct'] = (byReferrer['direct'] || 0) + 1;\n }\n byDevice[pv.device] = (byDevice[pv.device] || 0) + 1;\n byBrowser[pv.browser] = (byBrowser[pv.browser] || 0) + 1;\n if (pv.country) {\n byCountry[pv.country] = (byCountry[pv.country] || 0) + 1;\n }\n }\n\n // Calculate vitals averages\n const fcpValues = vitals.filter(v => v.metrics.FCP).map(v => v.metrics.FCP!);\n const lcpValues = vitals.filter(v => v.metrics.LCP).map(v => v.metrics.LCP!);\n const fidValues = vitals.filter(v => v.metrics.FID).map(v => v.metrics.FID!);\n const clsValues = vitals.filter(v => v.metrics.CLS).map(v => v.metrics.CLS!);\n const ttfbValues = vitals.filter(v => v.metrics.TTFB).map(v => v.metrics.TTFB!);\n\n const avg = (arr: number[]) => arr.length ? arr.reduce((a, b) => a + b, 0) / arr.length : 0;\n\n // Calculate session stats\n const sessionViews = new Map<string, number>();\n for (const pv of pageviews) {\n sessionViews.set(pv.sessionId, (sessionViews.get(pv.sessionId) || 0) + 1);\n }\n const bounces = Array.from(sessionViews.values()).filter(v => v === 1).length;\n const bounceRate = sessionViews.size > 0 ? (bounces / sessionViews.size) * 100 : 0;\n\n // Calculate event stats\n const byEventName: Record<string, number> = {};\n for (const e of events) {\n byEventName[e.name] = (byEventName[e.name] || 0) + 1;\n }\n\n return {\n period: { start: new Date(start), end: new Date(end) },\n pageviews: {\n total: pageviews.length,\n unique: uniqueSessions.size,\n byPath,\n byReferrer,\n byDevice,\n byBrowser,\n byCountry\n },\n vitals: {\n avgFCP: Math.round(avg(fcpValues)),\n avgLCP: Math.round(avg(lcpValues)),\n avgFID: Math.round(avg(fidValues)),\n avgCLS: Number(avg(clsValues).toFixed(3)),\n avgTTFB: Math.round(avg(ttfbValues)),\n p75LCP: Math.round(percentile(lcpValues, 75)),\n p75FID: Math.round(percentile(fidValues, 75)),\n p75CLS: Number(percentile(clsValues, 75).toFixed(3))\n },\n events: {\n total: events.length,\n byName: byEventName\n },\n sessions: {\n total: uniqueSessions.size,\n avgDuration: 0, // Would need page durations\n bounceRate: Number(bounceRate.toFixed(1))\n }\n };\n }\n\n /**\n * Get real-time stats (last 5 minutes)\n */\n getRealtime(): {\n activeUsers: number;\n pageviews: number;\n topPages: Array<{ path: string; count: number }>;\n } {\n const fiveMinutesAgo = Date.now() - (5 * 60 * 1000);\n \n const recentPageviews = this.allData.pageviews.filter(\n pv => pv.timestamp >= fiveMinutesAgo\n );\n\n const activeSessions = new Set(recentPageviews.map(pv => pv.sessionId));\n \n const pathCounts: Record<string, number> = {};\n for (const pv of recentPageviews) {\n pathCounts[pv.pathname] = (pathCounts[pv.pathname] || 0) + 1;\n }\n\n const topPages = Object.entries(pathCounts)\n .map(([path, count]) => ({ path, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return {\n activeUsers: activeSessions.size,\n pageviews: recentPageviews.length,\n topPages\n };\n }\n\n /**\n * Export data as JSON\n */\n exportData(): AnalyticsData {\n return { ...this.allData };\n }\n\n /**\n * Clear all analytics data\n */\n clearData(): void {\n this.buffer = { pageviews: [], vitals: [], events: [] };\n this.allData = { pageviews: [], vitals: [], events: [] };\n this.sessions.clear();\n }\n\n /**\n * Stop the analytics engine\n */\n stop(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n this.flush();\n }\n}\n\n// ============================================================================\n// MIDDLEWARE\n// ============================================================================\n\nexport interface AnalyticsMiddlewareOptions {\n config?: Partial<AnalyticsConfig>;\n getCountry?: (req: Request) => string | undefined;\n}\n\nlet analyticsEngine: AnalyticsEngine | null = null;\n\n/**\n * Get or create analytics engine\n */\nexport function getAnalytics(config?: Partial<AnalyticsConfig>): AnalyticsEngine {\n if (!analyticsEngine) {\n analyticsEngine = new AnalyticsEngine(config);\n }\n return analyticsEngine;\n}\n\n/**\n * Configure analytics\n */\nexport function configureAnalytics(config: Partial<AnalyticsConfig>): AnalyticsEngine {\n analyticsEngine = new AnalyticsEngine(config);\n return analyticsEngine;\n}\n\n/**\n * Create analytics middleware\n */\nexport function createAnalyticsMiddleware(options: AnalyticsMiddlewareOptions = {}) {\n const engine = getAnalytics(options.config);\n\n return async (req: Request, next: () => Promise<Response>): Promise<Response> => {\n // Track pageview\n engine.trackPageview(req, {\n country: options.getCountry?.(req)\n });\n\n // Continue to next handler\n const response = await next();\n\n return response;\n };\n}\n\n/**\n * Create analytics API handler\n */\nexport function createAnalyticsHandler() {\n const engine = getAnalytics();\n\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url);\n const action = url.searchParams.get('action') || 'summary';\n\n switch (action) {\n case 'summary': {\n const startParam = url.searchParams.get('start');\n const endParam = url.searchParams.get('end');\n const summary = engine.getSummary(\n startParam ? new Date(startParam) : undefined,\n endParam ? new Date(endParam) : undefined\n );\n return new Response(JSON.stringify(summary), {\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n case 'realtime': {\n const realtime = engine.getRealtime();\n return new Response(JSON.stringify(realtime), {\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n case 'vitals': {\n if (req.method !== 'POST') {\n return new Response('Method not allowed', { status: 405 });\n }\n try {\n const body = await req.json() as { pathname: string; metrics: WebVitals['metrics'] };\n engine.trackVitals(body.pathname, body.metrics);\n return new Response(JSON.stringify({ success: true }), {\n headers: { 'Content-Type': 'application/json' }\n });\n } catch {\n return new Response('Invalid body', { status: 400 });\n }\n }\n\n case 'event': {\n if (req.method !== 'POST') {\n return new Response('Method not allowed', { status: 405 });\n }\n try {\n const body = await req.json() as { \n name: string; \n properties?: Record<string, string | number | boolean> \n };\n engine.trackEvent(body.name, body.properties, req);\n return new Response(JSON.stringify({ success: true }), {\n headers: { 'Content-Type': 'application/json' }\n });\n } catch {\n return new Response('Invalid body', { status: 400 });\n }\n }\n\n case 'export': {\n const data = engine.exportData();\n return new Response(JSON.stringify(data), {\n headers: { \n 'Content-Type': 'application/json',\n 'Content-Disposition': 'attachment; filename=\"analytics-export.json\"'\n }\n });\n }\n\n default:\n return new Response('Unknown action', { status: 400 });\n }\n };\n}\n\n// ============================================================================\n// CLIENT-SIDE SCRIPT (for Web Vitals)\n// ============================================================================\n\nexport const analyticsClientScript = `\n<script>\n(function() {\n // Simple Web Vitals reporter\n const endpoint = '/__float/analytics?action=vitals';\n \n function sendVitals(metrics) {\n const body = JSON.stringify({\n pathname: window.location.pathname,\n metrics: metrics\n });\n \n if (navigator.sendBeacon) {\n navigator.sendBeacon(endpoint, body);\n } else {\n fetch(endpoint, { method: 'POST', body, keepalive: true });\n }\n }\n\n // Observe LCP\n if ('PerformanceObserver' in window) {\n const vitals = {};\n \n // LCP\n new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const lastEntry = entries[entries.length - 1];\n vitals.LCP = Math.round(lastEntry.startTime);\n }).observe({ type: 'largest-contentful-paint', buffered: true });\n \n // FCP\n new PerformanceObserver((list) => {\n const entries = list.getEntries();\n vitals.FCP = Math.round(entries[0].startTime);\n }).observe({ type: 'paint', buffered: true });\n \n // CLS\n let clsValue = 0;\n new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!entry.hadRecentInput) {\n clsValue += entry.value;\n }\n }\n vitals.CLS = clsValue;\n }).observe({ type: 'layout-shift', buffered: true });\n \n // Send on page hide\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n sendVitals(vitals);\n }\n });\n }\n})();\n</script>\n`;\n\n// ============================================================================\n// MAIN EXPORT\n// ============================================================================\n\nexport const analytics = {\n engine: getAnalytics,\n configure: configureAnalytics,\n createMiddleware: createAnalyticsMiddleware,\n createHandler: createAnalyticsHandler,\n clientScript: analyticsClientScript,\n track: {\n pageview: (req: Request, options?: { country?: string }) => \n getAnalytics().trackPageview(req, options),\n event: (name: string, properties?: Record<string, string | number | boolean>, req?: Request) => \n getAnalytics().trackEvent(name, properties, req),\n vitals: (pathname: string, metrics: WebVitals['metrics']) => \n getAnalytics().trackVitals(pathname, metrics)\n }\n};\n\nexport default analytics;\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;A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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;;;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;AA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","names":["path","build","path","fs","path","pc","path","error","error","fs","path","fs","path","fs","path","error","path","pc","error","fs","dashboardState","createDevDashboard","escapeHtml","http","fs","path","pc","mime","path","fs","pc","http","mime","error","esbuild","fs","path","pc","build","path","fs","pc","error","useCallback","error","useState","useCallback","useMemo","useRef","validators","error","isValid","useState","useCallback","useRef","useEffect","error","useCallback","middleware","listeners","error","validators","transform","error","WebSocketServer","WebSocket","error","join","error","path","error","window","createHash","existsSync","mkdirSync","readFileSync","writeFileSync","join","path","error","f","DEFAULT_CONFIG","path","realtime"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js","../src/devtools/index.ts","../src/index.ts","../src/version.ts","../src/router/index.ts","../src/server/index.ts","../src/server/dev-server.ts","../src/server/ssr.ts","../src/build/transform.ts","../src/build/persistent-cache.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/server/prod-server.ts","../src/build/index.ts","../src/hooks/index.ts","../src/hooks/use-router.ts","../src/hooks/use-data.ts","../src/hooks/use-form.ts","../src/hooks/use-async.ts","../src/hooks/use-store.ts","../src/ai/index.ts","../src/api/index.ts","../src/realtime/index.ts","../src/image/index.ts","../src/middleware/index.ts","../src/ssg/index.ts","../src/analytics/index.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 - Ultra Modern Web Framework\n * \n * @packageDocumentation\n */\n\n// Core exports\nexport { VERSION } from './version.js';\n\n// Router\nexport { \n scanRoutes, \n matchRoute,\n type Route as FloatRoute,\n type RouterOptions as FloatRouterOptions,\n} from './router/index.js';\n\n// Server\nexport {\n createDevServer,\n startProductionServer,\n renderPage,\n renderPageStream,\n type DevServer,\n type DevServerOptions,\n type ProdServerOptions,\n type RenderOptions,\n type PageProps,\n} from './server/index.js';\n\n// Build\nexport { \n build,\n type BuildOptions,\n type BuildResult,\n} from './build/index.js';\n\nexport {\n transformFile,\n transformSource,\n clearModuleCache,\n} from './build/transform.js';\n\n// Types for user applications\nexport interface FloatConfig {\n /** App directory (default: 'app') */\n appDir?: string;\n /** Base path for all routes */\n basePath?: string;\n /** Enable React strict mode */\n reactStrictMode?: boolean;\n /** Internationalization config */\n i18n?: {\n locales: string[];\n defaultLocale: string;\n };\n /** Custom headers */\n headers?: () => Promise<Array<{\n source: string;\n headers: Array<{ key: string; value: string }>;\n }>>;\n /** Redirects */\n redirects?: () => Promise<Array<{\n source: string;\n destination: string;\n permanent: boolean;\n }>>;\n /** Environment variables to expose to client */\n env?: Record<string, string>;\n /** Experimental features */\n experimental?: {\n serverActions?: boolean;\n ppr?: boolean; // Partial Pre-rendering\n };\n}\n\n// Metadata types\nexport interface Metadata {\n title?: string | { default: string; template?: string };\n description?: string;\n keywords?: string[];\n authors?: Array<{ name: string; url?: string }>;\n creator?: string;\n publisher?: string;\n robots?: string | {\n index?: boolean;\n follow?: boolean;\n googleBot?: {\n index?: boolean;\n follow?: boolean;\n };\n };\n openGraph?: {\n title?: string;\n description?: string;\n url?: string;\n siteName?: string;\n images?: Array<{\n url: string;\n width?: number;\n height?: number;\n alt?: string;\n }>;\n locale?: string;\n type?: 'website' | 'article' | 'book' | 'profile';\n };\n twitter?: {\n card?: 'summary' | 'summary_large_image' | 'app' | 'player';\n title?: string;\n description?: string;\n images?: string[];\n creator?: string;\n };\n icons?: {\n icon?: string | Array<{ url: string; sizes?: string }>;\n apple?: string | Array<{ url: string; sizes?: string }>;\n };\n manifest?: string;\n canonical?: string;\n}\n\n// Re-export React types for convenience\nexport type { \n ReactNode, \n ReactElement, \n FC, \n ComponentType \n} from 'react';\n\n// Float.js Hooks - Modern utilities for applications\nexport {\n useFloatRouter,\n useFloatData,\n useFloatForm,\n useFloatAsync,\n useFloatDebounce,\n useFloatThrottle,\n createFloatStore,\n useFloatStore,\n combineFloatStores,\n floatMiddleware,\n validators,\n} from './hooks/index.js';\n\n// AI Module - Native AI integration\nexport {\n ai,\n streamResponse,\n sseResponse,\n aiAction,\n OpenAIProvider,\n AnthropicProvider,\n type AIProvider,\n type ChatOptions,\n type Message,\n type AIResponse,\n} from './ai/index.js';\n\n// Type-Safe API Module\nexport {\n f,\n typedRoute,\n json,\n error,\n redirect,\n FloatValidationError,\n type Infer,\n} from './api/index.js';\n\n// Real-time Module - Built-in WebSocket support\nexport {\n FloatRealtime,\n realtime,\n getRealtimeServer,\n createRealtimeClient,\n type RealtimeClient,\n type RealtimeMessage,\n type RealtimeRoom,\n type PresenceState,\n type RealtimeOptions,\n} from './realtime/index.js';\n\n// Dev Tools - Visual dashboard for development\nexport {\n devtools,\n dashboardState,\n createDevDashboard,\n createRequestLogger,\n type RouteInfo,\n type BuildInfo,\n type RequestLog,\n type PerformanceMetrics,\n type DevDashboardOptions,\n} from './devtools/index.js';\n\n// Image Optimization\nexport {\n image,\n configureImages,\n getImageConfig,\n createImageHandler,\n floatImageLoader,\n generateSrcSet,\n getImageProps,\n renderImageToString,\n type ImageConfig,\n type ImageProps,\n type OptimizedImage,\n type StaticImageData,\n} from './image/index.js';\n\n// Edge Middleware\nexport {\n middleware,\n middlewareHelpers,\n NextResponse,\n registerMiddleware,\n clearMiddleware,\n createMiddlewareHandler,\n type MiddlewareRequest,\n type MiddlewareHandler,\n type MiddlewareConfig,\n type NextURL,\n type GeoData,\n} from './middleware/index.js';\n\n// Static Site Generation (SSG) & ISR\nexport {\n ssg,\n SSGEngine,\n getSSGEngine,\n configureSSG,\n defineStaticPaths,\n defineStaticProps,\n createSSGHandler,\n createRevalidateHandler,\n type StaticPath,\n type GetStaticPathsResult,\n type GetStaticPropsContext,\n type GetStaticPropsResult,\n type CachedPage,\n type SSGConfig,\n type GenerateResult,\n} from './ssg/index.js';\n\n// Built-in Analytics\nexport {\n analytics,\n AnalyticsEngine,\n getAnalytics,\n configureAnalytics,\n createAnalyticsMiddleware,\n createAnalyticsHandler,\n analyticsClientScript,\n type PageView,\n type WebVitals,\n type CustomEvent,\n type AnalyticsData,\n type AnalyticsConfig,\n type AnalyticsSummary,\n} from './analytics/index.js';\n\n// Client utilities\nexport { generateWelcomePage } from './client/welcome-page.js';\n","export const VERSION = '2.0.4';\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 /** Loading component path */\n loading?: string;\n /** Error boundary path */\n error?: 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 * Find loading component for a route (closest ancestor)\n */\nfunction findLoading(routePath: string, allLoading: Map<string, string>): string | undefined {\n const segments = routePath.split('/').filter(Boolean);\n \n // Check from most specific to root\n for (let i = segments.length; i >= 0; i--) {\n const currentPath = i === 0 ? '/' : '/' + segments.slice(0, i).join('/');\n if (allLoading.has(currentPath)) {\n return allLoading.get(currentPath);\n }\n }\n \n return undefined;\n}\n\n/**\n * Find error boundary for a route (closest ancestor)\n */\nfunction findError(routePath: string, allErrors: Map<string, string>): string | undefined {\n const segments = routePath.split('/').filter(Boolean);\n \n // Check from most specific to root\n for (let i = segments.length; i >= 0; i--) {\n const currentPath = i === 0 ? '/' : '/' + segments.slice(0, i).join('/');\n if (allErrors.has(currentPath)) {\n return allErrors.get(currentPath);\n }\n }\n \n return undefined;\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, loading, errors\n const layoutMap = new Map<string, string>();\n const loadingMap = new Map<string, string>();\n const errorMap = new Map<string, string>();\n \n for (const file of files) {\n const type = getRouteType(file);\n const { urlPath } = filePathToUrlPath(file, '');\n \n if (type === 'layout') {\n const layoutPath = urlPath === '/' ? '/' : urlPath.replace(/\\/layout$/, '') || '/';\n layoutMap.set(layoutPath, path.join(appDir, file));\n } else if (type === 'loading') {\n const loadingPath = urlPath === '/' ? '/' : urlPath.replace(/\\/loading$/, '') || '/';\n loadingMap.set(loadingPath, path.join(appDir, file));\n } else if (type === 'error') {\n const errorPath = urlPath === '/' ? '/' : urlPath.replace(/\\/error$/, '') || '/';\n errorMap.set(errorPath, 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 loading: type === 'page' ? findLoading(urlPath, loadingMap) : undefined,\n error: type === 'page' ? findError(urlPath, errorMap) : undefined,\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 Server Exports\n */\n\nexport { createDevServer, type DevServerOptions, type DevServer } from './dev-server.js';\nexport { renderPage, renderPageStream, type RenderOptions, type PageProps } from './ssr.js';\nexport { startProductionServer, type ProdServerOptions } from './prod-server.js';\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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';\nimport { getCache } from './persistent-cache.js';\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, useCache: boolean = true): 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 in-memory cache\n const cached = moduleCache.get(absolutePath);\n if (cached && cached.mtime === mtime) {\n return cached.module;\n }\n\n // Check persistent cache if enabled\n if (useCache) {\n const cache = getCache();\n const source = fs.readFileSync(absolutePath, 'utf-8');\n const sourceHash = require('crypto').createHash('sha256').update(source).digest('hex').slice(0, 16);\n const cacheKey = `transform_${absolutePath}_${sourceHash}`;\n \n if (cache.has(cacheKey)) {\n const cachedCode = cache.get<string>(cacheKey);\n if (cachedCode) {\n // Create temp file and import\n const tempDir = path.join(process.cwd(), '.float', '.cache');\n fs.mkdirSync(tempDir, { recursive: true });\n const tempFile = path.join(tempDir, `${path.basename(absolutePath, path.extname(absolutePath))}_${Date.now()}.mjs`);\n fs.writeFileSync(tempFile, cachedCode);\n \n try {\n const module = await import(pathToFileURL(tempFile).href);\n moduleCache.set(absolutePath, { module, mtime });\n setImmediate(() => { try { fs.unlinkSync(tempFile); } catch {} });\n return module;\n } catch (error) {\n // Cache invalid, continue with transformation\n setImmediate(() => { try { fs.unlinkSync(tempFile); } catch {} });\n }\n }\n }\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 // Save to persistent cache if enabled\n if (useCache) {\n const cache = getCache();\n const sourceHash = require('crypto').createHash('sha256').update(source).digest('hex').slice(0, 16);\n const cacheKey = `transform_${absolutePath}_${sourceHash}`;\n cache.set(cacheKey, code, source);\n }\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 Persistent Cache\n * File-based caching system for faster builds\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\n\nexport interface CacheEntry<T = any> {\n key: string;\n value: T;\n timestamp: number;\n hash: string;\n}\n\nexport interface CacheManifest {\n version: string;\n entries: Record<string, {\n hash: string;\n timestamp: number;\n size: number;\n }>;\n}\n\nexport class PersistentCache {\n private cacheDir: string;\n private manifestPath: string;\n private manifest: CacheManifest;\n\n constructor(rootDir: string = process.cwd()) {\n this.cacheDir = path.join(rootDir, '.float', 'cache');\n this.manifestPath = path.join(this.cacheDir, 'manifest.json');\n \n // Ensure cache directory exists\n fs.mkdirSync(this.cacheDir, { recursive: true });\n \n // Load or create manifest\n this.manifest = this.loadManifest();\n }\n\n private loadManifest(): CacheManifest {\n if (fs.existsSync(this.manifestPath)) {\n try {\n const data = fs.readFileSync(this.manifestPath, 'utf-8');\n return JSON.parse(data);\n } catch {\n // Invalid manifest, start fresh\n }\n }\n \n return {\n version: '1.0',\n entries: {},\n };\n }\n\n private saveManifest() {\n fs.writeFileSync(\n this.manifestPath,\n JSON.stringify(this.manifest, null, 2)\n );\n }\n\n /**\n * Generate hash for content\n */\n private hash(content: string): string {\n return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);\n }\n\n /**\n * Get cache key path\n */\n private getKeyPath(key: string): string {\n const safeKey = key.replace(/[^a-z0-9_-]/gi, '_');\n return path.join(this.cacheDir, `${safeKey}.cache`);\n }\n\n /**\n * Check if cache entry is valid\n */\n has(key: string, contentHash?: string): boolean {\n const entry = this.manifest.entries[key];\n if (!entry) return false;\n\n const cachePath = this.getKeyPath(key);\n if (!fs.existsSync(cachePath)) {\n // Cache file missing, clean up manifest\n delete this.manifest.entries[key];\n this.saveManifest();\n return false;\n }\n\n // If hash provided, verify it matches\n if (contentHash && entry.hash !== contentHash) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get cached value\n */\n get<T = any>(key: string): T | null {\n if (!this.has(key)) return null;\n\n try {\n const cachePath = this.getKeyPath(key);\n const data = fs.readFileSync(cachePath, 'utf-8');\n const entry: CacheEntry<T> = JSON.parse(data);\n return entry.value;\n } catch {\n return null;\n }\n }\n\n /**\n * Set cache value\n */\n set<T = any>(key: string, value: T, content?: string): void {\n const entry: CacheEntry<T> = {\n key,\n value,\n timestamp: Date.now(),\n hash: content ? this.hash(content) : this.hash(JSON.stringify(value)),\n };\n\n const cachePath = this.getKeyPath(key);\n const data = JSON.stringify(entry);\n \n fs.writeFileSync(cachePath, data);\n\n // Update manifest\n this.manifest.entries[key] = {\n hash: entry.hash,\n timestamp: entry.timestamp,\n size: Buffer.byteLength(data),\n };\n this.saveManifest();\n }\n\n /**\n * Delete cache entry\n */\n delete(key: string): boolean {\n const cachePath = this.getKeyPath(key);\n \n if (fs.existsSync(cachePath)) {\n fs.unlinkSync(cachePath);\n }\n\n if (this.manifest.entries[key]) {\n delete this.manifest.entries[key];\n this.saveManifest();\n return true;\n }\n\n return false;\n }\n\n /**\n * Clear all cache\n */\n clear(): void {\n if (fs.existsSync(this.cacheDir)) {\n fs.rmSync(this.cacheDir, { recursive: true });\n fs.mkdirSync(this.cacheDir, { recursive: true });\n }\n\n this.manifest = {\n version: '1.0',\n entries: {},\n };\n this.saveManifest();\n }\n\n /**\n * Get cache statistics\n */\n stats(): {\n entries: number;\n size: number;\n oldestEntry: number | null;\n newestEntry: number | null;\n } {\n const entries = Object.values(this.manifest.entries);\n const size = entries.reduce((acc, e) => acc + e.size, 0);\n const timestamps = entries.map(e => e.timestamp);\n\n return {\n entries: entries.length,\n size,\n oldestEntry: timestamps.length > 0 ? Math.min(...timestamps) : null,\n newestEntry: timestamps.length > 0 ? Math.max(...timestamps) : null,\n };\n }\n\n /**\n * Clean old entries (older than maxAge milliseconds)\n */\n prune(maxAge: number = 7 * 24 * 60 * 60 * 1000): number {\n const now = Date.now();\n let cleaned = 0;\n\n for (const [key, entry] of Object.entries(this.manifest.entries)) {\n if (now - entry.timestamp > maxAge) {\n this.delete(key);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n}\n\n// Global cache instance\nlet globalCache: PersistentCache | null = null;\n\n/**\n * Get global cache instance\n */\nexport function getCache(rootDir?: string): PersistentCache {\n if (!globalCache) {\n globalCache = new PersistentCache(rootDir);\n }\n return globalCache;\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\"><</span><span class=\"text-emerald-600 dark:text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>Hello, Float.js!<span class=\"text-zinc-500\"></</span><span class=\"text-emerald-600 dark:text-emerald-400\">h1</span><span class=\"text-zinc-500\">></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\"><</span><span class=\"text-emerald-400\">div</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"><</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>Welcome to my page<span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">div</span><span class=\"text-zinc-500\">></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\"><</span><span class=\"text-emerald-400\">main</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"><</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>Hello, Float.js!<span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">h1</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"><</span><span class=\"text-emerald-400\">p</span><span class=\"text-zinc-500\">></span>Welcome to my first app<span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">p</span><span class=\"text-zinc-500\">></span>\n <span class=\"text-zinc-500\"></</span><span class=\"text-emerald-400\">main</span><span class=\"text-zinc-500\">></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 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","/**\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 Hooks\n * Modern React hooks for Float.js applications\n */\n\n// Router\nexport { useFloatRouter, type FloatRouter, type FloatRouterState, type NavigateOptions } from './use-router.js';\n\n// Data fetching\nexport { useFloatData, type FloatDataOptions, type FloatDataResult } from './use-data.js';\n\n// Forms\nexport { useFloatForm, validators, type FloatFormOptions, type FloatFormResult, type FieldState, type ValidationRule } from './use-form.js';\n\n// Async operations\nexport { useFloatAsync, useFloatDebounce, useFloatThrottle, type AsyncState, type FloatAsyncResult, type FloatAsyncOptions } from './use-async.js';\n\n// Store\nexport { createFloatStore, useFloatStore, combineFloatStores, floatMiddleware, type FloatStore, type FloatStoreOptions } from './use-store.js';\n","/**\n * Float.js Router Hook\n * Modern client-side routing utilities\n */\n\nimport { useCallback, useMemo } from 'react';\n\nexport interface FloatRouterState {\n pathname: string;\n search: string;\n hash: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\nexport interface FloatRouter extends FloatRouterState {\n push: (url: string, options?: NavigateOptions) => void;\n replace: (url: string, options?: NavigateOptions) => void;\n back: () => void;\n forward: () => void;\n prefetch: (url: string) => void;\n refresh: () => void;\n}\n\nexport interface NavigateOptions {\n scroll?: boolean;\n shallow?: boolean;\n}\n\n/**\n * Access Float.js router for client-side navigation\n * @example\n * const router = useFloatRouter();\n * router.push('/dashboard');\n */\nexport function useFloatRouter(): FloatRouter {\n // Get current location\n const getLocation = useCallback((): FloatRouterState => {\n if (typeof window === 'undefined') {\n return {\n pathname: '/',\n search: '',\n hash: '',\n params: {},\n query: {},\n };\n }\n\n const url = new URL(window.location.href);\n const query: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n params: {}, // Populated by server\n query,\n };\n }, []);\n\n const state = useMemo(() => getLocation(), [getLocation]);\n\n const push = useCallback((url: string, options?: NavigateOptions) => {\n if (typeof window === 'undefined') return;\n \n window.history.pushState({}, '', url);\n window.dispatchEvent(new PopStateEvent('popstate'));\n \n if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n }, []);\n\n const replace = useCallback((url: string, options?: NavigateOptions) => {\n if (typeof window === 'undefined') return;\n \n window.history.replaceState({}, '', url);\n window.dispatchEvent(new PopStateEvent('popstate'));\n \n if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n }, []);\n\n const back = useCallback(() => {\n if (typeof window === 'undefined') return;\n window.history.back();\n }, []);\n\n const forward = useCallback(() => {\n if (typeof window === 'undefined') return;\n window.history.forward();\n }, []);\n\n const prefetch = useCallback((url: string) => {\n if (typeof window === 'undefined') return;\n \n // Create hidden link for prefetch\n const link = document.createElement('link');\n link.rel = 'prefetch';\n link.href = url;\n document.head.appendChild(link);\n }, []);\n\n const refresh = useCallback(() => {\n if (typeof window === 'undefined') return;\n window.location.reload();\n }, []);\n\n return {\n ...state,\n push,\n replace,\n back,\n forward,\n prefetch,\n refresh,\n };\n}\n","/**\n * Float.js Data Hook\n * SWR-like data fetching with caching\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\n\nexport interface FloatDataOptions<T> {\n /** Initial data before fetching */\n fallbackData?: T;\n /** Revalidate on window focus */\n revalidateOnFocus?: boolean;\n /** Revalidate on network reconnect */\n revalidateOnReconnect?: boolean;\n /** Refresh interval in milliseconds */\n refreshInterval?: number;\n /** Dedupe requests within this time window (ms) */\n dedupingInterval?: number;\n /** Keep previous data when revalidating */\n keepPreviousData?: boolean;\n /** Custom fetcher function */\n fetcher?: (url: string) => Promise<T>;\n}\n\nexport interface FloatDataResult<T> {\n data: T | undefined;\n error: Error | undefined;\n isLoading: boolean;\n isValidating: boolean;\n mutate: (data?: T | Promise<T> | ((current?: T) => T | Promise<T>)) => Promise<T | undefined>;\n refresh: () => Promise<void>;\n}\n\n// Global cache for data\nconst cache = new Map<string, { data: any; timestamp: number }>();\nconst listeners = new Map<string, Set<() => void>>();\n\n/**\n * Fetch and cache data with automatic revalidation\n * @example\n * const { data, error, isLoading } = useFloatData('/api/users');\n */\nexport function useFloatData<T = any>(\n key: string | null,\n options: FloatDataOptions<T> = {}\n): FloatDataResult<T> {\n const {\n fallbackData,\n revalidateOnFocus = true,\n revalidateOnReconnect = true,\n refreshInterval,\n dedupingInterval = 2000,\n keepPreviousData = false,\n fetcher = defaultFetcher,\n } = options;\n\n const [state, setState] = useState<{\n data: T | undefined;\n error: Error | undefined;\n isLoading: boolean;\n isValidating: boolean;\n }>(() => {\n const cached = key ? cache.get(key) : null;\n return {\n data: cached?.data ?? fallbackData,\n error: undefined,\n isLoading: !cached && !!key,\n isValidating: false,\n };\n });\n\n const mountedRef = useRef(true);\n const lastFetchRef = useRef<number>(0);\n\n const revalidate = useCallback(async () => {\n if (!key) return;\n\n // Dedupe requests\n const now = Date.now();\n if (now - lastFetchRef.current < dedupingInterval) {\n return;\n }\n lastFetchRef.current = now;\n\n setState(prev => ({ ...prev, isValidating: true }));\n\n try {\n const data = await fetcher(key);\n \n if (mountedRef.current) {\n cache.set(key, { data, timestamp: now });\n setState({\n data,\n error: undefined,\n isLoading: false,\n isValidating: false,\n });\n\n // Notify other listeners\n listeners.get(key)?.forEach(fn => fn());\n }\n } catch (error) {\n if (mountedRef.current) {\n setState(prev => ({\n ...prev,\n error: error as Error,\n isLoading: false,\n isValidating: false,\n }));\n }\n }\n }, [key, dedupingInterval, fetcher]);\n\n const mutate = useCallback(async (\n data?: T | Promise<T> | ((current?: T) => T | Promise<T>)\n ): Promise<T | undefined> => {\n if (!key) return undefined;\n\n let newData: T | undefined;\n\n if (typeof data === 'function') {\n const current = cache.get(key)?.data;\n newData = await (data as (current?: T) => T | Promise<T>)(current);\n } else if (data !== undefined) {\n newData = await data;\n }\n\n if (newData !== undefined) {\n cache.set(key, { data: newData, timestamp: Date.now() });\n setState(prev => ({ ...prev, data: newData }));\n listeners.get(key)?.forEach(fn => fn());\n } else {\n await revalidate();\n newData = cache.get(key)?.data;\n }\n\n return newData;\n }, [key, revalidate]);\n\n // Initial fetch\n useEffect(() => {\n mountedRef.current = true;\n revalidate();\n\n return () => {\n mountedRef.current = false;\n };\n }, [revalidate]);\n\n // Revalidate on focus\n useEffect(() => {\n if (!revalidateOnFocus || typeof window === 'undefined') return;\n\n const handleFocus = () => revalidate();\n window.addEventListener('focus', handleFocus);\n return () => window.removeEventListener('focus', handleFocus);\n }, [revalidateOnFocus, revalidate]);\n\n // Revalidate on reconnect\n useEffect(() => {\n if (!revalidateOnReconnect || typeof window === 'undefined') return;\n\n const handleOnline = () => revalidate();\n window.addEventListener('online', handleOnline);\n return () => window.removeEventListener('online', handleOnline);\n }, [revalidateOnReconnect, revalidate]);\n\n // Refresh interval\n useEffect(() => {\n if (!refreshInterval) return;\n\n const interval = setInterval(revalidate, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, revalidate]);\n\n // Register listener for cache updates\n useEffect(() => {\n if (!key) return;\n\n const update = () => {\n const cached = cache.get(key);\n if (cached && mountedRef.current) {\n setState(prev => ({ ...prev, data: cached.data }));\n }\n };\n\n if (!listeners.has(key)) {\n listeners.set(key, new Set());\n }\n listeners.get(key)!.add(update);\n\n return () => {\n listeners.get(key)?.delete(update);\n };\n }, [key]);\n\n return {\n data: keepPreviousData && state.data === undefined ? fallbackData : state.data,\n error: state.error,\n isLoading: state.isLoading,\n isValidating: state.isValidating,\n mutate,\n refresh: revalidate,\n };\n}\n\n// Default fetcher\nasync function defaultFetcher<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) {\n const error = new Error('Failed to fetch');\n (error as any).status = res.status;\n throw error;\n }\n return res.json();\n}\n","/**\n * Float.js Form Hook\n * Modern form handling with validation\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\n\nexport type ValidationRule<T> = (value: T, formData: Record<string, any>) => string | undefined | Promise<string | undefined>;\n\nexport interface FieldConfig<T = any> {\n initialValue?: T;\n validate?: ValidationRule<T> | ValidationRule<T>[];\n transform?: (value: any) => T;\n}\n\nexport interface FieldState<T = any> {\n value: T;\n error: string | undefined;\n touched: boolean;\n dirty: boolean;\n}\n\nexport interface FloatFormOptions<T extends Record<string, any>> {\n initialValues?: Partial<T>;\n onSubmit: (values: T) => void | Promise<void>;\n onError?: (errors: Record<keyof T, string | undefined>) => void;\n validateOnChange?: boolean;\n validateOnBlur?: boolean;\n}\n\nexport interface FloatFormResult<T extends Record<string, any>> {\n values: T;\n errors: Partial<Record<keyof T, string>>;\n touched: Partial<Record<keyof T, boolean>>;\n isSubmitting: boolean;\n isValid: boolean;\n isDirty: boolean;\n \n // Field helpers\n register: (name: keyof T) => {\n value: any;\n onChange: (e: React.ChangeEvent<any>) => void;\n onBlur: (e: React.FocusEvent<any>) => void;\n name: string;\n };\n \n // Actions\n setValue: (name: keyof T, value: any) => void;\n setError: (name: keyof T, error: string | undefined) => void;\n setTouched: (name: keyof T, touched?: boolean) => void;\n reset: (values?: Partial<T>) => void;\n handleSubmit: (e?: React.FormEvent) => Promise<void>;\n validate: () => Promise<boolean>;\n getFieldProps: (name: keyof T) => FieldState;\n}\n\n/**\n * Powerful form handling with validation\n * @example\n * const form = useFloatForm({\n * initialValues: { email: '', password: '' },\n * onSubmit: async (values) => await login(values)\n * });\n */\nexport function useFloatForm<T extends Record<string, any>>(\n options: FloatFormOptions<T>\n): FloatFormResult<T> {\n const {\n initialValues = {} as Partial<T>,\n onSubmit,\n onError,\n validateOnChange = true,\n validateOnBlur = true,\n } = options;\n\n const [values, setValues] = useState<T>(initialValues as T);\n const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});\n const [touched, setTouchedState] = useState<Partial<Record<keyof T, boolean>>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n \n const initialValuesRef = useRef(initialValues);\n const validatorsRef = useRef<Map<keyof T, ValidationRule<any>[]>>(new Map());\n\n // Validate a single field\n const validateField = useCallback(async (name: keyof T, value: any): Promise<string | undefined> => {\n const validators = validatorsRef.current.get(name);\n if (!validators) return undefined;\n\n for (const validator of validators) {\n const error = await validator(value, values);\n if (error) return error;\n }\n return undefined;\n }, [values]);\n\n // Validate all fields\n const validate = useCallback(async (): Promise<boolean> => {\n const newErrors: Partial<Record<keyof T, string>> = {};\n let isValid = true;\n\n for (const [name] of validatorsRef.current) {\n const error = await validateField(name, values[name]);\n if (error) {\n newErrors[name] = error;\n isValid = false;\n }\n }\n\n setErrors(newErrors);\n return isValid;\n }, [values, validateField]);\n\n // Set a single value\n const setValue = useCallback((name: keyof T, value: any) => {\n setValues(prev => ({ ...prev, [name]: value }));\n \n if (validateOnChange) {\n validateField(name, value).then(error => {\n setErrors(prev => ({ ...prev, [name]: error }));\n });\n }\n }, [validateOnChange, validateField]);\n\n // Set error\n const setError = useCallback((name: keyof T, error: string | undefined) => {\n setErrors(prev => ({ ...prev, [name]: error }));\n }, []);\n\n // Set touched\n const setTouched = useCallback((name: keyof T, isTouched = true) => {\n setTouchedState(prev => ({ ...prev, [name]: isTouched }));\n }, []);\n\n // Reset form\n const reset = useCallback((newValues?: Partial<T>) => {\n setValues((newValues || initialValuesRef.current) as T);\n setErrors({});\n setTouchedState({});\n setIsSubmitting(false);\n }, []);\n\n // Handle submit\n const handleSubmit = useCallback(async (e?: React.FormEvent) => {\n e?.preventDefault();\n \n // Touch all fields\n const allTouched = Object.keys(values).reduce((acc, key) => {\n acc[key as keyof T] = true;\n return acc;\n }, {} as Record<keyof T, boolean>);\n setTouchedState(allTouched);\n\n setIsSubmitting(true);\n\n const isValid = await validate();\n \n if (isValid) {\n try {\n await onSubmit(values);\n } catch (error) {\n console.error('Form submission error:', error);\n }\n } else if (onError) {\n onError(errors as Record<keyof T, string | undefined>);\n }\n\n setIsSubmitting(false);\n }, [values, validate, onSubmit, onError, errors]);\n\n // Register field\n const register = useCallback((name: keyof T) => {\n return {\n name: String(name),\n value: values[name] ?? '',\n onChange: (e: React.ChangeEvent<any>) => {\n const value = e.target.type === 'checkbox' ? e.target.checked : e.target.value;\n setValue(name, value);\n },\n onBlur: () => {\n setTouched(name, true);\n if (validateOnBlur) {\n validateField(name, values[name]).then(error => {\n setErrors(prev => ({ ...prev, [name]: error }));\n });\n }\n },\n };\n }, [values, setValue, setTouched, validateOnBlur, validateField]);\n\n // Get field props\n const getFieldProps = useCallback((name: keyof T): FieldState => {\n return {\n value: values[name],\n error: errors[name],\n touched: touched[name] ?? false,\n dirty: values[name] !== initialValuesRef.current[name],\n };\n }, [values, errors, touched]);\n\n // Computed\n const isValid = useMemo(() => {\n return Object.values(errors).every(e => !e);\n }, [errors]);\n\n const isDirty = useMemo(() => {\n return Object.keys(values).some(\n key => values[key as keyof T] !== initialValuesRef.current[key as keyof T]\n );\n }, [values]);\n\n return {\n values,\n errors,\n touched,\n isSubmitting,\n isValid,\n isDirty,\n register,\n setValue,\n setError,\n setTouched,\n reset,\n handleSubmit,\n validate,\n getFieldProps,\n };\n}\n\n// Built-in validators\nexport const validators = {\n required: (message = 'This field is required'): ValidationRule<any> => \n (value) => {\n if (value === undefined || value === null || value === '') {\n return message;\n }\n return undefined;\n },\n\n email: (message = 'Invalid email address'): ValidationRule<string> => \n (value) => {\n if (!value) return undefined;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value) ? undefined : message;\n },\n\n minLength: (min: number, message?: string): ValidationRule<string> => \n (value) => {\n if (!value) return undefined;\n return value.length >= min \n ? undefined \n : message || `Must be at least ${min} characters`;\n },\n\n maxLength: (max: number, message?: string): ValidationRule<string> => \n (value) => {\n if (!value) return undefined;\n return value.length <= max \n ? undefined \n : message || `Must be at most ${max} characters`;\n },\n\n pattern: (regex: RegExp, message = 'Invalid format'): ValidationRule<string> => \n (value) => {\n if (!value) return undefined;\n return regex.test(value) ? undefined : message;\n },\n\n match: (field: string, message = 'Fields do not match'): ValidationRule<any> => \n (value, formData) => value === formData[field] ? undefined : message,\n};\n","/**\n * Float.js Async Hook\n * Handle async operations with loading and error states\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface AsyncState<T> {\n data: T | undefined;\n error: Error | undefined;\n isLoading: boolean;\n isSuccess: boolean;\n isError: boolean;\n isIdle: boolean;\n}\n\nexport interface FloatAsyncResult<T, Args extends any[]> extends AsyncState<T> {\n execute: (...args: Args) => Promise<T | undefined>;\n reset: () => void;\n setData: (data: T) => void;\n}\n\nexport interface FloatAsyncOptions<T> {\n /** Initial data */\n initialData?: T;\n /** Execute immediately on mount */\n immediate?: boolean;\n /** Retry count on error */\n retryCount?: number;\n /** Delay between retries (ms) */\n retryDelay?: number;\n /** Callback on success */\n onSuccess?: (data: T) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Callback on settle (success or error) */\n onSettled?: (data: T | undefined, error: Error | undefined) => void;\n}\n\n/**\n * Execute async functions with loading/error states\n * @example\n * const { data, isLoading, execute } = useFloatAsync(\n * async (id) => await fetchUser(id),\n * { immediate: false }\n * );\n */\nexport function useFloatAsync<T, Args extends any[] = []>(\n asyncFn: (...args: Args) => Promise<T>,\n options: FloatAsyncOptions<T> = {}\n): FloatAsyncResult<T, Args> {\n const {\n initialData,\n immediate = false,\n retryCount = 0,\n retryDelay = 1000,\n onSuccess,\n onError,\n onSettled,\n } = options;\n\n const [state, setState] = useState<AsyncState<T>>({\n data: initialData,\n error: undefined,\n isLoading: immediate,\n isSuccess: false,\n isError: false,\n isIdle: !immediate,\n });\n\n const mountedRef = useRef(true);\n const attemptRef = useRef(0);\n\n const execute = useCallback(async (...args: Args): Promise<T | undefined> => {\n setState(prev => ({\n ...prev,\n isLoading: true,\n isIdle: false,\n error: undefined,\n }));\n\n attemptRef.current = 0;\n\n const attempt = async (): Promise<T | undefined> => {\n try {\n const data = await asyncFn(...args);\n \n if (mountedRef.current) {\n setState({\n data,\n error: undefined,\n isLoading: false,\n isSuccess: true,\n isError: false,\n isIdle: false,\n });\n onSuccess?.(data);\n onSettled?.(data, undefined);\n }\n \n return data;\n } catch (error) {\n attemptRef.current++;\n \n if (attemptRef.current <= retryCount) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n return attempt();\n }\n \n if (mountedRef.current) {\n setState(prev => ({\n ...prev,\n error: error as Error,\n isLoading: false,\n isSuccess: false,\n isError: true,\n }));\n onError?.(error as Error);\n onSettled?.(undefined, error as Error);\n }\n \n return undefined;\n }\n };\n\n return attempt();\n }, [asyncFn, retryCount, retryDelay, onSuccess, onError, onSettled]);\n\n const reset = useCallback(() => {\n setState({\n data: initialData,\n error: undefined,\n isLoading: false,\n isSuccess: false,\n isError: false,\n isIdle: true,\n });\n }, [initialData]);\n\n const setData = useCallback((data: T) => {\n setState(prev => ({\n ...prev,\n data,\n isSuccess: true,\n }));\n }, []);\n\n // Execute immediately if requested\n useEffect(() => {\n mountedRef.current = true;\n \n if (immediate) {\n execute(...([] as unknown as Args));\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n ...state,\n execute,\n reset,\n setData,\n };\n}\n\n/**\n * Debounced async execution\n */\nexport function useFloatDebounce<T, Args extends any[]>(\n asyncFn: (...args: Args) => Promise<T>,\n delay: number = 300,\n options: FloatAsyncOptions<T> = {}\n): FloatAsyncResult<T, Args> {\n const timerRef = useRef<NodeJS.Timeout>();\n const result = useFloatAsync(asyncFn, options);\n\n const debouncedExecute = useCallback((...args: Args) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n return new Promise<T | undefined>((resolve) => {\n timerRef.current = setTimeout(async () => {\n const data = await result.execute(...args);\n resolve(data);\n }, delay);\n });\n }, [result.execute, delay]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return {\n ...result,\n execute: debouncedExecute,\n };\n}\n\n/**\n * Throttled async execution\n */\nexport function useFloatThrottle<T, Args extends any[]>(\n asyncFn: (...args: Args) => Promise<T>,\n limit: number = 1000,\n options: FloatAsyncOptions<T> = {}\n): FloatAsyncResult<T, Args> {\n const lastRunRef = useRef<number>(0);\n const result = useFloatAsync(asyncFn, options);\n\n const throttledExecute = useCallback((...args: Args) => {\n const now = Date.now();\n \n if (now - lastRunRef.current >= limit) {\n lastRunRef.current = now;\n return result.execute(...args);\n }\n \n return Promise.resolve(result.data);\n }, [result.execute, result.data, limit]);\n\n return {\n ...result,\n execute: throttledExecute,\n };\n}\n","/**\n * Float.js Store Hook\n * Lightweight global state management (like Zustand but simpler)\n */\n\nimport { useSyncExternalStore, useCallback } from 'react';\n\ntype SetState<T> = (partial: Partial<T> | ((state: T) => Partial<T>)) => void;\ntype GetState<T> = () => T;\ntype Subscribe = (listener: () => void) => () => void;\ntype Selector<T, U> = (state: T) => U;\n\nexport interface FloatStore<T> {\n getState: GetState<T>;\n setState: SetState<T>;\n subscribe: Subscribe;\n reset: () => void;\n}\n\nexport interface FloatStoreOptions<T> {\n /** Persist state to localStorage */\n persist?: string;\n /** Custom equality function */\n equals?: (a: any, b: any) => boolean;\n /** Middleware */\n middleware?: (set: SetState<T>, get: GetState<T>) => SetState<T>;\n}\n\n/**\n * Create a global store\n * @example\n * const useStore = createFloatStore({ count: 0 });\n * \n * // In component\n * const count = useStore(state => state.count);\n */\nexport function createFloatStore<T extends object>(\n initialState: T | (() => T),\n options: FloatStoreOptions<T> = {}\n): {\n (): T;\n <U>(selector: Selector<T, U>): U;\n getState: GetState<T>;\n setState: SetState<T>;\n subscribe: Subscribe;\n reset: () => void;\n} {\n const { persist, middleware } = options;\n\n // Initialize state\n let state: T = typeof initialState === 'function' \n ? (initialState as () => T)()\n : initialState;\n\n // Load persisted state\n if (persist && typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(`float-store:${persist}`);\n if (saved) {\n state = { ...state, ...JSON.parse(saved) };\n }\n } catch (e) {\n console.warn('Float Store: Failed to load persisted state');\n }\n }\n\n const initialStateRef = state;\n const listeners = new Set<() => void>();\n\n const getState: GetState<T> = () => state;\n\n let setState: SetState<T> = (partial) => {\n const nextState = typeof partial === 'function'\n ? (partial as (state: T) => Partial<T>)(state)\n : partial;\n\n if (nextState !== state) {\n state = { ...state, ...nextState };\n\n // Persist\n if (persist && typeof window !== 'undefined') {\n try {\n localStorage.setItem(`float-store:${persist}`, JSON.stringify(state));\n } catch (e) {\n console.warn('Float Store: Failed to persist state');\n }\n }\n\n listeners.forEach((listener) => listener());\n }\n };\n\n // Apply middleware\n if (middleware) {\n setState = middleware(setState, getState);\n }\n\n const subscribe: Subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n\n const reset = () => {\n setState(initialStateRef);\n };\n\n // Hook function\n function useStore(): T;\n function useStore<U>(selector: Selector<T, U>): U;\n function useStore<U>(selector?: Selector<T, U>): T | U {\n const getSnapshot = useCallback(() => {\n const currentState = getState();\n return selector ? selector(currentState) : currentState;\n }, [selector]);\n\n const getServerSnapshot = useCallback(() => {\n const currentState = getState();\n return selector ? selector(currentState) : currentState;\n }, [selector]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n }\n\n // Attach methods to hook\n useStore.getState = getState;\n useStore.setState = setState;\n useStore.subscribe = subscribe;\n useStore.reset = reset;\n\n return useStore;\n}\n\n/**\n * Use a selector on an existing store\n */\nexport function useFloatStore<T, U>(\n store: FloatStore<T>,\n selector: Selector<T, U>\n): U {\n const getSnapshot = useCallback(() => selector(store.getState()), [store, selector]);\n const getServerSnapshot = useCallback(() => selector(store.getState()), [store, selector]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot, getServerSnapshot);\n}\n\n// Middleware helpers\nexport const floatMiddleware = {\n /**\n * Log all state changes\n */\n logger: <T>(name?: string) => (set: SetState<T>, get: GetState<T>): SetState<T> => {\n return (partial) => {\n const prev = get();\n set(partial);\n const next = get();\n console.group(`${name || 'Float Store'} Update`);\n console.log('Prev:', prev);\n console.log('Next:', next);\n console.groupEnd();\n };\n },\n\n /**\n * Add undo/redo capability\n */\n undoable: <T>(maxHistory = 10) => {\n const history: T[] = [];\n let index = -1;\n\n return (set: SetState<T>, get: GetState<T>): SetState<T> => {\n return (partial) => {\n const current = get();\n \n // Add to history\n history.splice(index + 1);\n history.push(current);\n if (history.length > maxHistory) {\n history.shift();\n }\n index = history.length - 1;\n\n set(partial);\n };\n };\n },\n\n /**\n * Debounce state updates\n */\n debounce: <T>(delay: number) => {\n let timeout: NodeJS.Timeout;\n\n return (set: SetState<T>, _get: GetState<T>): SetState<T> => {\n return (partial) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => set(partial), delay);\n };\n };\n },\n};\n\n/**\n * Combine multiple stores\n */\nexport function combineFloatStores<T extends Record<string, FloatStore<any>>>(\n stores: T\n): FloatStore<{ [K in keyof T]: ReturnType<T[K]['getState']> }> {\n type CombinedState = { [K in keyof T]: ReturnType<T[K]['getState']> };\n\n const getState = (): CombinedState => {\n const state = {} as CombinedState;\n for (const [key, store] of Object.entries(stores)) {\n state[key as keyof T] = store.getState();\n }\n return state;\n };\n\n const setState: SetState<CombinedState> = (partial) => {\n const nextState = typeof partial === 'function'\n ? (partial as (state: CombinedState) => Partial<CombinedState>)(getState())\n : partial;\n\n for (const [key, value] of Object.entries(nextState)) {\n if (stores[key as keyof T] && value !== undefined) {\n stores[key as keyof T].setState(value as any);\n }\n }\n };\n\n const subscribe: Subscribe = (listener) => {\n const unsubscribes = Object.values(stores).map(store => store.subscribe(listener));\n return () => unsubscribes.forEach(unsub => unsub());\n };\n\n const reset = () => {\n Object.values(stores).forEach(store => store.reset());\n };\n\n return { getState, setState, subscribe, reset };\n}\n","/**\n * Float.js AI Module\n * Native AI integration with streaming support\n */\n\nexport interface AIProvider {\n name: string;\n chat(options: ChatOptions): Promise<AIResponse>;\n stream(options: ChatOptions): AsyncIterable<string>;\n}\n\nexport interface ChatOptions {\n model?: string;\n messages: Message[];\n temperature?: number;\n maxTokens?: number;\n system?: string;\n}\n\nexport interface Message {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface AIResponse {\n content: string;\n model: string;\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * OpenAI Provider\n */\nexport class OpenAIProvider implements AIProvider {\n name = 'openai';\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey || process.env.OPENAI_API_KEY || '';\n this.baseUrl = options.baseUrl || 'https://api.openai.com/v1';\n }\n\n async chat(options: ChatOptions): Promise<AIResponse> {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: options.model || 'gpt-4o-mini',\n messages: options.system \n ? [{ role: 'system', content: options.system }, ...options.messages]\n : options.messages,\n temperature: options.temperature ?? 0.7,\n max_tokens: options.maxTokens,\n }),\n });\n\n const data = await response.json();\n \n return {\n content: data.choices[0].message.content,\n model: data.model,\n usage: data.usage ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n } : undefined,\n };\n }\n\n async *stream(options: ChatOptions): AsyncIterable<string> {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: options.model || 'gpt-4o-mini',\n messages: options.system \n ? [{ role: 'system', content: options.system }, ...options.messages]\n : options.messages,\n temperature: options.temperature ?? 0.7,\n max_tokens: options.maxTokens,\n stream: true,\n }),\n });\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No response body');\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n \n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices[0]?.delta?.content;\n if (content) yield content;\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n }\n}\n\n/**\n * Anthropic Provider\n */\nexport class AnthropicProvider implements AIProvider {\n name = 'anthropic';\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY || '';\n this.baseUrl = options.baseUrl || 'https://api.anthropic.com/v1';\n }\n\n async chat(options: ChatOptions): Promise<AIResponse> {\n const response = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: options.model || 'claude-3-5-sonnet-20241022',\n messages: options.messages.filter(m => m.role !== 'system'),\n system: options.system || options.messages.find(m => m.role === 'system')?.content,\n max_tokens: options.maxTokens || 4096,\n temperature: options.temperature ?? 0.7,\n }),\n });\n\n const data = await response.json();\n \n return {\n content: data.content[0].text,\n model: data.model,\n usage: data.usage ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n } : undefined,\n };\n }\n\n async *stream(options: ChatOptions): AsyncIterable<string> {\n const response = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: options.model || 'claude-3-5-sonnet-20241022',\n messages: options.messages.filter(m => m.role !== 'system'),\n system: options.system || options.messages.find(m => m.role === 'system')?.content,\n max_tokens: options.maxTokens || 4096,\n temperature: options.temperature ?? 0.7,\n stream: true,\n }),\n });\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No response body');\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const parsed = JSON.parse(line.slice(6));\n if (parsed.type === 'content_block_delta') {\n yield parsed.delta.text;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n }\n}\n\n/**\n * AI Instance - Main entry point\n */\nclass FloatAI {\n private providers: Map<string, AIProvider> = new Map();\n private defaultProvider: string = 'openai';\n\n constructor() {\n // Auto-register providers based on available API keys\n if (process.env.OPENAI_API_KEY) {\n this.register(new OpenAIProvider());\n this.defaultProvider = 'openai';\n }\n if (process.env.ANTHROPIC_API_KEY) {\n this.register(new AnthropicProvider());\n if (!process.env.OPENAI_API_KEY) {\n this.defaultProvider = 'anthropic';\n }\n }\n }\n\n register(provider: AIProvider): void {\n this.providers.set(provider.name, provider);\n }\n\n use(name: string): this {\n if (!this.providers.has(name)) {\n throw new Error(`AI provider \"${name}\" not registered`);\n }\n this.defaultProvider = name;\n return this;\n }\n\n private getProvider(): AIProvider {\n const provider = this.providers.get(this.defaultProvider);\n if (!provider) {\n throw new Error(`No AI provider configured. Set OPENAI_API_KEY or ANTHROPIC_API_KEY`);\n }\n return provider;\n }\n\n /**\n * Simple chat completion\n */\n async chat(prompt: string, options: Partial<ChatOptions> = {}): Promise<string> {\n const response = await this.getProvider().chat({\n ...options,\n messages: [{ role: 'user', content: prompt }],\n });\n return response.content;\n }\n\n /**\n * Chat with message history\n */\n async complete(options: ChatOptions): Promise<AIResponse> {\n return this.getProvider().chat(options);\n }\n\n /**\n * Stream chat completion\n */\n stream(prompt: string, options: Partial<ChatOptions> = {}): AsyncIterable<string> {\n return this.getProvider().stream({\n ...options,\n messages: [{ role: 'user', content: prompt }],\n });\n }\n\n /**\n * Stream with message history\n */\n streamChat(options: ChatOptions): AsyncIterable<string> {\n return this.getProvider().stream(options);\n }\n}\n\n// Singleton instance\nexport const ai = new FloatAI();\n\n/**\n * Create a streaming response for API routes\n */\nexport function streamResponse(\n iterable: AsyncIterable<string>,\n options: { headers?: Record<string, string> } = {}\n): Response {\n const encoder = new TextEncoder();\n \n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of iterable) {\n controller.enqueue(encoder.encode(chunk));\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked',\n 'Cache-Control': 'no-cache',\n ...options.headers,\n },\n });\n}\n\n/**\n * Create a Server-Sent Events response\n */\nexport function sseResponse(\n iterable: AsyncIterable<string>,\n options: { headers?: Record<string, string> } = {}\n): Response {\n const encoder = new TextEncoder();\n \n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of iterable) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\\n\\n`));\n }\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n ...options.headers,\n },\n });\n}\n\n/**\n * AI Action decorator for type-safe AI endpoints\n */\nexport function aiAction<T extends Record<string, unknown>>(\n handler: (input: T) => Promise<string> | AsyncIterable<string>\n) {\n return async (request: Request): Promise<Response> => {\n try {\n const input = await request.json() as T;\n const result = handler(input);\n\n if (Symbol.asyncIterator in Object(result)) {\n return streamResponse(result as AsyncIterable<string>);\n }\n\n const content = await (result as Promise<string>);\n return new Response(JSON.stringify({ content }), {\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n return new Response(\n JSON.stringify({ error: (error as Error).message }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n };\n}\n","/**\n * Float.js Type-Safe API Module\n * Automatic validation and type inference for API routes\n * \n * This is a MAJOR differentiator from Next.js - zero boilerplate API validation!\n */\n\n// ============================================================================\n// SCHEMA TYPES (Zod-like but zero dependencies)\n// ============================================================================\n\ntype SchemaType = 'string' | 'number' | 'boolean' | 'array' | 'object' | 'enum' | 'union' | 'optional';\n\ninterface BaseSchema<T = unknown> {\n _type: SchemaType;\n _output: T;\n optional(): OptionalSchema<T>;\n parse(value: unknown): T;\n safeParse(value: unknown): { success: true; data: T } | { success: false; error: ValidationError };\n}\n\ninterface ValidationError {\n path: string[];\n message: string;\n received: unknown;\n expected: string;\n}\n\n// ============================================================================\n// STRING SCHEMA\n// ============================================================================\n\ninterface StringSchema extends BaseSchema<string> {\n _type: 'string';\n min(length: number, message?: string): StringSchema;\n max(length: number, message?: string): StringSchema;\n email(message?: string): StringSchema;\n url(message?: string): StringSchema;\n uuid(message?: string): StringSchema;\n regex(pattern: RegExp, message?: string): StringSchema;\n trim(): StringSchema;\n toLowerCase(): StringSchema;\n toUpperCase(): StringSchema;\n}\n\nfunction createStringSchema(): StringSchema {\n const validators: Array<(val: string) => string | null> = [];\n const transforms: Array<(val: string) => string> = [];\n\n const schema: StringSchema = {\n _type: 'string',\n _output: '' as string,\n\n min(length: number, message?: string) {\n validators.push((val) => \n val.length >= length ? null : (message || `Must be at least ${length} characters`)\n );\n return schema;\n },\n\n max(length: number, message?: string) {\n validators.push((val) => \n val.length <= length ? null : (message || `Must be at most ${length} characters`)\n );\n return schema;\n },\n\n email(message?: string) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n validators.push((val) => \n emailRegex.test(val) ? null : (message || 'Invalid email address')\n );\n return schema;\n },\n\n url(message?: string) {\n validators.push((val) => {\n try {\n new URL(val);\n return null;\n } catch {\n return message || 'Invalid URL';\n }\n });\n return schema;\n },\n\n uuid(message?: string) {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n validators.push((val) => \n uuidRegex.test(val) ? null : (message || 'Invalid UUID')\n );\n return schema;\n },\n\n regex(pattern: RegExp, message?: string) {\n validators.push((val) => \n pattern.test(val) ? null : (message || `Must match pattern ${pattern}`)\n );\n return schema;\n },\n\n trim() {\n transforms.push((val) => val.trim());\n return schema;\n },\n\n toLowerCase() {\n transforms.push((val) => val.toLowerCase());\n return schema;\n },\n\n toUpperCase() {\n transforms.push((val) => val.toUpperCase());\n return schema;\n },\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): string {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (typeof value !== 'string') {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected string',\n received: value,\n expected: 'string',\n },\n };\n }\n\n // Apply transforms\n let transformed = value;\n for (const transform of transforms) {\n transformed = transform(transformed);\n }\n\n // Run validators\n for (const validator of validators) {\n const error = validator(transformed);\n if (error) {\n return {\n success: false as const,\n error: {\n path: [],\n message: error,\n received: value,\n expected: 'string',\n },\n };\n }\n }\n\n return { success: true as const, data: transformed };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// NUMBER SCHEMA\n// ============================================================================\n\ninterface NumberSchema extends BaseSchema<number> {\n _type: 'number';\n min(value: number, message?: string): NumberSchema;\n max(value: number, message?: string): NumberSchema;\n int(message?: string): NumberSchema;\n positive(message?: string): NumberSchema;\n negative(message?: string): NumberSchema;\n finite(message?: string): NumberSchema;\n}\n\nfunction createNumberSchema(): NumberSchema {\n const validators: Array<(val: number) => string | null> = [];\n\n const schema: NumberSchema = {\n _type: 'number',\n _output: 0 as number,\n\n min(value: number, message?: string) {\n validators.push((val) => \n val >= value ? null : (message || `Must be at least ${value}`)\n );\n return schema;\n },\n\n max(value: number, message?: string) {\n validators.push((val) => \n val <= value ? null : (message || `Must be at most ${value}`)\n );\n return schema;\n },\n\n int(message?: string) {\n validators.push((val) => \n Number.isInteger(val) ? null : (message || 'Must be an integer')\n );\n return schema;\n },\n\n positive(message?: string) {\n validators.push((val) => \n val > 0 ? null : (message || 'Must be positive')\n );\n return schema;\n },\n\n negative(message?: string) {\n validators.push((val) => \n val < 0 ? null : (message || 'Must be negative')\n );\n return schema;\n },\n\n finite(message?: string) {\n validators.push((val) => \n Number.isFinite(val) ? null : (message || 'Must be finite')\n );\n return schema;\n },\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): number {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n const num = typeof value === 'string' ? parseFloat(value) : value;\n \n if (typeof num !== 'number' || isNaN(num)) {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected number',\n received: value,\n expected: 'number',\n },\n };\n }\n\n for (const validator of validators) {\n const error = validator(num);\n if (error) {\n return {\n success: false as const,\n error: {\n path: [],\n message: error,\n received: value,\n expected: 'number',\n },\n };\n }\n }\n\n return { success: true as const, data: num };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// BOOLEAN SCHEMA\n// ============================================================================\n\ninterface BooleanSchema extends BaseSchema<boolean> {\n _type: 'boolean';\n}\n\nfunction createBooleanSchema(): BooleanSchema {\n const schema: BooleanSchema = {\n _type: 'boolean',\n _output: false as boolean,\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): boolean {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n // Handle string booleans\n if (value === 'true') return { success: true as const, data: true };\n if (value === 'false') return { success: true as const, data: false };\n \n if (typeof value !== 'boolean') {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected boolean',\n received: value,\n expected: 'boolean',\n },\n };\n }\n\n return { success: true as const, data: value };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// ARRAY SCHEMA\n// ============================================================================\n\ninterface ArraySchema<T> extends BaseSchema<T[]> {\n _type: 'array';\n min(length: number, message?: string): ArraySchema<T>;\n max(length: number, message?: string): ArraySchema<T>;\n nonempty(message?: string): ArraySchema<T>;\n}\n\nfunction createArraySchema<S extends BaseSchema>(itemSchema: S): ArraySchema<S['_output']> {\n const validators: Array<(val: unknown[]) => string | null> = [];\n\n const schema: ArraySchema<S['_output']> = {\n _type: 'array',\n _output: [] as S['_output'][],\n\n min(length: number, message?: string) {\n validators.push((val) => \n val.length >= length ? null : (message || `Must have at least ${length} items`)\n );\n return schema;\n },\n\n max(length: number, message?: string) {\n validators.push((val) => \n val.length <= length ? null : (message || `Must have at most ${length} items`)\n );\n return schema;\n },\n\n nonempty(message?: string) {\n validators.push((val) => \n val.length > 0 ? null : (message || 'Array must not be empty')\n );\n return schema;\n },\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): S['_output'][] {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (!Array.isArray(value)) {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected array',\n received: value,\n expected: 'array',\n },\n };\n }\n\n // Validate length constraints\n for (const validator of validators) {\n const error = validator(value);\n if (error) {\n return {\n success: false as const,\n error: {\n path: [],\n message: error,\n received: value,\n expected: 'array',\n },\n };\n }\n }\n\n // Validate each item\n const result: S['_output'][] = [];\n for (let i = 0; i < value.length; i++) {\n const itemResult = itemSchema.safeParse(value[i]);\n if (!itemResult.success) {\n return {\n success: false as const,\n error: {\n ...itemResult.error,\n path: [String(i), ...itemResult.error.path],\n },\n };\n }\n result.push(itemResult.data);\n }\n\n return { success: true as const, data: result };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// OBJECT SCHEMA\n// ============================================================================\n\ntype ObjectShape = Record<string, BaseSchema>;\ntype InferObject<T extends ObjectShape> = {\n [K in keyof T]: T[K]['_output'];\n};\n\ninterface ObjectSchema<T extends ObjectShape> extends BaseSchema<InferObject<T>> {\n _type: 'object';\n _shape: T;\n partial(): ObjectSchema<{ [K in keyof T]: OptionalSchema<T[K]['_output']> }>;\n pick<K extends keyof T>(...keys: K[]): ObjectSchema<Pick<T, K>>;\n omit<K extends keyof T>(...keys: K[]): ObjectSchema<Omit<T, K>>;\n extend<E extends ObjectShape>(extension: E): ObjectSchema<T & E>;\n merge<E extends ObjectShape>(other: ObjectSchema<E>): ObjectSchema<T & E>;\n passthrough(): ObjectSchema<T>;\n strict(): ObjectSchema<T>;\n}\n\nfunction createObjectSchema<T extends ObjectShape>(shape: T): ObjectSchema<T> {\n let passthroughMode = false;\n let strictMode = false;\n\n const schema: ObjectSchema<T> = {\n _type: 'object',\n _output: {} as InferObject<T>,\n _shape: shape,\n\n partial() {\n const partialShape: Record<string, BaseSchema> = {};\n for (const key in shape) {\n partialShape[key] = shape[key].optional();\n }\n return createObjectSchema(partialShape) as any;\n },\n\n pick<K extends keyof T>(...keys: K[]) {\n const pickedShape: Partial<T> = {};\n for (const key of keys) {\n pickedShape[key] = shape[key];\n }\n return createObjectSchema(pickedShape as Pick<T, K>);\n },\n\n omit<K extends keyof T>(...keys: K[]) {\n const omittedShape = { ...shape };\n for (const key of keys) {\n delete omittedShape[key];\n }\n return createObjectSchema(omittedShape as Omit<T, K>);\n },\n\n extend<E extends ObjectShape>(extension: E) {\n return createObjectSchema({ ...shape, ...extension });\n },\n\n merge<E extends ObjectShape>(other: ObjectSchema<E>) {\n return createObjectSchema({ ...shape, ...other._shape });\n },\n\n passthrough() {\n passthroughMode = true;\n return schema;\n },\n\n strict() {\n strictMode = true;\n return schema;\n },\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): InferObject<T> {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false as const,\n error: {\n path: [],\n message: 'Expected object',\n received: value,\n expected: 'object',\n },\n };\n }\n\n const obj = value as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n\n // Check for unknown keys in strict mode\n if (strictMode) {\n for (const key in obj) {\n if (!(key in shape)) {\n return {\n success: false as const,\n error: {\n path: [key],\n message: `Unknown key '${key}'`,\n received: obj[key],\n expected: 'undefined',\n },\n };\n }\n }\n }\n\n // Validate each field\n for (const key in shape) {\n const fieldSchema = shape[key];\n const fieldResult = fieldSchema.safeParse(obj[key]);\n \n if (!fieldResult.success) {\n return {\n success: false as const,\n error: {\n ...fieldResult.error,\n path: [key, ...fieldResult.error.path],\n },\n };\n }\n \n result[key] = fieldResult.data;\n }\n\n // Include extra keys in passthrough mode\n if (passthroughMode) {\n for (const key in obj) {\n if (!(key in shape)) {\n result[key] = obj[key];\n }\n }\n }\n\n return { success: true as const, data: result as InferObject<T> };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// OPTIONAL SCHEMA\n// ============================================================================\n\ninterface OptionalSchema<T> extends BaseSchema<T | undefined> {\n _type: 'optional';\n _innerType: BaseSchema<T>;\n default(value: T): BaseSchema<T>;\n}\n\nfunction createOptionalSchema<T>(innerSchema: BaseSchema<T>): OptionalSchema<T> {\n const schema: OptionalSchema<T> = {\n _type: 'optional',\n _output: undefined as T | undefined,\n _innerType: innerSchema,\n\n default(defaultValue: T): BaseSchema<T> {\n return {\n _type: 'optional',\n _output: defaultValue,\n optional: () => schema,\n parse(value: unknown): T {\n if (value === undefined || value === null) {\n return defaultValue;\n }\n return innerSchema.parse(value);\n },\n safeParse(value: unknown) {\n if (value === undefined || value === null) {\n return { success: true as const, data: defaultValue };\n }\n return innerSchema.safeParse(value);\n },\n };\n },\n\n optional() {\n return schema;\n },\n\n parse(value: unknown): T | undefined {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (value === undefined || value === null) {\n return { success: true as const, data: undefined };\n }\n return innerSchema.safeParse(value);\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// ENUM SCHEMA\n// ============================================================================\n\ninterface EnumSchema<T extends readonly string[]> extends BaseSchema<T[number]> {\n _type: 'enum';\n options: T;\n}\n\nfunction createEnumSchema<T extends readonly string[]>(values: T): EnumSchema<T> {\n const schema: EnumSchema<T> = {\n _type: 'enum',\n _output: values[0] as T[number],\n options: values,\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): T[number] {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n if (typeof value !== 'string' || !values.includes(value as T[number])) {\n return {\n success: false as const,\n error: {\n path: [],\n message: `Expected one of: ${values.join(', ')}`,\n received: value,\n expected: values.join(' | '),\n },\n };\n }\n\n return { success: true as const, data: value as T[number] };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// UNION SCHEMA\n// ============================================================================\n\ninterface UnionSchema<T extends BaseSchema[]> extends BaseSchema<T[number]['_output']> {\n _type: 'union';\n}\n\nfunction createUnionSchema<T extends BaseSchema[]>(schemas: T): UnionSchema<T> {\n const schema: UnionSchema<T> = {\n _type: 'union',\n _output: undefined as T[number]['_output'],\n\n optional() {\n return createOptionalSchema(schema);\n },\n\n parse(value: unknown): T[number]['_output'] {\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new FloatValidationError([result.error]);\n }\n return result.data;\n },\n\n safeParse(value: unknown) {\n const errors: ValidationError[] = [];\n \n for (const s of schemas) {\n const result = s.safeParse(value);\n if (result.success) {\n return result;\n }\n errors.push(result.error);\n }\n\n return {\n success: false as const,\n error: {\n path: [],\n message: `Value did not match any schema in union`,\n received: value,\n expected: schemas.map(s => s._type).join(' | '),\n },\n };\n },\n };\n\n return schema;\n}\n\n// ============================================================================\n// VALIDATION ERROR\n// ============================================================================\n\nexport class FloatValidationError extends Error {\n public readonly errors: ValidationError[];\n public readonly status = 400;\n\n constructor(errors: ValidationError[]) {\n super('Validation failed');\n this.name = 'FloatValidationError';\n this.errors = errors;\n }\n\n toJSON() {\n return {\n error: 'Validation Error',\n details: this.errors.map(e => ({\n path: e.path.join('.') || 'root',\n message: e.message,\n received: typeof e.received,\n })),\n };\n }\n\n toResponse(): Response {\n return new Response(JSON.stringify(this.toJSON()), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n\n// ============================================================================\n// SCHEMA BUILDER (f - main export)\n// ============================================================================\n\nexport const f = {\n string: createStringSchema,\n number: createNumberSchema,\n boolean: createBooleanSchema,\n array: createArraySchema,\n object: createObjectSchema,\n enum: createEnumSchema,\n union: createUnionSchema,\n};\n\n// ============================================================================\n// TYPE INFERENCE\n// ============================================================================\n\nexport type Infer<T extends BaseSchema> = T['_output'];\n\n// ============================================================================\n// API ROUTE DECORATOR\n// ============================================================================\n\ninterface TypedRouteOptions {\n body?: ObjectSchema<any>;\n query?: ObjectSchema<any>;\n params?: ObjectSchema<any>;\n}\n\ninterface ValidatedData {\n body: any;\n query: any;\n params: any;\n}\n\ninterface TypedRequest extends Request {\n validated: ValidatedData;\n}\n\ntype RouteHandler = (\n request: TypedRequest\n) => Promise<Response> | Response;\n\n/**\n * Create a type-safe API route with automatic validation\n * \n * @example\n * ```typescript\n * import { typedRoute, f } from '@float/core';\n * \n * export const POST = typedRoute({\n * body: f.object({\n * name: f.string().min(2),\n * email: f.string().email(),\n * age: f.number().min(18).optional(),\n * }),\n * }, async (req) => {\n * // req.validated.body is fully typed!\n * const { name, email, age } = req.validated.body;\n * \n * return new Response(JSON.stringify({ \n * message: `Hello ${name}!` \n * }));\n * });\n * ```\n */\nexport function typedRoute(\n options: TypedRouteOptions,\n handler: RouteHandler\n): (request: Request) => Promise<Response> {\n return async (request: Request): Promise<Response> => {\n try {\n const validated: ValidatedData = { body: undefined, query: undefined, params: undefined };\n\n // Parse and validate body\n if (options.body) {\n try {\n const body = await request.json();\n const bodySchema = options.body;\n const result = bodySchema.safeParse(body);\n if (!result.success) {\n return new FloatValidationError([result.error]).toResponse();\n }\n validated.body = result.data;\n } catch {\n return new Response(\n JSON.stringify({ error: 'Invalid JSON body' }),\n { status: 400, headers: { 'Content-Type': 'application/json' } }\n );\n }\n }\n\n // Parse and validate query params\n if (options.query) {\n const url = new URL(request.url);\n const queryObj: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n queryObj[key] = value;\n });\n \n const querySchema = options.query;\n const result = querySchema.safeParse(queryObj);\n if (!result.success) {\n return new FloatValidationError([result.error]).toResponse();\n }\n validated.query = result.data;\n }\n\n // Validate URL params (if provided via request context)\n if (options.params) {\n const params = (request as any).params || {};\n const paramsSchema = options.params;\n const result = paramsSchema.safeParse(params);\n if (!result.success) {\n return new FloatValidationError([result.error]).toResponse();\n }\n validated.params = result.data;\n }\n\n // Create typed request\n const typedRequest = request as TypedRequest;\n typedRequest.validated = validated;\n\n // Call handler\n return await handler(typedRequest);\n } catch (error) {\n if (error instanceof FloatValidationError) {\n return error.toResponse();\n }\n \n console.error('Route error:', error);\n return new Response(\n JSON.stringify({ error: 'Internal server error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n };\n}\n\n// ============================================================================\n// JSON RESPONSE HELPER\n// ============================================================================\n\ninterface JsonResponseOptions {\n status?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * Create a JSON response with automatic serialization\n */\nexport function json<T>(data: T, options: JsonResponseOptions = {}): Response {\n return new Response(JSON.stringify(data), {\n status: options.status || 200,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n}\n\n/**\n * Create an error response\n */\nexport function error(message: string, status = 500): Response {\n return new Response(\n JSON.stringify({ error: message }),\n { \n status, \n headers: { 'Content-Type': 'application/json' } \n }\n );\n}\n\n/**\n * Create a redirect response\n */\nexport function redirect(url: string, status: 301 | 302 | 307 | 308 = 302): Response {\n return new Response(null, {\n status,\n headers: { Location: url },\n });\n}\n","/**\n * Float.js Real-time Module\n * Built-in WebSocket support with rooms, presence, and broadcasting\n * \n * NO plugins needed - real-time is native to Float.js!\n */\n\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { createServer, IncomingMessage } from 'http';\nimport type { Server as HTTPServer } from 'http';\nimport { EventEmitter } from 'events';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface RealtimeClient {\n id: string;\n socket: WebSocket;\n rooms: Set<string>;\n data: Record<string, unknown>;\n isAlive: boolean;\n connectedAt: Date;\n}\n\nexport interface RealtimeMessage<T = unknown> {\n type: string;\n payload: T;\n from?: string;\n room?: string;\n timestamp: number;\n}\n\nexport interface RealtimeRoom {\n name: string;\n clients: Set<string>;\n metadata: Record<string, unknown>;\n createdAt: Date;\n}\n\nexport interface PresenceState {\n clientId: string;\n data: Record<string, unknown>;\n joinedAt: Date;\n lastSeen: Date;\n}\n\nexport interface RealtimeOptions {\n /** Port for WebSocket server (default: 3001) */\n port?: number;\n /** Path for WebSocket endpoint (default: '/ws') */\n path?: string;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n /** Max message size in bytes (default: 1MB) */\n maxPayload?: number;\n /** Enable presence tracking (default: true) */\n presence?: boolean;\n /** Custom authentication handler */\n authenticate?: (request: IncomingMessage) => Promise<{ id: string; data?: Record<string, unknown> } | null>;\n}\n\ntype EventHandler<T = unknown> = (message: RealtimeMessage<T>, client: RealtimeClient) => void | Promise<void>;\ntype ConnectionHandler = (client: RealtimeClient) => void | Promise<void>;\ntype DisconnectHandler = (client: RealtimeClient, code: number, reason: string) => void | Promise<void>;\n\n// ============================================================================\n// REALTIME SERVER\n// ============================================================================\n\nexport class FloatRealtime extends EventEmitter {\n private wss: WebSocketServer | null = null;\n private httpServer: HTTPServer | null = null;\n private clients: Map<string, RealtimeClient> = new Map();\n private rooms: Map<string, RealtimeRoom> = new Map();\n private eventHandlers: Map<string, EventHandler[]> = new Map();\n private connectionHandlers: ConnectionHandler[] = [];\n private disconnectHandlers: DisconnectHandler[] = [];\n private pingInterval: NodeJS.Timeout | null = null;\n private options: Required<RealtimeOptions>;\n\n constructor(options: RealtimeOptions = {}) {\n super();\n this.options = {\n port: options.port ?? 3001,\n path: options.path ?? '/ws',\n pingInterval: options.pingInterval ?? 30000,\n maxPayload: options.maxPayload ?? 1024 * 1024, // 1MB\n presence: options.presence ?? true,\n authenticate: options.authenticate ?? (async () => ({ id: this.generateId() })),\n };\n }\n\n /**\n * Start the WebSocket server\n */\n async start(): Promise<void> {\n return new Promise((resolve) => {\n this.httpServer = createServer();\n \n this.wss = new WebSocketServer({\n server: this.httpServer,\n path: this.options.path,\n maxPayload: this.options.maxPayload,\n });\n\n this.wss.on('connection', (socket, request) => {\n this.handleConnection(socket, request);\n });\n\n // Start ping interval\n this.pingInterval = setInterval(() => {\n this.pingClients();\n }, this.options.pingInterval);\n\n this.httpServer.listen(this.options.port, () => {\n console.log(`π Float.js Realtime running on ws://localhost:${this.options.port}${this.options.path}`);\n resolve();\n });\n });\n }\n\n /**\n * Stop the WebSocket server\n */\n async stop(): Promise<void> {\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n }\n\n // Close all client connections\n for (const client of this.clients.values()) {\n client.socket.close(1000, 'Server shutting down');\n }\n\n return new Promise((resolve) => {\n if (this.wss) {\n this.wss.close(() => {\n if (this.httpServer) {\n this.httpServer.close(() => {\n resolve();\n });\n } else {\n resolve();\n }\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Handle new WebSocket connection\n */\n private async handleConnection(socket: WebSocket, request: IncomingMessage): Promise<void> {\n try {\n // Authenticate\n const authResult = await this.options.authenticate(request);\n if (!authResult) {\n socket.close(4001, 'Unauthorized');\n return;\n }\n\n // Create client\n const client: RealtimeClient = {\n id: authResult.id,\n socket,\n rooms: new Set(),\n data: authResult.data || {},\n isAlive: true,\n connectedAt: new Date(),\n };\n\n this.clients.set(client.id, client);\n\n // Send welcome message\n this.sendToClient(client, {\n type: '_connected',\n payload: {\n id: client.id,\n connectedAt: client.connectedAt,\n },\n timestamp: Date.now(),\n });\n\n // Handle pong\n socket.on('pong', () => {\n client.isAlive = true;\n });\n\n // Handle messages\n socket.on('message', (data) => {\n this.handleMessage(client, data);\n });\n\n // Handle close\n socket.on('close', (code, reason) => {\n this.handleDisconnect(client, code, reason.toString());\n });\n\n // Handle error\n socket.on('error', (error) => {\n console.error(`WebSocket error for client ${client.id}:`, error);\n });\n\n // Notify connection handlers\n for (const handler of this.connectionHandlers) {\n await handler(client);\n }\n\n this.emit('connection', client);\n } catch (error) {\n console.error('Connection error:', error);\n socket.close(4000, 'Connection error');\n }\n }\n\n /**\n * Handle incoming message\n */\n private async handleMessage(client: RealtimeClient, rawData: WebSocket.Data): Promise<void> {\n try {\n const message = JSON.parse(rawData.toString()) as RealtimeMessage;\n message.from = client.id;\n message.timestamp = Date.now();\n\n // Handle built-in message types\n switch (message.type) {\n case '_join':\n await this.handleJoin(client, message.payload as { room: string; data?: Record<string, unknown> });\n return;\n case '_leave':\n await this.handleLeave(client, message.payload as { room: string });\n return;\n case '_broadcast':\n await this.handleBroadcast(client, message);\n return;\n case '_presence':\n await this.handlePresenceUpdate(client, message.payload as Record<string, unknown>);\n return;\n }\n\n // Handle custom events\n const handlers = this.eventHandlers.get(message.type) || [];\n for (const handler of handlers) {\n await handler(message, client);\n }\n\n this.emit('message', message, client);\n } catch (error) {\n console.error('Message handling error:', error);\n }\n }\n\n /**\n * Handle client disconnect\n */\n private async handleDisconnect(client: RealtimeClient, code: number, reason: string): Promise<void> {\n // Leave all rooms\n for (const roomName of client.rooms) {\n const room = this.rooms.get(roomName);\n if (room) {\n room.clients.delete(client.id);\n \n // Notify room members\n this.broadcastToRoom(roomName, {\n type: '_presence_leave',\n payload: { clientId: client.id },\n timestamp: Date.now(),\n }, client.id);\n\n // Delete empty rooms\n if (room.clients.size === 0) {\n this.rooms.delete(roomName);\n }\n }\n }\n\n // Remove client\n this.clients.delete(client.id);\n\n // Notify disconnect handlers\n for (const handler of this.disconnectHandlers) {\n await handler(client, code, reason);\n }\n\n this.emit('disconnect', client, code, reason);\n }\n\n /**\n * Handle room join\n */\n private async handleJoin(client: RealtimeClient, payload: { room: string; data?: Record<string, unknown> }): Promise<void> {\n const { room: roomName, data } = payload;\n\n // Create room if doesn't exist\n let room = this.rooms.get(roomName);\n if (!room) {\n room = {\n name: roomName,\n clients: new Set(),\n metadata: {},\n createdAt: new Date(),\n };\n this.rooms.set(roomName, room);\n }\n\n // Add client to room\n room.clients.add(client.id);\n client.rooms.add(roomName);\n\n // Update client data\n if (data) {\n client.data = { ...client.data, ...data };\n }\n\n // Send confirmation\n this.sendToClient(client, {\n type: '_joined',\n payload: {\n room: roomName,\n members: this.getRoomPresence(roomName),\n },\n timestamp: Date.now(),\n });\n\n // Notify other members\n if (this.options.presence) {\n this.broadcastToRoom(roomName, {\n type: '_presence_join',\n payload: {\n clientId: client.id,\n data: client.data,\n joinedAt: new Date(),\n },\n timestamp: Date.now(),\n }, client.id);\n }\n\n this.emit('join', client, roomName);\n }\n\n /**\n * Handle room leave\n */\n private async handleLeave(client: RealtimeClient, payload: { room: string }): Promise<void> {\n const { room: roomName } = payload;\n const room = this.rooms.get(roomName);\n\n if (room) {\n room.clients.delete(client.id);\n client.rooms.delete(roomName);\n\n // Notify other members\n if (this.options.presence) {\n this.broadcastToRoom(roomName, {\n type: '_presence_leave',\n payload: { clientId: client.id },\n timestamp: Date.now(),\n });\n }\n\n // Delete empty rooms\n if (room.clients.size === 0) {\n this.rooms.delete(roomName);\n }\n }\n\n // Send confirmation\n this.sendToClient(client, {\n type: '_left',\n payload: { room: roomName },\n timestamp: Date.now(),\n });\n\n this.emit('leave', client, roomName);\n }\n\n /**\n * Handle broadcast message\n */\n private async handleBroadcast(client: RealtimeClient, message: RealtimeMessage): Promise<void> {\n const { room } = message.payload as { room?: string; data: unknown };\n const broadcastMessage = {\n ...message,\n type: (message.payload as { type?: string }).type || 'broadcast',\n payload: (message.payload as { data?: unknown }).data,\n };\n\n if (room) {\n this.broadcastToRoom(room, broadcastMessage, client.id);\n } else {\n this.broadcastToAll(broadcastMessage, client.id);\n }\n }\n\n /**\n * Handle presence update\n */\n private async handlePresenceUpdate(client: RealtimeClient, data: Record<string, unknown>): Promise<void> {\n client.data = { ...client.data, ...data };\n\n // Broadcast to all rooms the client is in\n for (const roomName of client.rooms) {\n this.broadcastToRoom(roomName, {\n type: '_presence_update',\n payload: {\n clientId: client.id,\n data: client.data,\n },\n timestamp: Date.now(),\n }, client.id);\n }\n }\n\n /**\n * Ping all clients to check if they're alive\n */\n private pingClients(): void {\n for (const client of this.clients.values()) {\n if (!client.isAlive) {\n client.socket.terminate();\n this.handleDisconnect(client, 4002, 'Ping timeout');\n continue;\n }\n\n client.isAlive = false;\n client.socket.ping();\n }\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n /**\n * Register a handler for connection events\n */\n onConnection(handler: ConnectionHandler): this {\n this.connectionHandlers.push(handler);\n return this;\n }\n\n /**\n * Register a handler for disconnect events\n */\n onDisconnect(handler: DisconnectHandler): this {\n this.disconnectHandlers.push(handler);\n return this;\n }\n\n /**\n * Register a handler for a specific event type\n */\n onEvent<T = unknown>(eventType: string, handler: EventHandler<T>): this {\n const handlers = this.eventHandlers.get(eventType) || [];\n handlers.push(handler as EventHandler);\n this.eventHandlers.set(eventType, handlers);\n return this;\n }\n\n /**\n * Send a message to a specific client\n */\n sendToClient(client: RealtimeClient, message: RealtimeMessage): boolean {\n if (client.socket.readyState === WebSocket.OPEN) {\n client.socket.send(JSON.stringify(message));\n return true;\n }\n return false;\n }\n\n /**\n * Send a message to a client by ID\n */\n sendToId(clientId: string, message: RealtimeMessage): boolean {\n const client = this.clients.get(clientId);\n if (client) {\n return this.sendToClient(client, message);\n }\n return false;\n }\n\n /**\n * Broadcast to all clients in a room\n */\n broadcastToRoom(roomName: string, message: RealtimeMessage, excludeId?: string): void {\n const room = this.rooms.get(roomName);\n if (!room) return;\n\n message.room = roomName;\n\n for (const clientId of room.clients) {\n if (clientId !== excludeId) {\n const client = this.clients.get(clientId);\n if (client) {\n this.sendToClient(client, message);\n }\n }\n }\n }\n\n /**\n * Broadcast to all connected clients\n */\n broadcastToAll(message: RealtimeMessage, excludeId?: string): void {\n for (const [clientId, client] of this.clients) {\n if (clientId !== excludeId) {\n this.sendToClient(client, message);\n }\n }\n }\n\n /**\n * Get all clients in a room\n */\n getRoom(roomName: string): RealtimeRoom | undefined {\n return this.rooms.get(roomName);\n }\n\n /**\n * Get client by ID\n */\n getClient(clientId: string): RealtimeClient | undefined {\n return this.clients.get(clientId);\n }\n\n /**\n * Get presence data for a room\n */\n getRoomPresence(roomName: string): PresenceState[] {\n const room = this.rooms.get(roomName);\n if (!room) return [];\n\n return Array.from(room.clients).map((clientId) => {\n const client = this.clients.get(clientId);\n return {\n clientId,\n data: client?.data || {},\n joinedAt: client?.connectedAt || new Date(),\n lastSeen: new Date(),\n };\n });\n }\n\n /**\n * Get all connected clients count\n */\n get clientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Get all rooms count\n */\n get roomCount(): number {\n return this.rooms.size;\n }\n\n /**\n * Generate a unique client ID\n */\n private generateId(): string {\n return `client_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n}\n\n// ============================================================================\n// CLIENT-SIDE REALTIME (for browser)\n// ============================================================================\n\nexport interface RealtimeClientOptions {\n url: string;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n}\n\n/**\n * Create a client-side realtime connection\n * This code is isomorphic and can run in the browser\n */\nexport function createRealtimeClient(options: RealtimeClientOptions) {\n const {\n url,\n autoReconnect = true,\n reconnectInterval = 3000,\n maxReconnectAttempts = 10,\n } = options;\n\n let ws: WebSocket | null = null;\n let reconnectAttempts = 0;\n let clientId: string | null = null;\n const eventHandlers = new Map<string, Set<(payload: unknown) => void>>();\n const rooms = new Set<string>();\n\n const connect = (): Promise<void> => {\n return new Promise((resolve, reject) => {\n try {\n ws = new WebSocket(url);\n\n ws.onopen = () => {\n reconnectAttempts = 0;\n console.log('π Connected to Float.js Realtime');\n };\n\n ws.onmessage = (event) => {\n try {\n const data = typeof event.data === 'string' ? event.data : String(event.data);\n const message = JSON.parse(data) as RealtimeMessage;\n \n // Handle system messages\n if (message.type === '_connected') {\n clientId = (message.payload as { id: string }).id;\n resolve();\n return;\n }\n\n // Emit to handlers\n const handlers = eventHandlers.get(message.type);\n if (handlers) {\n handlers.forEach(handler => handler(message.payload));\n }\n\n // Also emit to 'message' handlers for all messages\n const allHandlers = eventHandlers.get('*');\n if (allHandlers) {\n allHandlers.forEach(handler => handler(message));\n }\n } catch (error) {\n console.error('Failed to parse message:', error);\n }\n };\n\n ws.onclose = () => {\n console.log('π Disconnected from Float.js Realtime');\n clientId = null;\n\n if (autoReconnect && reconnectAttempts < maxReconnectAttempts) {\n reconnectAttempts++;\n console.log(`Reconnecting in ${reconnectInterval}ms (attempt ${reconnectAttempts}/${maxReconnectAttempts})`);\n setTimeout(() => {\n connect().then(() => {\n // Rejoin rooms after reconnect\n rooms.forEach(room => {\n send({ type: '_join', payload: { room } });\n });\n });\n }, reconnectInterval);\n }\n };\n\n ws.onerror = (error) => {\n console.error('WebSocket error:', error);\n reject(error);\n };\n } catch (error) {\n reject(error);\n }\n });\n };\n\n const disconnect = () => {\n if (ws) {\n ws.close(1000, 'Client disconnect');\n ws = null;\n }\n };\n\n const send = (message: Partial<RealtimeMessage>) => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({\n ...message,\n timestamp: Date.now(),\n }));\n }\n };\n\n const join = (room: string, data?: Record<string, unknown>) => {\n rooms.add(room);\n send({ type: '_join', payload: { room, data } });\n };\n\n const leave = (room: string) => {\n rooms.delete(room);\n send({ type: '_leave', payload: { room } });\n };\n\n const broadcast = (room: string, type: string, data: unknown) => {\n send({\n type: '_broadcast',\n payload: { room, type, data },\n });\n };\n\n const emit = (type: string, data: unknown) => {\n send({ type, payload: data });\n };\n\n const on = <T = unknown>(eventType: string, handler: (payload: T) => void) => {\n if (!eventHandlers.has(eventType)) {\n eventHandlers.set(eventType, new Set());\n }\n eventHandlers.get(eventType)!.add(handler as (payload: unknown) => void);\n\n // Return unsubscribe function\n return () => {\n eventHandlers.get(eventType)?.delete(handler as (payload: unknown) => void);\n };\n };\n\n const updatePresence = (data: Record<string, unknown>) => {\n send({ type: '_presence', payload: data });\n };\n\n return {\n connect,\n disconnect,\n join,\n leave,\n broadcast,\n emit,\n on,\n updatePresence,\n get id() { return clientId; },\n get connected() { return ws?.readyState === WebSocket.OPEN; },\n };\n}\n\n// ============================================================================\n// SINGLETON INSTANCE\n// ============================================================================\n\nlet realtimeInstance: FloatRealtime | null = null;\n\n/**\n * Get or create the realtime server instance\n */\nexport function getRealtimeServer(options?: RealtimeOptions): FloatRealtime {\n if (!realtimeInstance) {\n realtimeInstance = new FloatRealtime(options);\n }\n return realtimeInstance;\n}\n\n/**\n * Shorthand export for easy usage\n */\nexport const realtime = {\n create: (options?: RealtimeOptions) => new FloatRealtime(options),\n server: getRealtimeServer,\n client: createRealtimeClient,\n};\n","/**\n * Float.js Image Optimization\n * Automatic image optimization, resizing, and format conversion\n * \n * Similar to Next.js Image but with more features!\n */\n\nimport { createHash } from 'crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, statSync } from 'fs';\nimport { join } from 'path';\nimport type { IncomingMessage, ServerResponse } from 'http';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ImageConfig {\n /** Supported image widths for responsive images */\n deviceSizes: number[];\n /** Smaller sizes for use with next/image */\n imageSizes: number[];\n /** Supported output formats */\n formats: ImageFormat[];\n /** Quality for lossy formats (1-100) */\n quality: number;\n /** Cache directory for optimized images */\n cacheDir: string;\n /** Base path for images */\n basePath: string;\n /** Remote image domains allowed */\n domains: string[];\n /** Minimum cache TTL in seconds */\n minimumCacheTTL: number;\n /** Disable static image imports */\n disableStaticImages: boolean;\n /** Enable AVIF format (experimental) */\n avif: boolean;\n}\n\nexport type ImageFormat = 'webp' | 'avif' | 'jpeg' | 'png' | 'gif' | 'svg';\n\nexport interface ImageProps {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n fill?: boolean;\n sizes?: string;\n quality?: number;\n priority?: boolean;\n placeholder?: 'blur' | 'empty' | 'data:image/...';\n blurDataURL?: string;\n loading?: 'lazy' | 'eager';\n className?: string;\n style?: Record<string, string>;\n onLoad?: () => void;\n onError?: () => void;\n}\n\nexport interface OptimizedImage {\n src: string;\n width: number;\n height: number;\n blurDataURL?: string;\n}\n\nexport interface ImageLoaderProps {\n src: string;\n width: number;\n quality?: number;\n}\n\n// ============================================================================\n// DEFAULT CONFIG\n// ============================================================================\n\nconst defaultConfig: ImageConfig = {\n deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],\n imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],\n formats: ['webp', 'jpeg'],\n quality: 75,\n cacheDir: '.float/cache/images',\n basePath: '/_float/image',\n domains: [],\n minimumCacheTTL: 60,\n disableStaticImages: false,\n avif: false,\n};\n\nlet imageConfig: ImageConfig = { ...defaultConfig };\n\nexport function configureImages(config: Partial<ImageConfig>): void {\n imageConfig = { ...defaultConfig, ...config };\n \n // Ensure cache directory exists\n if (!existsSync(imageConfig.cacheDir)) {\n mkdirSync(imageConfig.cacheDir, { recursive: true });\n }\n}\n\nexport function getImageConfig(): ImageConfig {\n return imageConfig;\n}\n\n// ============================================================================\n// IMAGE UTILITIES\n// ============================================================================\n\n/**\n * Generate a hash for cache key\n */\nfunction generateCacheKey(url: string, width: number, quality: number, format: string): string {\n const hash = createHash('md5')\n .update(`${url}-${width}-${quality}-${format}`)\n .digest('hex');\n return `${hash}.${format}`;\n}\n\n/**\n * Get the best format for the request\n */\nfunction getBestFormat(acceptHeader: string): ImageFormat {\n if (imageConfig.avif && acceptHeader.includes('image/avif')) {\n return 'avif';\n }\n if (acceptHeader.includes('image/webp')) {\n return 'webp';\n }\n return 'jpeg';\n}\n\n/**\n * Parse image URL parameters\n */\nfunction parseImageParams(url: URL): { src: string; width: number; quality: number } | null {\n const src = url.searchParams.get('url');\n const width = parseInt(url.searchParams.get('w') || '0', 10);\n const quality = parseInt(url.searchParams.get('q') || String(imageConfig.quality), 10);\n\n if (!src || !width) {\n return null;\n }\n\n // Validate width\n const allSizes = [...imageConfig.deviceSizes, ...imageConfig.imageSizes];\n if (!allSizes.includes(width)) {\n return null;\n }\n\n // Validate quality\n if (quality < 1 || quality > 100) {\n return null;\n }\n\n return { src, width, quality };\n}\n\n/**\n * Check if URL is external\n */\nfunction isExternalUrl(url: string): boolean {\n return url.startsWith('http://') || url.startsWith('https://');\n}\n\n/**\n * Validate external domain\n */\nfunction isAllowedDomain(url: string): boolean {\n if (!isExternalUrl(url)) return true;\n \n try {\n const { hostname } = new URL(url);\n return imageConfig.domains.includes(hostname);\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// IMAGE OPTIMIZATION (Sharp-like without Sharp dependency)\n// ============================================================================\n\n/**\n * Simple image resize using canvas (for basic optimization)\n * In production, you'd use Sharp or similar\n */\nasync function optimizeImage(\n input: Buffer,\n _width: number,\n _quality: number,\n _format: ImageFormat\n): Promise<Buffer> {\n // For now, return original with proper content type\n // In real implementation, use Sharp or similar:\n // const sharp = await import('sharp');\n // return sharp(input).resize(_width).toFormat(_format, { quality: _quality }).toBuffer();\n \n // Placeholder - returns original image\n // Users can install sharp for real optimization\n return input;\n}\n\n/**\n * Generate blur placeholder\n */\nexport async function generateBlurDataURL(input: Buffer): Promise<string> {\n // Generate a tiny version for blur placeholder\n // In real implementation, resize to 8x8 or 10x10 and base64 encode\n return `data:image/jpeg;base64,${input.slice(0, 50).toString('base64')}`;\n}\n\n// ============================================================================\n// IMAGE HANDLER\n// ============================================================================\n\nexport function createImageHandler() {\n // Ensure cache directory exists\n if (!existsSync(imageConfig.cacheDir)) {\n mkdirSync(imageConfig.cacheDir, { recursive: true });\n }\n\n return async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const urlString = req.url || '';\n \n // Check if this is an image optimization request\n if (!urlString.startsWith(imageConfig.basePath)) {\n return next();\n }\n\n try {\n const url = new URL(urlString, `http://${req.headers.host}`);\n const params = parseImageParams(url);\n\n if (!params) {\n res.statusCode = 400;\n res.end('Invalid image parameters');\n return;\n }\n\n const { src, width, quality } = params;\n\n // Validate domain for external URLs\n if (!isAllowedDomain(src)) {\n res.statusCode = 400;\n res.end('Domain not allowed');\n return;\n }\n\n // Determine best format\n const acceptHeader = req.headers.accept || '';\n const format = getBestFormat(acceptHeader);\n\n // Check cache\n const cacheKey = generateCacheKey(src, width, quality, format);\n const cachePath = join(imageConfig.cacheDir, cacheKey);\n\n if (existsSync(cachePath)) {\n const cachedImage = readFileSync(cachePath);\n const stat = statSync(cachePath);\n \n res.setHeader('Content-Type', `image/${format}`);\n res.setHeader('Cache-Control', `public, max-age=${imageConfig.minimumCacheTTL}, stale-while-revalidate`);\n res.setHeader('X-Float-Image-Cache', 'HIT');\n res.setHeader('Last-Modified', stat.mtime.toUTCString());\n res.end(cachedImage);\n return;\n }\n\n // Fetch or read image\n let imageBuffer: Buffer;\n\n if (isExternalUrl(src)) {\n const response = await fetch(src);\n if (!response.ok) {\n res.statusCode = 404;\n res.end('Image not found');\n return;\n }\n imageBuffer = Buffer.from(await response.arrayBuffer());\n } else {\n const imagePath = join(process.cwd(), 'public', src);\n if (!existsSync(imagePath)) {\n res.statusCode = 404;\n res.end('Image not found');\n return;\n }\n imageBuffer = readFileSync(imagePath);\n }\n\n // Optimize image\n const optimizedBuffer = await optimizeImage(imageBuffer, width, quality, format);\n\n // Save to cache\n writeFileSync(cachePath, optimizedBuffer);\n\n // Send response\n res.setHeader('Content-Type', `image/${format}`);\n res.setHeader('Cache-Control', `public, max-age=${imageConfig.minimumCacheTTL}, stale-while-revalidate`);\n res.setHeader('X-Float-Image-Cache', 'MISS');\n res.end(optimizedBuffer);\n } catch (error) {\n console.error('Image optimization error:', error);\n res.statusCode = 500;\n res.end('Image optimization failed');\n }\n };\n}\n\n// ============================================================================\n// IMAGE LOADER (for client-side)\n// ============================================================================\n\n/**\n * Default image loader\n */\nexport function floatImageLoader({ src, width, quality }: ImageLoaderProps): string {\n const q = quality || imageConfig.quality;\n return `${imageConfig.basePath}?url=${encodeURIComponent(src)}&w=${width}&q=${q}`;\n}\n\n/**\n * Generate srcset for responsive images\n */\nexport function generateSrcSet(src: string, sizes: number[]): string {\n return sizes\n .map(size => `${floatImageLoader({ src, width: size })} ${size}w`)\n .join(', ');\n}\n\n/**\n * Generate responsive image props\n */\nexport function getImageProps(props: ImageProps): {\n src: string;\n srcSet: string;\n sizes: string;\n width?: number;\n height?: number;\n loading: 'lazy' | 'eager';\n decoding: 'async' | 'sync';\n style?: Record<string, string>;\n} {\n const {\n src,\n width,\n height,\n fill,\n sizes = '100vw',\n quality,\n priority,\n loading = priority ? 'eager' : 'lazy',\n } = props;\n\n const allSizes = [...imageConfig.imageSizes, ...imageConfig.deviceSizes].sort((a, b) => a - b);\n \n // Filter sizes based on image width\n const relevantSizes = width \n ? allSizes.filter(s => s <= width * 2) \n : allSizes;\n\n return {\n src: floatImageLoader({ src, width: width || relevantSizes[relevantSizes.length - 1], quality }),\n srcSet: generateSrcSet(src, relevantSizes),\n sizes,\n width: fill ? undefined : width,\n height: fill ? undefined : height,\n loading,\n decoding: 'async',\n style: fill ? {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n } : undefined,\n };\n}\n\n// ============================================================================\n// REACT COMPONENT (Server Component compatible)\n// ============================================================================\n\n/**\n * Generate Image component HTML (for SSR)\n */\nexport function renderImageToString(props: ImageProps): string {\n const imageProps = getImageProps(props);\n \n const attributes = [\n `src=\"${imageProps.src}\"`,\n `srcset=\"${imageProps.srcSet}\"`,\n `sizes=\"${imageProps.sizes}\"`,\n `alt=\"${props.alt}\"`,\n `loading=\"${imageProps.loading}\"`,\n `decoding=\"${imageProps.decoding}\"`,\n ];\n\n if (imageProps.width) {\n attributes.push(`width=\"${imageProps.width}\"`);\n }\n if (imageProps.height) {\n attributes.push(`height=\"${imageProps.height}\"`);\n }\n if (props.className) {\n attributes.push(`class=\"${props.className}\"`);\n }\n if (imageProps.style) {\n const styleString = Object.entries(imageProps.style)\n .map(([key, value]) => `${key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`)}: ${value}`)\n .join('; ');\n attributes.push(`style=\"${styleString}\"`);\n }\n\n // Wrap in picture element for format fallback\n return `\n <picture>\n <source type=\"image/webp\" srcset=\"${imageProps.srcSet}\">\n <img ${attributes.join(' ')}>\n </picture>\n `.trim();\n}\n\n// ============================================================================\n// STATIC IMPORT HELPERS\n// ============================================================================\n\nexport interface StaticImageData {\n src: string;\n width: number;\n height: number;\n blurDataURL?: string;\n}\n\n/**\n * Import static image (for build-time optimization)\n */\nexport function importImage(imagePath: string): StaticImageData {\n // This would be processed at build time\n // Returns placeholder data for runtime\n return {\n src: imagePath,\n width: 0, // Determined at build time\n height: 0, // Determined at build time\n blurDataURL: undefined,\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport const image = {\n configure: configureImages,\n getConfig: getImageConfig,\n handler: createImageHandler,\n loader: floatImageLoader,\n srcSet: generateSrcSet,\n props: getImageProps,\n render: renderImageToString,\n import: importImage,\n};\n","/**\n * Float.js Edge Middleware\n * Run code at the edge before requests hit your application\n * \n * Inspired by Vercel Edge but works everywhere!\n */\n\nimport type { IncomingMessage, ServerResponse } from 'http';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface MiddlewareRequest {\n /** HTTP method */\n method: string;\n /** Request URL */\n url: string;\n /** Parsed URL */\n nextUrl: NextURL;\n /** Request headers */\n headers: Headers;\n /** Cookies from request */\n cookies: RequestCookies;\n /** Geolocation data (if available) */\n geo?: GeoData;\n /** IP address */\n ip?: string;\n /** Original request */\n request: Request;\n}\n\nexport interface NextURL {\n /** Full URL */\n href: string;\n /** Origin */\n origin: string;\n /** Protocol */\n protocol: string;\n /** Hostname */\n hostname: string;\n /** Port */\n port: string;\n /** Pathname */\n pathname: string;\n /** Search params */\n searchParams: URLSearchParams;\n /** Search string */\n search: string;\n /** Hash */\n hash: string;\n /** Base path */\n basePath: string;\n /** Locale */\n locale?: string;\n /** Clone the URL */\n clone(): NextURL;\n}\n\nexport interface RequestCookies {\n get(name: string): { name: string; value: string } | undefined;\n getAll(): Array<{ name: string; value: string }>;\n has(name: string): boolean;\n set(name: string, value: string, options?: CookieOptions): void;\n delete(name: string): void;\n}\n\nexport interface CookieOptions {\n domain?: string;\n path?: string;\n maxAge?: number;\n expires?: Date;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\nexport interface GeoData {\n city?: string;\n country?: string;\n countryCode?: string;\n region?: string;\n latitude?: number;\n longitude?: number;\n}\n\nexport type MiddlewareHandler = (\n request: MiddlewareRequest\n) => Promise<MiddlewareResponse | void> | MiddlewareResponse | void;\n\nexport type MiddlewareResponse = Response | NextResponse;\n\nexport interface MiddlewareConfig {\n matcher?: string | string[];\n}\n\n// ============================================================================\n// NEXT RESPONSE\n// ============================================================================\n\nexport class NextResponse extends Response {\n private _cookies: Map<string, { value: string; options?: CookieOptions }> = new Map();\n private _headers: Headers;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n super(body, init);\n this._headers = new Headers(init?.headers);\n }\n\n get cookies() {\n const self = this;\n return {\n set(name: string, value: string, options?: CookieOptions) {\n self._cookies.set(name, { value, options });\n self._headers.append('Set-Cookie', self._serializeCookie(name, value, options));\n },\n delete(name: string) {\n self._cookies.delete(name);\n self._headers.append('Set-Cookie', `${name}=; Max-Age=0; Path=/`);\n },\n get(name: string) {\n const cookie = self._cookies.get(name);\n return cookie ? { name, value: cookie.value } : undefined;\n },\n getAll() {\n return Array.from(self._cookies.entries()).map(([name, { value }]) => ({ name, value }));\n },\n };\n }\n\n private _serializeCookie(name: string, value: string, options?: CookieOptions): string {\n let cookie = `${name}=${encodeURIComponent(value)}`;\n \n if (options?.domain) cookie += `; Domain=${options.domain}`;\n if (options?.path) cookie += `; Path=${options.path}`;\n if (options?.maxAge) cookie += `; Max-Age=${options.maxAge}`;\n if (options?.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n if (options?.httpOnly) cookie += '; HttpOnly';\n if (options?.secure) cookie += '; Secure';\n if (options?.sameSite) cookie += `; SameSite=${options.sameSite}`;\n \n return cookie;\n }\n\n /**\n * Continue to the next middleware/handler\n */\n static next(init?: { request?: { headers?: Headers } }): NextResponse {\n const response = new NextResponse(null, { status: 200 });\n \n if (init?.request?.headers) {\n init.request.headers.forEach((value, key) => {\n response._headers.set(`x-middleware-request-${key}`, value);\n });\n }\n \n // Mark as \"continue\"\n response._headers.set('x-middleware-next', '1');\n \n return response;\n }\n\n /**\n * Redirect to a URL\n */\n static redirect(url: string | URL, status: 301 | 302 | 303 | 307 | 308 = 307): NextResponse {\n const urlString = typeof url === 'string' ? url : url.toString();\n return new NextResponse(null, {\n status,\n headers: { Location: urlString },\n });\n }\n\n /**\n * Rewrite to a different URL (internal redirect)\n */\n static rewrite(url: string | URL): NextResponse {\n const urlString = typeof url === 'string' ? url : url.toString();\n const response = new NextResponse(null, { status: 200 });\n response._headers.set('x-middleware-rewrite', urlString);\n return response;\n }\n\n /**\n * Return a JSON response\n */\n static json(data: unknown, init?: ResponseInit): NextResponse {\n const body = JSON.stringify(data);\n return new NextResponse(body, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n}\n\n// ============================================================================\n// MATCHER UTILITIES\n// ============================================================================\n\n/**\n * Convert matcher pattern to regex\n */\nfunction matcherToRegex(pattern: string): RegExp {\n // Handle special patterns\n if (pattern === '*') return /.*/;\n if (pattern === '/') return /^\\/$/;\n \n // Convert Next.js-style patterns to regex\n let regex = pattern\n // Escape special regex chars (except our patterns)\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n // Convert :param to named capture groups\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, '(?<$1>[^/]+)')\n // Convert * to match any characters\n .replace(/\\\\\\*/g, '.*')\n // Handle (group) for optional segments\n .replace(/\\\\\\(([^)]+)\\\\\\)/g, '($1)?');\n \n return new RegExp(`^${regex}$`);\n}\n\n/**\n * Check if path matches any of the patterns\n */\nfunction matchesPath(path: string, matcher?: string | string[]): boolean {\n if (!matcher) return true;\n \n const patterns = Array.isArray(matcher) ? matcher : [matcher];\n return patterns.some(pattern => matcherToRegex(pattern).test(path));\n}\n\n// ============================================================================\n// REQUEST PARSING\n// ============================================================================\n\nfunction parseCookies(cookieHeader: string): Map<string, string> {\n const cookies = new Map<string, string>();\n if (!cookieHeader) return cookies;\n \n cookieHeader.split(';').forEach(cookie => {\n const [name, ...valueParts] = cookie.trim().split('=');\n if (name) {\n cookies.set(name, valueParts.join('='));\n }\n });\n \n return cookies;\n}\n\nfunction createRequestCookies(cookieHeader: string): RequestCookies {\n const cookies = parseCookies(cookieHeader);\n const toSet: Map<string, { value: string; options?: CookieOptions }> = new Map();\n const toDelete: Set<string> = new Set();\n \n return {\n get(name: string) {\n if (toDelete.has(name)) return undefined;\n const value = toSet.get(name)?.value ?? cookies.get(name);\n return value ? { name, value } : undefined;\n },\n getAll() {\n const result: Array<{ name: string; value: string }> = [];\n \n cookies.forEach((value, name) => {\n if (!toDelete.has(name) && !toSet.has(name)) {\n result.push({ name, value });\n }\n });\n \n toSet.forEach(({ value }, name) => {\n result.push({ name, value });\n });\n \n return result;\n },\n has(name: string) {\n if (toDelete.has(name)) return false;\n return toSet.has(name) || cookies.has(name);\n },\n set(name: string, value: string, options?: CookieOptions) {\n toDelete.delete(name);\n toSet.set(name, { value, options });\n },\n delete(name: string) {\n toSet.delete(name);\n toDelete.add(name);\n },\n };\n}\n\nfunction createNextUrl(url: URL, basePath: string = ''): NextURL {\n return {\n href: url.href,\n origin: url.origin,\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port,\n pathname: url.pathname,\n searchParams: url.searchParams,\n search: url.search,\n hash: url.hash,\n basePath,\n locale: undefined,\n clone() {\n return createNextUrl(new URL(url.href), basePath);\n },\n };\n}\n\n// ============================================================================\n// MIDDLEWARE RUNNER\n// ============================================================================\n\nexport interface MiddlewareDefinition {\n handler: MiddlewareHandler;\n config?: MiddlewareConfig;\n}\n\nconst middlewareStack: MiddlewareDefinition[] = [];\n\n/**\n * Register a middleware\n */\nexport function registerMiddleware(\n handler: MiddlewareHandler,\n config?: MiddlewareConfig\n): void {\n middlewareStack.push({ handler, config });\n}\n\n/**\n * Clear all middleware\n */\nexport function clearMiddleware(): void {\n middlewareStack.length = 0;\n}\n\n/**\n * Create middleware handler for server integration\n */\nexport function createMiddlewareHandler(\n middlewares?: MiddlewareDefinition[]\n) {\n const stack = middlewares || middlewareStack;\n \n return async (\n req: IncomingMessage,\n res: ServerResponse,\n next: () => void\n ): Promise<void> => {\n const protocol = (req.socket as any).encrypted ? 'https' : 'http';\n const host = req.headers.host || 'localhost';\n const urlString = req.url || '/';\n const url = new URL(urlString, `${protocol}://${host}`);\n \n // Create middleware request\n const headers = new Headers();\n Object.entries(req.headers).forEach(([key, value]) => {\n if (value) {\n headers.set(key, Array.isArray(value) ? value.join(', ') : value);\n }\n });\n \n const request = new Request(url.href, {\n method: req.method,\n headers,\n });\n \n const middlewareReq: MiddlewareRequest = {\n method: req.method || 'GET',\n url: urlString,\n nextUrl: createNextUrl(url),\n headers,\n cookies: createRequestCookies(req.headers.cookie || ''),\n ip: (req.socket.remoteAddress || '').replace('::ffff:', ''),\n request,\n };\n \n // Run middleware stack\n for (const { handler, config } of stack) {\n // Check if path matches\n if (!matchesPath(url.pathname, config?.matcher)) {\n continue;\n }\n \n try {\n const result = await handler(middlewareReq);\n \n if (!result) {\n continue; // No response, continue to next middleware\n }\n \n // Check for special headers\n const middlewareHeaders = result.headers;\n \n // Handle \"next\" (continue)\n if (middlewareHeaders.get('x-middleware-next')) {\n continue;\n }\n \n // Handle rewrite\n const rewriteUrl = middlewareHeaders.get('x-middleware-rewrite');\n if (rewriteUrl) {\n // Update request URL for downstream handlers\n (req as any).url = rewriteUrl;\n continue;\n }\n \n // Handle redirect\n if (result.status >= 300 && result.status < 400) {\n const location = middlewareHeaders.get('Location');\n if (location) {\n res.setHeader('Location', location);\n res.statusCode = result.status;\n res.end();\n return;\n }\n }\n \n // Handle response\n if (result.body || result.status !== 200) {\n res.statusCode = result.status;\n \n result.headers.forEach((value, key) => {\n if (!key.startsWith('x-middleware-')) {\n res.setHeader(key, value);\n }\n });\n \n if (result.body) {\n const body = await result.text();\n res.end(body);\n } else {\n res.end();\n }\n return;\n }\n } catch (error) {\n console.error('Middleware error:', error);\n res.statusCode = 500;\n res.end('Internal Server Error');\n return;\n }\n }\n \n // No middleware blocked, continue\n next();\n };\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport const middleware = {\n register: registerMiddleware,\n clear: clearMiddleware,\n handler: createMiddlewareHandler,\n NextResponse,\n};\n\n/**\n * Shorthand for common middleware patterns\n */\nexport const middlewareHelpers = {\n /**\n * Basic auth middleware\n */\n basicAuth(username: string, password: string): MiddlewareHandler {\n return (req) => {\n const authHeader = req.headers.get('authorization');\n \n if (!authHeader || !authHeader.startsWith('Basic ')) {\n return new NextResponse('Unauthorized', {\n status: 401,\n headers: { 'WWW-Authenticate': 'Basic realm=\"Secure Area\"' },\n });\n }\n \n const credentials = atob(authHeader.slice(6));\n const [user, pass] = credentials.split(':');\n \n if (user !== username || pass !== password) {\n return new NextResponse('Invalid credentials', { status: 401 });\n }\n \n return NextResponse.next();\n };\n },\n \n /**\n * CORS middleware\n */\n cors(options: {\n origin?: string | string[];\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n } = {}): MiddlewareHandler {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n headers = ['Content-Type', 'Authorization'],\n credentials = false,\n } = options;\n \n return (req) => {\n const response = NextResponse.next();\n \n const requestOrigin = req.headers.get('origin');\n const allowedOrigin = Array.isArray(origin)\n ? (origin.includes(requestOrigin || '') ? requestOrigin : origin[0])\n : origin;\n \n response.headers.set('Access-Control-Allow-Origin', allowedOrigin || '*');\n response.headers.set('Access-Control-Allow-Methods', methods.join(', '));\n response.headers.set('Access-Control-Allow-Headers', headers.join(', '));\n \n if (credentials) {\n response.headers.set('Access-Control-Allow-Credentials', 'true');\n }\n \n // Handle preflight\n if (req.method === 'OPTIONS') {\n return new NextResponse(null, {\n status: 204,\n headers: response.headers,\n });\n }\n \n return response;\n };\n },\n \n /**\n * Rate limiting middleware\n */\n rateLimit(options: {\n limit: number;\n window: number; // seconds\n }): MiddlewareHandler {\n const { limit, window } = options;\n const requests = new Map<string, { count: number; resetAt: number }>();\n \n return (req) => {\n const ip = req.ip || 'unknown';\n const now = Date.now();\n \n let record = requests.get(ip);\n \n if (!record || record.resetAt < now) {\n record = { count: 0, resetAt: now + window * 1000 };\n requests.set(ip, record);\n }\n \n record.count++;\n \n if (record.count > limit) {\n return NextResponse.json(\n { error: 'Too many requests' },\n { \n status: 429,\n headers: {\n 'Retry-After': String(Math.ceil((record.resetAt - now) / 1000)),\n },\n }\n );\n }\n \n const response = NextResponse.next();\n response.headers.set('X-RateLimit-Limit', String(limit));\n response.headers.set('X-RateLimit-Remaining', String(limit - record.count));\n response.headers.set('X-RateLimit-Reset', String(Math.ceil(record.resetAt / 1000)));\n \n return response;\n };\n },\n \n /**\n * Redirect trailing slashes\n */\n trailingSlash(add: boolean = false): MiddlewareHandler {\n return (req) => {\n const path = req.nextUrl.pathname;\n \n if (path === '/') return NextResponse.next();\n \n const hasSlash = path.endsWith('/');\n \n if (add && !hasSlash) {\n return NextResponse.redirect(new URL(path + '/', req.request.url));\n }\n \n if (!add && hasSlash) {\n return NextResponse.redirect(new URL(path.slice(0, -1), req.request.url));\n }\n \n return NextResponse.next();\n };\n },\n};\n","/**\n * Float.js - Static Site Generation (SSG) & Incremental Static Regeneration (ISR)\n * \n * Built-in static generation with automatic revalidation.\n * Simpler API than Next.js with more flexibility.\n */\n\nimport { createHash } from 'crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from 'fs';\nimport { join, dirname } from 'path';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface StaticPath {\n params: Record<string, string | string[]>;\n locale?: string;\n}\n\nexport interface GetStaticPathsResult {\n paths: StaticPath[];\n fallback: boolean | 'blocking';\n}\n\nexport interface GetStaticPropsContext<P = Record<string, string>> {\n params: P;\n locale?: string;\n defaultLocale?: string;\n preview?: boolean;\n previewData?: unknown;\n}\n\nexport interface GetStaticPropsResult<T = unknown> {\n props: T;\n revalidate?: number | false;\n notFound?: boolean;\n redirect?: {\n destination: string;\n permanent?: boolean;\n statusCode?: 301 | 302 | 303 | 307 | 308;\n };\n}\n\nexport interface CachedPage {\n html: string;\n props: unknown;\n generatedAt: number;\n revalidateAfter: number | null;\n etag: string;\n headers?: Record<string, string>;\n}\n\nexport interface SSGConfig {\n /** Directory to store generated pages */\n outDir: string;\n /** Default revalidation time in seconds */\n defaultRevalidate: number;\n /** Enable stale-while-revalidate */\n staleWhileRevalidate: boolean;\n /** Max pages in memory cache */\n maxMemoryCacheSize: number;\n /** Custom render function */\n renderPage?: (component: unknown, props: unknown) => Promise<string>;\n /** Compression for stored pages */\n compression: boolean;\n}\n\nexport interface GenerateResult {\n path: string;\n success: boolean;\n error?: Error;\n duration: number;\n size: number;\n revalidateAt?: Date;\n}\n\nexport interface ISRState {\n revalidating: Set<string>;\n scheduled: Map<string, NodeJS.Timeout>;\n lastRevalidation: Map<string, number>;\n}\n\n// ============================================================================\n// DEFAULT CONFIG\n// ============================================================================\n\nconst DEFAULT_CONFIG: SSGConfig = {\n outDir: '.float/static',\n defaultRevalidate: 60,\n staleWhileRevalidate: true,\n maxMemoryCacheSize: 100,\n compression: false\n};\n\n// ============================================================================\n// SSG ENGINE\n// ============================================================================\n\nexport class SSGEngine {\n private config: SSGConfig;\n private memoryCache: Map<string, CachedPage> = new Map();\n private diskCachePath: string;\n private isrState: ISRState = {\n revalidating: new Set(),\n scheduled: new Map(),\n lastRevalidation: new Map()\n };\n\n constructor(config: Partial<SSGConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.diskCachePath = join(process.cwd(), this.config.outDir);\n this.ensureCacheDir();\n }\n\n private ensureCacheDir(): void {\n if (!existsSync(this.diskCachePath)) {\n mkdirSync(this.diskCachePath, { recursive: true });\n }\n }\n\n private getCacheKey(path: string, locale?: string): string {\n const normalized = path.replace(/^\\/+|\\/+$/g, '') || 'index';\n const key = locale ? `${locale}/${normalized}` : normalized;\n return key.replace(/\\//g, '__');\n }\n\n private getEtag(content: string): string {\n return createHash('md5').update(content).digest('hex').slice(0, 16);\n }\n\n private getCacheFilePath(cacheKey: string): string {\n return join(this.diskCachePath, `${cacheKey}.json`);\n }\n\n /**\n * Generate static page and cache it\n */\n async generatePage<P = unknown>(\n path: string,\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n params: Record<string, string> = {},\n locale?: string\n ): Promise<GenerateResult> {\n const startTime = Date.now();\n const cacheKey = this.getCacheKey(path, locale);\n\n try {\n // Get props\n const propsResult = await getStaticProps({\n params,\n locale,\n preview: false\n });\n\n // Handle redirect/notFound\n if (propsResult.redirect) {\n return {\n path,\n success: true,\n duration: Date.now() - startTime,\n size: 0\n };\n }\n\n if (propsResult.notFound) {\n return {\n path,\n success: false,\n duration: Date.now() - startTime,\n size: 0,\n error: new Error('Page not found')\n };\n }\n\n // Render HTML\n const html = await render(propsResult.props);\n const etag = this.getEtag(html);\n\n // Calculate revalidation\n const revalidate = propsResult.revalidate ?? this.config.defaultRevalidate;\n const revalidateAfter = revalidate === false \n ? null \n : Date.now() + (revalidate * 1000);\n\n // Create cached page\n const cachedPage: CachedPage = {\n html,\n props: propsResult.props,\n generatedAt: Date.now(),\n revalidateAfter,\n etag,\n headers: {\n 'Cache-Control': revalidate === false\n ? 'public, max-age=31536000, immutable'\n : `public, s-maxage=${revalidate}, stale-while-revalidate=${revalidate * 2}`\n }\n };\n\n // Store in memory cache (with LRU eviction)\n this.setMemoryCache(cacheKey, cachedPage);\n\n // Store on disk\n this.writeToDisk(cacheKey, cachedPage);\n\n return {\n path,\n success: true,\n duration: Date.now() - startTime,\n size: html.length,\n revalidateAt: revalidateAfter ? new Date(revalidateAfter) : undefined\n };\n\n } catch (error) {\n return {\n path,\n success: false,\n duration: Date.now() - startTime,\n size: 0,\n error: error instanceof Error ? error : new Error(String(error))\n };\n }\n }\n\n /**\n * Get cached page or generate on-demand\n */\n async getPage<P = unknown>(\n path: string,\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n params: Record<string, string> = {},\n locale?: string,\n fallback: boolean | 'blocking' = false\n ): Promise<{ cached: CachedPage; stale: boolean } | null> {\n const cacheKey = this.getCacheKey(path, locale);\n\n // Try memory cache first\n let cached = this.memoryCache.get(cacheKey);\n\n // Try disk cache if not in memory\n if (!cached) {\n cached = this.readFromDisk(cacheKey) || undefined;\n if (cached) {\n this.setMemoryCache(cacheKey, cached);\n }\n }\n\n // If we have a cached page\n if (cached) {\n const isStale = cached.revalidateAfter !== null && \n Date.now() > cached.revalidateAfter;\n\n // If stale and SWR enabled, trigger background revalidation\n if (isStale && this.config.staleWhileRevalidate) {\n this.triggerRevalidation(path, getStaticProps, render, params, locale);\n }\n\n return { cached, stale: isStale };\n }\n\n // No cached page - handle fallback\n if (fallback === false) {\n return null; // 404\n }\n\n // Generate on-demand (blocking or non-blocking)\n if (fallback === 'blocking') {\n const result = await this.generatePage(path, getStaticProps, render, params, locale);\n if (result.success) {\n const newCached = this.memoryCache.get(cacheKey);\n return newCached ? { cached: newCached, stale: false } : null;\n }\n }\n\n return null;\n }\n\n /**\n * Trigger ISR revalidation in background\n */\n private async triggerRevalidation<P = unknown>(\n path: string,\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n params: Record<string, string> = {},\n locale?: string\n ): Promise<void> {\n const cacheKey = this.getCacheKey(path, locale);\n\n // Prevent concurrent revalidation\n if (this.isrState.revalidating.has(cacheKey)) {\n return;\n }\n\n this.isrState.revalidating.add(cacheKey);\n\n try {\n await this.generatePage(path, getStaticProps, render, params, locale);\n this.isrState.lastRevalidation.set(cacheKey, Date.now());\n } finally {\n this.isrState.revalidating.delete(cacheKey);\n }\n }\n\n /**\n * Force revalidation of a path (On-Demand ISR)\n */\n async revalidate<P = unknown>(\n path: string,\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n params: Record<string, string> = {},\n locale?: string\n ): Promise<{ revalidated: boolean; error?: string }> {\n try {\n const result = await this.generatePage(path, getStaticProps, render, params, locale);\n return { revalidated: result.success, error: result.error?.message };\n } catch (error) {\n return { \n revalidated: false, \n error: error instanceof Error ? error.message : 'Unknown error' \n };\n }\n }\n\n /**\n * Batch generate multiple pages\n */\n async generatePaths<P = unknown>(\n paths: StaticPath[],\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<P>>,\n render: (props: P) => Promise<string>,\n concurrency: number = 5\n ): Promise<GenerateResult[]> {\n const results: GenerateResult[] = [];\n const queue = [...paths];\n\n const worker = async () => {\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) break;\n\n const pathStr = this.buildPath(item.params);\n const result = await this.generatePage(\n pathStr,\n getStaticProps,\n render,\n item.params as Record<string, string>,\n item.locale\n );\n results.push(result);\n }\n };\n\n // Run workers in parallel\n const workers = Array(Math.min(concurrency, paths.length))\n .fill(null)\n .map(() => worker());\n\n await Promise.all(workers);\n\n return results;\n }\n\n private buildPath(params: Record<string, string | string[]>): string {\n return '/' + Object.values(params)\n .map(v => Array.isArray(v) ? v.join('/') : v)\n .join('/');\n }\n\n /**\n * Memory cache with LRU eviction\n */\n private setMemoryCache(key: string, page: CachedPage): void {\n // Evict if at capacity\n if (this.memoryCache.size >= this.config.maxMemoryCacheSize) {\n const firstKey = this.memoryCache.keys().next().value;\n if (firstKey) {\n this.memoryCache.delete(firstKey);\n }\n }\n\n // Delete and re-add to maintain LRU order\n this.memoryCache.delete(key);\n this.memoryCache.set(key, page);\n }\n\n /**\n * Write cached page to disk\n */\n private writeToDisk(cacheKey: string, page: CachedPage): void {\n try {\n const filePath = this.getCacheFilePath(cacheKey);\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(page));\n } catch {\n // Silently fail disk writes\n }\n }\n\n /**\n * Read cached page from disk\n */\n private readFromDisk(cacheKey: string): CachedPage | null {\n try {\n const filePath = this.getCacheFilePath(cacheKey);\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // Silently fail disk reads\n }\n return null;\n }\n\n /**\n * Clear all caches\n */\n clearCache(): void {\n this.memoryCache.clear();\n \n // Clear scheduled revalidations\n for (const timeout of this.isrState.scheduled.values()) {\n clearTimeout(timeout);\n }\n this.isrState.scheduled.clear();\n this.isrState.lastRevalidation.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): {\n memoryPages: number;\n diskPages: number;\n revalidating: number;\n lastRevalidations: Record<string, Date>;\n } {\n let diskPages = 0;\n try {\n if (existsSync(this.diskCachePath)) {\n diskPages = readdirSync(this.diskCachePath)\n .filter(f => f.endsWith('.json')).length;\n }\n } catch {\n // Ignore\n }\n\n return {\n memoryPages: this.memoryCache.size,\n diskPages,\n revalidating: this.isrState.revalidating.size,\n lastRevalidations: Object.fromEntries(\n Array.from(this.isrState.lastRevalidation.entries())\n .map(([k, v]) => [k, new Date(v)])\n )\n };\n }\n\n /**\n * Purge stale pages from disk\n */\n purgeStale(): number {\n let purged = 0;\n\n try {\n if (!existsSync(this.diskCachePath)) return 0;\n\n const files = readdirSync(this.diskCachePath)\n .filter(f => f.endsWith('.json'));\n\n for (const file of files) {\n const filePath = join(this.diskCachePath, file);\n try {\n const content = readFileSync(filePath, 'utf-8');\n const page: CachedPage = JSON.parse(content);\n \n if (page.revalidateAfter !== null && Date.now() > page.revalidateAfter) {\n unlinkSync(filePath);\n purged++;\n }\n } catch {\n // Invalid file, remove it\n unlinkSync(filePath);\n purged++;\n }\n }\n } catch {\n // Ignore\n }\n\n return purged;\n }\n}\n\n// ============================================================================\n// HELPER FUNCTIONS (like getStaticPaths, getStaticProps)\n// ============================================================================\n\n/**\n * Define static paths for dynamic routes\n */\nexport function defineStaticPaths<_P extends StaticPath = StaticPath>(\n fn: () => Promise<GetStaticPathsResult> | GetStaticPathsResult\n): () => Promise<GetStaticPathsResult> {\n return async () => {\n const result = await fn();\n return result;\n };\n}\n\n/**\n * Define static props for a page\n */\nexport function defineStaticProps<P = unknown, Params = Record<string, string>>(\n fn: (ctx: GetStaticPropsContext<Params>) => Promise<GetStaticPropsResult<P>> | GetStaticPropsResult<P>\n): (ctx: GetStaticPropsContext<Params>) => Promise<GetStaticPropsResult<P>> {\n return async (ctx) => {\n const result = await fn(ctx);\n return result;\n };\n}\n\n// ============================================================================\n// SINGLETON & EXPORTS\n// ============================================================================\n\nlet ssgEngine: SSGEngine | null = null;\n\n/**\n * Get or create SSG engine instance\n */\nexport function getSSGEngine(config?: Partial<SSGConfig>): SSGEngine {\n if (!ssgEngine) {\n ssgEngine = new SSGEngine(config);\n }\n return ssgEngine;\n}\n\n/**\n * Configure SSG engine\n */\nexport function configureSSG(config: Partial<SSGConfig>): SSGEngine {\n ssgEngine = new SSGEngine(config);\n return ssgEngine;\n}\n\n// ============================================================================\n// REQUEST HANDLER\n// ============================================================================\n\nexport interface SSGHandlerOptions {\n getStaticPaths?: () => Promise<GetStaticPathsResult>;\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult>;\n render: (props: unknown) => Promise<string>;\n fallback?: boolean | 'blocking';\n}\n\n/**\n * Create SSG request handler\n */\nexport function createSSGHandler(options: SSGHandlerOptions) {\n const engine = getSSGEngine();\n\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url);\n const path = url.pathname;\n \n // Extract params from path (simplified)\n const params: Record<string, string> = {};\n\n // Try to get cached page\n const result = await engine.getPage(\n path,\n options.getStaticProps as (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<unknown>>,\n options.render,\n params,\n undefined,\n options.fallback ?? false\n );\n\n if (!result) {\n return new Response('Not Found', { status: 404 });\n }\n\n // Check ETag for conditional request\n const ifNoneMatch = req.headers.get('If-None-Match');\n if (ifNoneMatch === result.cached.etag) {\n return new Response(null, { status: 304 });\n }\n\n // Return cached HTML\n return new Response(result.cached.html, {\n status: 200,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'ETag': result.cached.etag,\n 'X-Float-Generated': new Date(result.cached.generatedAt).toISOString(),\n 'X-Float-Stale': result.stale ? 'true' : 'false',\n ...result.cached.headers\n }\n });\n };\n}\n\n// ============================================================================\n// REVALIDATION API\n// ============================================================================\n\nexport interface RevalidateAPIOptions {\n secret?: string;\n getStaticProps: (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult>;\n render: (props: unknown) => Promise<string>;\n}\n\n/**\n * Create on-demand revalidation API handler\n */\nexport function createRevalidateHandler(options: RevalidateAPIOptions) {\n const engine = getSSGEngine();\n\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url);\n \n // Validate secret if configured\n if (options.secret) {\n const providedSecret = url.searchParams.get('secret');\n if (providedSecret !== options.secret) {\n return new Response(JSON.stringify({ error: 'Invalid token' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n }\n\n // Get path to revalidate\n const pathToRevalidate = url.searchParams.get('path');\n if (!pathToRevalidate) {\n return new Response(JSON.stringify({ error: 'Missing path parameter' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n // Trigger revalidation\n const result = await engine.revalidate(\n pathToRevalidate,\n options.getStaticProps as (ctx: GetStaticPropsContext) => Promise<GetStaticPropsResult<unknown>>,\n options.render\n );\n\n return new Response(JSON.stringify(result), {\n status: result.revalidated ? 200 : 500,\n headers: { 'Content-Type': 'application/json' }\n });\n };\n}\n\n// ============================================================================\n// MAIN EXPORT\n// ============================================================================\n\nexport const ssg = {\n engine: getSSGEngine,\n configure: configureSSG,\n defineStaticPaths,\n defineStaticProps,\n createHandler: createSSGHandler,\n createRevalidateHandler\n};\n\nexport default ssg;\n","/**\n * Float.js - Built-in Analytics\n * \n * Zero-config privacy-focused analytics built into the framework.\n * No external dependencies, no cookies, GDPR-compliant by default.\n */\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface PageView {\n id: string;\n timestamp: number;\n pathname: string;\n referrer?: string;\n userAgent?: string;\n country?: string;\n device: 'desktop' | 'mobile' | 'tablet' | 'unknown';\n browser: string;\n os: string;\n sessionId: string;\n duration?: number;\n}\n\nexport interface WebVitals {\n id: string;\n timestamp: number;\n pathname: string;\n metrics: {\n FCP?: number; // First Contentful Paint\n LCP?: number; // Largest Contentful Paint\n FID?: number; // First Input Delay\n CLS?: number; // Cumulative Layout Shift\n TTFB?: number; // Time to First Byte\n INP?: number; // Interaction to Next Paint\n };\n}\n\nexport interface CustomEvent {\n id: string;\n timestamp: number;\n name: string;\n pathname: string;\n properties?: Record<string, string | number | boolean>;\n sessionId: string;\n}\n\nexport interface AnalyticsData {\n pageviews: PageView[];\n vitals: WebVitals[];\n events: CustomEvent[];\n}\n\nexport interface AnalyticsConfig {\n /** Enable/disable analytics */\n enabled: boolean;\n /** Ignore paths (regex patterns) */\n ignorePaths: (string | RegExp)[];\n /** Max events in memory before flush */\n maxBufferSize: number;\n /** Flush interval in ms */\n flushInterval: number;\n /** Custom event handler */\n onFlush?: (data: AnalyticsData) => Promise<void>;\n /** Hash IP addresses for privacy */\n hashIPs: boolean;\n /** Track web vitals */\n trackVitals: boolean;\n /** Session timeout in minutes */\n sessionTimeout: number;\n /** GeoIP lookup */\n geoIP: boolean;\n}\n\nexport interface AnalyticsSummary {\n period: { start: Date; end: Date };\n pageviews: {\n total: number;\n unique: number;\n byPath: Record<string, number>;\n byReferrer: Record<string, number>;\n byDevice: Record<string, number>;\n byBrowser: Record<string, number>;\n byCountry: Record<string, number>;\n };\n vitals: {\n avgFCP: number;\n avgLCP: number;\n avgFID: number;\n avgCLS: number;\n avgTTFB: number;\n p75LCP: number;\n p75FID: number;\n p75CLS: number;\n };\n events: {\n total: number;\n byName: Record<string, number>;\n };\n sessions: {\n total: number;\n avgDuration: number;\n bounceRate: number;\n };\n}\n\n// ============================================================================\n// DEFAULT CONFIG\n// ============================================================================\n\nconst DEFAULT_CONFIG: AnalyticsConfig = {\n enabled: true,\n ignorePaths: [/^\\/__float/, /^\\/api\\//, /\\.(ico|png|jpg|css|js)$/],\n maxBufferSize: 100,\n flushInterval: 30000, // 30 seconds\n hashIPs: true,\n trackVitals: true,\n sessionTimeout: 30, // minutes\n geoIP: false\n};\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15) + \n Math.random().toString(36).substring(2, 15);\n}\n\nfunction hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n\nfunction parseUserAgent(ua?: string): { device: PageView['device']; browser: string; os: string } {\n if (!ua) {\n return { device: 'unknown', browser: 'Unknown', os: 'Unknown' };\n }\n\n // Device detection\n let device: PageView['device'] = 'desktop';\n if (/Mobile|Android.*Mobile|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua)) {\n device = 'mobile';\n } else if (/iPad|Android(?!.*Mobile)|Tablet/i.test(ua)) {\n device = 'tablet';\n }\n\n // Browser detection\n let browser = 'Unknown';\n if (/Firefox/i.test(ua)) browser = 'Firefox';\n else if (/Edg/i.test(ua)) browser = 'Edge';\n else if (/Chrome/i.test(ua)) browser = 'Chrome';\n else if (/Safari/i.test(ua)) browser = 'Safari';\n else if (/Opera|OPR/i.test(ua)) browser = 'Opera';\n\n // OS detection\n let os = 'Unknown';\n if (/Windows/i.test(ua)) os = 'Windows';\n else if (/Mac OS X/i.test(ua)) os = 'macOS';\n else if (/Linux/i.test(ua)) os = 'Linux';\n else if (/Android/i.test(ua)) os = 'Android';\n else if (/iOS|iPhone|iPad/i.test(ua)) os = 'iOS';\n\n return { device, browser, os };\n}\n\nfunction percentile(arr: number[], p: number): number {\n if (arr.length === 0) return 0;\n const sorted = [...arr].sort((a, b) => a - b);\n const index = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, index)];\n}\n\n// ============================================================================\n// ANALYTICS ENGINE\n// ============================================================================\n\nexport class AnalyticsEngine {\n private config: AnalyticsConfig;\n private buffer: AnalyticsData = {\n pageviews: [],\n vitals: [],\n events: []\n };\n private flushTimer: NodeJS.Timeout | null = null;\n private sessions: Map<string, { lastActivity: number; views: number }> = new Map();\n private allData: AnalyticsData = {\n pageviews: [],\n vitals: [],\n events: []\n };\n\n constructor(config: Partial<AnalyticsConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.startFlushTimer();\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) clearInterval(this.flushTimer);\n \n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.config.flushInterval);\n }\n\n private shouldIgnore(pathname: string): boolean {\n return this.config.ignorePaths.some(pattern => {\n if (typeof pattern === 'string') {\n return pathname.startsWith(pattern);\n }\n return pattern.test(pathname);\n });\n }\n\n private getOrCreateSession(ip: string): string {\n const sessionKey = this.config.hashIPs ? hashString(ip) : ip;\n const existing = this.sessions.get(sessionKey);\n const now = Date.now();\n const timeout = this.config.sessionTimeout * 60 * 1000;\n\n if (existing && (now - existing.lastActivity) < timeout) {\n existing.lastActivity = now;\n existing.views++;\n return sessionKey;\n }\n\n this.sessions.set(sessionKey, { lastActivity: now, views: 1 });\n return sessionKey;\n }\n\n /**\n * Track a page view\n */\n trackPageview(req: Request, options: { country?: string } = {}): PageView | null {\n if (!this.config.enabled) return null;\n\n const url = new URL(req.url);\n \n if (this.shouldIgnore(url.pathname)) return null;\n\n const ip = req.headers.get('x-forwarded-for')?.split(',')[0] || \n req.headers.get('x-real-ip') || \n 'unknown';\n const userAgent = req.headers.get('user-agent') || undefined;\n const { device, browser, os } = parseUserAgent(userAgent);\n const sessionId = this.getOrCreateSession(ip);\n\n const pageview: PageView = {\n id: generateId(),\n timestamp: Date.now(),\n pathname: url.pathname,\n referrer: req.headers.get('referer') || undefined,\n userAgent: userAgent?.substring(0, 200), // Truncate for storage\n country: options.country,\n device,\n browser,\n os,\n sessionId\n };\n\n this.buffer.pageviews.push(pageview);\n this.checkBufferSize();\n\n return pageview;\n }\n\n /**\n * Track Web Vitals\n */\n trackVitals(pathname: string, metrics: WebVitals['metrics']): WebVitals | null {\n if (!this.config.enabled || !this.config.trackVitals) return null;\n\n const vitals: WebVitals = {\n id: generateId(),\n timestamp: Date.now(),\n pathname,\n metrics\n };\n\n this.buffer.vitals.push(vitals);\n this.checkBufferSize();\n\n return vitals;\n }\n\n /**\n * Track custom event\n */\n trackEvent(\n name: string, \n properties?: Record<string, string | number | boolean>,\n req?: Request\n ): CustomEvent | null {\n if (!this.config.enabled) return null;\n\n let pathname = '/';\n let sessionId = generateId();\n\n if (req) {\n const url = new URL(req.url);\n pathname = url.pathname;\n \n const ip = req.headers.get('x-forwarded-for')?.split(',')[0] || \n req.headers.get('x-real-ip') || \n 'unknown';\n sessionId = this.getOrCreateSession(ip);\n }\n\n const event: CustomEvent = {\n id: generateId(),\n timestamp: Date.now(),\n name,\n pathname,\n properties,\n sessionId\n };\n\n this.buffer.events.push(event);\n this.checkBufferSize();\n\n return event;\n }\n\n private checkBufferSize(): void {\n const totalSize = this.buffer.pageviews.length + \n this.buffer.vitals.length + \n this.buffer.events.length;\n \n if (totalSize >= this.config.maxBufferSize) {\n this.flush();\n }\n }\n\n /**\n * Flush buffer to storage/handler\n */\n async flush(): Promise<void> {\n if (this.buffer.pageviews.length === 0 && \n this.buffer.vitals.length === 0 && \n this.buffer.events.length === 0) {\n return;\n }\n\n const dataToFlush = { ...this.buffer };\n \n // Reset buffer\n this.buffer = { pageviews: [], vitals: [], events: [] };\n\n // Add to all data for summary\n this.allData.pageviews.push(...dataToFlush.pageviews);\n this.allData.vitals.push(...dataToFlush.vitals);\n this.allData.events.push(...dataToFlush.events);\n\n // Limit stored data (keep last 10000 of each)\n if (this.allData.pageviews.length > 10000) {\n this.allData.pageviews = this.allData.pageviews.slice(-10000);\n }\n if (this.allData.vitals.length > 10000) {\n this.allData.vitals = this.allData.vitals.slice(-10000);\n }\n if (this.allData.events.length > 10000) {\n this.allData.events = this.allData.events.slice(-10000);\n }\n\n // Call custom handler if provided\n if (this.config.onFlush) {\n await this.config.onFlush(dataToFlush);\n }\n }\n\n /**\n * Get analytics summary\n */\n getSummary(startDate?: Date, endDate?: Date): AnalyticsSummary {\n const start = startDate?.getTime() || Date.now() - (7 * 24 * 60 * 60 * 1000); // Last 7 days\n const end = endDate?.getTime() || Date.now();\n\n // Filter by date range\n const pageviews = this.allData.pageviews.filter(\n pv => pv.timestamp >= start && pv.timestamp <= end\n );\n const vitals = this.allData.vitals.filter(\n v => v.timestamp >= start && v.timestamp <= end\n );\n const events = this.allData.events.filter(\n e => e.timestamp >= start && e.timestamp <= end\n );\n\n // Calculate pageview stats\n const uniqueSessions = new Set(pageviews.map(pv => pv.sessionId));\n const byPath: Record<string, number> = {};\n const byReferrer: Record<string, number> = {};\n const byDevice: Record<string, number> = {};\n const byBrowser: Record<string, number> = {};\n const byCountry: Record<string, number> = {};\n\n for (const pv of pageviews) {\n byPath[pv.pathname] = (byPath[pv.pathname] || 0) + 1;\n if (pv.referrer) {\n try {\n const ref = new URL(pv.referrer).hostname;\n byReferrer[ref] = (byReferrer[ref] || 0) + 1;\n } catch {\n byReferrer['direct'] = (byReferrer['direct'] || 0) + 1;\n }\n } else {\n byReferrer['direct'] = (byReferrer['direct'] || 0) + 1;\n }\n byDevice[pv.device] = (byDevice[pv.device] || 0) + 1;\n byBrowser[pv.browser] = (byBrowser[pv.browser] || 0) + 1;\n if (pv.country) {\n byCountry[pv.country] = (byCountry[pv.country] || 0) + 1;\n }\n }\n\n // Calculate vitals averages\n const fcpValues = vitals.filter(v => v.metrics.FCP).map(v => v.metrics.FCP!);\n const lcpValues = vitals.filter(v => v.metrics.LCP).map(v => v.metrics.LCP!);\n const fidValues = vitals.filter(v => v.metrics.FID).map(v => v.metrics.FID!);\n const clsValues = vitals.filter(v => v.metrics.CLS).map(v => v.metrics.CLS!);\n const ttfbValues = vitals.filter(v => v.metrics.TTFB).map(v => v.metrics.TTFB!);\n\n const avg = (arr: number[]) => arr.length ? arr.reduce((a, b) => a + b, 0) / arr.length : 0;\n\n // Calculate session stats\n const sessionViews = new Map<string, number>();\n for (const pv of pageviews) {\n sessionViews.set(pv.sessionId, (sessionViews.get(pv.sessionId) || 0) + 1);\n }\n const bounces = Array.from(sessionViews.values()).filter(v => v === 1).length;\n const bounceRate = sessionViews.size > 0 ? (bounces / sessionViews.size) * 100 : 0;\n\n // Calculate event stats\n const byEventName: Record<string, number> = {};\n for (const e of events) {\n byEventName[e.name] = (byEventName[e.name] || 0) + 1;\n }\n\n return {\n period: { start: new Date(start), end: new Date(end) },\n pageviews: {\n total: pageviews.length,\n unique: uniqueSessions.size,\n byPath,\n byReferrer,\n byDevice,\n byBrowser,\n byCountry\n },\n vitals: {\n avgFCP: Math.round(avg(fcpValues)),\n avgLCP: Math.round(avg(lcpValues)),\n avgFID: Math.round(avg(fidValues)),\n avgCLS: Number(avg(clsValues).toFixed(3)),\n avgTTFB: Math.round(avg(ttfbValues)),\n p75LCP: Math.round(percentile(lcpValues, 75)),\n p75FID: Math.round(percentile(fidValues, 75)),\n p75CLS: Number(percentile(clsValues, 75).toFixed(3))\n },\n events: {\n total: events.length,\n byName: byEventName\n },\n sessions: {\n total: uniqueSessions.size,\n avgDuration: 0, // Would need page durations\n bounceRate: Number(bounceRate.toFixed(1))\n }\n };\n }\n\n /**\n * Get real-time stats (last 5 minutes)\n */\n getRealtime(): {\n activeUsers: number;\n pageviews: number;\n topPages: Array<{ path: string; count: number }>;\n } {\n const fiveMinutesAgo = Date.now() - (5 * 60 * 1000);\n \n const recentPageviews = this.allData.pageviews.filter(\n pv => pv.timestamp >= fiveMinutesAgo\n );\n\n const activeSessions = new Set(recentPageviews.map(pv => pv.sessionId));\n \n const pathCounts: Record<string, number> = {};\n for (const pv of recentPageviews) {\n pathCounts[pv.pathname] = (pathCounts[pv.pathname] || 0) + 1;\n }\n\n const topPages = Object.entries(pathCounts)\n .map(([path, count]) => ({ path, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return {\n activeUsers: activeSessions.size,\n pageviews: recentPageviews.length,\n topPages\n };\n }\n\n /**\n * Export data as JSON\n */\n exportData(): AnalyticsData {\n return { ...this.allData };\n }\n\n /**\n * Clear all analytics data\n */\n clearData(): void {\n this.buffer = { pageviews: [], vitals: [], events: [] };\n this.allData = { pageviews: [], vitals: [], events: [] };\n this.sessions.clear();\n }\n\n /**\n * Stop the analytics engine\n */\n stop(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n this.flush();\n }\n}\n\n// ============================================================================\n// MIDDLEWARE\n// ============================================================================\n\nexport interface AnalyticsMiddlewareOptions {\n config?: Partial<AnalyticsConfig>;\n getCountry?: (req: Request) => string | undefined;\n}\n\nlet analyticsEngine: AnalyticsEngine | null = null;\n\n/**\n * Get or create analytics engine\n */\nexport function getAnalytics(config?: Partial<AnalyticsConfig>): AnalyticsEngine {\n if (!analyticsEngine) {\n analyticsEngine = new AnalyticsEngine(config);\n }\n return analyticsEngine;\n}\n\n/**\n * Configure analytics\n */\nexport function configureAnalytics(config: Partial<AnalyticsConfig>): AnalyticsEngine {\n analyticsEngine = new AnalyticsEngine(config);\n return analyticsEngine;\n}\n\n/**\n * Create analytics middleware\n */\nexport function createAnalyticsMiddleware(options: AnalyticsMiddlewareOptions = {}) {\n const engine = getAnalytics(options.config);\n\n return async (req: Request, next: () => Promise<Response>): Promise<Response> => {\n // Track pageview\n engine.trackPageview(req, {\n country: options.getCountry?.(req)\n });\n\n // Continue to next handler\n const response = await next();\n\n return response;\n };\n}\n\n/**\n * Create analytics API handler\n */\nexport function createAnalyticsHandler() {\n const engine = getAnalytics();\n\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url);\n const action = url.searchParams.get('action') || 'summary';\n\n switch (action) {\n case 'summary': {\n const startParam = url.searchParams.get('start');\n const endParam = url.searchParams.get('end');\n const summary = engine.getSummary(\n startParam ? new Date(startParam) : undefined,\n endParam ? new Date(endParam) : undefined\n );\n return new Response(JSON.stringify(summary), {\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n case 'realtime': {\n const realtime = engine.getRealtime();\n return new Response(JSON.stringify(realtime), {\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n case 'vitals': {\n if (req.method !== 'POST') {\n return new Response('Method not allowed', { status: 405 });\n }\n try {\n const body = await req.json() as { pathname: string; metrics: WebVitals['metrics'] };\n engine.trackVitals(body.pathname, body.metrics);\n return new Response(JSON.stringify({ success: true }), {\n headers: { 'Content-Type': 'application/json' }\n });\n } catch {\n return new Response('Invalid body', { status: 400 });\n }\n }\n\n case 'event': {\n if (req.method !== 'POST') {\n return new Response('Method not allowed', { status: 405 });\n }\n try {\n const body = await req.json() as { \n name: string; \n properties?: Record<string, string | number | boolean> \n };\n engine.trackEvent(body.name, body.properties, req);\n return new Response(JSON.stringify({ success: true }), {\n headers: { 'Content-Type': 'application/json' }\n });\n } catch {\n return new Response('Invalid body', { status: 400 });\n }\n }\n\n case 'export': {\n const data = engine.exportData();\n return new Response(JSON.stringify(data), {\n headers: { \n 'Content-Type': 'application/json',\n 'Content-Disposition': 'attachment; filename=\"analytics-export.json\"'\n }\n });\n }\n\n default:\n return new Response('Unknown action', { status: 400 });\n }\n };\n}\n\n// ============================================================================\n// CLIENT-SIDE SCRIPT (for Web Vitals)\n// ============================================================================\n\nexport const analyticsClientScript = `\n<script>\n(function() {\n // Simple Web Vitals reporter\n const endpoint = '/__float/analytics?action=vitals';\n \n function sendVitals(metrics) {\n const body = JSON.stringify({\n pathname: window.location.pathname,\n metrics: metrics\n });\n \n if (navigator.sendBeacon) {\n navigator.sendBeacon(endpoint, body);\n } else {\n fetch(endpoint, { method: 'POST', body, keepalive: true });\n }\n }\n\n // Observe LCP\n if ('PerformanceObserver' in window) {\n const vitals = {};\n \n // LCP\n new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const lastEntry = entries[entries.length - 1];\n vitals.LCP = Math.round(lastEntry.startTime);\n }).observe({ type: 'largest-contentful-paint', buffered: true });\n \n // FCP\n new PerformanceObserver((list) => {\n const entries = list.getEntries();\n vitals.FCP = Math.round(entries[0].startTime);\n }).observe({ type: 'paint', buffered: true });\n \n // CLS\n let clsValue = 0;\n new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!entry.hadRecentInput) {\n clsValue += entry.value;\n }\n }\n vitals.CLS = clsValue;\n }).observe({ type: 'layout-shift', buffered: true });\n \n // Send on page hide\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n sendVitals(vitals);\n }\n });\n }\n})();\n</script>\n`;\n\n// ============================================================================\n// MAIN EXPORT\n// ============================================================================\n\nexport const analytics = {\n engine: getAnalytics,\n configure: configureAnalytics,\n createMiddleware: createAnalyticsMiddleware,\n createHandler: createAnalyticsHandler,\n clientScript: analyticsClientScript,\n track: {\n pageview: (req: Request, options?: { country?: string }) => \n getAnalytics().trackPageview(req, options),\n event: (name: string, properties?: Record<string, string | number | boolean>, req?: Request) => \n getAnalytics().trackEvent(name, properties, req),\n vitals: (pathname: string, metrics: WebVitals['metrics']) => \n getAnalytics().trackVitals(pathname, metrics)\n }\n};\n\nexport default analytics;\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;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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AA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","names":["path","build","path","fs","path","pc","fs","path","path","path","fs","cache","source","tempDir","tempFile","error","error","fs","path","fs","path","fs","path","error","path","pc","error","fs","dashboardState","createDevDashboard","escapeHtml","http","fs","path","pc","mime","path","fs","pc","http","mime","error","esbuild","fs","path","pc","build","path","fs","pc","error","useCallback","error","useState","useCallback","useMemo","useRef","validators","error","isValid","useState","useCallback","useRef","useEffect","error","useCallback","middleware","listeners","error","validators","transform","error","WebSocketServer","WebSocket","error","join","error","path","error","window","createHash","existsSync","mkdirSync","readFileSync","writeFileSync","join","path","error","f","DEFAULT_CONFIG","path","realtime"]}
|