@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.
- package/LICENSE.md +26 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
- package/dist/aup-protocol.cjs +235 -0
- package/dist/aup-protocol.d.cts +78 -0
- package/dist/aup-protocol.d.cts.map +1 -0
- package/dist/aup-protocol.d.mts +78 -0
- package/dist/aup-protocol.d.mts.map +1 -0
- package/dist/aup-protocol.mjs +235 -0
- package/dist/aup-protocol.mjs.map +1 -0
- package/dist/aup-registry.cjs +2489 -0
- package/dist/aup-registry.mjs +2487 -0
- package/dist/aup-registry.mjs.map +1 -0
- package/dist/aup-spec.cjs +1467 -0
- package/dist/aup-spec.mjs +1466 -0
- package/dist/aup-spec.mjs.map +1 -0
- package/dist/aup-types.cjs +165 -0
- package/dist/aup-types.d.cts +157 -0
- package/dist/aup-types.d.cts.map +1 -0
- package/dist/aup-types.d.mts +157 -0
- package/dist/aup-types.d.mts.map +1 -0
- package/dist/aup-types.mjs +157 -0
- package/dist/aup-types.mjs.map +1 -0
- package/dist/backend.cjs +14 -0
- package/dist/backend.d.cts +104 -0
- package/dist/backend.d.cts.map +1 -0
- package/dist/backend.d.mts +104 -0
- package/dist/backend.d.mts.map +1 -0
- package/dist/backend.mjs +13 -0
- package/dist/backend.mjs.map +1 -0
- package/dist/degradation.cjs +85 -0
- package/dist/degradation.d.cts +17 -0
- package/dist/degradation.d.cts.map +1 -0
- package/dist/degradation.d.mts +17 -0
- package/dist/degradation.d.mts.map +1 -0
- package/dist/degradation.mjs +84 -0
- package/dist/degradation.mjs.map +1 -0
- package/dist/index.cjs +36 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.mts +12 -0
- package/dist/index.mjs +13 -0
- package/dist/runtime.cjs +117 -0
- package/dist/runtime.d.cts +59 -0
- package/dist/runtime.d.cts.map +1 -0
- package/dist/runtime.d.mts +59 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +118 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/session.cjs +159 -0
- package/dist/session.d.cts +80 -0
- package/dist/session.d.cts.map +1 -0
- package/dist/session.d.mts +80 -0
- package/dist/session.d.mts.map +1 -0
- package/dist/session.mjs +159 -0
- package/dist/session.mjs.map +1 -0
- package/dist/snapshot.cjs +162 -0
- package/dist/snapshot.mjs +163 -0
- package/dist/snapshot.mjs.map +1 -0
- package/dist/term-page.cjs +264 -0
- package/dist/term-page.mjs +264 -0
- package/dist/term-page.mjs.map +1 -0
- package/dist/term.cjs +295 -0
- package/dist/term.d.cts +84 -0
- package/dist/term.d.cts.map +1 -0
- package/dist/term.d.mts +84 -0
- package/dist/term.d.mts.map +1 -0
- package/dist/term.mjs +296 -0
- package/dist/term.mjs.map +1 -0
- package/dist/tty.cjs +136 -0
- package/dist/tty.d.cts +53 -0
- package/dist/tty.d.cts.map +1 -0
- package/dist/tty.d.mts +53 -0
- package/dist/tty.d.mts.map +1 -0
- package/dist/tty.mjs +135 -0
- package/dist/tty.mjs.map +1 -0
- package/dist/ui-provider.cjs +4615 -0
- package/dist/ui-provider.d.cts +307 -0
- package/dist/ui-provider.d.cts.map +1 -0
- package/dist/ui-provider.d.mts +307 -0
- package/dist/ui-provider.d.mts.map +1 -0
- package/dist/ui-provider.mjs +4616 -0
- package/dist/ui-provider.mjs.map +1 -0
- package/dist/web-page/core.cjs +1388 -0
- package/dist/web-page/core.mjs +1387 -0
- package/dist/web-page/core.mjs.map +1 -0
- package/dist/web-page/css.cjs +1699 -0
- package/dist/web-page/css.mjs +1698 -0
- package/dist/web-page/css.mjs.map +1 -0
- package/dist/web-page/icons.cjs +248 -0
- package/dist/web-page/icons.mjs +248 -0
- package/dist/web-page/icons.mjs.map +1 -0
- package/dist/web-page/overlay-themes.cjs +514 -0
- package/dist/web-page/overlay-themes.mjs +513 -0
- package/dist/web-page/overlay-themes.mjs.map +1 -0
- package/dist/web-page/renderers/action.cjs +72 -0
- package/dist/web-page/renderers/action.mjs +72 -0
- package/dist/web-page/renderers/action.mjs.map +1 -0
- package/dist/web-page/renderers/broadcast.cjs +160 -0
- package/dist/web-page/renderers/broadcast.mjs +160 -0
- package/dist/web-page/renderers/broadcast.mjs.map +1 -0
- package/dist/web-page/renderers/calendar.cjs +137 -0
- package/dist/web-page/renderers/calendar.mjs +137 -0
- package/dist/web-page/renderers/calendar.mjs.map +1 -0
- package/dist/web-page/renderers/canvas.cjs +173 -0
- package/dist/web-page/renderers/canvas.mjs +173 -0
- package/dist/web-page/renderers/canvas.mjs.map +1 -0
- package/dist/web-page/renderers/cdn-loader.cjs +25 -0
- package/dist/web-page/renderers/cdn-loader.mjs +25 -0
- package/dist/web-page/renderers/cdn-loader.mjs.map +1 -0
- package/dist/web-page/renderers/chart.cjs +101 -0
- package/dist/web-page/renderers/chart.mjs +101 -0
- package/dist/web-page/renderers/chart.mjs.map +1 -0
- package/dist/web-page/renderers/deck.cjs +390 -0
- package/dist/web-page/renderers/deck.mjs +390 -0
- package/dist/web-page/renderers/deck.mjs.map +1 -0
- package/dist/web-page/renderers/device.cjs +1015 -0
- package/dist/web-page/renderers/device.mjs +1015 -0
- package/dist/web-page/renderers/device.mjs.map +1 -0
- package/dist/web-page/renderers/editor.cjs +127 -0
- package/dist/web-page/renderers/editor.mjs +127 -0
- package/dist/web-page/renderers/editor.mjs.map +1 -0
- package/dist/web-page/renderers/finance-chart.cjs +178 -0
- package/dist/web-page/renderers/finance-chart.mjs +178 -0
- package/dist/web-page/renderers/finance-chart.mjs.map +1 -0
- package/dist/web-page/renderers/frame.cjs +274 -0
- package/dist/web-page/renderers/frame.mjs +274 -0
- package/dist/web-page/renderers/frame.mjs.map +1 -0
- package/dist/web-page/renderers/globe.cjs +119 -0
- package/dist/web-page/renderers/globe.mjs +119 -0
- package/dist/web-page/renderers/globe.mjs.map +1 -0
- package/dist/web-page/renderers/input.cjs +137 -0
- package/dist/web-page/renderers/input.mjs +137 -0
- package/dist/web-page/renderers/input.mjs.map +1 -0
- package/dist/web-page/renderers/list.cjs +1243 -0
- package/dist/web-page/renderers/list.mjs +1243 -0
- package/dist/web-page/renderers/list.mjs.map +1 -0
- package/dist/web-page/renderers/map.cjs +126 -0
- package/dist/web-page/renderers/map.mjs +126 -0
- package/dist/web-page/renderers/map.mjs.map +1 -0
- package/dist/web-page/renderers/media.cjs +106 -0
- package/dist/web-page/renderers/media.mjs +106 -0
- package/dist/web-page/renderers/media.mjs.map +1 -0
- package/dist/web-page/renderers/moonphase.cjs +105 -0
- package/dist/web-page/renderers/moonphase.mjs +105 -0
- package/dist/web-page/renderers/moonphase.mjs.map +1 -0
- package/dist/web-page/renderers/natal-chart.cjs +222 -0
- package/dist/web-page/renderers/natal-chart.mjs +222 -0
- package/dist/web-page/renderers/natal-chart.mjs.map +1 -0
- package/dist/web-page/renderers/overlay.cjs +531 -0
- package/dist/web-page/renderers/overlay.mjs +531 -0
- package/dist/web-page/renderers/overlay.mjs.map +1 -0
- package/dist/web-page/renderers/table.cjs +74 -0
- package/dist/web-page/renderers/table.mjs +74 -0
- package/dist/web-page/renderers/table.mjs.map +1 -0
- package/dist/web-page/renderers/terminal.cjs +30 -0
- package/dist/web-page/renderers/terminal.mjs +30 -0
- package/dist/web-page/renderers/terminal.mjs.map +1 -0
- package/dist/web-page/renderers/text.cjs +109 -0
- package/dist/web-page/renderers/text.mjs +109 -0
- package/dist/web-page/renderers/text.mjs.map +1 -0
- package/dist/web-page/renderers/ticker.cjs +133 -0
- package/dist/web-page/renderers/ticker.mjs +133 -0
- package/dist/web-page/renderers/ticker.mjs.map +1 -0
- package/dist/web-page/renderers/time.cjs +69 -0
- package/dist/web-page/renderers/time.mjs +69 -0
- package/dist/web-page/renderers/time.mjs.map +1 -0
- package/dist/web-page/renderers/unknown.cjs +20 -0
- package/dist/web-page/renderers/unknown.mjs +20 -0
- package/dist/web-page/renderers/unknown.mjs.map +1 -0
- package/dist/web-page/renderers/view.cjs +161 -0
- package/dist/web-page/renderers/view.mjs +161 -0
- package/dist/web-page/renderers/view.mjs.map +1 -0
- package/dist/web-page/renderers/wm.cjs +669 -0
- package/dist/web-page/renderers/wm.mjs +669 -0
- package/dist/web-page/renderers/wm.mjs.map +1 -0
- package/dist/web-page/skeleton.cjs +103 -0
- package/dist/web-page/skeleton.mjs +103 -0
- package/dist/web-page/skeleton.mjs.map +1 -0
- package/dist/web-page.cjs +114 -0
- package/dist/web-page.d.cts +19 -0
- package/dist/web-page.d.cts.map +1 -0
- package/dist/web-page.d.mts +19 -0
- package/dist/web-page.d.mts.map +1 -0
- package/dist/web-page.mjs +115 -0
- package/dist/web-page.mjs.map +1 -0
- package/dist/web.cjs +827 -0
- package/dist/web.d.cts +144 -0
- package/dist/web.d.cts.map +1 -0
- package/dist/web.d.mts +144 -0
- package/dist/web.d.mts.map +1 -0
- package/dist/web.mjs +828 -0
- package/dist/web.mjs.map +1 -0
- package/dist/wm-state.cjs +172 -0
- package/dist/wm-state.mjs +171 -0
- package/dist/wm-state.mjs.map +1 -0
- 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;
|