@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,72 @@
1
+ //#region src/web-page/renderers/action.ts
2
+ const ACTION_JS = `
3
+ function _sanitizeActionHref(rawHref) {
4
+ if (typeof rawHref !== "string") return null;
5
+ var href = rawHref.trim();
6
+ if (!href) return null;
7
+ if (href.charAt(0) === "/" || href.charAt(0) === "#") return href;
8
+ try {
9
+ var parsed = new URL(href, location.href);
10
+ var protocol = parsed.protocol.toLowerCase();
11
+ if (
12
+ protocol === "http:" ||
13
+ protocol === "https:" ||
14
+ protocol === "mailto:" ||
15
+ protocol === "tel:"
16
+ ) {
17
+ return href;
18
+ }
19
+ } catch (_ex) {}
20
+ return null;
21
+ }
22
+
23
+ function renderAupAction(node) {
24
+ var p = node.props || {};
25
+ var safeHref = _sanitizeActionHref(p.href);
26
+ var el;
27
+ if (safeHref) {
28
+ el = document.createElement("a");
29
+ el.href = safeHref;
30
+ if (p.target) {
31
+ el.target = p.target;
32
+ if (String(p.target).toLowerCase() === "_blank") {
33
+ el.rel = "noopener noreferrer";
34
+ }
35
+ }
36
+ } else {
37
+ el = document.createElement("button");
38
+ }
39
+ el.className = "aup-action";
40
+ if (p.variant) el.setAttribute("data-variant", p.variant);
41
+ if (p.size) el.setAttribute("data-size", p.size);
42
+ // Icon before label
43
+ if (p.icon && _ICON_PATHS[p.icon]) {
44
+ var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
45
+ svg.setAttribute("viewBox", "0 0 24 24");
46
+ svg.setAttribute("fill", "none");
47
+ svg.setAttribute("stroke", "currentColor");
48
+ svg.setAttribute("stroke-width", "2");
49
+ svg.setAttribute("stroke-linecap", "round");
50
+ svg.setAttribute("stroke-linejoin", "round");
51
+ svg.classList.add("aup-icon-svg");
52
+ svg.innerHTML = _ICON_PATHS[p.icon];
53
+ el.appendChild(svg);
54
+ }
55
+ var span = document.createElement("span");
56
+ span.textContent = String(p.label || "Action");
57
+ el.appendChild(span);
58
+ // Wire click event — use _fireAupEvent for proper device WS routing
59
+ if (node.events && node.events.click) {
60
+ el.onclick = function(e) {
61
+ if (safeHref) e.preventDefault();
62
+ _fireAupEvent(node.id, "click", {});
63
+ };
64
+ }
65
+ return el;
66
+ }
67
+
68
+ `;
69
+
70
+ //#endregion
71
+ export { ACTION_JS };
72
+ //# sourceMappingURL=action.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.mjs","names":[],"sources":["../../../src/web-page/renderers/action.ts"],"sourcesContent":["export const ACTION_JS = `\n function _sanitizeActionHref(rawHref) {\n if (typeof rawHref !== \"string\") return null;\n var href = rawHref.trim();\n if (!href) return null;\n if (href.charAt(0) === \"/\" || href.charAt(0) === \"#\") return href;\n try {\n var parsed = new URL(href, location.href);\n var protocol = parsed.protocol.toLowerCase();\n if (\n protocol === \"http:\" ||\n protocol === \"https:\" ||\n protocol === \"mailto:\" ||\n protocol === \"tel:\"\n ) {\n return href;\n }\n } catch (_ex) {}\n return null;\n }\n\n function renderAupAction(node) {\n var p = node.props || {};\n var safeHref = _sanitizeActionHref(p.href);\n var el;\n if (safeHref) {\n el = document.createElement(\"a\");\n el.href = safeHref;\n if (p.target) {\n el.target = p.target;\n if (String(p.target).toLowerCase() === \"_blank\") {\n el.rel = \"noopener noreferrer\";\n }\n }\n } else {\n el = document.createElement(\"button\");\n }\n el.className = \"aup-action\";\n if (p.variant) el.setAttribute(\"data-variant\", p.variant);\n if (p.size) el.setAttribute(\"data-size\", p.size);\n // Icon before label\n if (p.icon && _ICON_PATHS[p.icon]) {\n var svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", \"currentColor\");\n svg.setAttribute(\"stroke-width\", \"2\");\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n svg.classList.add(\"aup-icon-svg\");\n svg.innerHTML = _ICON_PATHS[p.icon];\n el.appendChild(svg);\n }\n var span = document.createElement(\"span\");\n span.textContent = String(p.label || \"Action\");\n el.appendChild(span);\n // Wire click event — use _fireAupEvent for proper device WS routing\n if (node.events && node.events.click) {\n el.onclick = function(e) {\n if (safeHref) e.preventDefault();\n _fireAupEvent(node.id, \"click\", {});\n };\n }\n return el;\n }\n\n`;\n"],"mappings":";AAAA,MAAa,YAAY"}
@@ -0,0 +1,160 @@
1
+
2
+ //#region src/web-page/renderers/broadcast.ts
3
+ const BROADCAST_JS = `
4
+ // ── Broadcast Primitive ──
5
+ // Expands semantic roles into standard AUP nodes, then delegates to renderAupView.
6
+
7
+ var _BROADCAST_ROLE_MAP = {
8
+ "live-badge": { type: "text", props: { mode: "badge" } },
9
+ "clock": { type: "text", props: {} },
10
+ "viewer-count": { type: "text", props: {} },
11
+ "alert": { type: "text", props: {} },
12
+ "headline": { type: "text", props: {} },
13
+ "hashtag": { type: "text", props: {} },
14
+ "speaker-bar": { type: "view", props: { layout: "column" } },
15
+ "lower-third": { type: "view", props: { layout: "column" } },
16
+ "data-widget": { type: "view", props: { layout: "column" } },
17
+ "featured-comment": { type: "view", props: { layout: "column" } },
18
+ "score-bug": { type: "view", props: { layout: "column" } },
19
+ "logo": { type: "media", props: {} },
20
+ "ticker": { type: "ticker", props: {} }
21
+ };
22
+
23
+ var _BROADCAST_PLACEMENTS = {
24
+ _default: {
25
+ "live-badge": "top-start",
26
+ "clock": "top-end",
27
+ "viewer-count": "top-center",
28
+ "speaker-bar": "lower-start",
29
+ "lower-third": "lower-center",
30
+ "alert": "lower-start",
31
+ "headline": "lower-center",
32
+ "ticker": "ticker",
33
+ "logo": "lower-end",
34
+ "score-bug": "mid-end",
35
+ "data-widget": "mid-end",
36
+ "hashtag": "bottom-end",
37
+ "featured-comment": "mid-center"
38
+ },
39
+ apple: {
40
+ "live-badge": "top-end",
41
+ "clock": "top-start"
42
+ }
43
+ };
44
+
45
+ function _resolveBroadcastPlacements(theme) {
46
+ var themeName = typeof theme === "string" ? theme : "_default";
47
+ var base = _BROADCAST_PLACEMENTS._default;
48
+ var overrides = _BROADCAST_PLACEMENTS[themeName];
49
+ if (!overrides || themeName === "_default") return base;
50
+ var merged = {};
51
+ for (var k in base) { if (base.hasOwnProperty(k)) merged[k] = base[k]; }
52
+ for (var k2 in overrides) { if (overrides.hasOwnProperty(k2)) merged[k2] = overrides[k2]; }
53
+ return merged;
54
+ }
55
+
56
+ function _expandBroadcastChild(child, region) {
57
+ var role = child.role;
58
+ var mapping = _BROADCAST_ROLE_MAP[role];
59
+ if (!mapping) return null;
60
+
61
+ var nodeType = mapping.type;
62
+ var nodeProps = {};
63
+ for (var pk in mapping.props) { if (mapping.props.hasOwnProperty(pk)) nodeProps[pk] = mapping.props[pk]; }
64
+ nodeProps.region = region;
65
+ nodeProps.role = role;
66
+
67
+ // Logo: if src is present, use media; otherwise view
68
+ if (role === "logo") {
69
+ if (child.src) {
70
+ nodeType = "media";
71
+ nodeProps.src = child.src;
72
+ if (child.alt) nodeProps.alt = child.alt;
73
+ if (child.size) nodeProps.size = child.size;
74
+ } else {
75
+ nodeType = "view";
76
+ }
77
+ }
78
+
79
+ // Ticker: wrap items in a ticker node inside a view
80
+ if (role === "ticker") {
81
+ var tickerItems = child.items || [];
82
+ var tickerChildren = [];
83
+ for (var ti = 0; ti < tickerItems.length; ti++) {
84
+ tickerChildren.push({ type: "text", props: { content: tickerItems[ti] } });
85
+ }
86
+ var tickerProps = {};
87
+ if (child.intent) tickerProps.intent = child.intent;
88
+ if (child.mode) tickerProps.mode = child.mode;
89
+ if (child.speed) tickerProps.speed = child.speed;
90
+ return {
91
+ type: "view",
92
+ props: { region: region },
93
+ children: [{
94
+ type: "ticker",
95
+ props: tickerProps,
96
+ children: tickerChildren
97
+ }]
98
+ };
99
+ }
100
+
101
+ // Simple text roles: text prop → content
102
+ if (nodeType === "text") {
103
+ if (child.text) nodeProps.content = child.text;
104
+ return { type: "text", props: nodeProps };
105
+ }
106
+
107
+ // Compound view roles (speaker-bar, lower-third, data-widget, featured-comment, score-bug)
108
+ if (nodeType === "view") {
109
+ var viewChildren = [];
110
+ // lines[] → text children
111
+ if (child.lines && child.lines.length) {
112
+ for (var li = 0; li < child.lines.length; li++) {
113
+ viewChildren.push({ type: "text", props: { content: child.lines[li] } });
114
+ }
115
+ }
116
+ // Passthrough children[] — already-expanded AUP nodes
117
+ if (child.children && child.children.length) {
118
+ viewChildren = viewChildren.concat(child.children);
119
+ }
120
+ return { type: "view", props: nodeProps, children: viewChildren };
121
+ }
122
+
123
+ // Media (logo with src)
124
+ if (nodeType === "media") {
125
+ return { type: "media", props: nodeProps };
126
+ }
127
+
128
+ return null;
129
+ }
130
+
131
+ function renderAupBroadcast(node) {
132
+ var p = node.props || {};
133
+ var theme = p.theme || "minimal";
134
+ var placements = _resolveBroadcastPlacements(theme);
135
+
136
+ var viewNode = {
137
+ type: "view",
138
+ props: { layout: "overlay-grid", theme: theme },
139
+ children: []
140
+ };
141
+
142
+ // Forward background
143
+ if (p.background) viewNode.props.background = p.background;
144
+
145
+ var children = node.children || [];
146
+ for (var i = 0; i < children.length; i++) {
147
+ var child = children[i];
148
+ var role = child.role;
149
+ if (!role) continue;
150
+ var region = child.at || (placements[role] || "mid-center");
151
+ var expanded = _expandBroadcastChild(child, region);
152
+ if (expanded) viewNode.children.push(expanded);
153
+ }
154
+
155
+ return renderAupView(viewNode);
156
+ }
157
+ `;
158
+
159
+ //#endregion
160
+ exports.BROADCAST_JS = BROADCAST_JS;
@@ -0,0 +1,160 @@
1
+ //#region src/web-page/renderers/broadcast.ts
2
+ const BROADCAST_JS = `
3
+ // ── Broadcast Primitive ──
4
+ // Expands semantic roles into standard AUP nodes, then delegates to renderAupView.
5
+
6
+ var _BROADCAST_ROLE_MAP = {
7
+ "live-badge": { type: "text", props: { mode: "badge" } },
8
+ "clock": { type: "text", props: {} },
9
+ "viewer-count": { type: "text", props: {} },
10
+ "alert": { type: "text", props: {} },
11
+ "headline": { type: "text", props: {} },
12
+ "hashtag": { type: "text", props: {} },
13
+ "speaker-bar": { type: "view", props: { layout: "column" } },
14
+ "lower-third": { type: "view", props: { layout: "column" } },
15
+ "data-widget": { type: "view", props: { layout: "column" } },
16
+ "featured-comment": { type: "view", props: { layout: "column" } },
17
+ "score-bug": { type: "view", props: { layout: "column" } },
18
+ "logo": { type: "media", props: {} },
19
+ "ticker": { type: "ticker", props: {} }
20
+ };
21
+
22
+ var _BROADCAST_PLACEMENTS = {
23
+ _default: {
24
+ "live-badge": "top-start",
25
+ "clock": "top-end",
26
+ "viewer-count": "top-center",
27
+ "speaker-bar": "lower-start",
28
+ "lower-third": "lower-center",
29
+ "alert": "lower-start",
30
+ "headline": "lower-center",
31
+ "ticker": "ticker",
32
+ "logo": "lower-end",
33
+ "score-bug": "mid-end",
34
+ "data-widget": "mid-end",
35
+ "hashtag": "bottom-end",
36
+ "featured-comment": "mid-center"
37
+ },
38
+ apple: {
39
+ "live-badge": "top-end",
40
+ "clock": "top-start"
41
+ }
42
+ };
43
+
44
+ function _resolveBroadcastPlacements(theme) {
45
+ var themeName = typeof theme === "string" ? theme : "_default";
46
+ var base = _BROADCAST_PLACEMENTS._default;
47
+ var overrides = _BROADCAST_PLACEMENTS[themeName];
48
+ if (!overrides || themeName === "_default") return base;
49
+ var merged = {};
50
+ for (var k in base) { if (base.hasOwnProperty(k)) merged[k] = base[k]; }
51
+ for (var k2 in overrides) { if (overrides.hasOwnProperty(k2)) merged[k2] = overrides[k2]; }
52
+ return merged;
53
+ }
54
+
55
+ function _expandBroadcastChild(child, region) {
56
+ var role = child.role;
57
+ var mapping = _BROADCAST_ROLE_MAP[role];
58
+ if (!mapping) return null;
59
+
60
+ var nodeType = mapping.type;
61
+ var nodeProps = {};
62
+ for (var pk in mapping.props) { if (mapping.props.hasOwnProperty(pk)) nodeProps[pk] = mapping.props[pk]; }
63
+ nodeProps.region = region;
64
+ nodeProps.role = role;
65
+
66
+ // Logo: if src is present, use media; otherwise view
67
+ if (role === "logo") {
68
+ if (child.src) {
69
+ nodeType = "media";
70
+ nodeProps.src = child.src;
71
+ if (child.alt) nodeProps.alt = child.alt;
72
+ if (child.size) nodeProps.size = child.size;
73
+ } else {
74
+ nodeType = "view";
75
+ }
76
+ }
77
+
78
+ // Ticker: wrap items in a ticker node inside a view
79
+ if (role === "ticker") {
80
+ var tickerItems = child.items || [];
81
+ var tickerChildren = [];
82
+ for (var ti = 0; ti < tickerItems.length; ti++) {
83
+ tickerChildren.push({ type: "text", props: { content: tickerItems[ti] } });
84
+ }
85
+ var tickerProps = {};
86
+ if (child.intent) tickerProps.intent = child.intent;
87
+ if (child.mode) tickerProps.mode = child.mode;
88
+ if (child.speed) tickerProps.speed = child.speed;
89
+ return {
90
+ type: "view",
91
+ props: { region: region },
92
+ children: [{
93
+ type: "ticker",
94
+ props: tickerProps,
95
+ children: tickerChildren
96
+ }]
97
+ };
98
+ }
99
+
100
+ // Simple text roles: text prop → content
101
+ if (nodeType === "text") {
102
+ if (child.text) nodeProps.content = child.text;
103
+ return { type: "text", props: nodeProps };
104
+ }
105
+
106
+ // Compound view roles (speaker-bar, lower-third, data-widget, featured-comment, score-bug)
107
+ if (nodeType === "view") {
108
+ var viewChildren = [];
109
+ // lines[] → text children
110
+ if (child.lines && child.lines.length) {
111
+ for (var li = 0; li < child.lines.length; li++) {
112
+ viewChildren.push({ type: "text", props: { content: child.lines[li] } });
113
+ }
114
+ }
115
+ // Passthrough children[] — already-expanded AUP nodes
116
+ if (child.children && child.children.length) {
117
+ viewChildren = viewChildren.concat(child.children);
118
+ }
119
+ return { type: "view", props: nodeProps, children: viewChildren };
120
+ }
121
+
122
+ // Media (logo with src)
123
+ if (nodeType === "media") {
124
+ return { type: "media", props: nodeProps };
125
+ }
126
+
127
+ return null;
128
+ }
129
+
130
+ function renderAupBroadcast(node) {
131
+ var p = node.props || {};
132
+ var theme = p.theme || "minimal";
133
+ var placements = _resolveBroadcastPlacements(theme);
134
+
135
+ var viewNode = {
136
+ type: "view",
137
+ props: { layout: "overlay-grid", theme: theme },
138
+ children: []
139
+ };
140
+
141
+ // Forward background
142
+ if (p.background) viewNode.props.background = p.background;
143
+
144
+ var children = node.children || [];
145
+ for (var i = 0; i < children.length; i++) {
146
+ var child = children[i];
147
+ var role = child.role;
148
+ if (!role) continue;
149
+ var region = child.at || (placements[role] || "mid-center");
150
+ var expanded = _expandBroadcastChild(child, region);
151
+ if (expanded) viewNode.children.push(expanded);
152
+ }
153
+
154
+ return renderAupView(viewNode);
155
+ }
156
+ `;
157
+
158
+ //#endregion
159
+ export { BROADCAST_JS };
160
+ //# sourceMappingURL=broadcast.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast.mjs","names":[],"sources":["../../../src/web-page/renderers/broadcast.ts"],"sourcesContent":["export const BROADCAST_JS = `\n // ── Broadcast Primitive ──\n // Expands semantic roles into standard AUP nodes, then delegates to renderAupView.\n\n var _BROADCAST_ROLE_MAP = {\n \"live-badge\": { type: \"text\", props: { mode: \"badge\" } },\n \"clock\": { type: \"text\", props: {} },\n \"viewer-count\": { type: \"text\", props: {} },\n \"alert\": { type: \"text\", props: {} },\n \"headline\": { type: \"text\", props: {} },\n \"hashtag\": { type: \"text\", props: {} },\n \"speaker-bar\": { type: \"view\", props: { layout: \"column\" } },\n \"lower-third\": { type: \"view\", props: { layout: \"column\" } },\n \"data-widget\": { type: \"view\", props: { layout: \"column\" } },\n \"featured-comment\": { type: \"view\", props: { layout: \"column\" } },\n \"score-bug\": { type: \"view\", props: { layout: \"column\" } },\n \"logo\": { type: \"media\", props: {} },\n \"ticker\": { type: \"ticker\", props: {} }\n };\n\n var _BROADCAST_PLACEMENTS = {\n _default: {\n \"live-badge\": \"top-start\",\n \"clock\": \"top-end\",\n \"viewer-count\": \"top-center\",\n \"speaker-bar\": \"lower-start\",\n \"lower-third\": \"lower-center\",\n \"alert\": \"lower-start\",\n \"headline\": \"lower-center\",\n \"ticker\": \"ticker\",\n \"logo\": \"lower-end\",\n \"score-bug\": \"mid-end\",\n \"data-widget\": \"mid-end\",\n \"hashtag\": \"bottom-end\",\n \"featured-comment\": \"mid-center\"\n },\n apple: {\n \"live-badge\": \"top-end\",\n \"clock\": \"top-start\"\n }\n };\n\n function _resolveBroadcastPlacements(theme) {\n var themeName = typeof theme === \"string\" ? theme : \"_default\";\n var base = _BROADCAST_PLACEMENTS._default;\n var overrides = _BROADCAST_PLACEMENTS[themeName];\n if (!overrides || themeName === \"_default\") return base;\n var merged = {};\n for (var k in base) { if (base.hasOwnProperty(k)) merged[k] = base[k]; }\n for (var k2 in overrides) { if (overrides.hasOwnProperty(k2)) merged[k2] = overrides[k2]; }\n return merged;\n }\n\n function _expandBroadcastChild(child, region) {\n var role = child.role;\n var mapping = _BROADCAST_ROLE_MAP[role];\n if (!mapping) return null;\n\n var nodeType = mapping.type;\n var nodeProps = {};\n for (var pk in mapping.props) { if (mapping.props.hasOwnProperty(pk)) nodeProps[pk] = mapping.props[pk]; }\n nodeProps.region = region;\n nodeProps.role = role;\n\n // Logo: if src is present, use media; otherwise view\n if (role === \"logo\") {\n if (child.src) {\n nodeType = \"media\";\n nodeProps.src = child.src;\n if (child.alt) nodeProps.alt = child.alt;\n if (child.size) nodeProps.size = child.size;\n } else {\n nodeType = \"view\";\n }\n }\n\n // Ticker: wrap items in a ticker node inside a view\n if (role === \"ticker\") {\n var tickerItems = child.items || [];\n var tickerChildren = [];\n for (var ti = 0; ti < tickerItems.length; ti++) {\n tickerChildren.push({ type: \"text\", props: { content: tickerItems[ti] } });\n }\n var tickerProps = {};\n if (child.intent) tickerProps.intent = child.intent;\n if (child.mode) tickerProps.mode = child.mode;\n if (child.speed) tickerProps.speed = child.speed;\n return {\n type: \"view\",\n props: { region: region },\n children: [{\n type: \"ticker\",\n props: tickerProps,\n children: tickerChildren\n }]\n };\n }\n\n // Simple text roles: text prop → content\n if (nodeType === \"text\") {\n if (child.text) nodeProps.content = child.text;\n return { type: \"text\", props: nodeProps };\n }\n\n // Compound view roles (speaker-bar, lower-third, data-widget, featured-comment, score-bug)\n if (nodeType === \"view\") {\n var viewChildren = [];\n // lines[] → text children\n if (child.lines && child.lines.length) {\n for (var li = 0; li < child.lines.length; li++) {\n viewChildren.push({ type: \"text\", props: { content: child.lines[li] } });\n }\n }\n // Passthrough children[] — already-expanded AUP nodes\n if (child.children && child.children.length) {\n viewChildren = viewChildren.concat(child.children);\n }\n return { type: \"view\", props: nodeProps, children: viewChildren };\n }\n\n // Media (logo with src)\n if (nodeType === \"media\") {\n return { type: \"media\", props: nodeProps };\n }\n\n return null;\n }\n\n function renderAupBroadcast(node) {\n var p = node.props || {};\n var theme = p.theme || \"minimal\";\n var placements = _resolveBroadcastPlacements(theme);\n\n var viewNode = {\n type: \"view\",\n props: { layout: \"overlay-grid\", theme: theme },\n children: []\n };\n\n // Forward background\n if (p.background) viewNode.props.background = p.background;\n\n var children = node.children || [];\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n var role = child.role;\n if (!role) continue;\n var region = child.at || (placements[role] || \"mid-center\");\n var expanded = _expandBroadcastChild(child, region);\n if (expanded) viewNode.children.push(expanded);\n }\n\n return renderAupView(viewNode);\n }\n`;\n"],"mappings":";AAAA,MAAa,eAAe"}
@@ -0,0 +1,137 @@
1
+
2
+ //#region src/web-page/renderers/calendar.ts
3
+ const CALENDAR_JS = `
4
+ // ── Calendar Primitive (Pure CSS/JS) ──
5
+ function renderAupCalendar(node) {
6
+ var el = document.createElement("div");
7
+ el.className = "aup-calendar";
8
+ var p = node.props || {};
9
+ var mode = p.mode || "month";
10
+ var events = p.events || [];
11
+ var currentDate = new Date();
12
+
13
+ if (mode === "month" || mode === "week" || mode === "day") {
14
+ renderMonthView();
15
+ } else if (mode === "agenda") {
16
+ renderAgendaView();
17
+ }
18
+
19
+ function renderMonthView() {
20
+ el.innerHTML = "";
21
+ var header = document.createElement("div");
22
+ header.className = "aup-calendar-header";
23
+ var prevBtn = document.createElement("button");
24
+ prevBtn.textContent = "\\u25C0";
25
+ prevBtn.onclick = function() { currentDate.setMonth(currentDate.getMonth() - 1); renderMonthView(); };
26
+ var nextBtn = document.createElement("button");
27
+ nextBtn.textContent = "\\u25B6";
28
+ nextBtn.onclick = function() { currentDate.setMonth(currentDate.getMonth() + 1); renderMonthView(); };
29
+ var title = document.createElement("span");
30
+ title.className = "aup-calendar-title";
31
+ title.textContent = currentDate.toLocaleDateString(p.locale || undefined, { year: "numeric", month: "long" });
32
+ header.appendChild(prevBtn);
33
+ header.appendChild(title);
34
+ header.appendChild(nextBtn);
35
+ el.appendChild(header);
36
+
37
+ var grid = document.createElement("div");
38
+ grid.className = "aup-calendar-grid";
39
+
40
+ var dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
41
+ for (var d = 0; d < 7; d++) {
42
+ var dh = document.createElement("div");
43
+ dh.className = "aup-calendar-day-header";
44
+ dh.textContent = dayNames[d];
45
+ grid.appendChild(dh);
46
+ }
47
+
48
+ var year = currentDate.getFullYear();
49
+ var month = currentDate.getMonth();
50
+ var firstDay = new Date(year, month, 1).getDay();
51
+ var daysInMonth = new Date(year, month + 1, 0).getDate();
52
+ var today = new Date();
53
+
54
+ // Previous month padding
55
+ var prevMonthDays = new Date(year, month, 0).getDate();
56
+ for (var i = firstDay - 1; i >= 0; i--) {
57
+ var dayEl = document.createElement("div");
58
+ dayEl.className = "aup-calendar-day other-month";
59
+ dayEl.textContent = String(prevMonthDays - i);
60
+ grid.appendChild(dayEl);
61
+ }
62
+
63
+ // Current month days
64
+ for (var day = 1; day <= daysInMonth; day++) {
65
+ var dayEl = document.createElement("div");
66
+ dayEl.className = "aup-calendar-day";
67
+ if (day === today.getDate() && month === today.getMonth() && year === today.getFullYear()) {
68
+ dayEl.classList.add("today");
69
+ }
70
+ dayEl.textContent = String(day);
71
+
72
+ // Events on this day
73
+ var dateStr = year + "-" + String(month + 1).padStart(2, "0") + "-" + String(day).padStart(2, "0");
74
+ for (var e = 0; e < events.length; e++) {
75
+ if (events[e].date === dateStr) {
76
+ var evtEl = document.createElement("span");
77
+ evtEl.className = "aup-calendar-event";
78
+ evtEl.setAttribute("data-intent", events[e].intent || "info");
79
+ evtEl.textContent = _escapeHtml(String(events[e].label || ""));
80
+ dayEl.appendChild(evtEl);
81
+ }
82
+ }
83
+ grid.appendChild(dayEl);
84
+ }
85
+
86
+ // Next month padding
87
+ var totalCells = firstDay + daysInMonth;
88
+ var remaining = (7 - (totalCells % 7)) % 7;
89
+ for (var i = 1; i <= remaining; i++) {
90
+ var dayEl = document.createElement("div");
91
+ dayEl.className = "aup-calendar-day other-month";
92
+ dayEl.textContent = String(i);
93
+ grid.appendChild(dayEl);
94
+ }
95
+
96
+ el.appendChild(grid);
97
+ }
98
+
99
+ function renderAgendaView() {
100
+ el.innerHTML = "";
101
+ var header = document.createElement("div");
102
+ header.className = "aup-calendar-header";
103
+ var title = document.createElement("span");
104
+ title.className = "aup-calendar-title";
105
+ title.textContent = "Agenda";
106
+ header.appendChild(title);
107
+ el.appendChild(header);
108
+
109
+ var sorted = events.slice().sort(function(a, b) { return (a.date || "").localeCompare(b.date || ""); });
110
+ if (sorted.length === 0) {
111
+ var empty = document.createElement("div");
112
+ empty.style.cssText = "color: var(--dim); text-align: center; padding: 20px;";
113
+ empty.textContent = "No events";
114
+ el.appendChild(empty);
115
+ } else {
116
+ for (var i = 0; i < sorted.length; i++) {
117
+ var item = document.createElement("div");
118
+ item.style.cssText = "display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--border);";
119
+ var date = document.createElement("span");
120
+ date.style.cssText = "font-size: 0.8em; color: var(--dim); min-width: 80px;";
121
+ date.textContent = sorted[i].date || "";
122
+ var label = document.createElement("span");
123
+ label.textContent = _escapeHtml(String(sorted[i].label || ""));
124
+ item.appendChild(date);
125
+ item.appendChild(label);
126
+ el.appendChild(item);
127
+ }
128
+ }
129
+ }
130
+
131
+ return el;
132
+ }
133
+
134
+ `;
135
+
136
+ //#endregion
137
+ exports.CALENDAR_JS = CALENDAR_JS;