@float.js/core 2.0.1 → 2.0.3
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/cli/index.js +501 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +4345 -4337
- package/dist/index.js.map +1 -1
- package/dist/server/index.js +501 -0
- package/dist/server/index.js.map +1 -1
- package/package.json +2 -2
package/dist/server/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/server/index.ts","../../src/server/dev-server.ts","../../src/router/index.ts","../../src/server/ssr.ts","../../src/build/transform.ts","../../src/client/float-indicator.ts","../../src/client/error-overlay.ts","../../src/server/prod-server.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 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';\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 if (!route) {\n res.writeHead(404, { 'Content-Type': 'text/html' });\n res.end(create404Page(pathname));\n return;\n }\n\n // Handle API routes\n if (route.type === 'api') {\n await handleApiRoute(req, res, route, params);\n return;\n }\n\n // Render page with SSR\n const html = await renderPage(route, params, { \n hmrScript: hmrClientScript,\n isDev: true,\n });\n\n res.writeHead(200, { \n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(html);\n\n } catch (error) {\n console.error(pc.red('Request error:'), error);\n res.writeHead(500, { 'Content-Type': 'text/html' });\n res.end(createErrorPage(error as Error));\n }\n }\n\n // Handle API routes\n async function handleApiRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n route: Route,\n params: Record<string, string>\n ) {\n try {\n const module = await transformFile(route.absolutePath);\n const method = req.method?.toUpperCase() || 'GET';\n \n // Create Request object\n const url = new URL(req.url || '/', `http://${host}:${port}`);\n const body = await getRequestBody(req);\n \n const request = new Request(url.toString(), {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).filter(([_, v]) => v !== undefined) as [string, string][]\n ),\n body: method !== 'GET' && method !== 'HEAD' ? body : undefined,\n });\n\n // Find handler\n const handler = module[method] || module.default;\n \n if (!handler) {\n res.writeHead(405, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Method not allowed' }));\n return;\n }\n\n // Execute handler\n const response: Response = await handler(request, { params });\n \n // Send response\n res.writeHead(response.status, Object.fromEntries(response.headers));\n const responseBody = await response.text();\n res.end(responseBody);\n\n } catch (error) {\n console.error(pc.red('API route error:'), error);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Internal server error' }));\n }\n }\n\n async function start() {\n await refreshRoutes();\n\n // Create HTTP server\n server = http.createServer(handleRequest);\n \n // Create WebSocket server for HMR\n wss = new WebSocketServer({ port: port + 1 });\n wss.on('connection', (ws) => {\n clients.add(ws);\n ws.on('close', () => clients.delete(ws));\n });\n\n // Watch for file changes\n const watcher = chokidar.watch(\n [\n path.join(rootDir, 'app/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'components/**/*.{ts,tsx,js,jsx}'),\n path.join(rootDir, 'lib/**/*.{ts,tsx,js,jsx}'),\n ],\n {\n ignored: /node_modules/,\n persistent: true,\n }\n );\n\n watcher.on('change', async (filePath) => {\n console.log(pc.yellow(`\\n ⚡ File changed: ${path.relative(rootDir, filePath)}`));\n \n // Check if it's a route file\n if (filePath.includes('/app/')) {\n await refreshRoutes();\n }\n \n notifyClients('reload');\n });\n\n watcher.on('add', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.green(`\\n ➕ File added: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n watcher.on('unlink', async (filePath) => {\n if (filePath.includes('/app/')) {\n console.log(pc.red(`\\n ➖ File removed: ${path.relative(rootDir, filePath)}`));\n await refreshRoutes();\n notifyClients('reload');\n }\n });\n\n // Start server\n return new Promise<void>((resolve, reject) => {\n server!.listen(port, host, () => {\n console.log(pc.green(` ✅ Server running at ${pc.cyan(`http://${host}:${port}`)}`));\n console.log(pc.dim(` ⚡ HMR enabled on ws://${host}:${port + 1}\\n`));\n \n // Print routes\n console.log(pc.bold(' Routes:'));\n routes.forEach(route => {\n if (route.type === 'page') {\n console.log(pc.dim(` ${pc.green('●')} ${route.path}`));\n } else if (route.type === 'api') {\n console.log(pc.dim(` ${pc.blue('◆')} ${route.path} (API)`));\n }\n });\n console.log('');\n\n if (open) {\n import('child_process').then(({ exec }) => {\n exec(`open http://${host}:${port}`);\n });\n }\n\n resolve();\n });\n\n server!.on('error', reject);\n });\n }\n\n async function stop() {\n return new Promise<void>((resolve) => {\n wss?.close();\n server?.close(() => resolve());\n });\n }\n\n async function restart() {\n await stop();\n await start();\n }\n\n return { start, stop, restart };\n}\n\n// Helper functions\nfunction getRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', chunk => body += chunk);\n req.on('end', () => resolve(body));\n req.on('error', reject);\n });\n}\n\nfunction create404Page(pathname: string): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>404 - Not Found | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);\n color: white;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .container { text-align: center; padding: 2rem; }\n h1 { font-size: 8rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); \n -webkit-background-clip: text; -webkit-text-fill-color: transparent; }\n h2 { font-size: 1.5rem; margin: 1rem 0; opacity: 0.8; }\n code { background: rgba(255,255,255,0.1); padding: 0.5rem 1rem; border-radius: 0.5rem; }\n .tip { margin-top: 2rem; opacity: 0.6; font-size: 0.9rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <code>${pathname}</code>\n <p class=\"tip\">Create <code>app${pathname === '/' ? '' : pathname}/page.tsx</code> to add this route</p>\n </div>\n</body>\n</html>`;\n}\n\nfunction createErrorPage(error: Error): string {\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Error | Float.js</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: 'Monaco', 'Menlo', monospace;\n background: #1a1a1a;\n color: #ff6b6b;\n min-height: 100vh;\n padding: 2rem;\n }\n .header { display: flex; align-items: center; gap: 1rem; margin-bottom: 1rem; }\n .icon { font-size: 2rem; }\n h1 { font-size: 1.5rem; }\n .message { color: #ffa94d; font-size: 1.25rem; margin-bottom: 1rem; }\n .stack { \n background: #2d2d2d; \n padding: 1rem; \n border-radius: 0.5rem; \n overflow-x: auto;\n color: #888;\n font-size: 0.875rem;\n line-height: 1.6;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <span class=\"icon\">⚠️</span>\n <h1>Server Error</h1>\n </div>\n <p class=\"message\">${escapeHtml(error.message)}</p>\n <pre class=\"stack\">${escapeHtml(error.stack || '')}</pre>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n","/**\n * Float.js Router\n * File-based routing system\n */\n\nimport fg from 'fast-glob';\nimport path from 'node:path';\n\nexport interface Route {\n /** URL path pattern (e.g., /users/:id) */\n path: string;\n /** File path relative to app directory */\n filePath: string;\n /** Absolute file path */\n absolutePath: string;\n /** Route type */\n type: 'page' | 'layout' | 'api' | 'error' | 'loading';\n /** Dynamic segments */\n params: string[];\n /** Is catch-all route */\n isCatchAll: boolean;\n /** Is optional catch-all */\n isOptionalCatchAll: boolean;\n /** Nested layouts */\n layouts: string[];\n}\n\nexport interface RouterOptions {\n /** Root directory of the app (default: 'app') */\n appDir?: string;\n /** Base path for all routes */\n basePath?: string;\n /** File extensions to consider */\n extensions?: string[];\n}\n\nconst DEFAULT_OPTIONS: Required<RouterOptions> = {\n appDir: 'app',\n basePath: '',\n extensions: ['.tsx', '.ts', '.jsx', '.js'],\n};\n\n/**\n * Convert file path to URL path\n * \n * Examples:\n * - app/page.tsx -> /\n * - app/about/page.tsx -> /about\n * - app/users/[id]/page.tsx -> /users/:id\n * - app/docs/[...slug]/page.tsx -> /docs/*\n * - app/shop/[[...slug]]/page.tsx -> /shop/*?\n */\nfunction filePathToUrlPath(filePath: string, appDir: string): { \n urlPath: string; \n params: string[];\n isCatchAll: boolean;\n isOptionalCatchAll: boolean;\n} {\n // Remove app dir prefix and file name\n let urlPath = filePath\n .replace(new RegExp(`^${appDir}/`), '')\n .replace(/\\/?(page|layout|route|error|loading|not-found)\\.(tsx?|jsx?)$/, '');\n\n const params: string[] = [];\n let isCatchAll = false;\n let isOptionalCatchAll = false;\n\n // Convert [param] to :param\n urlPath = urlPath.replace(/\\[([^\\]]+)\\]/g, (_, param) => {\n // Optional catch-all [[...slug]]\n if (param.startsWith('...') && filePath.includes('[[')) {\n isOptionalCatchAll = true;\n const paramName = param.replace('...', '');\n params.push(paramName);\n return `*${paramName}?`;\n }\n // Catch-all [...slug]\n if (param.startsWith('...')) {\n isCatchAll = true;\n const paramName = param.replace('...', '');\n params.push(paramName);\n return `*${paramName}`;\n }\n // Regular dynamic param [id]\n params.push(param);\n return `:${param}`;\n });\n\n // Ensure leading slash\n urlPath = '/' + urlPath;\n \n // Clean up double slashes and trailing slash\n urlPath = urlPath.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\n\n return { urlPath, params, isCatchAll, isOptionalCatchAll };\n}\n\n/**\n * Determine route type from file name\n */\nfunction getRouteType(filePath: string): Route['type'] {\n // Check if file name (without path) matches special file types\n const fileName = filePath.split('/').pop() || filePath;\n \n if (fileName.match(/^route\\.(tsx?|jsx?)$/)) return 'api';\n if (fileName.match(/^layout\\.(tsx?|jsx?)$/)) return 'layout';\n if (fileName.match(/^error\\.(tsx?|jsx?)$/)) return 'error';\n if (fileName.match(/^loading\\.(tsx?|jsx?)$/)) return 'loading';\n return 'page';\n}\n\n/**\n * Find all layouts that apply to a route\n */\nfunction findLayouts(routePath: string, allLayouts: Map<string, string>): string[] {\n const layouts: string[] = [];\n const segments = routePath.split('/').filter(Boolean);\n \n // Check from root to deepest\n let currentPath = '';\n \n // Root layout\n if (allLayouts.has('/')) {\n layouts.push(allLayouts.get('/')!);\n }\n \n for (const segment of segments) {\n currentPath += '/' + segment;\n if (allLayouts.has(currentPath)) {\n layouts.push(allLayouts.get(currentPath)!);\n }\n }\n \n return layouts;\n}\n\n/**\n * Scan app directory and build routes\n */\nexport async function scanRoutes(\n rootDir: string,\n options: RouterOptions = {}\n): Promise<Route[]> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const appDir = path.join(rootDir, opts.appDir);\n const extensions = opts.extensions.map(ext => ext.replace('.', '')).join(',');\n\n // Find all route files\n const pattern = `**/{page,layout,route,error,loading}.{${extensions}}`;\n const files = await fg(pattern, {\n cwd: appDir,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/_*/**'],\n });\n\n // First pass: collect all layouts\n const layoutMap = new Map<string, string>();\n \n for (const file of files) {\n const type = getRouteType(file);\n if (type === 'layout') {\n const { urlPath } = filePathToUrlPath(file, '');\n const layoutPath = urlPath === '/' ? '/' : urlPath.replace(/\\/layout$/, '') || '/';\n layoutMap.set(layoutPath, path.join(appDir, file));\n }\n }\n\n // Second pass: build all routes (only pages and API routes)\n const routes: Route[] = [];\n\n for (const file of files) {\n const type = getRouteType(file);\n \n // Skip layouts, errors, loading - they are not matchable routes\n if (type === 'layout' || type === 'error' || type === 'loading') {\n continue;\n }\n const { urlPath, params, isCatchAll, isOptionalCatchAll } = filePathToUrlPath(file, '');\n \n const route: Route = {\n path: opts.basePath + urlPath,\n filePath: file,\n absolutePath: path.join(appDir, file),\n type,\n params,\n isCatchAll,\n isOptionalCatchAll,\n layouts: type === 'page' ? findLayouts(urlPath, layoutMap) : [],\n };\n\n routes.push(route);\n }\n\n // Sort routes: static first, then dynamic, catch-all last\n routes.sort((a, b) => {\n if (a.isCatchAll !== b.isCatchAll) return a.isCatchAll ? 1 : -1;\n if (a.params.length !== b.params.length) return a.params.length - b.params.length;\n return a.path.localeCompare(b.path);\n });\n\n return routes;\n}\n\n/**\n * Match a URL path to a route\n */\nexport function matchRoute(url: string, routes: Route[]): { \n route: Route | null; \n params: Record<string, string>;\n} {\n const urlParts = url.split('/').filter(Boolean);\n\n for (const route of routes) {\n if (route.type !== 'page' && route.type !== 'api') continue;\n\n const routeParts = route.path.split('/').filter(Boolean);\n const params: Record<string, string> = {};\n let matched = true;\n let urlIndex = 0;\n\n for (let i = 0; i < routeParts.length; i++) {\n const routePart = routeParts[i];\n\n // Catch-all\n if (routePart.startsWith('*')) {\n const paramName = routePart.replace(/^\\*/, '').replace(/\\?$/, '');\n params[paramName] = urlParts.slice(urlIndex).join('/');\n return { route, params };\n }\n\n // Dynamic segment\n if (routePart.startsWith(':')) {\n const paramName = routePart.slice(1);\n if (urlIndex >= urlParts.length) {\n matched = false;\n break;\n }\n params[paramName] = urlParts[urlIndex];\n urlIndex++;\n continue;\n }\n\n // Static segment\n if (urlParts[urlIndex] !== routePart) {\n matched = false;\n break;\n }\n urlIndex++;\n }\n\n // Check if we consumed all URL parts\n if (matched && urlIndex === urlParts.length) {\n return { route, params };\n }\n }\n\n return { route: null, params: {} };\n}\n\nexport type { Route as FloatRoute, RouterOptions as FloatRouterOptions };\n","/**\n * Float.js SSR Engine\n * Server-Side Rendering with React 18 Streaming\n */\n\nimport React from 'react';\nimport { renderToPipeableStream, renderToString } from 'react-dom/server';\nimport { Writable } from 'node:stream';\nimport type { Route } from '../router/index.js';\nimport { transformFile } from '../build/transform.js';\n\nexport interface RenderOptions {\n hmrScript?: string;\n isDev?: boolean;\n streaming?: boolean;\n}\n\nexport interface PageProps {\n params: Record<string, string>;\n searchParams: Record<string, string>;\n}\n\n/**\n * Render a page to HTML string\n */\nexport async function renderPage(\n route: Route,\n params: Record<string, string>,\n options: RenderOptions = {}\n): Promise<string> {\n const { hmrScript = '', isDev = false, streaming = false } = options;\n void streaming; // Reserved for future streaming implementation\n\n try {\n // Load the page component\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n throw new Error(`No default export found in ${route.filePath}`);\n }\n\n // Load layouts (from root to current)\n const layouts = await Promise.all(\n route.layouts.map(async (layoutPath) => {\n const layoutModule = await transformFile(layoutPath);\n return layoutModule.default;\n })\n );\n\n // Get metadata if exported\n const metadata = pageModule.metadata || {};\n const generateMetadata = pageModule.generateMetadata;\n \n let pageMetadata = metadata;\n if (generateMetadata) {\n pageMetadata = await generateMetadata({ params });\n }\n\n // Create props\n const props: PageProps = {\n params,\n searchParams: {},\n };\n\n // Build component tree with layouts\n let element: React.ReactElement = React.createElement(PageComponent, props);\n \n // Wrap with layouts (innermost to outermost)\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i];\n if (Layout) {\n element = React.createElement(Layout, { children: element }) as React.ReactElement;\n }\n }\n\n // Render to HTML\n const content = renderToString(element);\n\n // Generate full HTML document\n const html = generateHtmlDocument({\n content,\n metadata: pageMetadata,\n hmrScript: isDev ? hmrScript : '',\n isDev,\n });\n\n return html;\n\n } catch (error) {\n console.error('SSR Error:', error);\n throw error;\n }\n}\n\n/**\n * Render with streaming (React 18 Suspense)\n */\nexport async function renderPageStream(\n route: Route,\n params: Record<string, string>,\n _options: RenderOptions = {}\n): Promise<NodeJS.ReadableStream> {\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n const props: PageProps = { params, searchParams: {} };\n const element = React.createElement(PageComponent, props);\n\n return new Promise((resolve, reject) => {\n let html = '';\n \n const writable = new Writable({\n write(chunk, _encoding, callback) {\n html += chunk.toString();\n callback();\n },\n final(callback) {\n callback();\n }\n });\n\n const { pipe, abort } = renderToPipeableStream(element, {\n onShellReady() {\n pipe(writable);\n },\n onShellError(error) {\n reject(error);\n },\n onAllReady() {\n resolve(writable as any);\n },\n onError(error) {\n console.error('Streaming error:', error);\n }\n });\n\n // Timeout after 10 seconds\n setTimeout(() => abort(), 10000);\n });\n}\n\ninterface HtmlDocumentOptions {\n content: string;\n metadata: Record<string, any>;\n hmrScript: string;\n isDev: boolean;\n styles?: string;\n scripts?: string[];\n}\n\n/**\n * Generate full HTML document\n */\nfunction generateHtmlDocument(options: HtmlDocumentOptions): string {\n const { content, metadata, hmrScript, isDev, styles = '', scripts = [] } = options;\n \n // Handle title which can be string or object with default/template\n let title = 'Float.js App';\n if (metadata.title) {\n if (typeof metadata.title === 'string') {\n title = metadata.title;\n } else if (typeof metadata.title === 'object' && metadata.title.default) {\n title = metadata.title.default;\n }\n }\n \n const description = metadata.description || '';\n const charset = metadata.charset || 'utf-8';\n const viewport = metadata.viewport || 'width=device-width, initial-scale=1';\n\n // Generate meta tags\n const metaTags = generateMetaTags(metadata);\n\n return `<!DOCTYPE html>\n<html lang=\"${metadata.lang || 'en'}\">\n<head>\n <meta charset=\"${charset}\">\n <meta name=\"viewport\" content=\"${viewport}\">\n <title>${escapeHtml(title)}</title>\n ${description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''}\n ${metaTags}\n <meta name=\"generator\" content=\"Float.js\">\n <style>\n /* Float.js Base Styles */\n *, *::before, *::after { box-sizing: border-box; }\n html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }\n body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }\n ${styles}\n </style>\n ${isDev ? `\n <style>\n /* Dev mode indicator */\n body::after {\n content: 'DEV';\n position: fixed;\n bottom: 8px;\n right: 8px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n font-size: 10px;\n font-weight: bold;\n padding: 4px 8px;\n border-radius: 4px;\n z-index: 99999;\n font-family: monospace;\n }\n </style>\n ` : ''}\n</head>\n<body>\n <div id=\"__float\">${content}</div>\n ${hmrScript}\n ${scripts.map(src => `<script src=\"${src}\"></script>`).join('\\n ')}\n</body>\n</html>`;\n}\n\n/**\n * Generate meta tags from metadata object\n */\nfunction generateMetaTags(metadata: Record<string, any>): string {\n const tags: string[] = [];\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.image) tags.push(`<meta property=\"og:image\" content=\"${escapeHtml(og.image)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${escapeHtml(og.url)}\">`);\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${escapeHtml(og.type)}\">`);\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${escapeHtml(tw.card)}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.image) tags.push(`<meta name=\"twitter:image\" content=\"${escapeHtml(tw.image)}\">`);\n }\n\n // Robots\n if (metadata.robots) {\n const robots = typeof metadata.robots === 'string' \n ? metadata.robots \n : Object.entries(metadata.robots).map(([k, v]) => v ? k : `no${k}`).join(', ');\n tags.push(`<meta name=\"robots\" content=\"${escapeHtml(robots)}\">`);\n }\n\n // Icons\n if (metadata.icons) {\n const icons = metadata.icons;\n if (icons.icon) tags.push(`<link rel=\"icon\" href=\"${escapeHtml(icons.icon)}\">`);\n if (icons.apple) tags.push(`<link rel=\"apple-touch-icon\" href=\"${escapeHtml(icons.apple)}\">`);\n }\n\n // Canonical\n if (metadata.canonical) {\n tags.push(`<link rel=\"canonical\" href=\"${escapeHtml(metadata.canonical)}\">`);\n }\n\n return tags.join('\\n ');\n}\n\nfunction escapeHtml(text: string): string {\n return String(text)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport type { PageProps as FloatPageProps };\n","/**\n * Float.js Transform\n * On-the-fly TypeScript/JSX transformation\n */\n\nimport * as esbuild from 'esbuild';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\n// Module cache for dev mode\nconst moduleCache = new Map<string, { module: any; mtime: number }>();\n\n/**\n * Transform and import a file\n * Handles .ts, .tsx, .js, .jsx files\n */\nexport async function transformFile(filePath: string): Promise<any> {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n \n // Check if file exists\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n const stats = fs.statSync(absolutePath);\n const mtime = stats.mtimeMs;\n\n // Check cache\n const cached = moduleCache.get(absolutePath);\n if (cached && cached.mtime === mtime) {\n return cached.module;\n }\n\n // Read source\n const source = fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath);\n\n // Determine loader\n const loader = getLoader(ext);\n\n // Transform with esbuild\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: absolutePath,\n });\n\n // Create temporary file for import\n const tempDir = path.join(process.cwd(), '.float', '.cache');\n fs.mkdirSync(tempDir, { recursive: true });\n \n const tempFile = path.join(tempDir, `${path.basename(absolutePath, ext)}_${Date.now()}.mjs`);\n \n // Rewrite imports to absolute paths\n let code = result.code;\n code = rewriteImports(code, path.dirname(absolutePath));\n \n fs.writeFileSync(tempFile, code);\n\n try {\n // Dynamic import\n const module = await import(pathToFileURL(tempFile).href);\n \n // Cache the result\n moduleCache.set(absolutePath, { module, mtime });\n \n // Clean up temp file (async)\n setImmediate(() => {\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n });\n\n return module;\n } catch (error) {\n // Clean up on error\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n throw error;\n }\n}\n\n/**\n * Get esbuild loader for file extension\n */\nfunction getLoader(ext: string): esbuild.Loader {\n switch (ext) {\n case '.ts': return 'ts';\n case '.tsx': return 'tsx';\n case '.jsx': return 'jsx';\n case '.js': return 'js';\n case '.mjs': return 'js';\n case '.json': return 'json';\n case '.css': return 'css';\n default: return 'ts';\n }\n}\n\n/**\n * Rewrite relative imports to absolute paths\n */\nfunction rewriteImports(code: string, baseDir: string): string {\n // Match import statements\n const importRegex = /from\\s+['\"](\\.[^'\"]+)['\"]/g;\n \n return code.replace(importRegex, (match, importPath) => {\n // Resolve relative path\n let resolvedPath = path.resolve(baseDir, importPath);\n \n // Try to find the file with various extensions\n const extensions = ['.tsx', '.ts', '.jsx', '.js', '.mjs', ''];\n let found = false;\n \n for (const ext of extensions) {\n const tryPath = resolvedPath + ext;\n if (fs.existsSync(tryPath)) {\n resolvedPath = tryPath;\n found = true;\n break;\n }\n // Try index file\n const indexPath = path.join(resolvedPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n resolvedPath = indexPath;\n found = true;\n break;\n }\n }\n \n if (!found) {\n // Keep original for node_modules imports\n return match;\n }\n \n return `from '${pathToFileURL(resolvedPath).href}'`;\n });\n}\n\n/**\n * Clear module cache (for HMR)\n */\nexport function clearModuleCache(filePath?: string) {\n if (filePath) {\n moduleCache.delete(path.resolve(filePath));\n } else {\n moduleCache.clear();\n }\n}\n\n/**\n * Transform source code without file operations\n */\nexport async function transformSource(\n source: string,\n options: { filename?: string; loader?: esbuild.Loader } = {}\n): Promise<string> {\n const { filename = 'module.tsx', loader = 'tsx' } = options;\n\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: filename,\n });\n\n return result.code;\n}\n","/**\n * Float.js Dev Indicator\n * Minimalist indicator inspired by Next.js\n */\n\nexport const FLOAT_INDICATOR_SCRIPT = `\n<script id=\"__float-indicator\">\n(function() {\n var isConnected = false;\n var isOpen = false;\n var buildTime = null;\n var startTime = Date.now();\n \n var indicator = document.createElement('div');\n indicator.id = '__float-dev-indicator';\n indicator.innerHTML = '<div class=\"float-btn\" id=\"float-btn\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span class=\"float-dot\" id=\"float-dot\"></span></div><div class=\"float-panel\" id=\"float-panel\"><div class=\"float-panel-header\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span>Float.js</span><span class=\"float-version\">v2.0.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 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"],"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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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACLtC;AAKO,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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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","names":["path","fs","path","path","path","path","fs","dashboardState","createDevDashboard","escapeHtml","http","fs","path","pc","mime","path","fs","pc","http","mime"]}
|
|
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/server/index.ts","../../src/server/dev-server.ts","../../src/router/index.ts","../../src/server/ssr.ts","../../src/build/transform.ts","../../src/client/float-indicator.ts","../../src/client/error-overlay.ts","../../src/client/welcome-page.ts","../../src/server/prod-server.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 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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n","/**\n * Float.js Router\n * File-based routing system\n */\n\nimport fg from 'fast-glob';\nimport path from 'node:path';\n\nexport interface Route {\n /** URL path pattern (e.g., /users/:id) */\n path: string;\n /** File path relative to app directory */\n filePath: string;\n /** Absolute file path */\n absolutePath: string;\n /** Route type */\n type: 'page' | 'layout' | 'api' | 'error' | 'loading';\n /** Dynamic segments */\n params: string[];\n /** Is catch-all route */\n isCatchAll: boolean;\n /** Is optional catch-all */\n isOptionalCatchAll: boolean;\n /** Nested layouts */\n layouts: string[];\n}\n\nexport interface RouterOptions {\n /** Root directory of the app (default: 'app') */\n appDir?: string;\n /** Base path for all routes */\n basePath?: string;\n /** File extensions to consider */\n extensions?: string[];\n}\n\nconst DEFAULT_OPTIONS: Required<RouterOptions> = {\n appDir: 'app',\n basePath: '',\n extensions: ['.tsx', '.ts', '.jsx', '.js'],\n};\n\n/**\n * Convert file path to URL path\n * \n * Examples:\n * - app/page.tsx -> /\n * - app/about/page.tsx -> /about\n * - app/users/[id]/page.tsx -> /users/:id\n * - app/docs/[...slug]/page.tsx -> /docs/*\n * - app/shop/[[...slug]]/page.tsx -> /shop/*?\n */\nfunction filePathToUrlPath(filePath: string, appDir: string): { \n urlPath: string; \n params: string[];\n isCatchAll: boolean;\n isOptionalCatchAll: boolean;\n} {\n // Remove app dir prefix and file name\n let urlPath = filePath\n .replace(new RegExp(`^${appDir}/`), '')\n .replace(/\\/?(page|layout|route|error|loading|not-found)\\.(tsx?|jsx?)$/, '');\n\n const params: string[] = [];\n let isCatchAll = false;\n let isOptionalCatchAll = false;\n\n // Convert [param] to :param\n urlPath = urlPath.replace(/\\[([^\\]]+)\\]/g, (_, param) => {\n // Optional catch-all [[...slug]]\n if (param.startsWith('...') && filePath.includes('[[')) {\n isOptionalCatchAll = true;\n const paramName = param.replace('...', '');\n params.push(paramName);\n return `*${paramName}?`;\n }\n // Catch-all [...slug]\n if (param.startsWith('...')) {\n isCatchAll = true;\n const paramName = param.replace('...', '');\n params.push(paramName);\n return `*${paramName}`;\n }\n // Regular dynamic param [id]\n params.push(param);\n return `:${param}`;\n });\n\n // Ensure leading slash\n urlPath = '/' + urlPath;\n \n // Clean up double slashes and trailing slash\n urlPath = urlPath.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/';\n\n return { urlPath, params, isCatchAll, isOptionalCatchAll };\n}\n\n/**\n * Determine route type from file name\n */\nfunction getRouteType(filePath: string): Route['type'] {\n // Check if file name (without path) matches special file types\n const fileName = filePath.split('/').pop() || filePath;\n \n if (fileName.match(/^route\\.(tsx?|jsx?)$/)) return 'api';\n if (fileName.match(/^layout\\.(tsx?|jsx?)$/)) return 'layout';\n if (fileName.match(/^error\\.(tsx?|jsx?)$/)) return 'error';\n if (fileName.match(/^loading\\.(tsx?|jsx?)$/)) return 'loading';\n return 'page';\n}\n\n/**\n * Find all layouts that apply to a route\n */\nfunction findLayouts(routePath: string, allLayouts: Map<string, string>): string[] {\n const layouts: string[] = [];\n const segments = routePath.split('/').filter(Boolean);\n \n // Check from root to deepest\n let currentPath = '';\n \n // Root layout\n if (allLayouts.has('/')) {\n layouts.push(allLayouts.get('/')!);\n }\n \n for (const segment of segments) {\n currentPath += '/' + segment;\n if (allLayouts.has(currentPath)) {\n layouts.push(allLayouts.get(currentPath)!);\n }\n }\n \n return layouts;\n}\n\n/**\n * Scan app directory and build routes\n */\nexport async function scanRoutes(\n rootDir: string,\n options: RouterOptions = {}\n): Promise<Route[]> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const appDir = path.join(rootDir, opts.appDir);\n const extensions = opts.extensions.map(ext => ext.replace('.', '')).join(',');\n\n // Find all route files\n const pattern = `**/{page,layout,route,error,loading}.{${extensions}}`;\n const files = await fg(pattern, {\n cwd: appDir,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/_*/**'],\n });\n\n // First pass: collect all layouts\n const layoutMap = new Map<string, string>();\n \n for (const file of files) {\n const type = getRouteType(file);\n if (type === 'layout') {\n const { urlPath } = filePathToUrlPath(file, '');\n const layoutPath = urlPath === '/' ? '/' : urlPath.replace(/\\/layout$/, '') || '/';\n layoutMap.set(layoutPath, path.join(appDir, file));\n }\n }\n\n // Second pass: build all routes (only pages and API routes)\n const routes: Route[] = [];\n\n for (const file of files) {\n const type = getRouteType(file);\n \n // Skip layouts, errors, loading - they are not matchable routes\n if (type === 'layout' || type === 'error' || type === 'loading') {\n continue;\n }\n const { urlPath, params, isCatchAll, isOptionalCatchAll } = filePathToUrlPath(file, '');\n \n const route: Route = {\n path: opts.basePath + urlPath,\n filePath: file,\n absolutePath: path.join(appDir, file),\n type,\n params,\n isCatchAll,\n isOptionalCatchAll,\n layouts: type === 'page' ? findLayouts(urlPath, layoutMap) : [],\n };\n\n routes.push(route);\n }\n\n // Sort routes: static first, then dynamic, catch-all last\n routes.sort((a, b) => {\n if (a.isCatchAll !== b.isCatchAll) return a.isCatchAll ? 1 : -1;\n if (a.params.length !== b.params.length) return a.params.length - b.params.length;\n return a.path.localeCompare(b.path);\n });\n\n return routes;\n}\n\n/**\n * Match a URL path to a route\n */\nexport function matchRoute(url: string, routes: Route[]): { \n route: Route | null; \n params: Record<string, string>;\n} {\n const urlParts = url.split('/').filter(Boolean);\n\n for (const route of routes) {\n if (route.type !== 'page' && route.type !== 'api') continue;\n\n const routeParts = route.path.split('/').filter(Boolean);\n const params: Record<string, string> = {};\n let matched = true;\n let urlIndex = 0;\n\n for (let i = 0; i < routeParts.length; i++) {\n const routePart = routeParts[i];\n\n // Catch-all\n if (routePart.startsWith('*')) {\n const paramName = routePart.replace(/^\\*/, '').replace(/\\?$/, '');\n params[paramName] = urlParts.slice(urlIndex).join('/');\n return { route, params };\n }\n\n // Dynamic segment\n if (routePart.startsWith(':')) {\n const paramName = routePart.slice(1);\n if (urlIndex >= urlParts.length) {\n matched = false;\n break;\n }\n params[paramName] = urlParts[urlIndex];\n urlIndex++;\n continue;\n }\n\n // Static segment\n if (urlParts[urlIndex] !== routePart) {\n matched = false;\n break;\n }\n urlIndex++;\n }\n\n // Check if we consumed all URL parts\n if (matched && urlIndex === urlParts.length) {\n return { route, params };\n }\n }\n\n return { route: null, params: {} };\n}\n\nexport type { Route as FloatRoute, RouterOptions as FloatRouterOptions };\n","/**\n * Float.js SSR Engine\n * Server-Side Rendering with React 18 Streaming\n */\n\nimport React from 'react';\nimport { renderToPipeableStream, renderToString } from 'react-dom/server';\nimport { Writable } from 'node:stream';\nimport type { Route } from '../router/index.js';\nimport { transformFile } from '../build/transform.js';\n\nexport interface RenderOptions {\n hmrScript?: string;\n isDev?: boolean;\n streaming?: boolean;\n}\n\nexport interface PageProps {\n params: Record<string, string>;\n searchParams: Record<string, string>;\n}\n\n/**\n * Render a page to HTML string\n */\nexport async function renderPage(\n route: Route,\n params: Record<string, string>,\n options: RenderOptions = {}\n): Promise<string> {\n const { hmrScript = '', isDev = false, streaming = false } = options;\n void streaming; // Reserved for future streaming implementation\n\n try {\n // Load the page component\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n throw new Error(`No default export found in ${route.filePath}`);\n }\n\n // Load layouts (from root to current)\n const layouts = await Promise.all(\n route.layouts.map(async (layoutPath) => {\n const layoutModule = await transformFile(layoutPath);\n return layoutModule.default;\n })\n );\n\n // Get metadata if exported\n const metadata = pageModule.metadata || {};\n const generateMetadata = pageModule.generateMetadata;\n \n let pageMetadata = metadata;\n if (generateMetadata) {\n pageMetadata = await generateMetadata({ params });\n }\n\n // Create props\n const props: PageProps = {\n params,\n searchParams: {},\n };\n\n // Build component tree with layouts\n let element: React.ReactElement = React.createElement(PageComponent, props);\n \n // Wrap with layouts (innermost to outermost)\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i];\n if (Layout) {\n element = React.createElement(Layout, { children: element }) as React.ReactElement;\n }\n }\n\n // Render to HTML\n const content = renderToString(element);\n\n // Generate full HTML document\n const html = generateHtmlDocument({\n content,\n metadata: pageMetadata,\n hmrScript: isDev ? hmrScript : '',\n isDev,\n });\n\n return html;\n\n } catch (error) {\n console.error('SSR Error:', error);\n throw error;\n }\n}\n\n/**\n * Render with streaming (React 18 Suspense)\n */\nexport async function renderPageStream(\n route: Route,\n params: Record<string, string>,\n _options: RenderOptions = {}\n): Promise<NodeJS.ReadableStream> {\n const pageModule = await transformFile(route.absolutePath);\n const PageComponent = pageModule.default;\n\n const props: PageProps = { params, searchParams: {} };\n const element = React.createElement(PageComponent, props);\n\n return new Promise((resolve, reject) => {\n let html = '';\n \n const writable = new Writable({\n write(chunk, _encoding, callback) {\n html += chunk.toString();\n callback();\n },\n final(callback) {\n callback();\n }\n });\n\n const { pipe, abort } = renderToPipeableStream(element, {\n onShellReady() {\n pipe(writable);\n },\n onShellError(error) {\n reject(error);\n },\n onAllReady() {\n resolve(writable as any);\n },\n onError(error) {\n console.error('Streaming error:', error);\n }\n });\n\n // Timeout after 10 seconds\n setTimeout(() => abort(), 10000);\n });\n}\n\ninterface HtmlDocumentOptions {\n content: string;\n metadata: Record<string, any>;\n hmrScript: string;\n isDev: boolean;\n styles?: string;\n scripts?: string[];\n}\n\n/**\n * Generate full HTML document\n */\nfunction generateHtmlDocument(options: HtmlDocumentOptions): string {\n const { content, metadata, hmrScript, isDev, styles = '', scripts = [] } = options;\n \n // Handle title which can be string or object with default/template\n let title = 'Float.js App';\n if (metadata.title) {\n if (typeof metadata.title === 'string') {\n title = metadata.title;\n } else if (typeof metadata.title === 'object' && metadata.title.default) {\n title = metadata.title.default;\n }\n }\n \n const description = metadata.description || '';\n const charset = metadata.charset || 'utf-8';\n const viewport = metadata.viewport || 'width=device-width, initial-scale=1';\n\n // Generate meta tags\n const metaTags = generateMetaTags(metadata);\n\n return `<!DOCTYPE html>\n<html lang=\"${metadata.lang || 'en'}\">\n<head>\n <meta charset=\"${charset}\">\n <meta name=\"viewport\" content=\"${viewport}\">\n <title>${escapeHtml(title)}</title>\n ${description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''}\n ${metaTags}\n <meta name=\"generator\" content=\"Float.js\">\n <style>\n /* Float.js Base Styles */\n *, *::before, *::after { box-sizing: border-box; }\n html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }\n body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }\n ${styles}\n </style>\n ${isDev ? `\n <style>\n /* Dev mode indicator */\n body::after {\n content: 'DEV';\n position: fixed;\n bottom: 8px;\n right: 8px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n font-size: 10px;\n font-weight: bold;\n padding: 4px 8px;\n border-radius: 4px;\n z-index: 99999;\n font-family: monospace;\n }\n </style>\n ` : ''}\n</head>\n<body>\n <div id=\"__float\">${content}</div>\n ${hmrScript}\n ${scripts.map(src => `<script src=\"${src}\"></script>`).join('\\n ')}\n</body>\n</html>`;\n}\n\n/**\n * Generate meta tags from metadata object\n */\nfunction generateMetaTags(metadata: Record<string, any>): string {\n const tags: string[] = [];\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.image) tags.push(`<meta property=\"og:image\" content=\"${escapeHtml(og.image)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${escapeHtml(og.url)}\">`);\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${escapeHtml(og.type)}\">`);\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${escapeHtml(tw.card)}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.image) tags.push(`<meta name=\"twitter:image\" content=\"${escapeHtml(tw.image)}\">`);\n }\n\n // Robots\n if (metadata.robots) {\n const robots = typeof metadata.robots === 'string' \n ? metadata.robots \n : Object.entries(metadata.robots).map(([k, v]) => v ? k : `no${k}`).join(', ');\n tags.push(`<meta name=\"robots\" content=\"${escapeHtml(robots)}\">`);\n }\n\n // Icons\n if (metadata.icons) {\n const icons = metadata.icons;\n if (icons.icon) tags.push(`<link rel=\"icon\" href=\"${escapeHtml(icons.icon)}\">`);\n if (icons.apple) tags.push(`<link rel=\"apple-touch-icon\" href=\"${escapeHtml(icons.apple)}\">`);\n }\n\n // Canonical\n if (metadata.canonical) {\n tags.push(`<link rel=\"canonical\" href=\"${escapeHtml(metadata.canonical)}\">`);\n }\n\n return tags.join('\\n ');\n}\n\nfunction escapeHtml(text: string): string {\n return String(text)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport type { PageProps as FloatPageProps };\n","/**\n * Float.js Transform\n * On-the-fly TypeScript/JSX transformation\n */\n\nimport * as esbuild from 'esbuild';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\n// Module cache for dev mode\nconst moduleCache = new Map<string, { module: any; mtime: number }>();\n\n/**\n * Transform and import a file\n * Handles .ts, .tsx, .js, .jsx files\n */\nexport async function transformFile(filePath: string): Promise<any> {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n \n // Check if file exists\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n const stats = fs.statSync(absolutePath);\n const mtime = stats.mtimeMs;\n\n // Check cache\n const cached = moduleCache.get(absolutePath);\n if (cached && cached.mtime === mtime) {\n return cached.module;\n }\n\n // Read source\n const source = fs.readFileSync(absolutePath, 'utf-8');\n const ext = path.extname(absolutePath);\n\n // Determine loader\n const loader = getLoader(ext);\n\n // Transform with esbuild\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: absolutePath,\n });\n\n // Create temporary file for import\n const tempDir = path.join(process.cwd(), '.float', '.cache');\n fs.mkdirSync(tempDir, { recursive: true });\n \n const tempFile = path.join(tempDir, `${path.basename(absolutePath, ext)}_${Date.now()}.mjs`);\n \n // Rewrite imports to absolute paths\n let code = result.code;\n code = rewriteImports(code, path.dirname(absolutePath));\n \n fs.writeFileSync(tempFile, code);\n\n try {\n // Dynamic import\n const module = await import(pathToFileURL(tempFile).href);\n \n // Cache the result\n moduleCache.set(absolutePath, { module, mtime });\n \n // Clean up temp file (async)\n setImmediate(() => {\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n });\n\n return module;\n } catch (error) {\n // Clean up on error\n try {\n fs.unlinkSync(tempFile);\n } catch {}\n throw error;\n }\n}\n\n/**\n * Get esbuild loader for file extension\n */\nfunction getLoader(ext: string): esbuild.Loader {\n switch (ext) {\n case '.ts': return 'ts';\n case '.tsx': return 'tsx';\n case '.jsx': return 'jsx';\n case '.js': return 'js';\n case '.mjs': return 'js';\n case '.json': return 'json';\n case '.css': return 'css';\n default: return 'ts';\n }\n}\n\n/**\n * Rewrite relative imports to absolute paths\n */\nfunction rewriteImports(code: string, baseDir: string): string {\n // Match import statements\n const importRegex = /from\\s+['\"](\\.[^'\"]+)['\"]/g;\n \n return code.replace(importRegex, (match, importPath) => {\n // Resolve relative path\n let resolvedPath = path.resolve(baseDir, importPath);\n \n // Try to find the file with various extensions\n const extensions = ['.tsx', '.ts', '.jsx', '.js', '.mjs', ''];\n let found = false;\n \n for (const ext of extensions) {\n const tryPath = resolvedPath + ext;\n if (fs.existsSync(tryPath)) {\n resolvedPath = tryPath;\n found = true;\n break;\n }\n // Try index file\n const indexPath = path.join(resolvedPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n resolvedPath = indexPath;\n found = true;\n break;\n }\n }\n \n if (!found) {\n // Keep original for node_modules imports\n return match;\n }\n \n return `from '${pathToFileURL(resolvedPath).href}'`;\n });\n}\n\n/**\n * Clear module cache (for HMR)\n */\nexport function clearModuleCache(filePath?: string) {\n if (filePath) {\n moduleCache.delete(path.resolve(filePath));\n } else {\n moduleCache.clear();\n }\n}\n\n/**\n * Transform source code without file operations\n */\nexport async function transformSource(\n source: string,\n options: { filename?: string; loader?: esbuild.Loader } = {}\n): Promise<string> {\n const { filename = 'module.tsx', loader = 'tsx' } = options;\n\n const result = await esbuild.transform(source, {\n loader,\n jsx: 'automatic',\n format: 'esm',\n target: 'node18',\n sourcemap: 'inline',\n sourcefile: filename,\n });\n\n return result.code;\n}\n","/**\n * Float.js Dev Indicator\n * Minimalist indicator inspired by Next.js\n */\n\nexport const FLOAT_INDICATOR_SCRIPT = `\n<script id=\"__float-indicator\">\n(function() {\n var isConnected = false;\n var isOpen = false;\n var buildTime = null;\n var startTime = Date.now();\n \n var indicator = document.createElement('div');\n indicator.id = '__float-dev-indicator';\n indicator.innerHTML = '<div class=\"float-btn\" id=\"float-btn\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span class=\"float-dot\" id=\"float-dot\"></span></div><div class=\"float-panel\" id=\"float-panel\"><div class=\"float-panel-header\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 200 200\" fill=\"none\"><path d=\"M50 145C50 136.716 56.7157 130 65 130H105C113.284 130 120 136.716 120 145C120 153.284 113.284 160 105 160H65C56.7157 160 50 153.284 50 145Z\" fill=\"#3B82F6\"/><path d=\"M50 100C50 91.7157 56.7157 85 65 85H135C143.284 85 150 91.7157 150 100C150 108.284 143.284 115 135 115H65C56.7157 115 50 108.284 50 100Z\" fill=\"#6366F1\"/><path d=\"M50 55C50 46.7157 56.7157 40 65 40H155C163.284 40 170 46.7157 170 55C170 63.2843 163.284 70 155 70H65C56.7157 70 50 63.2843 50 55Z\" fill=\"#8B5CF6\"/></svg><span>Float.js</span><span class=\"float-version\">v2.0.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\"><h1></span>Hello, Float.js!<span class=\"code-tag\"></h1></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"],"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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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACLtC;AAKO,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["path","fs","path","path","path","path","fs","dashboardState","createDevDashboard","escapeHtml","http","fs","path","pc","mime","path","fs","pc","http","mime"]}
|