@aigne/afs-ui 1.11.0-beta.12

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.
Files changed (196) hide show
  1. package/LICENSE.md +26 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  4. package/dist/aup-protocol.cjs +235 -0
  5. package/dist/aup-protocol.d.cts +78 -0
  6. package/dist/aup-protocol.d.cts.map +1 -0
  7. package/dist/aup-protocol.d.mts +78 -0
  8. package/dist/aup-protocol.d.mts.map +1 -0
  9. package/dist/aup-protocol.mjs +235 -0
  10. package/dist/aup-protocol.mjs.map +1 -0
  11. package/dist/aup-registry.cjs +2489 -0
  12. package/dist/aup-registry.mjs +2487 -0
  13. package/dist/aup-registry.mjs.map +1 -0
  14. package/dist/aup-spec.cjs +1467 -0
  15. package/dist/aup-spec.mjs +1466 -0
  16. package/dist/aup-spec.mjs.map +1 -0
  17. package/dist/aup-types.cjs +165 -0
  18. package/dist/aup-types.d.cts +157 -0
  19. package/dist/aup-types.d.cts.map +1 -0
  20. package/dist/aup-types.d.mts +157 -0
  21. package/dist/aup-types.d.mts.map +1 -0
  22. package/dist/aup-types.mjs +157 -0
  23. package/dist/aup-types.mjs.map +1 -0
  24. package/dist/backend.cjs +14 -0
  25. package/dist/backend.d.cts +104 -0
  26. package/dist/backend.d.cts.map +1 -0
  27. package/dist/backend.d.mts +104 -0
  28. package/dist/backend.d.mts.map +1 -0
  29. package/dist/backend.mjs +13 -0
  30. package/dist/backend.mjs.map +1 -0
  31. package/dist/degradation.cjs +85 -0
  32. package/dist/degradation.d.cts +17 -0
  33. package/dist/degradation.d.cts.map +1 -0
  34. package/dist/degradation.d.mts +17 -0
  35. package/dist/degradation.d.mts.map +1 -0
  36. package/dist/degradation.mjs +84 -0
  37. package/dist/degradation.mjs.map +1 -0
  38. package/dist/index.cjs +36 -0
  39. package/dist/index.d.cts +12 -0
  40. package/dist/index.d.mts +12 -0
  41. package/dist/index.mjs +13 -0
  42. package/dist/runtime.cjs +117 -0
  43. package/dist/runtime.d.cts +59 -0
  44. package/dist/runtime.d.cts.map +1 -0
  45. package/dist/runtime.d.mts +59 -0
  46. package/dist/runtime.d.mts.map +1 -0
  47. package/dist/runtime.mjs +118 -0
  48. package/dist/runtime.mjs.map +1 -0
  49. package/dist/session.cjs +159 -0
  50. package/dist/session.d.cts +80 -0
  51. package/dist/session.d.cts.map +1 -0
  52. package/dist/session.d.mts +80 -0
  53. package/dist/session.d.mts.map +1 -0
  54. package/dist/session.mjs +159 -0
  55. package/dist/session.mjs.map +1 -0
  56. package/dist/snapshot.cjs +162 -0
  57. package/dist/snapshot.mjs +163 -0
  58. package/dist/snapshot.mjs.map +1 -0
  59. package/dist/term-page.cjs +264 -0
  60. package/dist/term-page.mjs +264 -0
  61. package/dist/term-page.mjs.map +1 -0
  62. package/dist/term.cjs +295 -0
  63. package/dist/term.d.cts +84 -0
  64. package/dist/term.d.cts.map +1 -0
  65. package/dist/term.d.mts +84 -0
  66. package/dist/term.d.mts.map +1 -0
  67. package/dist/term.mjs +296 -0
  68. package/dist/term.mjs.map +1 -0
  69. package/dist/tty.cjs +136 -0
  70. package/dist/tty.d.cts +53 -0
  71. package/dist/tty.d.cts.map +1 -0
  72. package/dist/tty.d.mts +53 -0
  73. package/dist/tty.d.mts.map +1 -0
  74. package/dist/tty.mjs +135 -0
  75. package/dist/tty.mjs.map +1 -0
  76. package/dist/ui-provider.cjs +4615 -0
  77. package/dist/ui-provider.d.cts +307 -0
  78. package/dist/ui-provider.d.cts.map +1 -0
  79. package/dist/ui-provider.d.mts +307 -0
  80. package/dist/ui-provider.d.mts.map +1 -0
  81. package/dist/ui-provider.mjs +4616 -0
  82. package/dist/ui-provider.mjs.map +1 -0
  83. package/dist/web-page/core.cjs +1388 -0
  84. package/dist/web-page/core.mjs +1387 -0
  85. package/dist/web-page/core.mjs.map +1 -0
  86. package/dist/web-page/css.cjs +1699 -0
  87. package/dist/web-page/css.mjs +1698 -0
  88. package/dist/web-page/css.mjs.map +1 -0
  89. package/dist/web-page/icons.cjs +248 -0
  90. package/dist/web-page/icons.mjs +248 -0
  91. package/dist/web-page/icons.mjs.map +1 -0
  92. package/dist/web-page/overlay-themes.cjs +514 -0
  93. package/dist/web-page/overlay-themes.mjs +513 -0
  94. package/dist/web-page/overlay-themes.mjs.map +1 -0
  95. package/dist/web-page/renderers/action.cjs +72 -0
  96. package/dist/web-page/renderers/action.mjs +72 -0
  97. package/dist/web-page/renderers/action.mjs.map +1 -0
  98. package/dist/web-page/renderers/broadcast.cjs +160 -0
  99. package/dist/web-page/renderers/broadcast.mjs +160 -0
  100. package/dist/web-page/renderers/broadcast.mjs.map +1 -0
  101. package/dist/web-page/renderers/calendar.cjs +137 -0
  102. package/dist/web-page/renderers/calendar.mjs +137 -0
  103. package/dist/web-page/renderers/calendar.mjs.map +1 -0
  104. package/dist/web-page/renderers/canvas.cjs +173 -0
  105. package/dist/web-page/renderers/canvas.mjs +173 -0
  106. package/dist/web-page/renderers/canvas.mjs.map +1 -0
  107. package/dist/web-page/renderers/cdn-loader.cjs +25 -0
  108. package/dist/web-page/renderers/cdn-loader.mjs +25 -0
  109. package/dist/web-page/renderers/cdn-loader.mjs.map +1 -0
  110. package/dist/web-page/renderers/chart.cjs +101 -0
  111. package/dist/web-page/renderers/chart.mjs +101 -0
  112. package/dist/web-page/renderers/chart.mjs.map +1 -0
  113. package/dist/web-page/renderers/deck.cjs +390 -0
  114. package/dist/web-page/renderers/deck.mjs +390 -0
  115. package/dist/web-page/renderers/deck.mjs.map +1 -0
  116. package/dist/web-page/renderers/device.cjs +1015 -0
  117. package/dist/web-page/renderers/device.mjs +1015 -0
  118. package/dist/web-page/renderers/device.mjs.map +1 -0
  119. package/dist/web-page/renderers/editor.cjs +127 -0
  120. package/dist/web-page/renderers/editor.mjs +127 -0
  121. package/dist/web-page/renderers/editor.mjs.map +1 -0
  122. package/dist/web-page/renderers/finance-chart.cjs +178 -0
  123. package/dist/web-page/renderers/finance-chart.mjs +178 -0
  124. package/dist/web-page/renderers/finance-chart.mjs.map +1 -0
  125. package/dist/web-page/renderers/frame.cjs +274 -0
  126. package/dist/web-page/renderers/frame.mjs +274 -0
  127. package/dist/web-page/renderers/frame.mjs.map +1 -0
  128. package/dist/web-page/renderers/globe.cjs +119 -0
  129. package/dist/web-page/renderers/globe.mjs +119 -0
  130. package/dist/web-page/renderers/globe.mjs.map +1 -0
  131. package/dist/web-page/renderers/input.cjs +137 -0
  132. package/dist/web-page/renderers/input.mjs +137 -0
  133. package/dist/web-page/renderers/input.mjs.map +1 -0
  134. package/dist/web-page/renderers/list.cjs +1243 -0
  135. package/dist/web-page/renderers/list.mjs +1243 -0
  136. package/dist/web-page/renderers/list.mjs.map +1 -0
  137. package/dist/web-page/renderers/map.cjs +126 -0
  138. package/dist/web-page/renderers/map.mjs +126 -0
  139. package/dist/web-page/renderers/map.mjs.map +1 -0
  140. package/dist/web-page/renderers/media.cjs +106 -0
  141. package/dist/web-page/renderers/media.mjs +106 -0
  142. package/dist/web-page/renderers/media.mjs.map +1 -0
  143. package/dist/web-page/renderers/moonphase.cjs +105 -0
  144. package/dist/web-page/renderers/moonphase.mjs +105 -0
  145. package/dist/web-page/renderers/moonphase.mjs.map +1 -0
  146. package/dist/web-page/renderers/natal-chart.cjs +222 -0
  147. package/dist/web-page/renderers/natal-chart.mjs +222 -0
  148. package/dist/web-page/renderers/natal-chart.mjs.map +1 -0
  149. package/dist/web-page/renderers/overlay.cjs +531 -0
  150. package/dist/web-page/renderers/overlay.mjs +531 -0
  151. package/dist/web-page/renderers/overlay.mjs.map +1 -0
  152. package/dist/web-page/renderers/table.cjs +74 -0
  153. package/dist/web-page/renderers/table.mjs +74 -0
  154. package/dist/web-page/renderers/table.mjs.map +1 -0
  155. package/dist/web-page/renderers/terminal.cjs +30 -0
  156. package/dist/web-page/renderers/terminal.mjs +30 -0
  157. package/dist/web-page/renderers/terminal.mjs.map +1 -0
  158. package/dist/web-page/renderers/text.cjs +109 -0
  159. package/dist/web-page/renderers/text.mjs +109 -0
  160. package/dist/web-page/renderers/text.mjs.map +1 -0
  161. package/dist/web-page/renderers/ticker.cjs +133 -0
  162. package/dist/web-page/renderers/ticker.mjs +133 -0
  163. package/dist/web-page/renderers/ticker.mjs.map +1 -0
  164. package/dist/web-page/renderers/time.cjs +69 -0
  165. package/dist/web-page/renderers/time.mjs +69 -0
  166. package/dist/web-page/renderers/time.mjs.map +1 -0
  167. package/dist/web-page/renderers/unknown.cjs +20 -0
  168. package/dist/web-page/renderers/unknown.mjs +20 -0
  169. package/dist/web-page/renderers/unknown.mjs.map +1 -0
  170. package/dist/web-page/renderers/view.cjs +161 -0
  171. package/dist/web-page/renderers/view.mjs +161 -0
  172. package/dist/web-page/renderers/view.mjs.map +1 -0
  173. package/dist/web-page/renderers/wm.cjs +669 -0
  174. package/dist/web-page/renderers/wm.mjs +669 -0
  175. package/dist/web-page/renderers/wm.mjs.map +1 -0
  176. package/dist/web-page/skeleton.cjs +103 -0
  177. package/dist/web-page/skeleton.mjs +103 -0
  178. package/dist/web-page/skeleton.mjs.map +1 -0
  179. package/dist/web-page.cjs +114 -0
  180. package/dist/web-page.d.cts +19 -0
  181. package/dist/web-page.d.cts.map +1 -0
  182. package/dist/web-page.d.mts +19 -0
  183. package/dist/web-page.d.mts.map +1 -0
  184. package/dist/web-page.mjs +115 -0
  185. package/dist/web-page.mjs.map +1 -0
  186. package/dist/web.cjs +827 -0
  187. package/dist/web.d.cts +144 -0
  188. package/dist/web.d.cts.map +1 -0
  189. package/dist/web.d.mts +144 -0
  190. package/dist/web.d.mts.map +1 -0
  191. package/dist/web.mjs +828 -0
  192. package/dist/web.mjs.map +1 -0
  193. package/dist/wm-state.cjs +172 -0
  194. package/dist/wm-state.mjs +171 -0
  195. package/dist/wm-state.mjs.map +1 -0
  196. package/package.json +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wm.mjs","names":[],"sources":["../../../src/web-page/renderers/wm.ts"],"sourcesContent":["/**\n * WM Renderer — Client-side window manager as AUP node types.\n *\n * WM is no longer a separate message protocol. It's two AUP node types:\n * - \"wm\": container node, props.strategy = \"single\" | \"floating\" | \"panels\"\n * - \"wm-surface\": child of wm, src = session URL, props = { title, position, size, ... }\n *\n * State lives in the AUP tree. Reconnect replays the tree → WM restores for free.\n * Patches on WM nodes trigger re-render via the standard AUP DOM patching pipeline.\n */\nexport const WM_JS = `\n // ── WM Node Renderer ──\n // Renders a \"wm\" AUP node as a window manager container.\n // Reads strategy from node.props.strategy, surfaces from node.children (type=\"wm-surface\").\n\n var _wmMaxZ = 10;\n\n function renderAupWm(node) {\n var p = node.props || {};\n var strategy = p.strategy || \"single\";\n var children = node.children || [];\n\n var container = document.createElement(\"div\");\n container.className = \"wm-container\";\n container.setAttribute(\"data-wm-strategy\", strategy);\n\n // Collect surface data from children\n var surfaces = [];\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n if (child.type === \"wm-surface\") {\n var cp = child.props || {};\n surfaces.push({\n id: child.id,\n name: cp.surfaceName || child.id,\n src: child.src || \"\",\n title: cp.title || cp.surfaceName || child.id,\n position: cp.position || null,\n size: cp.size || null,\n zIndex: cp.zIndex || 0,\n docked: !!cp.docked,\n panel: cp.panel || null,\n originalPanel: cp.originalPanel || null,\n node: child\n });\n }\n }\n\n // Determine active surface (from WM node state or first non-docked)\n var wmState = node.state || {};\n var activeName = wmState.active || null;\n if (!activeName && surfaces.length > 0) {\n for (var ai = 0; ai < surfaces.length; ai++) {\n if (!surfaces[ai].docked) { activeName = surfaces[ai].name; break; }\n }\n }\n\n switch (strategy) {\n case \"floating\":\n _wmRenderFloatingFromNode(container, surfaces, activeName, node);\n break;\n case \"panels\":\n _wmRenderPanelsFromNode(container, surfaces, activeName, node);\n break;\n case \"single\":\n default:\n _wmRenderSingleFromNode(container, surfaces, activeName);\n break;\n }\n\n return container;\n }\n\n // ── Single Strategy ──\n function _wmRenderSingleFromNode(container, surfaces, activeName) {\n if (surfaces.length === 0) {\n container.innerHTML = '<div class=\"wm-empty\">No surfaces</div>';\n return;\n }\n for (var i = 0; i < surfaces.length; i++) {\n var s = surfaces[i];\n var el = _wmCreateSurfaceElFromNode(s);\n if (s.name === activeName) {\n el.style.display = \"block\";\n el.setAttribute(\"data-active\", \"true\");\n el.style.position = \"relative\";\n el.style.width = \"100%\";\n el.style.height = \"100%\";\n } else {\n el.style.display = \"none\";\n }\n container.appendChild(el);\n }\n }\n\n // ── Floating Strategy ──\n function _wmRenderFloatingFromNode(container, surfaces, activeName, wmNode) {\n container.style.position = \"relative\";\n container.style.overflow = \"hidden\";\n if (surfaces.length === 0) {\n container.innerHTML = '<div class=\"wm-empty\">No surfaces</div>';\n return;\n }\n\n var hasDocked = false;\n var cascadeOffset = 30;\n var floatingIdx = 0;\n\n for (var i = 0; i < surfaces.length; i++) {\n var s = surfaces[i];\n if (s.docked) { hasDocked = true; continue; }\n\n var el = _wmCreateSurfaceElFromNode(s);\n\n // Floating: absolute position\n el.style.position = \"absolute\";\n if (s.position) {\n el.style.left = s.position.x + \"px\";\n el.style.top = s.position.y + \"px\";\n } else {\n el.style.left = (cascadeOffset * floatingIdx) + \"px\";\n el.style.top = (cascadeOffset * floatingIdx) + \"px\";\n }\n if (s.size) {\n el.style.width = s.size.width + \"px\";\n el.style.height = s.size.height + \"px\";\n } else {\n el.style.width = \"400px\";\n el.style.height = \"300px\";\n }\n var z = s.zIndex || (++_wmMaxZ);\n el.style.zIndex = String(z);\n\n // Decorator: title bar + close + resize\n _wmApplyDecoratorFromNode(el, s, wmNode);\n\n // Click-to-front\n (function(surfEl, surfData, wmN) {\n surfEl.addEventListener(\"pointerdown\", function() {\n _wmBringToFrontFromNode(surfEl, surfData, wmN);\n });\n })(el, s, wmNode);\n\n // Active state\n if (s.name === activeName) {\n el.setAttribute(\"data-active\", \"true\");\n }\n\n container.appendChild(el);\n floatingIdx++;\n }\n\n // Dock\n if (hasDocked) {\n var dockEl = document.createElement(\"div\");\n dockEl.className = \"wm-dock\";\n dockEl.style.display = \"flex\";\n for (var di = 0; di < surfaces.length; di++) {\n var ds = surfaces[di];\n if (!ds.docked) continue;\n var item = document.createElement(\"div\");\n item.className = \"wm-dock-item\";\n item.textContent = _escapeHtml(ds.title);\n item.setAttribute(\"data-surface-id\", ds.name);\n // Undock on click — fire AUP event\n (function(surfData, wmN) {\n item.addEventListener(\"click\", function() {\n _fireAupEvent(surfData.id, \"undock\", {});\n });\n })(ds, wmNode);\n dockEl.appendChild(item);\n }\n container.appendChild(dockEl);\n }\n }\n\n function _wmBringToFrontFromNode(el, surfData, wmNode) {\n surfData.zIndex = ++_wmMaxZ;\n el.style.zIndex = String(surfData.zIndex);\n // Update active on all siblings\n var container = el.parentNode;\n if (!container) return;\n var siblings = container.querySelectorAll(\".wm-surface\");\n for (var i = 0; i < siblings.length; i++) {\n siblings[i].removeAttribute(\"data-active\");\n }\n el.setAttribute(\"data-active\", \"true\");\n }\n\n // ── Panels Strategy ──\n // Positions that span full width (rows, not columns)\n var _wmRowPositions = { header: 1, footer: 1, statusbar: 1, dock: 1 };\n\n function _wmRenderPanelsFromNode(container, surfaces, activeName, wmNode) {\n var p = wmNode.props || {};\n var panels = p.panels || [];\n var panelActives = (wmNode.state || {}).panelActives || {};\n\n if (panels.length === 0) {\n container.innerHTML = '<div class=\"wm-empty\">No panel layout configured</div>';\n return;\n }\n\n container.className = \"wm-container wm-panels\";\n\n // Separate panels into rows (header/footer/statusbar/dock) and columns\n var topRows = []; // header\n var columns = []; // sidebar, primary, inspector, col1, col2, col3, etc.\n var bottomRows = []; // footer, statusbar, dock\n for (var pi = 0; pi < panels.length; pi++) {\n var pos = panels[pi].position;\n if (pos === \"header\") topRows.push(panels[pi]);\n else if (_wmRowPositions[pos]) bottomRows.push(panels[pi]);\n else columns.push(panels[pi]);\n }\n\n // Build grid-template-columns from columns, with 4px dividers between\n var colSizes = [];\n var visibleCols = [];\n for (var ci = 0; ci < columns.length; ci++) {\n var col = columns[ci];\n colSizes.push(col.defaultSize || \"1fr\");\n visibleCols.push(col);\n }\n // Interleave divider gaps: \"220px 4px 1fr 4px 280px\"\n var gridCols = [];\n for (var gi = 0; gi < colSizes.length; gi++) {\n if (gi > 0) gridCols.push(\"4px\"); // divider\n gridCols.push(colSizes[gi]);\n }\n if (gridCols.length === 0) gridCols.push(\"1fr\");\n\n // Compute grid-template-rows\n var gridRows = [];\n if (topRows.length > 0) gridRows.push(\"auto\");\n gridRows.push(\"1fr\"); // main column area\n for (var br = 0; br < bottomRows.length; br++) gridRows.push(\"auto\");\n\n container.style.gridTemplateColumns = gridCols.join(\" \");\n container.style.gridTemplateRows = gridRows.join(\" \");\n\n // Responsive tab bar (hidden by default, shown < 768px)\n var responsiveTabBar = document.createElement(\"div\");\n responsiveTabBar.className = \"wm-responsive-tabs\";\n var responsiveActivePanel = null;\n\n // ── Render top rows (header) ──\n for (var tri = 0; tri < topRows.length; tri++) {\n _wmRenderPanelEl(container, topRows[tri], surfaces, panelActives, wmNode);\n }\n\n // ── Render columns with dividers ──\n var colRow = topRows.length > 0 ? 2 : 1;\n for (var cii = 0; cii < visibleCols.length; cii++) {\n // Insert divider before this column (except first)\n if (cii > 0) {\n var divider = document.createElement(\"div\");\n divider.className = \"wm-divider\";\n divider.style.gridRow = String(colRow);\n // Divider resize: between visibleCols[cii-1] and visibleCols[cii]\n (function(div, leftPanel, rightPanel, containerEl) {\n _wmEnableDividerResize(div, leftPanel, rightPanel, containerEl, wmNode);\n })(divider, visibleCols[cii - 1], visibleCols[cii], container);\n container.appendChild(divider);\n }\n\n var colPanel = visibleCols[cii];\n var panelEl = _wmRenderPanelEl(container, colPanel, surfaces, panelActives, wmNode);\n panelEl.style.gridRow = String(colRow);\n // Tag panels that have flexible size so divider resize preserves \"1fr\"\n if (colPanel.defaultSize === \"1fr\" || !colPanel.defaultSize) {\n panelEl.setAttribute(\"data-wm-flex\", \"true\");\n }\n\n // Add to responsive tab bar\n var rTab = document.createElement(\"div\");\n rTab.className = \"wm-responsive-tab\";\n rTab.textContent = colPanel.id;\n rTab.setAttribute(\"data-panel-id\", colPanel.id);\n if (!responsiveActivePanel) {\n responsiveActivePanel = colPanel.id;\n rTab.setAttribute(\"data-active\", \"true\");\n } else {\n panelEl.setAttribute(\"data-wm-responsive-hidden\", \"true\");\n }\n (function(tab, pid, panelElement, allTabs) {\n tab.addEventListener(\"click\", function() {\n // Show this panel, hide others\n var allPanels = container.querySelectorAll(\".wm-panel\");\n var allRTabs = container.querySelectorAll(\".wm-responsive-tab\");\n for (var ri = 0; ri < allPanels.length; ri++) {\n var rp = allPanels[ri];\n var rpPos = rp.getAttribute(\"data-wm-position\");\n if (_wmRowPositions[rpPos]) continue;\n rp.setAttribute(\"data-wm-responsive-hidden\", rp.getAttribute(\"data-wm-panel\") !== pid ? \"true\" : \"false\");\n }\n for (var rti = 0; rti < allRTabs.length; rti++) {\n allRTabs[rti].setAttribute(\"data-active\", allRTabs[rti].getAttribute(\"data-panel-id\") === pid ? \"true\" : \"false\");\n }\n });\n })(rTab, colPanel.id, panelEl, responsiveTabBar);\n responsiveTabBar.appendChild(rTab);\n }\n\n // Insert responsive tab bar after top rows\n if (visibleCols.length > 1) {\n container.appendChild(responsiveTabBar);\n }\n\n // ── Render bottom rows (footer, statusbar, dock) ──\n for (var bri = 0; bri < bottomRows.length; bri++) {\n _wmRenderPanelEl(container, bottomRows[bri], surfaces, panelActives, wmNode);\n }\n\n // ── Floating overlay for surfaces with no panel assignment ──\n var overlays = [];\n for (var oi = 0; oi < surfaces.length; oi++) {\n if (!surfaces[oi].panel && !surfaces[oi].docked) overlays.push(surfaces[oi]);\n }\n if (overlays.length > 0) {\n var overlayEl = document.createElement(\"div\");\n overlayEl.className = \"wm-overlay\";\n var cascadeOff = 30;\n for (var oii = 0; oii < overlays.length; oii++) {\n var oSurf = overlays[oii];\n var oEl = _wmCreateSurfaceElFromNode(oSurf);\n oEl.style.position = \"absolute\";\n if (oSurf.position) {\n oEl.style.left = oSurf.position.x + \"px\";\n oEl.style.top = oSurf.position.y + \"px\";\n } else {\n oEl.style.left = (80 + cascadeOff * oii) + \"px\";\n oEl.style.top = (80 + cascadeOff * oii) + \"px\";\n }\n if (oSurf.size) {\n oEl.style.width = oSurf.size.width + \"px\";\n oEl.style.height = oSurf.size.height + \"px\";\n } else {\n oEl.style.width = \"400px\";\n oEl.style.height = \"300px\";\n }\n oEl.style.zIndex = String(oSurf.zIndex || (++_wmMaxZ));\n _wmApplyDecoratorFromNode(oEl, oSurf, wmNode);\n (function(sEl, sd, wn) {\n sEl.addEventListener(\"pointerdown\", function() {\n _wmBringToFrontFromNode(sEl, sd, wn);\n });\n })(oEl, oSurf, wmNode);\n overlayEl.appendChild(oEl);\n }\n container.appendChild(overlayEl);\n }\n }\n\n // ── Render a single panel element with its surfaces/tabs ──\n function _wmRenderPanelEl(container, panel, surfaces, panelActives, wmNode) {\n var panelEl = document.createElement(\"div\");\n panelEl.className = \"wm-panel\";\n panelEl.setAttribute(\"data-wm-panel\", panel.id);\n panelEl.setAttribute(\"data-wm-position\", panel.position);\n\n // Find surfaces assigned to this panel\n var panelSurfaces = [];\n for (var k = 0; k < surfaces.length; k++) {\n if (surfaces[k].panel === panel.id) {\n panelSurfaces.push(surfaces[k]);\n }\n }\n\n if (panelSurfaces.length === 0) {\n var placeholder = document.createElement(\"div\");\n placeholder.className = \"wm-empty\";\n placeholder.textContent = panel.id;\n panelEl.appendChild(placeholder);\n } else if (panelSurfaces.length === 1) {\n var sEl = _wmCreateSurfaceElFromNode(panelSurfaces[0]);\n sEl.style.position = \"relative\";\n sEl.style.width = \"100%\";\n sEl.style.height = \"100%\";\n sEl.style.display = \"block\";\n panelEl.appendChild(sEl);\n } else {\n // Multiple surfaces — tab bar\n var panelActive = panelActives[panel.id] || panelSurfaces[0].name;\n var tabBar = document.createElement(\"div\");\n tabBar.className = \"wm-tabs\";\n\n for (var t = 0; t < panelSurfaces.length; t++) {\n var tabSurf = panelSurfaces[t];\n var tab = document.createElement(\"div\");\n tab.className = \"wm-tab\" + (tabSurf.name === panelActive ? \" wm-tab-active\" : \"\");\n tab.setAttribute(\"data-surface-id\", tabSurf.name);\n\n var tabLabel = document.createElement(\"span\");\n tabLabel.className = \"wm-tab-label\";\n tabLabel.textContent = _escapeHtml(tabSurf.title);\n tab.appendChild(tabLabel);\n\n // Tab close\n var tabClose = document.createElement(\"button\");\n tabClose.className = \"wm-tab-close\";\n tabClose.textContent = \"\\\\u2715\";\n tabClose.title = \"Close tab\";\n (function(sd) {\n tabClose.addEventListener(\"click\", function(e) {\n e.stopPropagation();\n _fireAupEvent(sd.id, \"close\", {});\n });\n })(tabSurf);\n tab.appendChild(tabClose);\n\n // Tab click to switch\n (function(sd, pid) {\n tab.addEventListener(\"click\", function() {\n _fireAupEvent(wmNode.id, \"panel-active\", { panel: pid, surface: sd.name });\n });\n })(tabSurf, panel.id);\n\n tabBar.appendChild(tab);\n }\n panelEl.appendChild(tabBar);\n\n // Render tab contents\n for (var m = 0; m < panelSurfaces.length; m++) {\n var surfEl = _wmCreateSurfaceElFromNode(panelSurfaces[m]);\n surfEl.style.position = \"relative\";\n surfEl.style.width = \"100%\";\n surfEl.style.flex = \"1\";\n surfEl.style.display = panelSurfaces[m].name === panelActive ? \"block\" : \"none\";\n panelEl.appendChild(surfEl);\n }\n }\n\n container.appendChild(panelEl);\n return panelEl;\n }\n\n // ── Divider Drag Resize (between two column panels) ──\n // If the left panel is flex (1fr), resize the right panel instead.\n function _wmEnableDividerResize(divider, leftPanel, rightPanel, containerEl, wmNode) {\n var startX, targetStartW;\n var dragging = false;\n var targetEl = null;\n var leftIsFlex = (leftPanel.defaultSize === \"1fr\" || !leftPanel.defaultSize);\n var direction = leftIsFlex ? -1 : 1; // -1 means resize right panel (inverse drag)\n\n function findPanelEl(panelId) {\n return containerEl.querySelector('[data-wm-panel=\"' + panelId + '\"]');\n }\n\n divider.addEventListener(\"pointerdown\", function(e) {\n dragging = true;\n startX = e.clientX;\n var targetPanel = leftIsFlex ? rightPanel : leftPanel;\n targetEl = findPanelEl(targetPanel.id);\n if (targetEl) targetStartW = targetEl.offsetWidth;\n divider.setPointerCapture(e.pointerId);\n divider.classList.add(\"wm-divider-active\");\n e.preventDefault();\n });\n\n divider.addEventListener(\"pointermove\", function(e) {\n if (!dragging || !targetEl) return;\n var dx = e.clientX - startX;\n var targetPanel = leftIsFlex ? rightPanel : leftPanel;\n var minW = parseInt(targetPanel.minSize) || 80;\n var newW = Math.max(minW, targetStartW + dx * direction);\n targetEl.style.width = newW + \"px\";\n targetEl.style.flex = \"0 0 \" + newW + \"px\";\n _wmRecomputeGridCols(containerEl, wmNode);\n });\n\n divider.addEventListener(\"pointerup\", function(e) {\n if (!dragging) return;\n dragging = false;\n divider.classList.remove(\"wm-divider-active\");\n try { divider.releasePointerCapture(e.pointerId); } catch(_) {}\n if (targetEl) {\n var targetPanel = leftIsFlex ? rightPanel : leftPanel;\n _fireAupEvent(wmNode.id, \"panel-resize\", { panelId: targetPanel.id, size: targetEl.offsetWidth + \"px\" });\n }\n });\n\n divider.addEventListener(\"lostpointercapture\", function() {\n dragging = false;\n divider.classList.remove(\"wm-divider-active\");\n });\n }\n\n // Recompute grid-template-columns from actual panel widths\n // Panels tagged data-wm-flex=\"true\" keep \"1fr\" so they absorb remaining space.\n function _wmRecomputeGridCols(containerEl, wmNode) {\n var cols = containerEl.querySelectorAll(\".wm-panel:not([data-wm-position='header']):not([data-wm-position='footer']):not([data-wm-position='statusbar']):not([data-wm-position='dock'])\");\n var sizes = [];\n for (var i = 0; i < cols.length; i++) {\n if (i > 0) sizes.push(\"4px\");\n if (cols[i].getAttribute(\"data-wm-flex\") === \"true\") {\n sizes.push(\"1fr\");\n } else {\n var w = cols[i].style.width;\n if (w && w !== \"\") sizes.push(w);\n else sizes.push(cols[i].offsetWidth + \"px\");\n }\n }\n if (sizes.length > 0) containerEl.style.gridTemplateColumns = sizes.join(\" \");\n }\n\n // ── Decorator (title bar + close + resize) ──\n function _wmApplyDecoratorFromNode(el, surfData, wmNode) {\n var titleBar = document.createElement(\"div\");\n titleBar.className = \"wm-titlebar\";\n\n var titleText = document.createElement(\"span\");\n titleText.className = \"wm-title-text\";\n titleText.textContent = _escapeHtml(surfData.title);\n titleBar.appendChild(titleText);\n\n var closeBtn = document.createElement(\"button\");\n closeBtn.className = \"wm-close-btn\";\n closeBtn.textContent = \"\\\\u2715\";\n closeBtn.title = \"Close\";\n closeBtn.addEventListener(\"click\", function(e) {\n e.stopPropagation();\n _fireAupEvent(surfData.id, \"close\", {});\n });\n titleBar.appendChild(closeBtn);\n\n el.insertBefore(titleBar, el.firstChild);\n\n // Drag via title bar\n _wmEnableDragFromNode(el, titleBar, surfData);\n\n // Resize handle\n var resizeHandle = document.createElement(\"div\");\n resizeHandle.className = \"wm-resize-handle\";\n el.appendChild(resizeHandle);\n _wmEnableResizeFromNode(el, resizeHandle, surfData);\n }\n\n // ── Drag ──\n function _wmEnableDragFromNode(el, handle, surfData) {\n var startX, startY, origLeft, origTop;\n var dragging = false;\n\n function onPointerDown(e) {\n if (e.target.tagName === \"BUTTON\") return;\n dragging = true;\n startX = e.clientX;\n startY = e.clientY;\n origLeft = parseInt(el.style.left) || 0;\n origTop = parseInt(el.style.top) || 0;\n handle.setPointerCapture(e.pointerId);\n e.preventDefault();\n }\n\n function onPointerMove(e) {\n if (!dragging) return;\n var dx = e.clientX - startX;\n var dy = e.clientY - startY;\n var container = el.parentNode;\n var newX = Math.max(0, Math.min(origLeft + dx, container.clientWidth - 40));\n var newY = Math.max(0, Math.min(origTop + dy, container.clientHeight - 40));\n el.style.left = newX + \"px\";\n el.style.top = newY + \"px\";\n }\n\n function onPointerUp(e) {\n if (!dragging) return;\n dragging = false;\n try { handle.releasePointerCapture(e.pointerId); } catch(_) {}\n // Sync final position back via AUP event\n var finalX = parseInt(el.style.left) || 0;\n var finalY = parseInt(el.style.top) || 0;\n _fireAupEvent(surfData.id, \"move\", { position: { x: finalX, y: finalY } });\n }\n\n handle.addEventListener(\"pointerdown\", onPointerDown);\n handle.addEventListener(\"pointermove\", onPointerMove);\n handle.addEventListener(\"pointerup\", onPointerUp);\n handle.addEventListener(\"lostpointercapture\", function() { dragging = false; });\n }\n\n // ── Resize ──\n function _wmEnableResizeFromNode(el, handle, surfData) {\n var startX, startY, origW, origH;\n var resizing = false;\n var MIN_W = 120, MIN_H = 80;\n\n function onPointerDown(e) {\n resizing = true;\n startX = e.clientX;\n startY = e.clientY;\n origW = el.offsetWidth;\n origH = el.offsetHeight;\n handle.setPointerCapture(e.pointerId);\n e.preventDefault();\n e.stopPropagation();\n }\n\n function onPointerMove(e) {\n if (!resizing) return;\n var dx = e.clientX - startX;\n var dy = e.clientY - startY;\n var w = Math.max(MIN_W, origW + dx);\n var h = Math.max(MIN_H, origH + dy);\n el.style.width = w + \"px\";\n el.style.height = h + \"px\";\n }\n\n function onPointerUp(e) {\n if (!resizing) return;\n resizing = false;\n try { handle.releasePointerCapture(e.pointerId); } catch(_) {}\n // Sync final size back via AUP event\n var finalW = el.offsetWidth;\n var finalH = el.offsetHeight;\n _fireAupEvent(surfData.id, \"resize\", { size: { width: finalW, height: finalH } });\n }\n\n handle.addEventListener(\"pointerdown\", onPointerDown);\n handle.addEventListener(\"pointermove\", onPointerMove);\n handle.addEventListener(\"pointerup\", onPointerUp);\n handle.addEventListener(\"lostpointercapture\", function() { resizing = false; });\n }\n\n // ── Surface Element Factory ──\n function _wmCreateSurfaceElFromNode(surfData) {\n var el = document.createElement(\"div\");\n el.className = \"wm-surface\";\n el.setAttribute(\"data-surface-id\", surfData.name);\n el.setAttribute(\"data-aup-id\", surfData.id);\n\n var content = document.createElement(\"div\");\n content.className = \"wm-surface-content\";\n el.appendChild(content);\n\n // Universal surface: 3 modes\n // 1. Inline AUP children → render directly (no device)\n var children = surfData.node.children || [];\n if (children.length > 0) {\n for (var ci = 0; ci < children.length; ci++) {\n var rendered = renderAupNode(children[ci]);\n if (rendered) content.appendChild(rendered);\n }\n return el;\n }\n\n // 2. src = ws:// or http:// URL → device connects to remote AUP server\n // 3. src = /afs/path → device introspects via window.afs\n if (surfData.src && typeof renderAupDevice === \"function\") {\n var deviceNode = {\n id: \"wm-device-\" + surfData.name,\n type: \"device\",\n src: surfData.src,\n props: { sizing: \"fit\", showStatus: false }\n };\n var deviceEl = renderAupDevice(deviceNode);\n if (deviceEl) content.appendChild(deviceEl);\n }\n\n return el;\n }\n\n`;\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,QAAQ"}
@@ -0,0 +1,103 @@
1
+
2
+ //#region src/web-page/skeleton.ts
3
+ const SKELETON = `
4
+ <body>
5
+ <header style="display:none">
6
+ <h1>AFS</h1>
7
+ <span class="dot off" id="dot"></span>
8
+ <span class="status" id="status">Connecting...</span>
9
+ </header>
10
+
11
+ <div id="desktop-splash">
12
+ <div class="splash-orbit splash-orbit-1"></div>
13
+ <div class="splash-orbit splash-orbit-2"></div>
14
+ <div class="splash-orbit splash-orbit-3"></div>
15
+ <div class="splash-content">
16
+ <div class="splash-glyph">
17
+ <svg viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
18
+ <path class="glyph-outer" d="M40 4 L72 22 V58 L40 76 L8 58 V22 Z" stroke="currentColor" stroke-width="1" fill="none"/>
19
+ <path class="glyph-inner" d="M40 16 L60 28 V52 L40 64 L20 52 V28 Z" stroke="currentColor" stroke-width="0.75" fill="none"/>
20
+ <circle class="glyph-core" cx="40" cy="40" r="6" fill="currentColor"/>
21
+ <line class="glyph-ray" x1="40" y1="34" x2="40" y2="16" stroke="currentColor" stroke-width="0.5"/>
22
+ <line class="glyph-ray" x1="45.2" y1="37" x2="60" y2="28" stroke="currentColor" stroke-width="0.5"/>
23
+ <line class="glyph-ray" x1="45.2" y1="43" x2="60" y2="52" stroke="currentColor" stroke-width="0.5"/>
24
+ <line class="glyph-ray" x1="40" y1="46" x2="40" y2="64" stroke="currentColor" stroke-width="0.5"/>
25
+ <line class="glyph-ray" x1="34.8" y1="43" x2="20" y2="52" stroke="currentColor" stroke-width="0.5"/>
26
+ <line class="glyph-ray" x1="34.8" y1="37" x2="20" y2="28" stroke="currentColor" stroke-width="0.5"/>
27
+ </svg>
28
+ </div>
29
+ <div class="splash-wordmark">AFS</div>
30
+ <div class="splash-sub">Agentic File System</div>
31
+ <div class="splash-status">
32
+ <span class="dot off" id="splash-dot"></span>
33
+ <span id="splash-status">waiting for connection</span>
34
+ </div>
35
+ </div>
36
+ </div>
37
+
38
+ <div id="messages" style="display:none"></div>
39
+
40
+ <div id="page-view">
41
+ <div class="page-toolbar">
42
+ <button id="back-to-chat">Back</button>
43
+ <span id="page-title"></span>
44
+ </div>
45
+ <div id="page-content"></div>
46
+ </div>
47
+
48
+ <div id="aup-display">
49
+ <div class="aup-toolbar">
50
+ <button id="aup-back-to-chat">Back</button>
51
+ <span id="aup-status"></span>
52
+ </div>
53
+ <div id="aup-root"></div>
54
+ </div>
55
+
56
+ <div id="chrome-toolbar">
57
+ <div class="toolbar-group">
58
+ <span class="toolbar-label">Lang</span>
59
+ <select id="locale-select" title="Language">
60
+ <option value="en">EN</option>
61
+ <option value="zh">中文</option>
62
+ <option value="ja">日本語</option>
63
+ </select>
64
+ </div>
65
+ <div class="toolbar-group">
66
+ <span class="toolbar-label">Theme</span>
67
+ <select id="style-select" title="Style">
68
+ <option value="midnight">Midnight</option>
69
+ <option value="clean">Clean</option>
70
+ <option value="glass">Glass</option>
71
+ <option value="brutalist">Brutalist</option>
72
+ <option value="soft">Soft</option>
73
+ <option value="cyber">Cyber</option>
74
+ <option value="editorial">Editorial</option>
75
+ <option value="brutalist-mono">Brutalist Mono</option>
76
+ </select>
77
+ </div>
78
+ <div class="toolbar-group">
79
+ <span class="toolbar-label">Mode</span>
80
+ <select id="mode-select" title="Mode">
81
+ <option value="auto">Auto</option>
82
+ <option value="dark">Dark</option>
83
+ <option value="light">Light</option>
84
+ </select>
85
+ </div>
86
+ </div>
87
+
88
+ <div id="prompt-area">
89
+ <div class="prompt-msg" id="prompt-msg"></div>
90
+ <div class="prompt-options" id="prompt-options"></div>
91
+ </div>
92
+
93
+ <div id="session-badge"><span id="session-dot"></span><span id="session-id"></span></div>
94
+
95
+ <div id="input-bar" style="display:none">
96
+ <textarea id="input" rows="1" placeholder="Type a message... (Enter to send, Shift+Enter for newline)" disabled></textarea>
97
+ <button id="btn-send" disabled>Send</button>
98
+ </div>
99
+
100
+ `;
101
+
102
+ //#endregion
103
+ exports.SKELETON = SKELETON;
@@ -0,0 +1,103 @@
1
+ //#region src/web-page/skeleton.ts
2
+ const SKELETON = `
3
+ <body>
4
+ <header style="display:none">
5
+ <h1>AFS</h1>
6
+ <span class="dot off" id="dot"></span>
7
+ <span class="status" id="status">Connecting...</span>
8
+ </header>
9
+
10
+ <div id="desktop-splash">
11
+ <div class="splash-orbit splash-orbit-1"></div>
12
+ <div class="splash-orbit splash-orbit-2"></div>
13
+ <div class="splash-orbit splash-orbit-3"></div>
14
+ <div class="splash-content">
15
+ <div class="splash-glyph">
16
+ <svg viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
17
+ <path class="glyph-outer" d="M40 4 L72 22 V58 L40 76 L8 58 V22 Z" stroke="currentColor" stroke-width="1" fill="none"/>
18
+ <path class="glyph-inner" d="M40 16 L60 28 V52 L40 64 L20 52 V28 Z" stroke="currentColor" stroke-width="0.75" fill="none"/>
19
+ <circle class="glyph-core" cx="40" cy="40" r="6" fill="currentColor"/>
20
+ <line class="glyph-ray" x1="40" y1="34" x2="40" y2="16" stroke="currentColor" stroke-width="0.5"/>
21
+ <line class="glyph-ray" x1="45.2" y1="37" x2="60" y2="28" stroke="currentColor" stroke-width="0.5"/>
22
+ <line class="glyph-ray" x1="45.2" y1="43" x2="60" y2="52" stroke="currentColor" stroke-width="0.5"/>
23
+ <line class="glyph-ray" x1="40" y1="46" x2="40" y2="64" stroke="currentColor" stroke-width="0.5"/>
24
+ <line class="glyph-ray" x1="34.8" y1="43" x2="20" y2="52" stroke="currentColor" stroke-width="0.5"/>
25
+ <line class="glyph-ray" x1="34.8" y1="37" x2="20" y2="28" stroke="currentColor" stroke-width="0.5"/>
26
+ </svg>
27
+ </div>
28
+ <div class="splash-wordmark">AFS</div>
29
+ <div class="splash-sub">Agentic File System</div>
30
+ <div class="splash-status">
31
+ <span class="dot off" id="splash-dot"></span>
32
+ <span id="splash-status">waiting for connection</span>
33
+ </div>
34
+ </div>
35
+ </div>
36
+
37
+ <div id="messages" style="display:none"></div>
38
+
39
+ <div id="page-view">
40
+ <div class="page-toolbar">
41
+ <button id="back-to-chat">Back</button>
42
+ <span id="page-title"></span>
43
+ </div>
44
+ <div id="page-content"></div>
45
+ </div>
46
+
47
+ <div id="aup-display">
48
+ <div class="aup-toolbar">
49
+ <button id="aup-back-to-chat">Back</button>
50
+ <span id="aup-status"></span>
51
+ </div>
52
+ <div id="aup-root"></div>
53
+ </div>
54
+
55
+ <div id="chrome-toolbar">
56
+ <div class="toolbar-group">
57
+ <span class="toolbar-label">Lang</span>
58
+ <select id="locale-select" title="Language">
59
+ <option value="en">EN</option>
60
+ <option value="zh">中文</option>
61
+ <option value="ja">日本語</option>
62
+ </select>
63
+ </div>
64
+ <div class="toolbar-group">
65
+ <span class="toolbar-label">Theme</span>
66
+ <select id="style-select" title="Style">
67
+ <option value="midnight">Midnight</option>
68
+ <option value="clean">Clean</option>
69
+ <option value="glass">Glass</option>
70
+ <option value="brutalist">Brutalist</option>
71
+ <option value="soft">Soft</option>
72
+ <option value="cyber">Cyber</option>
73
+ <option value="editorial">Editorial</option>
74
+ <option value="brutalist-mono">Brutalist Mono</option>
75
+ </select>
76
+ </div>
77
+ <div class="toolbar-group">
78
+ <span class="toolbar-label">Mode</span>
79
+ <select id="mode-select" title="Mode">
80
+ <option value="auto">Auto</option>
81
+ <option value="dark">Dark</option>
82
+ <option value="light">Light</option>
83
+ </select>
84
+ </div>
85
+ </div>
86
+
87
+ <div id="prompt-area">
88
+ <div class="prompt-msg" id="prompt-msg"></div>
89
+ <div class="prompt-options" id="prompt-options"></div>
90
+ </div>
91
+
92
+ <div id="session-badge"><span id="session-dot"></span><span id="session-id"></span></div>
93
+
94
+ <div id="input-bar" style="display:none">
95
+ <textarea id="input" rows="1" placeholder="Type a message... (Enter to send, Shift+Enter for newline)" disabled></textarea>
96
+ <button id="btn-send" disabled>Send</button>
97
+ </div>
98
+
99
+ `;
100
+
101
+ //#endregion
102
+ export { SKELETON };
103
+ //# sourceMappingURL=skeleton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.mjs","names":[],"sources":["../../src/web-page/skeleton.ts"],"sourcesContent":["export const SKELETON = `\n<body>\n <header style=\"display:none\">\n <h1>AFS</h1>\n <span class=\"dot off\" id=\"dot\"></span>\n <span class=\"status\" id=\"status\">Connecting...</span>\n </header>\n\n <div id=\"desktop-splash\">\n <div class=\"splash-orbit splash-orbit-1\"></div>\n <div class=\"splash-orbit splash-orbit-2\"></div>\n <div class=\"splash-orbit splash-orbit-3\"></div>\n <div class=\"splash-content\">\n <div class=\"splash-glyph\">\n <svg viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path class=\"glyph-outer\" d=\"M40 4 L72 22 V58 L40 76 L8 58 V22 Z\" stroke=\"currentColor\" stroke-width=\"1\" fill=\"none\"/>\n <path class=\"glyph-inner\" d=\"M40 16 L60 28 V52 L40 64 L20 52 V28 Z\" stroke=\"currentColor\" stroke-width=\"0.75\" fill=\"none\"/>\n <circle class=\"glyph-core\" cx=\"40\" cy=\"40\" r=\"6\" fill=\"currentColor\"/>\n <line class=\"glyph-ray\" x1=\"40\" y1=\"34\" x2=\"40\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"0.5\"/>\n <line class=\"glyph-ray\" x1=\"45.2\" y1=\"37\" x2=\"60\" y2=\"28\" stroke=\"currentColor\" stroke-width=\"0.5\"/>\n <line class=\"glyph-ray\" x1=\"45.2\" y1=\"43\" x2=\"60\" y2=\"52\" stroke=\"currentColor\" stroke-width=\"0.5\"/>\n <line class=\"glyph-ray\" x1=\"40\" y1=\"46\" x2=\"40\" y2=\"64\" stroke=\"currentColor\" stroke-width=\"0.5\"/>\n <line class=\"glyph-ray\" x1=\"34.8\" y1=\"43\" x2=\"20\" y2=\"52\" stroke=\"currentColor\" stroke-width=\"0.5\"/>\n <line class=\"glyph-ray\" x1=\"34.8\" y1=\"37\" x2=\"20\" y2=\"28\" stroke=\"currentColor\" stroke-width=\"0.5\"/>\n </svg>\n </div>\n <div class=\"splash-wordmark\">AFS</div>\n <div class=\"splash-sub\">Agentic File System</div>\n <div class=\"splash-status\">\n <span class=\"dot off\" id=\"splash-dot\"></span>\n <span id=\"splash-status\">waiting for connection</span>\n </div>\n </div>\n </div>\n\n <div id=\"messages\" style=\"display:none\"></div>\n\n <div id=\"page-view\">\n <div class=\"page-toolbar\">\n <button id=\"back-to-chat\">Back</button>\n <span id=\"page-title\"></span>\n </div>\n <div id=\"page-content\"></div>\n </div>\n\n <div id=\"aup-display\">\n <div class=\"aup-toolbar\">\n <button id=\"aup-back-to-chat\">Back</button>\n <span id=\"aup-status\"></span>\n </div>\n <div id=\"aup-root\"></div>\n </div>\n\n <div id=\"chrome-toolbar\">\n <div class=\"toolbar-group\">\n <span class=\"toolbar-label\">Lang</span>\n <select id=\"locale-select\" title=\"Language\">\n <option value=\"en\">EN</option>\n <option value=\"zh\">中文</option>\n <option value=\"ja\">日本語</option>\n </select>\n </div>\n <div class=\"toolbar-group\">\n <span class=\"toolbar-label\">Theme</span>\n <select id=\"style-select\" title=\"Style\">\n <option value=\"midnight\">Midnight</option>\n <option value=\"clean\">Clean</option>\n <option value=\"glass\">Glass</option>\n <option value=\"brutalist\">Brutalist</option>\n <option value=\"soft\">Soft</option>\n <option value=\"cyber\">Cyber</option>\n <option value=\"editorial\">Editorial</option>\n <option value=\"brutalist-mono\">Brutalist Mono</option>\n </select>\n </div>\n <div class=\"toolbar-group\">\n <span class=\"toolbar-label\">Mode</span>\n <select id=\"mode-select\" title=\"Mode\">\n <option value=\"auto\">Auto</option>\n <option value=\"dark\">Dark</option>\n <option value=\"light\">Light</option>\n </select>\n </div>\n </div>\n\n <div id=\"prompt-area\">\n <div class=\"prompt-msg\" id=\"prompt-msg\"></div>\n <div class=\"prompt-options\" id=\"prompt-options\"></div>\n </div>\n\n <div id=\"session-badge\"><span id=\"session-dot\"></span><span id=\"session-id\"></span></div>\n\n <div id=\"input-bar\" style=\"display:none\">\n <textarea id=\"input\" rows=\"1\" placeholder=\"Type a message... (Enter to send, Shift+Enter for newline)\" disabled></textarea>\n <button id=\"btn-send\" disabled>Send</button>\n </div>\n\n`;\n"],"mappings":";AAAA,MAAa,WAAW"}
@@ -0,0 +1,114 @@
1
+ const require_core = require('./web-page/core.cjs');
2
+ const require_css = require('./web-page/css.cjs');
3
+ const require_icons = require('./web-page/icons.cjs');
4
+ const require_overlay_themes = require('./web-page/overlay-themes.cjs');
5
+ const require_action = require('./web-page/renderers/action.cjs');
6
+ const require_broadcast = require('./web-page/renderers/broadcast.cjs');
7
+ const require_calendar = require('./web-page/renderers/calendar.cjs');
8
+ const require_canvas = require('./web-page/renderers/canvas.cjs');
9
+ const require_cdn_loader = require('./web-page/renderers/cdn-loader.cjs');
10
+ const require_chart = require('./web-page/renderers/chart.cjs');
11
+ const require_deck = require('./web-page/renderers/deck.cjs');
12
+ const require_device = require('./web-page/renderers/device.cjs');
13
+ const require_editor = require('./web-page/renderers/editor.cjs');
14
+ const require_finance_chart = require('./web-page/renderers/finance-chart.cjs');
15
+ const require_frame = require('./web-page/renderers/frame.cjs');
16
+ const require_globe = require('./web-page/renderers/globe.cjs');
17
+ const require_input = require('./web-page/renderers/input.cjs');
18
+ const require_list = require('./web-page/renderers/list.cjs');
19
+ const require_map = require('./web-page/renderers/map.cjs');
20
+ const require_media = require('./web-page/renderers/media.cjs');
21
+ const require_moonphase = require('./web-page/renderers/moonphase.cjs');
22
+ const require_natal_chart = require('./web-page/renderers/natal-chart.cjs');
23
+ const require_overlay = require('./web-page/renderers/overlay.cjs');
24
+ const require_table = require('./web-page/renderers/table.cjs');
25
+ const require_terminal = require('./web-page/renderers/terminal.cjs');
26
+ const require_text = require('./web-page/renderers/text.cjs');
27
+ const require_ticker = require('./web-page/renderers/ticker.cjs');
28
+ const require_time = require('./web-page/renderers/time.cjs');
29
+ const require_unknown = require('./web-page/renderers/unknown.cjs');
30
+ const require_view = require('./web-page/renderers/view.cjs');
31
+ const require_wm = require('./web-page/renderers/wm.cjs');
32
+ const require_skeleton = require('./web-page/skeleton.cjs');
33
+ let node_module = require("node:module");
34
+
35
+ //#region src/web-page.ts
36
+ /**
37
+ * Inline HTML template for the AFS UI web client.
38
+ *
39
+ * Self-contained — CDN dependencies for markdown rendering (marked + highlight.js).
40
+ * Provides a chat-style interface with WebSocket communication.
41
+ * Supports text, html, markdown, and component message formats.
42
+ *
43
+ * Ported from AOS chat-ui surface, adapted for AFS WebBackend WS protocol.
44
+ *
45
+ * Structure: assembler that imports CSS, skeleton, core JS, and renderer
46
+ * modules, then concatenates them into a single HTML string. All pieces
47
+ * share the same IIFE scope — function declarations are hoisted, so
48
+ * renderer order is flexible.
49
+ */
50
+ const AFS_VERSION = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href)("../package.json").version || "unknown";
51
+ const AFS_VERSION_LITERAL = JSON.stringify(String(AFS_VERSION)).replace(/</g, "\\u003c");
52
+ const WEB_CLIENT_HTML = `<!DOCTYPE html>
53
+ <html lang="en">
54
+ <head>
55
+ <meta charset="UTF-8">
56
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
57
+ <title>AFS</title>
58
+ <link rel="preconnect" href="https://fonts.googleapis.com">
59
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
60
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700&family=Manrope:wght@400;500;600;700&family=Sora:wght@300;400;500;600;700&family=Outfit:wght@400;500;600;700&family=Share+Tech+Mono&family=JetBrains+Mono:wght@400;500&family=DM+Serif+Display:ital@0;1&family=Noto+Sans+SC:wght@300;400;500;600&family=Space+Mono:ital,wght@0,400;0,700;1,400&family=Instrument+Serif:ital@0;1&family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,700;1,9..144,400&family=Crimson+Pro:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
61
+ <script src="https://cdn.jsdelivr.net/npm/marked@15/marked.min.js"><\/script>
62
+ <script src="https://cdn.jsdelivr.net/npm/marked-highlight@2/lib/index.umd.min.js"><\/script>
63
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/styles/github-dark-dimmed.min.css">
64
+ <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js"><\/script>
65
+ <script src="https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js"><\/script>
66
+ <style>
67
+ ${require_css.CSS}
68
+ </style>
69
+ </head>
70
+ ${require_skeleton.SKELETON}
71
+ <script>
72
+ (function() {
73
+ var _AFS_VERSION = ${AFS_VERSION_LITERAL};
74
+ ${require_core.CORE_HEAD_JS}
75
+ ${require_icons.ICONS_JS}
76
+
77
+ ${require_view.VIEW_JS}
78
+ ${require_text.TEXT_JS}
79
+ ${require_action.ACTION_JS}
80
+ ${require_input.INPUT_JS}
81
+ ${require_media.MEDIA_JS}
82
+ ${require_overlay.OVERLAY_JS}
83
+ ${require_table.TABLE_JS}
84
+ ${require_terminal.TERMINAL_JS}
85
+ ${require_cdn_loader.CDN_LOADER_JS}
86
+ ${require_time.TIME_JS}
87
+ ${require_chart.CHART_JS}
88
+ ${require_finance_chart.FINANCE_CHART_JS}
89
+ ${require_map.MAP_JS}
90
+ ${require_globe.GLOBE_JS}
91
+ ${require_calendar.CALENDAR_JS}
92
+ ${require_moonphase.MOONPHASE_JS}
93
+ ${require_natal_chart.NATAL_CHART_JS}
94
+ ${require_editor.EDITOR_JS}
95
+ ${require_frame.FRAME_JS}
96
+ ${require_canvas.CANVAS_JS}
97
+ ${require_ticker.TICKER_JS}
98
+ ${require_broadcast.BROADCAST_JS}
99
+ ${require_list.LIST_JS}
100
+ ${require_device.DEVICE_JS}
101
+ ${require_wm.WM_JS}
102
+ var _OVERLAY_THEMES_CSS = ${JSON.stringify(require_overlay_themes.OVERLAY_THEMES_CSS)};
103
+ ${require_overlay_themes.OVERLAY_THEMES_JS}
104
+ var _DECK_SHADOW_CSS = ${JSON.stringify(require_css.DECK_SHADOW_CSS)};
105
+ ${require_deck.DECK_JS}
106
+ ${require_unknown.UNKNOWN_JS}
107
+
108
+ ${require_core.CORE_TAIL_JS}
109
+ <\/script>
110
+ </body>
111
+ </html>`;
112
+
113
+ //#endregion
114
+ exports.WEB_CLIENT_HTML = WEB_CLIENT_HTML;
@@ -0,0 +1,19 @@
1
+ //#region src/web-page.d.ts
2
+ /**
3
+ * Inline HTML template for the AFS UI web client.
4
+ *
5
+ * Self-contained — CDN dependencies for markdown rendering (marked + highlight.js).
6
+ * Provides a chat-style interface with WebSocket communication.
7
+ * Supports text, html, markdown, and component message formats.
8
+ *
9
+ * Ported from AOS chat-ui surface, adapted for AFS WebBackend WS protocol.
10
+ *
11
+ * Structure: assembler that imports CSS, skeleton, core JS, and renderer
12
+ * modules, then concatenates them into a single HTML string. All pieces
13
+ * share the same IIFE scope — function declarations are hoisted, so
14
+ * renderer order is flexible.
15
+ */
16
+ declare const WEB_CLIENT_HTML: string;
17
+ //#endregion
18
+ export { WEB_CLIENT_HTML };
19
+ //# sourceMappingURL=web-page.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-page.d.cts","names":[],"sources":["../src/web-page.ts"],"mappings":";;AAsDA;;;;;;;;;;;;;cAAa,eAAA"}
@@ -0,0 +1,19 @@
1
+ //#region src/web-page.d.ts
2
+ /**
3
+ * Inline HTML template for the AFS UI web client.
4
+ *
5
+ * Self-contained — CDN dependencies for markdown rendering (marked + highlight.js).
6
+ * Provides a chat-style interface with WebSocket communication.
7
+ * Supports text, html, markdown, and component message formats.
8
+ *
9
+ * Ported from AOS chat-ui surface, adapted for AFS WebBackend WS protocol.
10
+ *
11
+ * Structure: assembler that imports CSS, skeleton, core JS, and renderer
12
+ * modules, then concatenates them into a single HTML string. All pieces
13
+ * share the same IIFE scope — function declarations are hoisted, so
14
+ * renderer order is flexible.
15
+ */
16
+ declare const WEB_CLIENT_HTML: string;
17
+ //#endregion
18
+ export { WEB_CLIENT_HTML };
19
+ //# sourceMappingURL=web-page.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-page.d.mts","names":[],"sources":["../src/web-page.ts"],"mappings":";;AAsDA;;;;;;;;;;;;;cAAa,eAAA"}
@@ -0,0 +1,115 @@
1
+ import { CORE_HEAD_JS, CORE_TAIL_JS } from "./web-page/core.mjs";
2
+ import { CSS, DECK_SHADOW_CSS } from "./web-page/css.mjs";
3
+ import { ICONS_JS } from "./web-page/icons.mjs";
4
+ import { OVERLAY_THEMES_CSS, OVERLAY_THEMES_JS } from "./web-page/overlay-themes.mjs";
5
+ import { ACTION_JS } from "./web-page/renderers/action.mjs";
6
+ import { BROADCAST_JS } from "./web-page/renderers/broadcast.mjs";
7
+ import { CALENDAR_JS } from "./web-page/renderers/calendar.mjs";
8
+ import { CANVAS_JS } from "./web-page/renderers/canvas.mjs";
9
+ import { CDN_LOADER_JS } from "./web-page/renderers/cdn-loader.mjs";
10
+ import { CHART_JS } from "./web-page/renderers/chart.mjs";
11
+ import { DECK_JS } from "./web-page/renderers/deck.mjs";
12
+ import { DEVICE_JS } from "./web-page/renderers/device.mjs";
13
+ import { EDITOR_JS } from "./web-page/renderers/editor.mjs";
14
+ import { FINANCE_CHART_JS } from "./web-page/renderers/finance-chart.mjs";
15
+ import { FRAME_JS } from "./web-page/renderers/frame.mjs";
16
+ import { GLOBE_JS } from "./web-page/renderers/globe.mjs";
17
+ import { INPUT_JS } from "./web-page/renderers/input.mjs";
18
+ import { LIST_JS } from "./web-page/renderers/list.mjs";
19
+ import { MAP_JS } from "./web-page/renderers/map.mjs";
20
+ import { MEDIA_JS } from "./web-page/renderers/media.mjs";
21
+ import { MOONPHASE_JS } from "./web-page/renderers/moonphase.mjs";
22
+ import { NATAL_CHART_JS } from "./web-page/renderers/natal-chart.mjs";
23
+ import { OVERLAY_JS } from "./web-page/renderers/overlay.mjs";
24
+ import { TABLE_JS } from "./web-page/renderers/table.mjs";
25
+ import { TERMINAL_JS } from "./web-page/renderers/terminal.mjs";
26
+ import { TEXT_JS } from "./web-page/renderers/text.mjs";
27
+ import { TICKER_JS } from "./web-page/renderers/ticker.mjs";
28
+ import { TIME_JS } from "./web-page/renderers/time.mjs";
29
+ import { UNKNOWN_JS } from "./web-page/renderers/unknown.mjs";
30
+ import { VIEW_JS } from "./web-page/renderers/view.mjs";
31
+ import { WM_JS } from "./web-page/renderers/wm.mjs";
32
+ import { SKELETON } from "./web-page/skeleton.mjs";
33
+ import { createRequire } from "node:module";
34
+
35
+ //#region src/web-page.ts
36
+ /**
37
+ * Inline HTML template for the AFS UI web client.
38
+ *
39
+ * Self-contained — CDN dependencies for markdown rendering (marked + highlight.js).
40
+ * Provides a chat-style interface with WebSocket communication.
41
+ * Supports text, html, markdown, and component message formats.
42
+ *
43
+ * Ported from AOS chat-ui surface, adapted for AFS WebBackend WS protocol.
44
+ *
45
+ * Structure: assembler that imports CSS, skeleton, core JS, and renderer
46
+ * modules, then concatenates them into a single HTML string. All pieces
47
+ * share the same IIFE scope — function declarations are hoisted, so
48
+ * renderer order is flexible.
49
+ */
50
+ const AFS_VERSION = createRequire(import.meta.url)("../package.json").version || "unknown";
51
+ const AFS_VERSION_LITERAL = JSON.stringify(String(AFS_VERSION)).replace(/</g, "\\u003c");
52
+ const WEB_CLIENT_HTML = `<!DOCTYPE html>
53
+ <html lang="en">
54
+ <head>
55
+ <meta charset="UTF-8">
56
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
57
+ <title>AFS</title>
58
+ <link rel="preconnect" href="https://fonts.googleapis.com">
59
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
60
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700&family=Manrope:wght@400;500;600;700&family=Sora:wght@300;400;500;600;700&family=Outfit:wght@400;500;600;700&family=Share+Tech+Mono&family=JetBrains+Mono:wght@400;500&family=DM+Serif+Display:ital@0;1&family=Noto+Sans+SC:wght@300;400;500;600&family=Space+Mono:ital,wght@0,400;0,700;1,400&family=Instrument+Serif:ital@0;1&family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,700;1,9..144,400&family=Crimson+Pro:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
61
+ <script src="https://cdn.jsdelivr.net/npm/marked@15/marked.min.js"><\/script>
62
+ <script src="https://cdn.jsdelivr.net/npm/marked-highlight@2/lib/index.umd.min.js"><\/script>
63
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/styles/github-dark-dimmed.min.css">
64
+ <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js"><\/script>
65
+ <script src="https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js"><\/script>
66
+ <style>
67
+ ${CSS}
68
+ </style>
69
+ </head>
70
+ ${SKELETON}
71
+ <script>
72
+ (function() {
73
+ var _AFS_VERSION = ${AFS_VERSION_LITERAL};
74
+ ${CORE_HEAD_JS}
75
+ ${ICONS_JS}
76
+
77
+ ${VIEW_JS}
78
+ ${TEXT_JS}
79
+ ${ACTION_JS}
80
+ ${INPUT_JS}
81
+ ${MEDIA_JS}
82
+ ${OVERLAY_JS}
83
+ ${TABLE_JS}
84
+ ${TERMINAL_JS}
85
+ ${CDN_LOADER_JS}
86
+ ${TIME_JS}
87
+ ${CHART_JS}
88
+ ${FINANCE_CHART_JS}
89
+ ${MAP_JS}
90
+ ${GLOBE_JS}
91
+ ${CALENDAR_JS}
92
+ ${MOONPHASE_JS}
93
+ ${NATAL_CHART_JS}
94
+ ${EDITOR_JS}
95
+ ${FRAME_JS}
96
+ ${CANVAS_JS}
97
+ ${TICKER_JS}
98
+ ${BROADCAST_JS}
99
+ ${LIST_JS}
100
+ ${DEVICE_JS}
101
+ ${WM_JS}
102
+ var _OVERLAY_THEMES_CSS = ${JSON.stringify(OVERLAY_THEMES_CSS)};
103
+ ${OVERLAY_THEMES_JS}
104
+ var _DECK_SHADOW_CSS = ${JSON.stringify(DECK_SHADOW_CSS)};
105
+ ${DECK_JS}
106
+ ${UNKNOWN_JS}
107
+
108
+ ${CORE_TAIL_JS}
109
+ <\/script>
110
+ </body>
111
+ </html>`;
112
+
113
+ //#endregion
114
+ export { WEB_CLIENT_HTML };
115
+ //# sourceMappingURL=web-page.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-page.mjs","names":[],"sources":["../src/web-page.ts"],"sourcesContent":["/**\n * Inline HTML template for the AFS UI web client.\n *\n * Self-contained — CDN dependencies for markdown rendering (marked + highlight.js).\n * Provides a chat-style interface with WebSocket communication.\n * Supports text, html, markdown, and component message formats.\n *\n * Ported from AOS chat-ui surface, adapted for AFS WebBackend WS protocol.\n *\n * Structure: assembler that imports CSS, skeleton, core JS, and renderer\n * modules, then concatenates them into a single HTML string. All pieces\n * share the same IIFE scope — function declarations are hoisted, so\n * renderer order is flexible.\n */\n\nimport { createRequire } from \"node:module\";\nimport { CORE_HEAD_JS, CORE_TAIL_JS } from \"./web-page/core.js\";\nimport { CSS, DECK_SHADOW_CSS } from \"./web-page/css.js\";\nimport { ICONS_JS } from \"./web-page/icons.js\";\nimport { OVERLAY_THEMES_CSS, OVERLAY_THEMES_JS } from \"./web-page/overlay-themes.js\";\nimport { ACTION_JS } from \"./web-page/renderers/action.js\";\nimport { BROADCAST_JS } from \"./web-page/renderers/broadcast.js\";\nimport { CALENDAR_JS } from \"./web-page/renderers/calendar.js\";\nimport { CANVAS_JS } from \"./web-page/renderers/canvas.js\";\nimport { CDN_LOADER_JS } from \"./web-page/renderers/cdn-loader.js\";\nimport { CHART_JS } from \"./web-page/renderers/chart.js\";\nimport { DECK_JS } from \"./web-page/renderers/deck.js\";\nimport { DEVICE_JS } from \"./web-page/renderers/device.js\";\nimport { EDITOR_JS } from \"./web-page/renderers/editor.js\";\nimport { FINANCE_CHART_JS } from \"./web-page/renderers/finance-chart.js\";\nimport { FRAME_JS } from \"./web-page/renderers/frame.js\";\nimport { GLOBE_JS } from \"./web-page/renderers/globe.js\";\nimport { INPUT_JS } from \"./web-page/renderers/input.js\";\nimport { LIST_JS } from \"./web-page/renderers/list.js\";\nimport { MAP_JS } from \"./web-page/renderers/map.js\";\nimport { MEDIA_JS } from \"./web-page/renderers/media.js\";\nimport { MOONPHASE_JS } from \"./web-page/renderers/moonphase.js\";\nimport { NATAL_CHART_JS } from \"./web-page/renderers/natal-chart.js\";\nimport { OVERLAY_JS } from \"./web-page/renderers/overlay.js\";\nimport { TABLE_JS } from \"./web-page/renderers/table.js\";\nimport { TERMINAL_JS } from \"./web-page/renderers/terminal.js\";\nimport { TEXT_JS } from \"./web-page/renderers/text.js\";\nimport { TICKER_JS } from \"./web-page/renderers/ticker.js\";\nimport { TIME_JS } from \"./web-page/renderers/time.js\";\nimport { UNKNOWN_JS } from \"./web-page/renderers/unknown.js\";\nimport { VIEW_JS } from \"./web-page/renderers/view.js\";\nimport { WM_JS } from \"./web-page/renderers/wm.js\";\nimport { SKELETON } from \"./web-page/skeleton.js\";\n\nconst _require = createRequire(import.meta.url);\nconst _pkg = _require(\"../package.json\");\nconst AFS_VERSION: string = _pkg.version || \"unknown\";\nconst AFS_VERSION_LITERAL = JSON.stringify(String(AFS_VERSION)).replace(/</g, \"\\\\u003c\");\n\nexport const WEB_CLIENT_HTML = `<!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>AFS</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=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700&family=Manrope:wght@400;500;600;700&family=Sora:wght@300;400;500;600;700&family=Outfit:wght@400;500;600;700&family=Share+Tech+Mono&family=JetBrains+Mono:wght@400;500&family=DM+Serif+Display:ital@0;1&family=Noto+Sans+SC:wght@300;400;500;600&family=Space+Mono:ital,wght@0,400;0,700;1,400&family=Instrument+Serif:ital@0;1&family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,700;1,9..144,400&family=Crimson+Pro:ital,wght@0,400;0,600;1,400&display=swap\" rel=\"stylesheet\">\n<script src=\"https://cdn.jsdelivr.net/npm/marked@15/marked.min.js\"></script>\n<script src=\"https://cdn.jsdelivr.net/npm/marked-highlight@2/lib/index.umd.min.js\"></script>\n<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/styles/github-dark-dimmed.min.css\">\n<script src=\"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js\"></script>\n<script src=\"https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js\"></script>\n<style>\n${CSS}\n</style>\n</head>\n${SKELETON}\n<script>\n(function() {\nvar _AFS_VERSION = ${AFS_VERSION_LITERAL};\n${CORE_HEAD_JS}\n${ICONS_JS}\n\n${VIEW_JS}\n${TEXT_JS}\n${ACTION_JS}\n${INPUT_JS}\n${MEDIA_JS}\n${OVERLAY_JS}\n${TABLE_JS}\n${TERMINAL_JS}\n${CDN_LOADER_JS}\n${TIME_JS}\n${CHART_JS}\n${FINANCE_CHART_JS}\n${MAP_JS}\n${GLOBE_JS}\n${CALENDAR_JS}\n${MOONPHASE_JS}\n${NATAL_CHART_JS}\n${EDITOR_JS}\n${FRAME_JS}\n${CANVAS_JS}\n${TICKER_JS}\n${BROADCAST_JS}\n${LIST_JS}\n${DEVICE_JS}\n${WM_JS}\nvar _OVERLAY_THEMES_CSS = ${JSON.stringify(OVERLAY_THEMES_CSS)};\n${OVERLAY_THEMES_JS}\nvar _DECK_SHADOW_CSS = ${JSON.stringify(DECK_SHADOW_CSS)};\n${DECK_JS}\n${UNKNOWN_JS}\n\n${CORE_TAIL_JS}\n</script>\n</body>\n</html>`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,MAAM,cAFW,cAAc,OAAO,KAAK,IAAI,CACzB,kBAAkB,CACP,WAAW;AAC5C,MAAM,sBAAsB,KAAK,UAAU,OAAO,YAAY,CAAC,CAAC,QAAQ,MAAM,UAAU;AAExF,MAAa,kBAAkB;;;;;;;;;;;;;;;EAe7B,IAAI;;;EAGJ,SAAS;;;qBAGU,oBAAoB;EACvC,aAAa;EACb,SAAS;;EAET,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,SAAS;EACT,SAAS;EACT,WAAW;EACX,SAAS;EACT,YAAY;EACZ,cAAc;EACd,QAAQ;EACR,SAAS;EACT,iBAAiB;EACjB,OAAO;EACP,SAAS;EACT,YAAY;EACZ,aAAa;EACb,eAAe;EACf,UAAU;EACV,SAAS;EACT,UAAU;EACV,UAAU;EACV,aAAa;EACb,QAAQ;EACR,UAAU;EACV,MAAM;4BACoB,KAAK,UAAU,mBAAmB,CAAC;EAC7D,kBAAkB;yBACK,KAAK,UAAU,gBAAgB,CAAC;EACvD,QAAQ;EACR,WAAW;;EAEX,aAAa"}