@float.js/core 2.0.3 β†’ 2.0.4

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/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/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.1</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.1';\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';\n\nexport interface DevServerOptions {\n port: number;\n host: string;\n open?: boolean;\n}\n\nexport interface DevServer {\n start: () => Promise<void>;\n stop: () => Promise<void>;\n restart: () => Promise<void>;\n}\n\nexport async function createDevServer(options: DevServerOptions): Promise<DevServer> {\n const { port, host, open } = options;\n const rootDir = process.cwd();\n const publicDir = path.join(rootDir, 'public');\n \n let routes: Route[] = [];\n let server: http.Server | null = null;\n let wss: WebSocketServer | null = null;\n const clients = new Set<WebSocket>();\n\n // Scan routes on startup\n async function refreshRoutes() {\n try {\n routes = await scanRoutes(rootDir);\n console.log(pc.dim(` πŸ“ Found ${routes.length} routes`));\n } catch (error) {\n console.error(pc.red('Failed to scan routes:'), error);\n }\n }\n\n // Notify all clients to reload\n function notifyClients(type: 'reload' | 'update' | 'error' | 'clear-errors' | 'building', data?: any) {\n const message = JSON.stringify({ type, data, error: data?.error, timestamp: Date.now() });\n clients.forEach(client => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(message);\n }\n });\n }\n\n // HMR client script injected into HTML\n const hmrClientScript = `\n<script>\n(function() {\n const ws = new WebSocket('ws://${host}:${port + 1}');\n \n ws.onmessage = function(event) {\n const data = JSON.parse(event.data);\n \n // Update Float indicator if available\n if (window.__FLOAT_UPDATE_STATUS) {\n window.__FLOAT_UPDATE_STATUS(data);\n }\n \n if (data.type === 'reload') {\n console.log('[Float HMR] Reloading...');\n window.location.reload();\n }\n if (data.type === 'update') {\n console.log('[Float HMR] Update received:', data.data);\n }\n if (data.type === 'error' && window.__FLOAT_SHOW_ERROR) {\n window.__FLOAT_SHOW_ERROR(data.error);\n }\n if (data.type === 'clear-errors' && window.__FLOAT_CLEAR_ERRORS) {\n window.__FLOAT_CLEAR_ERRORS();\n }\n };\n \n ws.onopen = function() {\n console.log('[Float HMR] Connected');\n if (window.__FLOAT_SET_CONNECTED) {\n window.__FLOAT_SET_CONNECTED(true);\n }\n };\n \n ws.onclose = function() {\n console.log('[Float HMR] Disconnected. Attempting reconnect...');\n if (window.__FLOAT_SET_CONNECTED) {\n window.__FLOAT_SET_CONNECTED(false);\n }\n setTimeout(() => window.location.reload(), 1000);\n };\n})();\n</script>\n${FLOAT_INDICATOR_SCRIPT}\n${FLOAT_ERROR_OVERLAY}\n`;\n\n // Request handler\n async function handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ) {\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const pathname = url.pathname;\n\n console.log(pc.dim(` ${req.method} ${pathname}`));\n\n try {\n // Serve static files from public/\n const publicFilePath = path.join(publicDir, pathname);\n if (fs.existsSync(publicFilePath) && fs.statSync(publicFilePath).isFile()) {\n const content = fs.readFileSync(publicFilePath);\n const contentType = mime.lookup(publicFilePath) || 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n return;\n }\n\n // Serve /_float/ internal assets\n if (pathname.startsWith('/_float/')) {\n // Handle internal float assets\n res.writeHead(200, { 'Content-Type': 'application/javascript' });\n res.end('// Float.js internal asset');\n return;\n }\n\n // Serve Dev Dashboard at /__float\n if (pathname === '/__float' || pathname.startsWith('/__float/')) {\n const { dashboardState } = await import('../devtools/index.js');\n \n // Sync current routes to dashboard\n dashboardState.routes = routes.map(r => ({\n path: r.path,\n type: r.type,\n file: r.filePath || r.absolutePath,\n hasLayout: r.layouts && r.layouts.length > 0\n }));\n \n // Use the dashboard handler via middleware pattern\n const { createDevDashboard } = await import('../devtools/index.js');\n const handler = createDevDashboard({ path: '/__float' });\n \n handler(req, res, () => {\n res.writeHead(404);\n res.end('Not Found');\n });\n return;\n }\n\n // Match route\n const { route, params } = matchRoute(pathname, routes);\n\n // Show welcome page if no routes configured and visiting root\n if (!route && pathname === '/' && routes.length === 0) {\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(generateWelcomePage());\n return;\n }\n\n if (!route) {\n res.writeHead(404, { 'Content-Type': 'text/html' });\n res.end(create404Page(pathname));\n return;\n }\n\n // Handle API routes\n if (route.type === 'api') {\n await handleApiRoute(req, res, route, params);\n return;\n }\n\n // Render page with SSR\n const html = await renderPage(route, params, { \n hmrScript: hmrClientScript,\n isDev: true,\n });\n\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(html);\n\n } catch (error) {\n console.error(pc.red('Request error:'), error);\n res.writeHead(500, { 'Content-Type': 'text/html' });\n res.end(createErrorPage(error as Error));\n }\n }\n\n // Handle API routes\n async function handleApiRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n route: Route,\n params: Record<string, string>\n ) {\n try {\n const module = await transformFile(route.absolutePath);\n const method = req.method?.toUpperCase() || 'GET';\n \n // Create Request object\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const body = await getRequestBody(req);\n \n const request = new Request(url.toString(), {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).filter(([_, v]) => v !== undefined) as [string, string][]\n ),\n body: method !== 'GET' && method !== 'HEAD' ? body : undefined,\n });\n\n // Find handler\n const handler = module[method] || module.default;\n \n if (!handler) {\n res.writeHead(405, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Method not allowed' }));\n return;\n }\n\n // Execute handler\n const response: Response = await handler(request, { params });\n \n // Send response\n res.writeHead(response.status, Object.fromEntries(response.headers));\n const responseBody = await response.text();\n res.end(responseBody);\n\n } catch (error) {\n console.error(pc.red('API route error:'), error);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Internal server error' }));\n }\n }\n\n async function start() {\n await refreshRoutes();\n\n // Create HTTP server\n server = http.createServer(handleRequest);\n \n // Create WebSocket server for HMR\n wss = new WebSocketServer({ port: port + 1 });\n wss.on('connection', (ws) => {\n clients.add(ws);\n ws.on('close', () => clients.delete(ws));\n });\n\n // Watch for file changes\n const watcher = chokidar.watch(\n [\n path.join(rootDir, 'app/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'components/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'lib/**/*.{ts,tsx,js,jsx}'),\n ],\n {\n ignored: /node_modules/,\n persistent: true,\n }\n );\n\n watcher.on('change', async (filePath) => {\n console.log(pc.yellow(`\\n ⚑ File changed: ${path.relative(rootDir, filePath)}`));\n \n // Check if it's a route file\n if (filePath.includes('/app/')) {\n await refreshRoutes();\n }\n \n notifyClients('reload');\n });\n\n watcher.on('add', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.green(`\\n βž• File added: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n watcher.on('unlink', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.red(`\\n βž– File removed: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n // Start server\n return new Promise<void>((resolve, reject) => {\n server!.listen(port, host, () => {\n console.log(pc.green(` βœ… Server running at ${pc.cyan(`http://${host}:${port}`)}`));\n console.log(pc.dim(` ⚑ HMR enabled on ws://${host}:${port + 1}\\n`));\n \n // Print routes\n console.log(pc.bold(' Routes:'));\n routes.forEach(route => {\n if (route.type === 'page') {\n console.log(pc.dim(` ${pc.green('●')} ${route.path}`));\n } else if (route.type === 'api') {\n console.log(pc.dim(` ${pc.blue('β—†')} ${route.path} (API)`));\n }\n });\n console.log('');\n\n if (open) {\n import('child_process').then(({ exec }) => {\n exec(`open http://${host}:${port}`);\n });\n }\n\n resolve();\n });\n\n server!.on('error', reject);\n });\n }\n\n async function stop() {\n return new Promise<void>((resolve) => {\n wss?.close();\n server?.close(() => resolve());\n });\n }\n\n async function restart() {\n await stop();\n await start();\n }\n\n return { start, stop, restart };\n}\n\n// Helper functions\nfunction getRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', chunk => body += chunk);\n req.on('end', () => resolve(body));\n req.on('error', reject);\n });\n}\n\nfunction create404Page(pathname: string): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>404 - Not Found | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);\n color: white;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .container { text-align: center; padding: 2rem; }\n h1 { font-size: 8rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); \n -webkit-background-clip: text; -webkit-text-fill-color: transparent; }\n h2 { font-size: 1.5rem; margin: 1rem 0; opacity: 0.8; }\n code { background: rgba(255,255,255,0.1); padding: 0.5rem 1rem; border-radius: 0.5rem; }\n .tip { margin-top: 2rem; opacity: 0.6; font-size: 0.9rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <code>${pathname}</code>\n <p class=\"tip\">Create <code>app${pathname === '/' ? '' : pathname}/page.tsx</code> to add this route</p>\n </div>\n</body>\n</html>`;\n}\n\nfunction createErrorPage(error: Error): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Error | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: 'Monaco', 'Menlo', monospace;\n background: #1a1a1a;\n color: #ff6b6b;\n min-height: 100vh;\n padding: 2rem;\n }\n .header { display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem; }\n .icon { font-size: 2rem; }\n h1 { font-size: 1.5rem; }\n .message { color: #ffa94d; font-size: 1.25rem; margin-bottom: 1rem; }\n .stack { \n background: #2d2d2d; \n padding: 1rem; \n border-radius: 0.5rem; \n overflow-x: auto;\n color: #888;\n font-size: 0.875rem;\n line-height: 1.6;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <span class=\"icon\">⚠️</span>\n <h1>Server Error</h1>\n </div>\n <p class=\"message\">${escapeHtml(error.message)}</p>\n <pre class=\"stack\">${escapeHtml(error.stack || '')}</pre>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n","/**\n * Float.js SSR Engine\n * Server-Side Rendering with React 18 Streaming\n */\n\nimport React from 'react';\nimport { renderToPipeableStream, renderToString } from 'react-dom/server';\nimport { Writable } from 'node:stream';\nimport type { Route } from '../router/index.js';\nimport { transformFile } from '../build/transform.js';\n\nexport interface RenderOptions {\n hmrScript?: string;\n isDev?: boolean;\n streaming?: boolean;\n}\n\nexport interface PageProps {\n params: Record<string, string>;\n searchParams: Record<string, string>;\n}\n\n/**\n * Render a page to HTML string\n */\nexport async function renderPage(\n route: Route,\n params: Record<string, string>,\n options: RenderOptions = {}\n): Promise<string> {\n const { hmrScript = '', isDev = false, streaming = false } = options;\n void streaming; // Reserved for future streaming implementation\n\n try {\n // Load the page component\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n throw new Error(`No default export found in ${route.filePath}`);\n }\n\n // Load layouts (from root to current)\n const layouts = await Promise.all(\n route.layouts.map(async (layoutPath) => {\n const layoutModule = await transformFile(layoutPath);\n return layoutModule.default;\n })\n );\n\n // Get metadata if exported\n const metadata = pageModule.metadata || {};\n const generateMetadata = pageModule.generateMetadata;\n \n let pageMetadata = metadata;\n if (generateMetadata) {\n pageMetadata = await generateMetadata({ params });\n }\n\n // Create props\n const props: PageProps = {\n params,\n searchParams: {},\n };\n\n // Build component tree with layouts\n let element: React.ReactElement = React.createElement(PageComponent, props);\n \n // Wrap with layouts (innermost to outermost)\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i];\n if (Layout) {\n element = React.createElement(Layout, { children: element }) as React.ReactElement;\n }\n }\n\n // Render to HTML\n const content = renderToString(element);\n\n // Generate full HTML document\n const html = generateHtmlDocument({\n content,\n metadata: pageMetadata,\n hmrScript: isDev ? hmrScript : '',\n isDev,\n });\n\n return html;\n\n } catch (error) {\n console.error('SSR Error:', error);\n throw error;\n }\n}\n\n/**\n * Render with streaming (React 18 Suspense)\n */\nexport async function renderPageStream(\n route: Route,\n params: Record<string, string>,\n _options: RenderOptions = {}\n): Promise<NodeJS.ReadableStream> {\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n const props: PageProps = { params, searchParams: {} };\n const element = React.createElement(PageComponent, props);\n\n return new Promise((resolve, reject) => {\n let html = '';\n \n const writable = new Writable({\n write(chunk, _encoding, callback) {\n html += chunk.toString();\n callback();\n },\n final(callback) {\n callback();\n }\n });\n\n const { pipe, abort } = renderToPipeableStream(element, {\n onShellReady() {\n pipe(writable);\n },\n onShellError(error) {\n reject(error);\n },\n onAllReady() {\n resolve(writable as any);\n },\n onError(error) {\n console.error('Streaming error:', error);\n }\n });\n\n // Timeout after 10 seconds\n setTimeout(() => abort(), 10000);\n });\n}\n\ninterface HtmlDocumentOptions {\n content: string;\n metadata: Record<string, any>;\n hmrScript: string;\n isDev: boolean;\n styles?: string;\n scripts?: string[];\n}\n\n/**\n * Generate full HTML document\n */\nfunction generateHtmlDocument(options: HtmlDocumentOptions): string {\n const { content, metadata, hmrScript, isDev, styles = '', scripts = [] } = options;\n \n // Handle title which can be string or object with default/template\n let title = 'Float.js App';\n if (metadata.title) {\n if (typeof metadata.title === 'string') {\n title = metadata.title;\n } else if (typeof metadata.title === 'object' && metadata.title.default) {\n title = metadata.title.default;\n }\n }\n \n const description = metadata.description || '';\n const charset = metadata.charset || 'utf-8';\n const viewport = metadata.viewport || 'width=device-width, initial-scale=1';\n\n // Generate meta tags\n const metaTags = generateMetaTags(metadata);\n\n return `<!DOCTYPE html>\n<html lang=\"${metadata.lang || 'en'}\">\n<head>\n <meta charset=\"${charset}\">\n <meta name=\"viewport\" content=\"${viewport}\">\n <title>${escapeHtml(title)}</title>\n ${description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''}\n ${metaTags}\n <meta name=\"generator\" content=\"Float.js\">\n <style>\n /* Float.js Base Styles */\n *, *::before, *::after { box-sizing: border-box; }\n html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }\n body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }\n ${styles}\n </style>\n ${isDev ? `\n <style>\n /* Dev mode indicator */\n body::after {\n content: 'DEV';\n position: fixed;\n bottom: 8px;\n right: 8px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n font-size: 10px;\n font-weight: bold;\n padding: 4px 8px;\n border-radius: 4px;\n z-index: 99999;\n font-family: monospace;\n }\n </style>\n ` : ''}\n</head>\n<body>\n <div id=\"__float\">${content}</div>\n ${hmrScript}\n ${scripts.map(src => `<script src=\"${src}\"></script>`).join('\\n ')}\n</body>\n</html>`;\n}\n\n/**\n * Generate meta tags from metadata object\n */\nfunction generateMetaTags(metadata: Record<string, any>): string {\n const tags: string[] = [];\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.image) tags.push(`<meta property=\"og:image\" content=\"${escapeHtml(og.image)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${escapeHtml(og.url)}\">`);\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${escapeHtml(og.type)}\">`);\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${escapeHtml(tw.card)}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.image) tags.push(`<meta name=\"twitter:image\" content=\"${escapeHtml(tw.image)}\">`);\n }\n\n // Robots\n if (metadata.robots) {\n const robots = typeof metadata.robots === 'string' \n ? metadata.robots \n : Object.entries(metadata.robots).map(([k, v]) => v ? k : `no${k}`).join(', ');\n tags.push(`<meta name=\"robots\" content=\"${escapeHtml(robots)}\">`);\n }\n\n // Icons\n if (metadata.icons) {\n const icons = metadata.icons;\n if (icons.icon) tags.push(`<link rel=\"icon\" href=\"${escapeHtml(icons.icon)}\">`);\n if (icons.apple) tags.push(`<link rel=\"apple-touch-icon\" href=\"${escapeHtml(icons.apple)}\">`);\n }\n\n // Canonical\n if (metadata.canonical) {\n tags.push(`<link rel=\"canonical\" href=\"${escapeHtml(metadata.canonical)}\">`);\n }\n\n return tags.join('\\n ');\n}\n\nfunction escapeHtml(text: string): string {\n return String(text)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nexport type { PageProps as FloatPageProps };\n","/**\n * Float.js Transform\n * On-the-fly TypeScript/JSX transformation\n */\n\nimport * as esbuild from 'esbuild';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\n// Module cache for dev mode\nconst moduleCache = new Map<string, { module: any; mtime: number }>();\n\n/**\n * Transform and import a file\n * Handles .ts, .tsx, .js, .jsx files\n */\nexport async function transformFile(filePath: string): Promise<any> {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n \n // Check if file exists\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n const stats = fs.statSync(absolutePath);\n const mtime = stats.mtimeMs;\n\n // Check cache\n const cached = moduleCache.get(absolutePath);\n if (cached && cached.mtime === mtime) {\n return cached.module;\n }\n\n // Read source\n const source = fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath);\n\n // Determine loader\n const loader = getLoader(ext);\n\n // Transform with esbuild\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: absolutePath,\n });\n\n // Create temporary file for import\n const tempDir = path.join(process.cwd(), '.float', '.cache');\n fs.mkdirSync(tempDir, { recursive: true });\n \n const tempFile = path.join(tempDir, `${path.basename(absolutePath, ext)}_${Date.now()}.mjs`);\n \n // Rewrite imports to absolute paths\n let code = result.code;\n code = rewriteImports(code, path.dirname(absolutePath));\n \n fs.writeFileSync(tempFile, code);\n\n try {\n // Dynamic import\n const module = await import(pathToFileURL(tempFile).href);\n \n // Cache the result\n moduleCache.set(absolutePath, { module, mtime });\n \n // Clean up temp file (async)\n setImmediate(() => {\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n });\n\n return module;\n } catch (error) {\n // Clean up on error\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n throw error;\n }\n}\n\n/**\n * Get esbuild loader for file extension\n */\nfunction getLoader(ext: string): esbuild.Loader {\n switch (ext) {\n case '.ts': return 'ts';\n case '.tsx': return 'tsx';\n case '.jsx': return 'jsx';\n case '.js': return 'js';\n case '.mjs': return 'js';\n case '.json': return 'json';\n case '.css': return 'css';\n default: return 'ts';\n }\n}\n\n/**\n * Rewrite relative imports to absolute paths\n */\nfunction rewriteImports(code: string, baseDir: string): string {\n // Match import statements\n const importRegex = /from\\s+['\"](\\.[^'\"]+)['\"]/g;\n \n return code.replace(importRegex, (match, importPath) => {\n // Resolve relative path\n let resolvedPath = path.resolve(baseDir, importPath);\n \n // Try to find the file with various extensions\n const extensions = ['.tsx', '.ts', '.jsx', '.js', '.mjs', ''];\n let found = false;\n \n for (const ext of extensions) {\n const tryPath = resolvedPath + ext;\n if (fs.existsSync(tryPath)) {\n resolvedPath = tryPath;\n found = true;\n break;\n }\n // Try index file\n const indexPath = path.join(resolvedPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n resolvedPath = indexPath;\n found = true;\n break;\n }\n }\n \n if (!found) {\n // Keep original for node_modules imports\n return match;\n }\n \n return `from '${pathToFileURL(resolvedPath).href}'`;\n });\n}\n\n/**\n * Clear module cache (for HMR)\n */\nexport function clearModuleCache(filePath?: string) {\n if (filePath) {\n moduleCache.delete(path.resolve(filePath));\n } else {\n moduleCache.clear();\n }\n}\n\n/**\n * Transform source code without file operations\n */\nexport async function transformSource(\n source: string,\n options: { filename?: string; loader?: esbuild.Loader } = {}\n): Promise<string> {\n const { filename = 'module.tsx', loader = 'tsx' } = options;\n\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: filename,\n });\n\n return result.code;\n}\n","/**\n * Float.js Dev Indicator\n * Minimalist indicator inspired by Next.js\n */\n\nexport const FLOAT_INDICATOR_SCRIPT = `\n<script id=\"__float-indicator\">\n(function() {\n var isConnected = false;\n var isOpen = false;\n var buildTime = null;\n var startTime = Date.now();\n \n var indicator = document.createElement('div');\n indicator.id = '__float-dev-indicator';\n indicator.innerHTML = '<div class=\"float-btn\" id=\"float-btn\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span class=\"float-dot\" id=\"float-dot\"></span></div><div class=\"float-panel\" id=\"float-panel\"><div class=\"float-panel-header\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span>Float.js</span><span class=\"float-version\">v2.0.1</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 * Shown when users first install the framework\n */\n\nexport function generateWelcomePage(): string {\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>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 32 32'><defs><linearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'><stop offset='0%25' stop-color='%236366f1'/><stop offset='100%25' stop-color='%23d946ef'/></linearGradient></defs><circle cx='16' cy='16' r='14' fill='url(%23g)'/></svg>\">\n <style>\n @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');\n \n * { margin: 0; padding: 0; box-sizing: border-box; }\n \n :root {\n --float-purple: #8b5cf6;\n --float-indigo: #6366f1;\n --float-pink: #d946ef;\n --float-cyan: #06b6d4;\n }\n \n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n background: #0a0a0b;\n color: white;\n min-height: 100vh;\n overflow-x: hidden;\n }\n \n /* Animated background */\n .bg-gradient {\n position: fixed;\n inset: 0;\n background: \n radial-gradient(ellipse 80% 50% at 50% -20%, rgba(99, 102, 241, 0.3), transparent),\n radial-gradient(ellipse 60% 40% at 80% 60%, rgba(139, 92, 246, 0.15), transparent),\n radial-gradient(ellipse 40% 30% at 20% 80%, rgba(217, 70, 239, 0.1), transparent);\n pointer-events: none;\n }\n \n .bg-grid {\n position: fixed;\n inset: 0;\n background-image: \n linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),\n linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);\n background-size: 60px 60px;\n pointer-events: none;\n }\n \n /* Floating orbs */\n .orb {\n position: fixed;\n border-radius: 50%;\n filter: blur(80px);\n opacity: 0.5;\n animation: float 20s ease-in-out infinite;\n pointer-events: none;\n }\n \n .orb-1 {\n width: 400px;\n height: 400px;\n background: var(--float-purple);\n top: -100px;\n right: -100px;\n animation-delay: 0s;\n }\n \n .orb-2 {\n width: 300px;\n height: 300px;\n background: var(--float-pink);\n bottom: -50px;\n left: -50px;\n animation-delay: -7s;\n }\n \n .orb-3 {\n width: 200px;\n height: 200px;\n background: var(--float-cyan);\n top: 50%;\n left: 50%;\n animation-delay: -14s;\n }\n \n @keyframes float {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 25% { transform: translate(30px, -30px) scale(1.1); }\n 50% { transform: translate(-20px, 20px) scale(0.9); }\n 75% { transform: translate(20px, 10px) scale(1.05); }\n }\n \n /* Main content */\n .container {\n position: relative;\n max-width: 1200px;\n margin: 0 auto;\n padding: 60px 24px;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n \n /* Logo */\n .logo {\n margin-bottom: 48px;\n animation: fadeInUp 0.8s ease-out;\n }\n \n .logo svg {\n width: 80px;\n height: 80px;\n filter: drop-shadow(0 0 40px rgba(139, 92, 246, 0.5));\n }\n \n /* Hero */\n .hero {\n text-align: center;\n margin-bottom: 64px;\n }\n \n .hero h1 {\n font-size: clamp(48px, 10vw, 80px);\n font-weight: 800;\n letter-spacing: -0.03em;\n line-height: 1.1;\n margin-bottom: 24px;\n animation: fadeInUp 0.8s ease-out 0.1s both;\n }\n \n .hero h1 .gradient {\n background: linear-gradient(135deg, var(--float-indigo), var(--float-purple), var(--float-pink));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n \n .hero p {\n font-size: 20px;\n color: rgba(255,255,255,0.6);\n max-width: 600px;\n margin: 0 auto;\n line-height: 1.7;\n animation: fadeInUp 0.8s ease-out 0.2s both;\n }\n \n /* Features */\n .features {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n width: 100%;\n max-width: 900px;\n margin-bottom: 64px;\n }\n \n .feature {\n background: rgba(255,255,255,0.03);\n border: 1px solid rgba(255,255,255,0.06);\n border-radius: 20px;\n padding: 28px;\n transition: all 0.3s ease;\n animation: fadeInUp 0.8s ease-out both;\n }\n \n .feature:nth-child(1) { animation-delay: 0.3s; }\n .feature:nth-child(2) { animation-delay: 0.4s; }\n .feature:nth-child(3) { animation-delay: 0.5s; }\n \n .feature:hover {\n background: rgba(255,255,255,0.05);\n border-color: rgba(139, 92, 246, 0.3);\n transform: translateY(-4px);\n }\n \n .feature-icon {\n width: 48px;\n height: 48px;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.2), rgba(139, 92, 246, 0.2));\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 16px;\n font-size: 24px;\n }\n \n .feature h3 {\n font-size: 18px;\n font-weight: 600;\n margin-bottom: 8px;\n }\n \n .feature p {\n font-size: 14px;\n color: rgba(255,255,255,0.5);\n line-height: 1.6;\n }\n \n /* Code block */\n .code-section {\n width: 100%;\n max-width: 600px;\n animation: fadeInUp 0.8s ease-out 0.6s both;\n margin-bottom: 48px;\n }\n \n .code-header {\n background: rgba(255,255,255,0.05);\n border: 1px solid rgba(255,255,255,0.08);\n border-bottom: none;\n border-radius: 16px 16px 0 0;\n padding: 14px 20px;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n .code-dots {\n display: flex;\n gap: 6px;\n }\n \n .code-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: rgba(255,255,255,0.1);\n }\n \n .code-dot:nth-child(1) { background: #ff5f57; }\n .code-dot:nth-child(2) { background: #febc2e; }\n .code-dot:nth-child(3) { background: #28c840; }\n \n .code-title {\n margin-left: auto;\n font-size: 12px;\n color: rgba(255,255,255,0.4);\n }\n \n .code-block {\n background: rgba(0,0,0,0.4);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0 0 16px 16px;\n padding: 24px;\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 14px;\n line-height: 1.8;\n overflow-x: auto;\n }\n \n .code-line {\n display: flex;\n }\n \n .code-number {\n color: rgba(255,255,255,0.2);\n width: 40px;\n flex-shrink: 0;\n user-select: none;\n }\n \n .code-content {\n color: rgba(255,255,255,0.8);\n }\n \n .code-keyword { color: #c792ea; }\n .code-string { color: #c3e88d; }\n .code-function { color: #82aaff; }\n .code-comment { color: rgba(255,255,255,0.3); }\n .code-tag { color: #f07178; }\n .code-attr { color: #ffcb6b; }\n \n /* Quick start */\n .quick-start {\n text-align: center;\n animation: fadeInUp 0.8s ease-out 0.7s both;\n }\n \n .quick-start h2 {\n font-size: 14px;\n font-weight: 500;\n color: rgba(255,255,255,0.4);\n text-transform: uppercase;\n letter-spacing: 0.1em;\n margin-bottom: 20px;\n }\n \n .quick-start-cmd {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n background: rgba(255,255,255,0.05);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 12px;\n padding: 16px 24px;\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 15px;\n cursor: pointer;\n transition: all 0.2s;\n }\n \n .quick-start-cmd:hover {\n background: rgba(255,255,255,0.08);\n border-color: rgba(139, 92, 246, 0.4);\n }\n \n .quick-start-cmd .prompt {\n color: var(--float-purple);\n }\n \n .quick-start-cmd .text {\n color: rgba(255,255,255,0.8);\n }\n \n .quick-start-cmd .copy {\n opacity: 0.4;\n transition: opacity 0.2s;\n }\n \n .quick-start-cmd:hover .copy {\n opacity: 0.8;\n }\n \n /* Links */\n .links {\n display: flex;\n gap: 24px;\n margin-top: 48px;\n animation: fadeInUp 0.8s ease-out 0.8s both;\n }\n \n .link {\n color: rgba(255,255,255,0.5);\n text-decoration: none;\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n }\n \n .link:hover {\n color: var(--float-purple);\n }\n \n /* Footer */\n .footer {\n position: absolute;\n bottom: 24px;\n font-size: 12px;\n color: rgba(255,255,255,0.3);\n animation: fadeInUp 0.8s ease-out 0.9s both;\n }\n \n @keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n \n /* Responsive */\n @media (max-width: 640px) {\n .container { padding: 40px 20px; }\n .hero h1 { font-size: 40px; }\n .hero p { font-size: 16px; }\n .features { gap: 16px; }\n .feature { padding: 20px; }\n }\n </style>\n</head>\n<body>\n <div class=\"bg-gradient\"></div>\n <div class=\"bg-grid\"></div>\n <div class=\"orb orb-1\"></div>\n <div class=\"orb orb-2\"></div>\n <div class=\"orb orb-3\"></div>\n \n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 80 80\" fill=\"none\">\n <defs>\n <linearGradient id=\"logoGrad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#6366f1\"/>\n <stop offset=\"50%\" stop-color=\"#8b5cf6\"/>\n <stop offset=\"100%\" stop-color=\"#d946ef\"/>\n </linearGradient>\n </defs>\n <circle cx=\"40\" cy=\"40\" r=\"36\" stroke=\"url(#logoGrad)\" stroke-width=\"3\" fill=\"none\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 40 40\" to=\"360 40 40\" dur=\"20s\" repeatCount=\"indefinite\"/>\n </circle>\n <circle cx=\"40\" cy=\"40\" r=\"28\" stroke=\"url(#logoGrad)\" stroke-width=\"2\" fill=\"none\" opacity=\"0.5\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"360 40 40\" to=\"0 40 40\" dur=\"15s\" repeatCount=\"indefinite\"/>\n </circle>\n <path d=\"M30 28 L54 40 L30 52 Z\" fill=\"url(#logoGrad)\"/>\n </svg>\n </div>\n \n <div class=\"hero\">\n <h1>Welcome to <span class=\"gradient\">Float.js</span></h1>\n <p>Tu framework ultramoderno estΓ‘ listo. Comienza a crear experiencias web increΓ­bles con SSR, routing inteligente y desarrollo instantΓ‘neo.</p>\n </div>\n \n <div class=\"features\">\n <div class=\"feature\">\n <div class=\"feature-icon\">⚑</div>\n <h3>Desarrollo InstantΓ‘neo</h3>\n <p>Hot reload ultrarrΓ‘pido con esbuild. Ve tus cambios al instante sin perder el estado.</p>\n </div>\n <div class=\"feature\">\n <div class=\"feature-icon\">🎯</div>\n <h3>Routing Inteligente</h3>\n <p>Sistema de rutas basado en archivos. Crea page.tsx y tu ruta estΓ‘ lista automΓ‘ticamente.</p>\n </div>\n <div class=\"feature\">\n <div class=\"feature-icon\">🌊</div>\n <h3>SSR Streaming</h3>\n <p>Renderizado del lado del servidor con React 18 y soporte para streaming nativo.</p>\n </div>\n </div>\n \n <div class=\"code-section\">\n <div class=\"code-header\">\n <div class=\"code-dots\">\n <div class=\"code-dot\"></div>\n <div class=\"code-dot\"></div>\n <div class=\"code-dot\"></div>\n </div>\n <span class=\"code-title\">app/page.tsx</span>\n </div>\n <div class=\"code-block\">\n <div class=\"code-line\">\n <span class=\"code-number\">1</span>\n <span class=\"code-content\"><span class=\"code-keyword\">export default function</span> <span class=\"code-function\">HomePage</span>() {</span>\n </div>\n <div class=\"code-line\">\n <span class=\"code-number\">2</span>\n <span class=\"code-content\"> <span class=\"code-keyword\">return</span> (</span>\n </div>\n <div class=\"code-line\">\n <span class=\"code-number\">3</span>\n <span class=\"code-content\"> <span class=\"code-tag\">&lt;h1&gt;</span>Hello, Float.js!<span class=\"code-tag\">&lt;/h1&gt;</span></span>\n </div>\n <div class=\"code-line\">\n <span class=\"code-number\">4</span>\n <span class=\"code-content\"> );</span>\n </div>\n <div class=\"code-line\">\n <span class=\"code-number\">5</span>\n <span class=\"code-content\">}</span>\n </div>\n </div>\n </div>\n \n <div class=\"quick-start\">\n <h2>Crea tu primera pΓ‘gina</h2>\n <div class=\"quick-start-cmd\" onclick=\"navigator.clipboard.writeText('touch app/about/page.tsx')\">\n <span class=\"prompt\">$</span>\n <span class=\"text\">touch app/about/page.tsx</span>\n <span class=\"copy\">πŸ“‹</span>\n </div>\n </div>\n \n <div class=\"links\">\n <a href=\"https://floatjs.dev/docs\" target=\"_blank\" class=\"link\">\n <span>πŸ“–</span> DocumentaciΓ³n\n </a>\n <a href=\"https://github.com/floatjs/float\" target=\"_blank\" class=\"link\">\n <span>⭐</span> GitHub\n </a>\n <a href=\"https://floatjs.dev/examples\" target=\"_blank\" class=\"link\">\n <span>🎨</span> Ejemplos\n </a>\n </div>\n \n <div class=\"footer\">\n Float.js v2.0.1 β€” Made with ⚑ for the modern web\n </div>\n </div>\n</body>\n</html>`;\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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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAKO,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;AAA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","names":["path","build","path","fs","path","path","error","error","path","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_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/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';\n\nexport interface DevServerOptions {\n port: number;\n host: string;\n open?: boolean;\n}\n\nexport interface DevServer {\n start: () => Promise<void>;\n stop: () => Promise<void>;\n restart: () => Promise<void>;\n}\n\nexport async function createDevServer(options: DevServerOptions): Promise<DevServer> {\n const { port, host, open } = options;\n const rootDir = process.cwd();\n const publicDir = path.join(rootDir, 'public');\n \n let routes: Route[] = [];\n let server: http.Server | null = null;\n let wss: WebSocketServer | null = null;\n const clients = new Set<WebSocket>();\n\n // Scan routes on startup\n async function refreshRoutes() {\n try {\n routes = await scanRoutes(rootDir);\n console.log(pc.dim(` πŸ“ Found ${routes.length} routes`));\n } catch (error) {\n console.error(pc.red('Failed to scan routes:'), error);\n }\n }\n\n // Notify all clients to reload\n function notifyClients(type: 'reload' | 'update' | 'error' | 'clear-errors' | 'building', data?: any) {\n const message = JSON.stringify({ type, data, error: data?.error, timestamp: Date.now() });\n clients.forEach(client => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(message);\n }\n });\n }\n\n // HMR client script injected into HTML\n const hmrClientScript = `\n<script>\n(function() {\n const ws = new WebSocket('ws://${host}:${port + 1}');\n \n ws.onmessage = function(event) {\n const data = JSON.parse(event.data);\n \n // Update Float indicator if available\n if (window.__FLOAT_UPDATE_STATUS) {\n window.__FLOAT_UPDATE_STATUS(data);\n }\n \n if (data.type === 'reload') {\n console.log('[Float HMR] Reloading...');\n window.location.reload();\n }\n if (data.type === 'update') {\n console.log('[Float HMR] Update received:', data.data);\n }\n if (data.type === 'error' && window.__FLOAT_SHOW_ERROR) {\n window.__FLOAT_SHOW_ERROR(data.error);\n }\n if (data.type === 'clear-errors' && window.__FLOAT_CLEAR_ERRORS) {\n window.__FLOAT_CLEAR_ERRORS();\n }\n };\n \n ws.onopen = function() {\n console.log('[Float HMR] Connected');\n if (window.__FLOAT_SET_CONNECTED) {\n window.__FLOAT_SET_CONNECTED(true);\n }\n };\n \n ws.onclose = function() {\n console.log('[Float HMR] Disconnected. Attempting reconnect...');\n if (window.__FLOAT_SET_CONNECTED) {\n window.__FLOAT_SET_CONNECTED(false);\n }\n setTimeout(() => window.location.reload(), 1000);\n };\n})();\n</script>\n${FLOAT_INDICATOR_SCRIPT}\n${FLOAT_ERROR_OVERLAY}\n`;\n\n // Request handler\n async function handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ) {\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const pathname = url.pathname;\n\n console.log(pc.dim(` ${req.method} ${pathname}`));\n\n try {\n // Serve static files from public/\n const publicFilePath = path.join(publicDir, pathname);\n if (fs.existsSync(publicFilePath) && fs.statSync(publicFilePath).isFile()) {\n const content = fs.readFileSync(publicFilePath);\n const contentType = mime.lookup(publicFilePath) || 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(content);\n return;\n }\n\n // Serve /_float/ internal assets\n if (pathname.startsWith('/_float/')) {\n // Handle internal float assets\n res.writeHead(200, { 'Content-Type': 'application/javascript' });\n res.end('// Float.js internal asset');\n return;\n }\n\n // Serve Dev Dashboard at /__float\n if (pathname === '/__float' || pathname.startsWith('/__float/')) {\n const { dashboardState } = await import('../devtools/index.js');\n \n // Sync current routes to dashboard\n dashboardState.routes = routes.map(r => ({\n path: r.path,\n type: r.type,\n file: r.filePath || r.absolutePath,\n hasLayout: r.layouts && r.layouts.length > 0\n }));\n \n // Use the dashboard handler via middleware pattern\n const { createDevDashboard } = await import('../devtools/index.js');\n const handler = createDevDashboard({ path: '/__float' });\n \n handler(req, res, () => {\n res.writeHead(404);\n res.end('Not Found');\n });\n return;\n }\n\n // Match route\n const { route, params } = matchRoute(pathname, routes);\n\n // Show welcome page if no routes configured and visiting root\n if (!route && pathname === '/' && routes.length === 0) {\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(generateWelcomePage());\n return;\n }\n\n if (!route) {\n res.writeHead(404, { 'Content-Type': 'text/html' });\n res.end(create404Page(pathname));\n return;\n }\n\n // Handle API routes\n if (route.type === 'api') {\n await handleApiRoute(req, res, route, params);\n return;\n }\n\n // Render page with SSR\n const html = await renderPage(route, params, { \n hmrScript: hmrClientScript,\n isDev: true,\n });\n\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(html);\n\n } catch (error) {\n console.error(pc.red('Request error:'), error);\n res.writeHead(500, { 'Content-Type': 'text/html' });\n res.end(createErrorPage(error as Error));\n }\n }\n\n // Handle API routes\n async function handleApiRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n route: Route,\n params: Record<string, string>\n ) {\n try {\n const module = await transformFile(route.absolutePath);\n const method = req.method?.toUpperCase() || 'GET';\n \n // Create Request object\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const body = await getRequestBody(req);\n \n const request = new Request(url.toString(), {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).filter(([_, v]) => v !== undefined) as [string, string][]\n ),\n body: method !== 'GET' && method !== 'HEAD' ? body : undefined,\n });\n\n // Find handler\n const handler = module[method] || module.default;\n \n if (!handler) {\n res.writeHead(405, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Method not allowed' }));\n return;\n }\n\n // Execute handler\n const response: Response = await handler(request, { params });\n \n // Send response\n res.writeHead(response.status, Object.fromEntries(response.headers));\n const responseBody = await response.text();\n res.end(responseBody);\n\n } catch (error) {\n console.error(pc.red('API route error:'), error);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Internal server error' }));\n }\n }\n\n async function start() {\n await refreshRoutes();\n\n // Create HTTP server\n server = http.createServer(handleRequest);\n \n // Create WebSocket server for HMR\n wss = new WebSocketServer({ port: port + 1 });\n wss.on('connection', (ws) => {\n clients.add(ws);\n ws.on('close', () => clients.delete(ws));\n });\n\n // Watch for file changes\n const watcher = chokidar.watch(\n [\n path.join(rootDir, 'app/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'components/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'lib/**/*.{ts,tsx,js,jsx}'),\n ],\n {\n ignored: /node_modules/,\n persistent: true,\n }\n );\n\n watcher.on('change', async (filePath) => {\n console.log(pc.yellow(`\\n ⚑ File changed: ${path.relative(rootDir, filePath)}`));\n \n // Check if it's a route file\n if (filePath.includes('/app/')) {\n await refreshRoutes();\n }\n \n notifyClients('reload');\n });\n\n watcher.on('add', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.green(`\\n βž• File added: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n watcher.on('unlink', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.red(`\\n βž– File removed: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n // Start server\n return new Promise<void>((resolve, reject) => {\n server!.listen(port, host, () => {\n console.log(pc.green(` βœ… Server running at ${pc.cyan(`http://${host}:${port}`)}`));\n console.log(pc.dim(` ⚑ HMR enabled on ws://${host}:${port + 1}\\n`));\n \n // Print routes\n console.log(pc.bold(' Routes:'));\n routes.forEach(route => {\n if (route.type === 'page') {\n console.log(pc.dim(` ${pc.green('●')} ${route.path}`));\n } else if (route.type === 'api') {\n console.log(pc.dim(` ${pc.blue('β—†')} ${route.path} (API)`));\n }\n });\n console.log('');\n\n if (open) {\n import('child_process').then(({ exec }) => {\n exec(`open http://${host}:${port}`);\n });\n }\n\n resolve();\n });\n\n server!.on('error', reject);\n });\n }\n\n async function stop() {\n return new Promise<void>((resolve) => {\n wss?.close();\n server?.close(() => resolve());\n });\n }\n\n async function restart() {\n await stop();\n await start();\n }\n\n return { start, stop, restart };\n}\n\n// Helper functions\nfunction getRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', chunk => body += chunk);\n req.on('end', () => resolve(body));\n req.on('error', reject);\n });\n}\n\nfunction create404Page(pathname: string): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>404 - Not Found | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);\n color: white;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .container { text-align: center; padding: 2rem; }\n h1 { font-size: 8rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); \n -webkit-background-clip: text; -webkit-text-fill-color: transparent; }\n h2 { font-size: 1.5rem; margin: 1rem 0; opacity: 0.8; }\n code { background: rgba(255,255,255,0.1); padding: 0.5rem 1rem; border-radius: 0.5rem; }\n .tip { margin-top: 2rem; opacity: 0.6; font-size: 0.9rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <code>${pathname}</code>\n <p class=\"tip\">Create <code>app${pathname === '/' ? '' : pathname}/page.tsx</code> to add this route</p>\n </div>\n</body>\n</html>`;\n}\n\nfunction createErrorPage(error: Error): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Error | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: 'Monaco', 'Menlo', monospace;\n background: #1a1a1a;\n color: #ff6b6b;\n min-height: 100vh;\n padding: 2rem;\n }\n .header { display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem; }\n .icon { font-size: 2rem; }\n h1 { font-size: 1.5rem; }\n .message { color: #ffa94d; font-size: 1.25rem; margin-bottom: 1rem; }\n .stack { \n background: #2d2d2d; \n padding: 1rem; \n border-radius: 0.5rem; \n overflow-x: auto;\n color: #888;\n font-size: 0.875rem;\n line-height: 1.6;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <span class=\"icon\">⚠️</span>\n <h1>Server Error</h1>\n </div>\n <p class=\"message\">${escapeHtml(error.message)}</p>\n <pre class=\"stack\">${escapeHtml(error.stack || '')}</pre>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n","/**\n * Float.js SSR Engine\n * Server-Side Rendering with React 18 Streaming\n */\n\nimport React from 'react';\nimport { renderToPipeableStream, renderToString } from 'react-dom/server';\nimport { Writable } from 'node:stream';\nimport type { Route } from '../router/index.js';\nimport { transformFile } from '../build/transform.js';\n\nexport interface RenderOptions {\n hmrScript?: string;\n isDev?: boolean;\n streaming?: boolean;\n}\n\nexport interface PageProps {\n params: Record<string, string>;\n searchParams: Record<string, string>;\n}\n\n/**\n * Render a page to HTML string\n */\nexport async function renderPage(\n route: Route,\n params: Record<string, string>,\n options: RenderOptions = {}\n): Promise<string> {\n const { hmrScript = '', isDev = false, streaming = false } = options;\n void streaming; // Reserved for future streaming implementation\n\n try {\n // Load the page component\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n throw new Error(`No default export found in ${route.filePath}`);\n }\n\n // Load layouts (from root to current)\n const layouts = await Promise.all(\n route.layouts.map(async (layoutPath) => {\n const layoutModule = await transformFile(layoutPath);\n return layoutModule.default;\n })\n );\n\n // Get metadata if exported\n const metadata = pageModule.metadata || {};\n const generateMetadata = pageModule.generateMetadata;\n \n let pageMetadata = metadata;\n if (generateMetadata) {\n pageMetadata = await generateMetadata({ params });\n }\n\n // Create props\n const props: PageProps = {\n params,\n searchParams: {},\n };\n\n // Build component tree with layouts\n let element: React.ReactElement = React.createElement(PageComponent, props);\n \n // Wrap with layouts (innermost to outermost)\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i];\n if (Layout) {\n element = React.createElement(Layout, { children: element }) as React.ReactElement;\n }\n }\n\n // Render to HTML\n const content = renderToString(element);\n\n // Generate full HTML document\n const html = generateHtmlDocument({\n content,\n metadata: pageMetadata,\n hmrScript: isDev ? hmrScript : '',\n isDev,\n });\n\n return html;\n\n } catch (error) {\n console.error('SSR Error:', error);\n throw error;\n }\n}\n\n/**\n * Render with streaming (React 18 Suspense)\n */\nexport async function renderPageStream(\n route: Route,\n params: Record<string, string>,\n _options: RenderOptions = {}\n): Promise<NodeJS.ReadableStream> {\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n const props: PageProps = { params, searchParams: {} };\n const element = React.createElement(PageComponent, props);\n\n return new Promise((resolve, reject) => {\n let html = '';\n \n const writable = new Writable({\n write(chunk, _encoding, callback) {\n html += chunk.toString();\n callback();\n },\n final(callback) {\n callback();\n }\n });\n\n const { pipe, abort } = renderToPipeableStream(element, {\n onShellReady() {\n pipe(writable);\n },\n onShellError(error) {\n reject(error);\n },\n onAllReady() {\n resolve(writable as any);\n },\n onError(error) {\n console.error('Streaming error:', error);\n }\n });\n\n // Timeout after 10 seconds\n setTimeout(() => abort(), 10000);\n });\n}\n\ninterface HtmlDocumentOptions {\n content: string;\n metadata: Record<string, any>;\n hmrScript: string;\n isDev: boolean;\n styles?: string;\n scripts?: string[];\n}\n\n/**\n * Generate full HTML document\n */\nfunction generateHtmlDocument(options: HtmlDocumentOptions): string {\n const { content, metadata, hmrScript, isDev, styles = '', scripts = [] } = options;\n \n // Handle title which can be string or object with default/template\n let title = 'Float.js App';\n if (metadata.title) {\n if (typeof metadata.title === 'string') {\n title = metadata.title;\n } else if (typeof metadata.title === 'object' && metadata.title.default) {\n title = metadata.title.default;\n }\n }\n \n const description = metadata.description || '';\n const charset = metadata.charset || 'utf-8';\n const viewport = metadata.viewport || 'width=device-width, initial-scale=1';\n\n // Generate meta tags\n const metaTags = generateMetaTags(metadata);\n\n return `<!DOCTYPE html>\n<html lang=\"${metadata.lang || 'en'}\">\n<head>\n <meta charset=\"${charset}\">\n <meta name=\"viewport\" content=\"${viewport}\">\n <title>${escapeHtml(title)}</title>\n ${description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''}\n ${metaTags}\n <meta name=\"generator\" content=\"Float.js\">\n <style>\n /* Float.js Base Styles */\n *, *::before, *::after { box-sizing: border-box; }\n html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }\n body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }\n ${styles}\n </style>\n ${isDev ? `\n <style>\n /* Dev mode indicator */\n body::after {\n content: 'DEV';\n position: fixed;\n bottom: 8px;\n right: 8px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n font-size: 10px;\n font-weight: bold;\n padding: 4px 8px;\n border-radius: 4px;\n z-index: 99999;\n font-family: monospace;\n }\n </style>\n ` : ''}\n</head>\n<body>\n <div id=\"__float\">${content}</div>\n ${hmrScript}\n ${scripts.map(src => `<script src=\"${src}\"></script>`).join('\\n ')}\n</body>\n</html>`;\n}\n\n/**\n * Generate meta tags from metadata object\n */\nfunction generateMetaTags(metadata: Record<string, any>): string {\n const tags: string[] = [];\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.image) tags.push(`<meta property=\"og:image\" content=\"${escapeHtml(og.image)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${escapeHtml(og.url)}\">`);\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${escapeHtml(og.type)}\">`);\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${escapeHtml(tw.card)}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.image) tags.push(`<meta name=\"twitter:image\" content=\"${escapeHtml(tw.image)}\">`);\n }\n\n // Robots\n if (metadata.robots) {\n const robots = typeof metadata.robots === 'string' \n ? metadata.robots \n : Object.entries(metadata.robots).map(([k, v]) => v ? k : `no${k}`).join(', ');\n tags.push(`<meta name=\"robots\" content=\"${escapeHtml(robots)}\">`);\n }\n\n // Icons\n if (metadata.icons) {\n const icons = metadata.icons;\n if (icons.icon) tags.push(`<link rel=\"icon\" href=\"${escapeHtml(icons.icon)}\">`);\n if (icons.apple) tags.push(`<link rel=\"apple-touch-icon\" href=\"${escapeHtml(icons.apple)}\">`);\n }\n\n // Canonical\n if (metadata.canonical) {\n tags.push(`<link rel=\"canonical\" href=\"${escapeHtml(metadata.canonical)}\">`);\n }\n\n return tags.join('\\n ');\n}\n\nfunction escapeHtml(text: string): string {\n return String(text)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nexport type { PageProps as FloatPageProps };\n","/**\n * Float.js Transform\n * On-the-fly TypeScript/JSX transformation\n */\n\nimport * as esbuild from 'esbuild';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\n// Module cache for dev mode\nconst moduleCache = new Map<string, { module: any; mtime: number }>();\n\n/**\n * Transform and import a file\n * Handles .ts, .tsx, .js, .jsx files\n */\nexport async function transformFile(filePath: string): Promise<any> {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n \n // Check if file exists\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n const stats = fs.statSync(absolutePath);\n const mtime = stats.mtimeMs;\n\n // Check cache\n const cached = moduleCache.get(absolutePath);\n if (cached && cached.mtime === mtime) {\n return cached.module;\n }\n\n // Read source\n const source = fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath);\n\n // Determine loader\n const loader = getLoader(ext);\n\n // Transform with esbuild\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: absolutePath,\n });\n\n // Create temporary file for import\n const tempDir = path.join(process.cwd(), '.float', '.cache');\n fs.mkdirSync(tempDir, { recursive: true });\n \n const tempFile = path.join(tempDir, `${path.basename(absolutePath, ext)}_${Date.now()}.mjs`);\n \n // Rewrite imports to absolute paths\n let code = result.code;\n code = rewriteImports(code, path.dirname(absolutePath));\n \n fs.writeFileSync(tempFile, code);\n\n try {\n // Dynamic import\n const module = await import(pathToFileURL(tempFile).href);\n \n // Cache the result\n moduleCache.set(absolutePath, { module, mtime });\n \n // Clean up temp file (async)\n setImmediate(() => {\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n });\n\n return module;\n } catch (error) {\n // Clean up on error\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n throw error;\n }\n}\n\n/**\n * Get esbuild loader for file extension\n */\nfunction getLoader(ext: string): esbuild.Loader {\n switch (ext) {\n case '.ts': return 'ts';\n case '.tsx': return 'tsx';\n case '.jsx': return 'jsx';\n case '.js': return 'js';\n case '.mjs': return 'js';\n case '.json': return 'json';\n case '.css': return 'css';\n default: return 'ts';\n }\n}\n\n/**\n * Rewrite relative imports to absolute paths\n */\nfunction rewriteImports(code: string, baseDir: string): string {\n // Match import statements\n const importRegex = /from\\s+['\"](\\.[^'\"]+)['\"]/g;\n \n return code.replace(importRegex, (match, importPath) => {\n // Resolve relative path\n let resolvedPath = path.resolve(baseDir, importPath);\n \n // Try to find the file with various extensions\n const extensions = ['.tsx', '.ts', '.jsx', '.js', '.mjs', ''];\n let found = false;\n \n for (const ext of extensions) {\n const tryPath = resolvedPath + ext;\n if (fs.existsSync(tryPath)) {\n resolvedPath = tryPath;\n found = true;\n break;\n }\n // Try index file\n const indexPath = path.join(resolvedPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n resolvedPath = indexPath;\n found = true;\n break;\n }\n }\n \n if (!found) {\n // Keep original for node_modules imports\n return match;\n }\n \n return `from '${pathToFileURL(resolvedPath).href}'`;\n });\n}\n\n/**\n * Clear module cache (for HMR)\n */\nexport function clearModuleCache(filePath?: string) {\n if (filePath) {\n moduleCache.delete(path.resolve(filePath));\n } else {\n moduleCache.clear();\n }\n}\n\n/**\n * Transform source code without file operations\n */\nexport async function transformSource(\n source: string,\n options: { filename?: string; loader?: esbuild.Loader } = {}\n): Promise<string> {\n const { filename = 'module.tsx', loader = 'tsx' } = options;\n\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: filename,\n });\n\n return result.code;\n}\n","/**\n * Float.js Dev Indicator\n * Minimalist indicator inspired by Next.js\n */\n\nexport const FLOAT_INDICATOR_SCRIPT = `\n<script id=\"__float-indicator\">\n(function() {\n var isConnected = false;\n var isOpen = false;\n var buildTime = null;\n var startTime = Date.now();\n \n var indicator = document.createElement('div');\n indicator.id = '__float-dev-indicator';\n indicator.innerHTML = '<div class=\"float-btn\" id=\"float-btn\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span class=\"float-dot\" id=\"float-dot\"></span></div><div class=\"float-panel\" id=\"float-panel\"><div class=\"float-panel-header\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span>Float.js</span><span class=\"float-version\">v2.0.4</span></div><div class=\"float-panel-body\"><div class=\"float-row\"><span class=\"float-label\">Estado</span><span class=\"float-value\" id=\"float-state\">Conectando...</span></div><div class=\"float-row\"><span class=\"float-label\">HMR</span><span class=\"float-value\" id=\"float-hmr\">β€”</span></div><div class=\"float-row\"><span class=\"float-label\">Build</span><span class=\"float-value\" id=\"float-build\">β€”</span></div></div><div class=\"float-panel-footer\"><a href=\"/__float\" class=\"float-link\">Dashboard</a><a href=\"https://floatjs.dev/docs\" target=\"_blank\" class=\"float-link\">Docs</a></div></div>';\n \n var styles = document.createElement('style');\n styles.textContent = '#__float-dev-indicator{position:fixed;bottom:16px;left:16px;z-index:99999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:13px}.float-btn{display:flex;align-items:center;gap:6px;padding:8px 10px;background:#fff;border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 1px 2px rgba(0,0,0,0.05);cursor:pointer;transition:all 0.15s}.float-btn:hover{border-color:#d1d5db;box-shadow:0 2px 8px rgba(0,0,0,0.08)}.float-dot{width:8px;height:8px;border-radius:50%;background:#d1d5db;transition:background 0.2s}.float-dot.connected{background:#22c55e}.float-dot.error{background:#ef4444}.float-dot.building{background:#eab308;animation:blink 0.8s infinite}@keyframes blink{0%,100%{opacity:1}50%{opacity:0.4}}.float-panel{position:absolute;bottom:48px;left:0;width:240px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 4px 16px rgba(0,0,0,0.1);opacity:0;visibility:hidden;transform:translateY(8px);transition:all 0.2s ease}.float-panel.open{opacity:1;visibility:visible;transform:translateY(0)}.float-panel-header{display:flex;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid #f3f4f6;font-weight:600;color:#111827}.float-version{margin-left:auto;font-size:11px;font-weight:400;color:#9ca3af}.float-panel-body{padding:8px 0}.float-row{display:flex;justify-content:space-between;padding:8px 14px}.float-label{color:#6b7280}.float-value{color:#111827;font-weight:500}.float-value.success{color:#16a34a}.float-value.error{color:#dc2626}.float-panel-footer{display:flex;gap:8px;padding:12px 14px;border-top:1px solid #f3f4f6}.float-link{flex:1;text-align:center;padding:8px;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;color:#374151;text-decoration:none;font-size:12px;font-weight:500;transition:all 0.15s}.float-link:hover{background:#f3f4f6;border-color:#d1d5db}';\n \n document.head.appendChild(styles);\n document.body.appendChild(indicator);\n \n var btn = document.getElementById('float-btn');\n var panel = document.getElementById('float-panel');\n var dot = document.getElementById('float-dot');\n var stateEl = document.getElementById('float-state');\n var hmrEl = document.getElementById('float-hmr');\n var buildEl = document.getElementById('float-build');\n \n btn.addEventListener('click', function(e) {\n e.stopPropagation();\n isOpen = !isOpen;\n panel.classList.toggle('open', isOpen);\n });\n \n document.addEventListener('click', function(e) {\n if (!indicator.contains(e.target) && isOpen) {\n isOpen = false;\n panel.classList.remove('open');\n }\n });\n \n function updateStatus(state) {\n dot.className = 'float-dot ' + state;\n if (state === 'connected') {\n stateEl.textContent = 'Conectado';\n stateEl.className = 'float-value success';\n hmrEl.textContent = 'Activo';\n hmrEl.className = 'float-value success';\n } else if (state === 'building') {\n stateEl.textContent = 'Compilando...';\n stateEl.className = 'float-value';\n } else if (state === 'error') {\n stateEl.textContent = 'Error';\n stateEl.className = 'float-value error';\n } else {\n stateEl.textContent = 'Desconectado';\n stateEl.className = 'float-value';\n hmrEl.textContent = 'Inactivo';\n hmrEl.className = 'float-value';\n }\n }\n \n var wsUrl = 'ws://' + window.location.hostname + ':' + (parseInt(window.location.port) + 1);\n var ws;\n var reconnectAttempts = 0;\n \n function connect() {\n ws = new WebSocket(wsUrl);\n \n ws.onopen = function() {\n isConnected = true;\n reconnectAttempts = 0;\n buildTime = new Date();\n updateStatus('connected');\n buildEl.textContent = 'Ahora';\n };\n \n ws.onmessage = function(event) {\n try {\n var data = JSON.parse(event.data);\n if (data.type === 'reload') window.location.reload();\n if (data.type === 'building') updateStatus('building');\n if (data.type === 'update' || data.type === 'clear-errors') {\n buildTime = new Date();\n buildEl.textContent = 'Ahora';\n updateStatus('connected');\n }\n if (data.type === 'error') updateStatus('error');\n } catch (e) {}\n };\n \n ws.onclose = function() {\n isConnected = false;\n updateStatus('');\n var delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 10000);\n reconnectAttempts++;\n setTimeout(connect, delay);\n };\n \n ws.onerror = function() { ws.close(); };\n }\n \n connect();\n \n setInterval(function() {\n if (buildTime && isConnected) {\n var sec = Math.floor((Date.now() - buildTime) / 1000);\n if (sec < 5) buildEl.textContent = 'Ahora';\n else if (sec < 60) buildEl.textContent = sec + 's';\n else buildEl.textContent = Math.floor(sec / 60) + 'm';\n }\n }, 1000);\n})();\n<\\/script>\n`;\n","/**\n * Float.js Error Overlay\n * Beautiful full-screen error display\n */\n\nexport const FLOAT_ERROR_OVERLAY = `\n<script id=\"__float-error-overlay\">\n(function() {\n window.__FLOAT_SHOW_ERROR = function(error) {\n // Remove existing overlay\n const existing = document.getElementById('__float-error-overlay');\n if (existing) existing.remove();\n \n const overlay = document.createElement('div');\n overlay.id = '__float-error-overlay';\n overlay.innerHTML = \\`\n <div class=\"feo-backdrop\"></div>\n <div class=\"feo-container\">\n <div class=\"feo-header\">\n <div class=\"feo-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n </div>\n <div class=\"feo-title-group\">\n <h1 class=\"feo-title\">\\${error.type || 'Error'}</h1>\n <p class=\"feo-subtitle\">\\${error.file || ''}</p>\n </div>\n <button class=\"feo-close\" onclick=\"this.closest('#__float-error-overlay').remove()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n <div class=\"feo-content\">\n <div class=\"feo-message\">\\${error.message}</div>\n \\${error.stack ? \\`<pre class=\"feo-stack\">\\${error.stack}</pre>\\` : ''}\n \\${error.frame ? \\`\n <div class=\"feo-frame\">\n <div class=\"feo-frame-header\">\n <span class=\"feo-frame-file\">\\${error.file || 'source'}</span>\n \\${error.line ? \\`<span class=\"feo-frame-line\">:\\${error.line}\\${error.column ? ':' + error.column : ''}</span>\\` : ''}\n </div>\n <pre class=\"feo-frame-code\">\\${error.frame}</pre>\n </div>\n \\` : ''}\n </div>\n <div class=\"feo-footer\">\n <div class=\"feo-hint\">\n <span class=\"feo-hint-icon\">πŸ’‘</span>\n <span>\\${error.hint || 'Revisa el cΓ³digo y guarda para recargar automΓ‘ticamente'}</span>\n </div>\n <div class=\"feo-actions\">\n <button class=\"feo-btn feo-btn-secondary\" onclick=\"navigator.clipboard.writeText(document.querySelector('.feo-stack')?.textContent || '')\">\n Copiar error\n </button>\n <button class=\"feo-btn feo-btn-primary\" onclick=\"window.location.reload()\">\n Reintentar\n </button>\n </div>\n </div>\n </div>\n \\`;\n \n const styles = document.createElement('style');\n styles.textContent = \\`\n #__float-error-overlay {\n position: fixed;\n inset: 0;\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n \n .feo-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.85);\n backdrop-filter: blur(8px);\n }\n \n .feo-container {\n position: relative;\n width: 100%;\n max-width: 800px;\n max-height: 90vh;\n background: linear-gradient(145deg, #1a1a1a 0%, #0d0d0d 100%);\n border-radius: 20px;\n border: 1px solid rgba(239, 68, 68, 0.3);\n box-shadow: \n 0 0 0 1px rgba(239, 68, 68, 0.1),\n 0 20px 60px rgba(239, 68, 68, 0.2),\n 0 0 100px rgba(239, 68, 68, 0.1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n \n .feo-header {\n padding: 24px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n background: linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, transparent 100%);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n }\n \n .feo-icon {\n width: 48px;\n height: 48px;\n background: rgba(239, 68, 68, 0.2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n \n .feo-icon svg {\n width: 28px;\n height: 28px;\n color: #ef4444;\n }\n \n .feo-title-group {\n flex: 1;\n min-width: 0;\n }\n \n .feo-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #ef4444;\n }\n \n .feo-subtitle {\n margin: 4px 0 0;\n font-size: 13px;\n color: rgba(255,255,255,0.5);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n \n .feo-close {\n width: 36px;\n height: 36px;\n background: rgba(255,255,255,0.05);\n border: none;\n border-radius: 10px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n \n .feo-close:hover {\n background: rgba(255,255,255,0.1);\n }\n \n .feo-close svg {\n width: 18px;\n height: 18px;\n color: rgba(255,255,255,0.5);\n }\n \n .feo-content {\n padding: 24px;\n overflow-y: auto;\n flex: 1;\n }\n \n .feo-message {\n font-size: 16px;\n color: #fca5a5;\n line-height: 1.6;\n margin-bottom: 20px;\n }\n \n .feo-stack {\n background: rgba(0,0,0,0.4);\n border-radius: 12px;\n padding: 16px;\n margin: 0 0 20px;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n font-size: 12px;\n color: rgba(255,255,255,0.7);\n line-height: 1.8;\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-all;\n }\n \n .feo-frame {\n background: rgba(0,0,0,0.3);\n border-radius: 12px;\n overflow: hidden;\n border: 1px solid rgba(255,255,255,0.05);\n }\n \n .feo-frame-header {\n padding: 12px 16px;\n background: rgba(255,255,255,0.03);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n font-size: 12px;\n }\n \n .feo-frame-file {\n color: #f59e0b;\n }\n \n .feo-frame-line {\n color: rgba(255,255,255,0.4);\n }\n \n .feo-frame-code {\n margin: 0;\n padding: 16px;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n font-size: 13px;\n color: rgba(255,255,255,0.8);\n line-height: 1.6;\n overflow-x: auto;\n }\n \n .feo-footer {\n padding: 20px 24px;\n background: rgba(0,0,0,0.3);\n border-top: 1px solid rgba(255,255,255,0.05);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n }\n \n .feo-hint {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: rgba(255,255,255,0.5);\n }\n \n .feo-hint-icon {\n font-size: 16px;\n }\n \n .feo-actions {\n display: flex;\n gap: 10px;\n }\n \n .feo-btn {\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n }\n \n .feo-btn-secondary {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n \n .feo-btn-secondary:hover {\n background: rgba(255,255,255,0.15);\n }\n \n .feo-btn-primary {\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\n color: white;\n }\n \n .feo-btn-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 20px rgba(139, 92, 246, 0.4);\n }\n \\`;\n \n overlay.appendChild(styles);\n document.body.appendChild(overlay);\n };\n \n window.__FLOAT_HIDE_ERROR = function() {\n const overlay = document.getElementById('__float-error-overlay');\n if (overlay) overlay.remove();\n };\n \n // Global error handler\n window.addEventListener('error', (event) => {\n window.__FLOAT_SHOW_ERROR({\n type: 'Runtime Error',\n message: event.message,\n file: event.filename,\n line: event.lineno,\n column: event.colno,\n stack: event.error?.stack\n });\n });\n \n window.addEventListener('unhandledrejection', (event) => {\n window.__FLOAT_SHOW_ERROR({\n type: 'Unhandled Promise Rejection',\n message: String(event.reason),\n stack: event.reason?.stack\n });\n });\n})();\n</script>\n`;\n","/**\n * Float.js Welcome Page\n * Shown when users first install the framework\n */\n\nexport function generateWelcomePage(): string {\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>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 32 32'><defs><linearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'><stop offset='0%25' stop-color='%236366f1'/><stop offset='100%25' stop-color='%23d946ef'/></linearGradient></defs><circle cx='16' cy='16' r='14' fill='url(%23g)'/></svg>\">\n <style>\n @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');\n \n * { margin: 0; padding: 0; box-sizing: border-box; }\n \n :root {\n --float-purple: #8b5cf6;\n --float-indigo: #6366f1;\n --float-pink: #d946ef;\n --float-cyan: #06b6d4;\n }\n \n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n background: #0a0a0b;\n color: white;\n min-height: 100vh;\n overflow-x: hidden;\n }\n \n /* Animated background */\n .bg-gradient {\n position: fixed;\n inset: 0;\n background: \n radial-gradient(ellipse 80% 50% at 50% -20%, rgba(99, 102, 241, 0.3), transparent),\n radial-gradient(ellipse 60% 40% at 80% 60%, rgba(139, 92, 246, 0.15), transparent),\n radial-gradient(ellipse 40% 30% at 20% 80%, rgba(217, 70, 239, 0.1), transparent);\n pointer-events: none;\n }\n \n .bg-grid {\n position: fixed;\n inset: 0;\n background-image: \n linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),\n linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);\n background-size: 60px 60px;\n pointer-events: none;\n }\n \n /* Floating orbs */\n .orb {\n position: fixed;\n border-radius: 50%;\n filter: blur(80px);\n opacity: 0.5;\n animation: float 20s ease-in-out infinite;\n pointer-events: none;\n }\n \n .orb-1 {\n width: 400px;\n height: 400px;\n background: var(--float-purple);\n top: -100px;\n right: -100px;\n animation-delay: 0s;\n }\n \n .orb-2 {\n width: 300px;\n height: 300px;\n background: var(--float-pink);\n bottom: -50px;\n left: -50px;\n animation-delay: -7s;\n }\n \n .orb-3 {\n width: 200px;\n height: 200px;\n background: var(--float-cyan);\n top: 50%;\n left: 50%;\n animation-delay: -14s;\n }\n \n @keyframes float {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 25% { transform: translate(30px, -30px) scale(1.1); }\n 50% { transform: translate(-20px, 20px) scale(0.9); }\n 75% { transform: translate(20px, 10px) scale(1.05); }\n }\n \n /* Main content */\n .container {\n position: relative;\n max-width: 1200px;\n margin: 0 auto;\n padding: 60px 24px;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n \n /* Logo */\n .logo {\n margin-bottom: 48px;\n animation: fadeInUp 0.8s ease-out;\n }\n \n .logo svg {\n width: 80px;\n height: 80px;\n filter: drop-shadow(0 0 40px rgba(139, 92, 246, 0.5));\n }\n \n /* Hero */\n .hero {\n text-align: center;\n margin-bottom: 64px;\n }\n \n .hero h1 {\n font-size: clamp(48px, 10vw, 80px);\n font-weight: 800;\n letter-spacing: -0.03em;\n line-height: 1.1;\n margin-bottom: 24px;\n animation: fadeInUp 0.8s ease-out 0.1s both;\n }\n \n .hero h1 .gradient {\n background: linear-gradient(135deg, var(--float-indigo), var(--float-purple), var(--float-pink));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n \n .hero p {\n font-size: 20px;\n color: rgba(255,255,255,0.6);\n max-width: 600px;\n margin: 0 auto;\n line-height: 1.7;\n animation: fadeInUp 0.8s ease-out 0.2s both;\n }\n \n /* Features */\n .features {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 20px;\n width: 100%;\n max-width: 900px;\n margin-bottom: 64px;\n }\n \n .feature {\n background: rgba(255,255,255,0.03);\n border: 1px solid rgba(255,255,255,0.06);\n border-radius: 20px;\n padding: 28px;\n transition: all 0.3s ease;\n animation: fadeInUp 0.8s ease-out both;\n }\n \n .feature:nth-child(1) { animation-delay: 0.3s; }\n .feature:nth-child(2) { animation-delay: 0.4s; }\n .feature:nth-child(3) { animation-delay: 0.5s; }\n \n .feature:hover {\n background: rgba(255,255,255,0.05);\n border-color: rgba(139, 92, 246, 0.3);\n transform: translateY(-4px);\n }\n \n .feature-icon {\n width: 48px;\n height: 48px;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.2), rgba(139, 92, 246, 0.2));\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 16px;\n font-size: 24px;\n }\n \n .feature h3 {\n font-size: 18px;\n font-weight: 600;\n margin-bottom: 8px;\n }\n \n .feature p {\n font-size: 14px;\n color: rgba(255,255,255,0.5);\n line-height: 1.6;\n }\n \n /* Code block */\n .code-section {\n width: 100%;\n max-width: 600px;\n animation: fadeInUp 0.8s ease-out 0.6s both;\n margin-bottom: 48px;\n }\n \n .code-header {\n background: rgba(255,255,255,0.05);\n border: 1px solid rgba(255,255,255,0.08);\n border-bottom: none;\n border-radius: 16px 16px 0 0;\n padding: 14px 20px;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n .code-dots {\n display: flex;\n gap: 6px;\n }\n \n .code-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: rgba(255,255,255,0.1);\n }\n \n .code-dot:nth-child(1) { background: #ff5f57; }\n .code-dot:nth-child(2) { background: #febc2e; }\n .code-dot:nth-child(3) { background: #28c840; }\n \n .code-title {\n margin-left: auto;\n font-size: 12px;\n color: rgba(255,255,255,0.4);\n }\n \n .code-block {\n background: rgba(0,0,0,0.4);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 0 0 16px 16px;\n padding: 24px;\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 14px;\n line-height: 1.8;\n overflow-x: auto;\n }\n \n .code-line {\n display: flex;\n }\n \n .code-number {\n color: rgba(255,255,255,0.2);\n width: 40px;\n flex-shrink: 0;\n user-select: none;\n }\n \n .code-content {\n color: rgba(255,255,255,0.8);\n }\n \n .code-keyword { color: #c792ea; }\n .code-string { color: #c3e88d; }\n .code-function { color: #82aaff; }\n .code-comment { color: rgba(255,255,255,0.3); }\n .code-tag { color: #f07178; }\n .code-attr { color: #ffcb6b; }\n \n /* Quick start */\n .quick-start {\n text-align: center;\n animation: fadeInUp 0.8s ease-out 0.7s both;\n }\n \n .quick-start h2 {\n font-size: 14px;\n font-weight: 500;\n color: rgba(255,255,255,0.4);\n text-transform: uppercase;\n letter-spacing: 0.1em;\n margin-bottom: 20px;\n }\n \n .quick-start-cmd {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n background: rgba(255,255,255,0.05);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 12px;\n padding: 16px 24px;\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 15px;\n cursor: pointer;\n transition: all 0.2s;\n }\n \n .quick-start-cmd:hover {\n background: rgba(255,255,255,0.08);\n border-color: rgba(139, 92, 246, 0.4);\n }\n \n .quick-start-cmd .prompt {\n color: var(--float-purple);\n }\n \n .quick-start-cmd .text {\n color: rgba(255,255,255,0.8);\n }\n \n .quick-start-cmd .copy {\n opacity: 0.4;\n transition: opacity 0.2s;\n }\n \n .quick-start-cmd:hover .copy {\n opacity: 0.8;\n }\n \n /* Links */\n .links {\n display: flex;\n gap: 24px;\n margin-top: 48px;\n animation: fadeInUp 0.8s ease-out 0.8s both;\n }\n \n .link {\n color: rgba(255,255,255,0.5);\n text-decoration: none;\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n }\n \n .link:hover {\n color: var(--float-purple);\n }\n \n /* Footer */\n .footer {\n position: absolute;\n bottom: 24px;\n font-size: 12px;\n color: rgba(255,255,255,0.3);\n animation: fadeInUp 0.8s ease-out 0.9s both;\n }\n \n @keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n \n /* Responsive */\n @media (max-width: 640px) {\n .container { padding: 40px 20px; }\n .hero h1 { font-size: 40px; }\n .hero p { font-size: 16px; }\n .features { gap: 16px; }\n .feature { padding: 20px; }\n }\n </style>\n</head>\n<body>\n <div class=\"bg-gradient\"></div>\n <div class=\"bg-grid\"></div>\n <div class=\"orb orb-1\"></div>\n <div class=\"orb orb-2\"></div>\n <div class=\"orb orb-3\"></div>\n \n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 80 80\" fill=\"none\">\n <defs>\n <linearGradient id=\"logoGrad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stop-color=\"#6366f1\"/>\n <stop offset=\"50%\" stop-color=\"#8b5cf6\"/>\n <stop offset=\"100%\" stop-color=\"#d946ef\"/>\n </linearGradient>\n </defs>\n <circle cx=\"40\" cy=\"40\" r=\"36\" stroke=\"url(#logoGrad)\" stroke-width=\"3\" fill=\"none\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 40 40\" to=\"360 40 40\" dur=\"20s\" repeatCount=\"indefinite\"/>\n </circle>\n <circle cx=\"40\" cy=\"40\" r=\"28\" stroke=\"url(#logoGrad)\" stroke-width=\"2\" fill=\"none\" opacity=\"0.5\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"360 40 40\" to=\"0 40 40\" dur=\"15s\" repeatCount=\"indefinite\"/>\n </circle>\n <path d=\"M30 28 L54 40 L30 52 Z\" fill=\"url(#logoGrad)\"/>\n </svg>\n </div>\n \n <div class=\"hero\">\n <h1>Welcome to <span class=\"gradient\">Float.js</span></h1>\n <p>Tu framework ultramoderno estΓ‘ listo. Comienza a crear experiencias web increΓ­bles con SSR, routing inteligente y desarrollo instantΓ‘neo.</p>\n </div>\n \n <div class=\"features\">\n <div class=\"feature\">\n <div class=\"feature-icon\">⚑</div>\n <h3>Desarrollo InstantΓ‘neo</h3>\n <p>Hot reload ultrarrΓ‘pido con esbuild. Ve tus cambios al instante sin perder el estado.</p>\n </div>\n <div class=\"feature\">\n <div class=\"feature-icon\">🎯</div>\n <h3>Routing Inteligente</h3>\n <p>Sistema de rutas basado en archivos. Crea page.tsx y tu ruta estΓ‘ lista automΓ‘ticamente.</p>\n </div>\n <div class=\"feature\">\n <div class=\"feature-icon\">🌊</div>\n <h3>SSR Streaming</h3>\n <p>Renderizado del lado del servidor con React 18 y soporte para streaming nativo.</p>\n </div>\n </div>\n \n <div class=\"code-section\">\n <div class=\"code-header\">\n <div class=\"code-dots\">\n <div class=\"code-dot\"></div>\n <div class=\"code-dot\"></div>\n <div class=\"code-dot\"></div>\n </div>\n <span class=\"code-title\">app/page.tsx</span>\n </div>\n <div class=\"code-block\">\n <div class=\"code-line\">\n <span class=\"code-number\">1</span>\n <span class=\"code-content\"><span class=\"code-keyword\">export default function</span> <span class=\"code-function\">HomePage</span>() {</span>\n </div>\n <div class=\"code-line\">\n <span class=\"code-number\">2</span>\n <span class=\"code-content\"> <span class=\"code-keyword\">return</span> (</span>\n </div>\n <div class=\"code-line\">\n <span class=\"code-number\">3</span>\n <span class=\"code-content\"> <span class=\"code-tag\">&lt;h1&gt;</span>Hello, Float.js!<span class=\"code-tag\">&lt;/h1&gt;</span></span>\n </div>\n <div class=\"code-line\">\n <span class=\"code-number\">4</span>\n <span class=\"code-content\"> );</span>\n </div>\n <div class=\"code-line\">\n <span class=\"code-number\">5</span>\n <span class=\"code-content\">}</span>\n </div>\n </div>\n </div>\n \n <div class=\"quick-start\">\n <h2>Crea tu primera pΓ‘gina</h2>\n <div class=\"quick-start-cmd\" onclick=\"navigator.clipboard.writeText('touch app/about/page.tsx')\">\n <span class=\"prompt\">$</span>\n <span class=\"text\">touch app/about/page.tsx</span>\n <span class=\"copy\">πŸ“‹</span>\n </div>\n </div>\n \n <div class=\"links\">\n <a href=\"https://floatjs.dev/docs\" target=\"_blank\" class=\"link\">\n <span>πŸ“–</span> DocumentaciΓ³n\n </a>\n <a href=\"https://github.com/floatjs/float\" target=\"_blank\" class=\"link\">\n <span>⭐</span> GitHub\n </a>\n <a href=\"https://floatjs.dev/examples\" target=\"_blank\" class=\"link\">\n <span>🎨</span> Ejemplos\n </a>\n </div>\n \n <div class=\"footer\">\n Float.js v2.0.4 β€” Made with ⚑ for the modern web\n </div>\n </div>\n</body>\n</html>`;\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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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAKO,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;AAA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","names":["path","build","path","fs","path","path","error","error","path","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"]}