@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,137 @@
|
|
|
1
|
+
//#region src/web-page/renderers/calendar.ts
|
|
2
|
+
const CALENDAR_JS = `
|
|
3
|
+
// ── Calendar Primitive (Pure CSS/JS) ──
|
|
4
|
+
function renderAupCalendar(node) {
|
|
5
|
+
var el = document.createElement("div");
|
|
6
|
+
el.className = "aup-calendar";
|
|
7
|
+
var p = node.props || {};
|
|
8
|
+
var mode = p.mode || "month";
|
|
9
|
+
var events = p.events || [];
|
|
10
|
+
var currentDate = new Date();
|
|
11
|
+
|
|
12
|
+
if (mode === "month" || mode === "week" || mode === "day") {
|
|
13
|
+
renderMonthView();
|
|
14
|
+
} else if (mode === "agenda") {
|
|
15
|
+
renderAgendaView();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function renderMonthView() {
|
|
19
|
+
el.innerHTML = "";
|
|
20
|
+
var header = document.createElement("div");
|
|
21
|
+
header.className = "aup-calendar-header";
|
|
22
|
+
var prevBtn = document.createElement("button");
|
|
23
|
+
prevBtn.textContent = "\\u25C0";
|
|
24
|
+
prevBtn.onclick = function() { currentDate.setMonth(currentDate.getMonth() - 1); renderMonthView(); };
|
|
25
|
+
var nextBtn = document.createElement("button");
|
|
26
|
+
nextBtn.textContent = "\\u25B6";
|
|
27
|
+
nextBtn.onclick = function() { currentDate.setMonth(currentDate.getMonth() + 1); renderMonthView(); };
|
|
28
|
+
var title = document.createElement("span");
|
|
29
|
+
title.className = "aup-calendar-title";
|
|
30
|
+
title.textContent = currentDate.toLocaleDateString(p.locale || undefined, { year: "numeric", month: "long" });
|
|
31
|
+
header.appendChild(prevBtn);
|
|
32
|
+
header.appendChild(title);
|
|
33
|
+
header.appendChild(nextBtn);
|
|
34
|
+
el.appendChild(header);
|
|
35
|
+
|
|
36
|
+
var grid = document.createElement("div");
|
|
37
|
+
grid.className = "aup-calendar-grid";
|
|
38
|
+
|
|
39
|
+
var dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
40
|
+
for (var d = 0; d < 7; d++) {
|
|
41
|
+
var dh = document.createElement("div");
|
|
42
|
+
dh.className = "aup-calendar-day-header";
|
|
43
|
+
dh.textContent = dayNames[d];
|
|
44
|
+
grid.appendChild(dh);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
var year = currentDate.getFullYear();
|
|
48
|
+
var month = currentDate.getMonth();
|
|
49
|
+
var firstDay = new Date(year, month, 1).getDay();
|
|
50
|
+
var daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
51
|
+
var today = new Date();
|
|
52
|
+
|
|
53
|
+
// Previous month padding
|
|
54
|
+
var prevMonthDays = new Date(year, month, 0).getDate();
|
|
55
|
+
for (var i = firstDay - 1; i >= 0; i--) {
|
|
56
|
+
var dayEl = document.createElement("div");
|
|
57
|
+
dayEl.className = "aup-calendar-day other-month";
|
|
58
|
+
dayEl.textContent = String(prevMonthDays - i);
|
|
59
|
+
grid.appendChild(dayEl);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Current month days
|
|
63
|
+
for (var day = 1; day <= daysInMonth; day++) {
|
|
64
|
+
var dayEl = document.createElement("div");
|
|
65
|
+
dayEl.className = "aup-calendar-day";
|
|
66
|
+
if (day === today.getDate() && month === today.getMonth() && year === today.getFullYear()) {
|
|
67
|
+
dayEl.classList.add("today");
|
|
68
|
+
}
|
|
69
|
+
dayEl.textContent = String(day);
|
|
70
|
+
|
|
71
|
+
// Events on this day
|
|
72
|
+
var dateStr = year + "-" + String(month + 1).padStart(2, "0") + "-" + String(day).padStart(2, "0");
|
|
73
|
+
for (var e = 0; e < events.length; e++) {
|
|
74
|
+
if (events[e].date === dateStr) {
|
|
75
|
+
var evtEl = document.createElement("span");
|
|
76
|
+
evtEl.className = "aup-calendar-event";
|
|
77
|
+
evtEl.setAttribute("data-intent", events[e].intent || "info");
|
|
78
|
+
evtEl.textContent = _escapeHtml(String(events[e].label || ""));
|
|
79
|
+
dayEl.appendChild(evtEl);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
grid.appendChild(dayEl);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Next month padding
|
|
86
|
+
var totalCells = firstDay + daysInMonth;
|
|
87
|
+
var remaining = (7 - (totalCells % 7)) % 7;
|
|
88
|
+
for (var i = 1; i <= remaining; i++) {
|
|
89
|
+
var dayEl = document.createElement("div");
|
|
90
|
+
dayEl.className = "aup-calendar-day other-month";
|
|
91
|
+
dayEl.textContent = String(i);
|
|
92
|
+
grid.appendChild(dayEl);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
el.appendChild(grid);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function renderAgendaView() {
|
|
99
|
+
el.innerHTML = "";
|
|
100
|
+
var header = document.createElement("div");
|
|
101
|
+
header.className = "aup-calendar-header";
|
|
102
|
+
var title = document.createElement("span");
|
|
103
|
+
title.className = "aup-calendar-title";
|
|
104
|
+
title.textContent = "Agenda";
|
|
105
|
+
header.appendChild(title);
|
|
106
|
+
el.appendChild(header);
|
|
107
|
+
|
|
108
|
+
var sorted = events.slice().sort(function(a, b) { return (a.date || "").localeCompare(b.date || ""); });
|
|
109
|
+
if (sorted.length === 0) {
|
|
110
|
+
var empty = document.createElement("div");
|
|
111
|
+
empty.style.cssText = "color: var(--dim); text-align: center; padding: 20px;";
|
|
112
|
+
empty.textContent = "No events";
|
|
113
|
+
el.appendChild(empty);
|
|
114
|
+
} else {
|
|
115
|
+
for (var i = 0; i < sorted.length; i++) {
|
|
116
|
+
var item = document.createElement("div");
|
|
117
|
+
item.style.cssText = "display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--border);";
|
|
118
|
+
var date = document.createElement("span");
|
|
119
|
+
date.style.cssText = "font-size: 0.8em; color: var(--dim); min-width: 80px;";
|
|
120
|
+
date.textContent = sorted[i].date || "";
|
|
121
|
+
var label = document.createElement("span");
|
|
122
|
+
label.textContent = _escapeHtml(String(sorted[i].label || ""));
|
|
123
|
+
item.appendChild(date);
|
|
124
|
+
item.appendChild(label);
|
|
125
|
+
el.appendChild(item);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return el;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
`;
|
|
134
|
+
|
|
135
|
+
//#endregion
|
|
136
|
+
export { CALENDAR_JS };
|
|
137
|
+
//# sourceMappingURL=calendar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.mjs","names":[],"sources":["../../../src/web-page/renderers/calendar.ts"],"sourcesContent":["export const CALENDAR_JS = `\n // ── Calendar Primitive (Pure CSS/JS) ──\n function renderAupCalendar(node) {\n var el = document.createElement(\"div\");\n el.className = \"aup-calendar\";\n var p = node.props || {};\n var mode = p.mode || \"month\";\n var events = p.events || [];\n var currentDate = new Date();\n\n if (mode === \"month\" || mode === \"week\" || mode === \"day\") {\n renderMonthView();\n } else if (mode === \"agenda\") {\n renderAgendaView();\n }\n\n function renderMonthView() {\n el.innerHTML = \"\";\n var header = document.createElement(\"div\");\n header.className = \"aup-calendar-header\";\n var prevBtn = document.createElement(\"button\");\n prevBtn.textContent = \"\\\\u25C0\";\n prevBtn.onclick = function() { currentDate.setMonth(currentDate.getMonth() - 1); renderMonthView(); };\n var nextBtn = document.createElement(\"button\");\n nextBtn.textContent = \"\\\\u25B6\";\n nextBtn.onclick = function() { currentDate.setMonth(currentDate.getMonth() + 1); renderMonthView(); };\n var title = document.createElement(\"span\");\n title.className = \"aup-calendar-title\";\n title.textContent = currentDate.toLocaleDateString(p.locale || undefined, { year: \"numeric\", month: \"long\" });\n header.appendChild(prevBtn);\n header.appendChild(title);\n header.appendChild(nextBtn);\n el.appendChild(header);\n\n var grid = document.createElement(\"div\");\n grid.className = \"aup-calendar-grid\";\n\n var dayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n for (var d = 0; d < 7; d++) {\n var dh = document.createElement(\"div\");\n dh.className = \"aup-calendar-day-header\";\n dh.textContent = dayNames[d];\n grid.appendChild(dh);\n }\n\n var year = currentDate.getFullYear();\n var month = currentDate.getMonth();\n var firstDay = new Date(year, month, 1).getDay();\n var daysInMonth = new Date(year, month + 1, 0).getDate();\n var today = new Date();\n\n // Previous month padding\n var prevMonthDays = new Date(year, month, 0).getDate();\n for (var i = firstDay - 1; i >= 0; i--) {\n var dayEl = document.createElement(\"div\");\n dayEl.className = \"aup-calendar-day other-month\";\n dayEl.textContent = String(prevMonthDays - i);\n grid.appendChild(dayEl);\n }\n\n // Current month days\n for (var day = 1; day <= daysInMonth; day++) {\n var dayEl = document.createElement(\"div\");\n dayEl.className = \"aup-calendar-day\";\n if (day === today.getDate() && month === today.getMonth() && year === today.getFullYear()) {\n dayEl.classList.add(\"today\");\n }\n dayEl.textContent = String(day);\n\n // Events on this day\n var dateStr = year + \"-\" + String(month + 1).padStart(2, \"0\") + \"-\" + String(day).padStart(2, \"0\");\n for (var e = 0; e < events.length; e++) {\n if (events[e].date === dateStr) {\n var evtEl = document.createElement(\"span\");\n evtEl.className = \"aup-calendar-event\";\n evtEl.setAttribute(\"data-intent\", events[e].intent || \"info\");\n evtEl.textContent = _escapeHtml(String(events[e].label || \"\"));\n dayEl.appendChild(evtEl);\n }\n }\n grid.appendChild(dayEl);\n }\n\n // Next month padding\n var totalCells = firstDay + daysInMonth;\n var remaining = (7 - (totalCells % 7)) % 7;\n for (var i = 1; i <= remaining; i++) {\n var dayEl = document.createElement(\"div\");\n dayEl.className = \"aup-calendar-day other-month\";\n dayEl.textContent = String(i);\n grid.appendChild(dayEl);\n }\n\n el.appendChild(grid);\n }\n\n function renderAgendaView() {\n el.innerHTML = \"\";\n var header = document.createElement(\"div\");\n header.className = \"aup-calendar-header\";\n var title = document.createElement(\"span\");\n title.className = \"aup-calendar-title\";\n title.textContent = \"Agenda\";\n header.appendChild(title);\n el.appendChild(header);\n\n var sorted = events.slice().sort(function(a, b) { return (a.date || \"\").localeCompare(b.date || \"\"); });\n if (sorted.length === 0) {\n var empty = document.createElement(\"div\");\n empty.style.cssText = \"color: var(--dim); text-align: center; padding: 20px;\";\n empty.textContent = \"No events\";\n el.appendChild(empty);\n } else {\n for (var i = 0; i < sorted.length; i++) {\n var item = document.createElement(\"div\");\n item.style.cssText = \"display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--border);\";\n var date = document.createElement(\"span\");\n date.style.cssText = \"font-size: 0.8em; color: var(--dim); min-width: 80px;\";\n date.textContent = sorted[i].date || \"\";\n var label = document.createElement(\"span\");\n label.textContent = _escapeHtml(String(sorted[i].label || \"\"));\n item.appendChild(date);\n item.appendChild(label);\n el.appendChild(item);\n }\n }\n }\n\n return el;\n }\n\n`;\n"],"mappings":";AAAA,MAAa,cAAc"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/web-page/renderers/canvas.ts
|
|
3
|
+
const CANVAS_JS = `
|
|
4
|
+
// ── Canvas Subsystem (HTML5 Canvas drawing) ──
|
|
5
|
+
function renderAupCanvas(node) {
|
|
6
|
+
var el = document.createElement("div");
|
|
7
|
+
el.className = "aup-canvas";
|
|
8
|
+
var p = node.props || {};
|
|
9
|
+
var width = parseInt(p.width) || 800;
|
|
10
|
+
var height = parseInt(p.height) || 400;
|
|
11
|
+
var bgColor = p.background || "#ffffff";
|
|
12
|
+
|
|
13
|
+
// Toolbar
|
|
14
|
+
var toolbar = document.createElement("div");
|
|
15
|
+
toolbar.className = "aup-canvas-toolbar";
|
|
16
|
+
|
|
17
|
+
var tools = [
|
|
18
|
+
{ id: "pen", label: "Pen" },
|
|
19
|
+
{ id: "line", label: "Line" },
|
|
20
|
+
{ id: "rect", label: "Rect" },
|
|
21
|
+
{ id: "circle", label: "Circle" },
|
|
22
|
+
{ id: "eraser", label: "Eraser" },
|
|
23
|
+
];
|
|
24
|
+
var activeTool = "pen";
|
|
25
|
+
var toolBtns = {};
|
|
26
|
+
|
|
27
|
+
for (var t = 0; t < tools.length; t++) {
|
|
28
|
+
(function(tool) {
|
|
29
|
+
var btn = document.createElement("button");
|
|
30
|
+
btn.textContent = tool.label;
|
|
31
|
+
if (tool.id === activeTool) btn.classList.add("active");
|
|
32
|
+
btn.onclick = function() {
|
|
33
|
+
activeTool = tool.id;
|
|
34
|
+
for (var k in toolBtns) toolBtns[k].classList.remove("active");
|
|
35
|
+
btn.classList.add("active");
|
|
36
|
+
};
|
|
37
|
+
toolbar.appendChild(btn);
|
|
38
|
+
toolBtns[tool.id] = btn;
|
|
39
|
+
})(tools[t]);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Separator
|
|
43
|
+
var sep = document.createElement("div");
|
|
44
|
+
sep.className = "separator";
|
|
45
|
+
toolbar.appendChild(sep);
|
|
46
|
+
|
|
47
|
+
// Color picker
|
|
48
|
+
var colorInput = document.createElement("input");
|
|
49
|
+
colorInput.type = "color";
|
|
50
|
+
colorInput.value = p.strokeColor || "#000000";
|
|
51
|
+
toolbar.appendChild(colorInput);
|
|
52
|
+
|
|
53
|
+
// Line width
|
|
54
|
+
var sizeInput = document.createElement("input");
|
|
55
|
+
sizeInput.type = "range";
|
|
56
|
+
sizeInput.min = "1";
|
|
57
|
+
sizeInput.max = "20";
|
|
58
|
+
sizeInput.value = String(p.strokeWidth || 2);
|
|
59
|
+
toolbar.appendChild(sizeInput);
|
|
60
|
+
|
|
61
|
+
// Clear button
|
|
62
|
+
var sep2 = document.createElement("div");
|
|
63
|
+
sep2.className = "separator";
|
|
64
|
+
toolbar.appendChild(sep2);
|
|
65
|
+
var clearBtn = document.createElement("button");
|
|
66
|
+
clearBtn.textContent = "Clear";
|
|
67
|
+
clearBtn.onclick = function() {
|
|
68
|
+
ctx.fillStyle = bgColor;
|
|
69
|
+
ctx.fillRect(0, 0, width, height);
|
|
70
|
+
strokes = [];
|
|
71
|
+
};
|
|
72
|
+
toolbar.appendChild(clearBtn);
|
|
73
|
+
|
|
74
|
+
el.appendChild(toolbar);
|
|
75
|
+
|
|
76
|
+
// Canvas area
|
|
77
|
+
var area = document.createElement("div");
|
|
78
|
+
area.className = "aup-canvas-area";
|
|
79
|
+
var canvas = document.createElement("canvas");
|
|
80
|
+
canvas.width = width;
|
|
81
|
+
canvas.height = height;
|
|
82
|
+
canvas.style.width = "100%";
|
|
83
|
+
canvas.style.height = "auto";
|
|
84
|
+
area.appendChild(canvas);
|
|
85
|
+
el.appendChild(area);
|
|
86
|
+
|
|
87
|
+
var ctx = canvas.getContext("2d");
|
|
88
|
+
ctx.fillStyle = bgColor;
|
|
89
|
+
ctx.fillRect(0, 0, width, height);
|
|
90
|
+
|
|
91
|
+
var drawing = false;
|
|
92
|
+
var startX = 0, startY = 0;
|
|
93
|
+
var strokes = [];
|
|
94
|
+
var snapshot = null;
|
|
95
|
+
|
|
96
|
+
function getPos(e) {
|
|
97
|
+
var rect = canvas.getBoundingClientRect();
|
|
98
|
+
var scaleX = canvas.width / rect.width;
|
|
99
|
+
var scaleY = canvas.height / rect.height;
|
|
100
|
+
return { x: (e.clientX - rect.left) * scaleX, y: (e.clientY - rect.top) * scaleY };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
canvas.addEventListener("mousedown", function(e) {
|
|
104
|
+
drawing = true;
|
|
105
|
+
var pos = getPos(e);
|
|
106
|
+
startX = pos.x;
|
|
107
|
+
startY = pos.y;
|
|
108
|
+
if (activeTool === "pen" || activeTool === "eraser") {
|
|
109
|
+
ctx.beginPath();
|
|
110
|
+
ctx.moveTo(pos.x, pos.y);
|
|
111
|
+
} else {
|
|
112
|
+
snapshot = ctx.getImageData(0, 0, width, height);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
canvas.addEventListener("mousemove", function(e) {
|
|
117
|
+
if (!drawing) return;
|
|
118
|
+
var pos = getPos(e);
|
|
119
|
+
var lw = parseInt(sizeInput.value) || 2;
|
|
120
|
+
if (activeTool === "pen") {
|
|
121
|
+
ctx.strokeStyle = colorInput.value;
|
|
122
|
+
ctx.lineWidth = lw;
|
|
123
|
+
ctx.lineCap = "round";
|
|
124
|
+
ctx.lineJoin = "round";
|
|
125
|
+
ctx.lineTo(pos.x, pos.y);
|
|
126
|
+
ctx.stroke();
|
|
127
|
+
} else if (activeTool === "eraser") {
|
|
128
|
+
ctx.strokeStyle = bgColor;
|
|
129
|
+
ctx.lineWidth = lw * 4;
|
|
130
|
+
ctx.lineCap = "round";
|
|
131
|
+
ctx.lineTo(pos.x, pos.y);
|
|
132
|
+
ctx.stroke();
|
|
133
|
+
} else if (snapshot) {
|
|
134
|
+
ctx.putImageData(snapshot, 0, 0);
|
|
135
|
+
ctx.strokeStyle = colorInput.value;
|
|
136
|
+
ctx.lineWidth = lw;
|
|
137
|
+
ctx.lineCap = "round";
|
|
138
|
+
if (activeTool === "line") {
|
|
139
|
+
ctx.beginPath();
|
|
140
|
+
ctx.moveTo(startX, startY);
|
|
141
|
+
ctx.lineTo(pos.x, pos.y);
|
|
142
|
+
ctx.stroke();
|
|
143
|
+
} else if (activeTool === "rect") {
|
|
144
|
+
ctx.strokeRect(startX, startY, pos.x - startX, pos.y - startY);
|
|
145
|
+
} else if (activeTool === "circle") {
|
|
146
|
+
var rx = Math.abs(pos.x - startX) / 2;
|
|
147
|
+
var ry = Math.abs(pos.y - startY) / 2;
|
|
148
|
+
var cx = startX + (pos.x - startX) / 2;
|
|
149
|
+
var cy = startY + (pos.y - startY) / 2;
|
|
150
|
+
ctx.beginPath();
|
|
151
|
+
ctx.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2);
|
|
152
|
+
ctx.stroke();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
canvas.addEventListener("mouseup", function() {
|
|
158
|
+
drawing = false;
|
|
159
|
+
snapshot = null;
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
canvas.addEventListener("mouseleave", function() {
|
|
163
|
+
drawing = false;
|
|
164
|
+
snapshot = null;
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
return el;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
`;
|
|
171
|
+
|
|
172
|
+
//#endregion
|
|
173
|
+
exports.CANVAS_JS = CANVAS_JS;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
//#region src/web-page/renderers/canvas.ts
|
|
2
|
+
const CANVAS_JS = `
|
|
3
|
+
// ── Canvas Subsystem (HTML5 Canvas drawing) ──
|
|
4
|
+
function renderAupCanvas(node) {
|
|
5
|
+
var el = document.createElement("div");
|
|
6
|
+
el.className = "aup-canvas";
|
|
7
|
+
var p = node.props || {};
|
|
8
|
+
var width = parseInt(p.width) || 800;
|
|
9
|
+
var height = parseInt(p.height) || 400;
|
|
10
|
+
var bgColor = p.background || "#ffffff";
|
|
11
|
+
|
|
12
|
+
// Toolbar
|
|
13
|
+
var toolbar = document.createElement("div");
|
|
14
|
+
toolbar.className = "aup-canvas-toolbar";
|
|
15
|
+
|
|
16
|
+
var tools = [
|
|
17
|
+
{ id: "pen", label: "Pen" },
|
|
18
|
+
{ id: "line", label: "Line" },
|
|
19
|
+
{ id: "rect", label: "Rect" },
|
|
20
|
+
{ id: "circle", label: "Circle" },
|
|
21
|
+
{ id: "eraser", label: "Eraser" },
|
|
22
|
+
];
|
|
23
|
+
var activeTool = "pen";
|
|
24
|
+
var toolBtns = {};
|
|
25
|
+
|
|
26
|
+
for (var t = 0; t < tools.length; t++) {
|
|
27
|
+
(function(tool) {
|
|
28
|
+
var btn = document.createElement("button");
|
|
29
|
+
btn.textContent = tool.label;
|
|
30
|
+
if (tool.id === activeTool) btn.classList.add("active");
|
|
31
|
+
btn.onclick = function() {
|
|
32
|
+
activeTool = tool.id;
|
|
33
|
+
for (var k in toolBtns) toolBtns[k].classList.remove("active");
|
|
34
|
+
btn.classList.add("active");
|
|
35
|
+
};
|
|
36
|
+
toolbar.appendChild(btn);
|
|
37
|
+
toolBtns[tool.id] = btn;
|
|
38
|
+
})(tools[t]);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Separator
|
|
42
|
+
var sep = document.createElement("div");
|
|
43
|
+
sep.className = "separator";
|
|
44
|
+
toolbar.appendChild(sep);
|
|
45
|
+
|
|
46
|
+
// Color picker
|
|
47
|
+
var colorInput = document.createElement("input");
|
|
48
|
+
colorInput.type = "color";
|
|
49
|
+
colorInput.value = p.strokeColor || "#000000";
|
|
50
|
+
toolbar.appendChild(colorInput);
|
|
51
|
+
|
|
52
|
+
// Line width
|
|
53
|
+
var sizeInput = document.createElement("input");
|
|
54
|
+
sizeInput.type = "range";
|
|
55
|
+
sizeInput.min = "1";
|
|
56
|
+
sizeInput.max = "20";
|
|
57
|
+
sizeInput.value = String(p.strokeWidth || 2);
|
|
58
|
+
toolbar.appendChild(sizeInput);
|
|
59
|
+
|
|
60
|
+
// Clear button
|
|
61
|
+
var sep2 = document.createElement("div");
|
|
62
|
+
sep2.className = "separator";
|
|
63
|
+
toolbar.appendChild(sep2);
|
|
64
|
+
var clearBtn = document.createElement("button");
|
|
65
|
+
clearBtn.textContent = "Clear";
|
|
66
|
+
clearBtn.onclick = function() {
|
|
67
|
+
ctx.fillStyle = bgColor;
|
|
68
|
+
ctx.fillRect(0, 0, width, height);
|
|
69
|
+
strokes = [];
|
|
70
|
+
};
|
|
71
|
+
toolbar.appendChild(clearBtn);
|
|
72
|
+
|
|
73
|
+
el.appendChild(toolbar);
|
|
74
|
+
|
|
75
|
+
// Canvas area
|
|
76
|
+
var area = document.createElement("div");
|
|
77
|
+
area.className = "aup-canvas-area";
|
|
78
|
+
var canvas = document.createElement("canvas");
|
|
79
|
+
canvas.width = width;
|
|
80
|
+
canvas.height = height;
|
|
81
|
+
canvas.style.width = "100%";
|
|
82
|
+
canvas.style.height = "auto";
|
|
83
|
+
area.appendChild(canvas);
|
|
84
|
+
el.appendChild(area);
|
|
85
|
+
|
|
86
|
+
var ctx = canvas.getContext("2d");
|
|
87
|
+
ctx.fillStyle = bgColor;
|
|
88
|
+
ctx.fillRect(0, 0, width, height);
|
|
89
|
+
|
|
90
|
+
var drawing = false;
|
|
91
|
+
var startX = 0, startY = 0;
|
|
92
|
+
var strokes = [];
|
|
93
|
+
var snapshot = null;
|
|
94
|
+
|
|
95
|
+
function getPos(e) {
|
|
96
|
+
var rect = canvas.getBoundingClientRect();
|
|
97
|
+
var scaleX = canvas.width / rect.width;
|
|
98
|
+
var scaleY = canvas.height / rect.height;
|
|
99
|
+
return { x: (e.clientX - rect.left) * scaleX, y: (e.clientY - rect.top) * scaleY };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
canvas.addEventListener("mousedown", function(e) {
|
|
103
|
+
drawing = true;
|
|
104
|
+
var pos = getPos(e);
|
|
105
|
+
startX = pos.x;
|
|
106
|
+
startY = pos.y;
|
|
107
|
+
if (activeTool === "pen" || activeTool === "eraser") {
|
|
108
|
+
ctx.beginPath();
|
|
109
|
+
ctx.moveTo(pos.x, pos.y);
|
|
110
|
+
} else {
|
|
111
|
+
snapshot = ctx.getImageData(0, 0, width, height);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
canvas.addEventListener("mousemove", function(e) {
|
|
116
|
+
if (!drawing) return;
|
|
117
|
+
var pos = getPos(e);
|
|
118
|
+
var lw = parseInt(sizeInput.value) || 2;
|
|
119
|
+
if (activeTool === "pen") {
|
|
120
|
+
ctx.strokeStyle = colorInput.value;
|
|
121
|
+
ctx.lineWidth = lw;
|
|
122
|
+
ctx.lineCap = "round";
|
|
123
|
+
ctx.lineJoin = "round";
|
|
124
|
+
ctx.lineTo(pos.x, pos.y);
|
|
125
|
+
ctx.stroke();
|
|
126
|
+
} else if (activeTool === "eraser") {
|
|
127
|
+
ctx.strokeStyle = bgColor;
|
|
128
|
+
ctx.lineWidth = lw * 4;
|
|
129
|
+
ctx.lineCap = "round";
|
|
130
|
+
ctx.lineTo(pos.x, pos.y);
|
|
131
|
+
ctx.stroke();
|
|
132
|
+
} else if (snapshot) {
|
|
133
|
+
ctx.putImageData(snapshot, 0, 0);
|
|
134
|
+
ctx.strokeStyle = colorInput.value;
|
|
135
|
+
ctx.lineWidth = lw;
|
|
136
|
+
ctx.lineCap = "round";
|
|
137
|
+
if (activeTool === "line") {
|
|
138
|
+
ctx.beginPath();
|
|
139
|
+
ctx.moveTo(startX, startY);
|
|
140
|
+
ctx.lineTo(pos.x, pos.y);
|
|
141
|
+
ctx.stroke();
|
|
142
|
+
} else if (activeTool === "rect") {
|
|
143
|
+
ctx.strokeRect(startX, startY, pos.x - startX, pos.y - startY);
|
|
144
|
+
} else if (activeTool === "circle") {
|
|
145
|
+
var rx = Math.abs(pos.x - startX) / 2;
|
|
146
|
+
var ry = Math.abs(pos.y - startY) / 2;
|
|
147
|
+
var cx = startX + (pos.x - startX) / 2;
|
|
148
|
+
var cy = startY + (pos.y - startY) / 2;
|
|
149
|
+
ctx.beginPath();
|
|
150
|
+
ctx.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2);
|
|
151
|
+
ctx.stroke();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
canvas.addEventListener("mouseup", function() {
|
|
157
|
+
drawing = false;
|
|
158
|
+
snapshot = null;
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
canvas.addEventListener("mouseleave", function() {
|
|
162
|
+
drawing = false;
|
|
163
|
+
snapshot = null;
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
return el;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
`;
|
|
170
|
+
|
|
171
|
+
//#endregion
|
|
172
|
+
export { CANVAS_JS };
|
|
173
|
+
//# sourceMappingURL=canvas.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.mjs","names":[],"sources":["../../../src/web-page/renderers/canvas.ts"],"sourcesContent":["export const CANVAS_JS = `\n // ── Canvas Subsystem (HTML5 Canvas drawing) ──\n function renderAupCanvas(node) {\n var el = document.createElement(\"div\");\n el.className = \"aup-canvas\";\n var p = node.props || {};\n var width = parseInt(p.width) || 800;\n var height = parseInt(p.height) || 400;\n var bgColor = p.background || \"#ffffff\";\n\n // Toolbar\n var toolbar = document.createElement(\"div\");\n toolbar.className = \"aup-canvas-toolbar\";\n\n var tools = [\n { id: \"pen\", label: \"Pen\" },\n { id: \"line\", label: \"Line\" },\n { id: \"rect\", label: \"Rect\" },\n { id: \"circle\", label: \"Circle\" },\n { id: \"eraser\", label: \"Eraser\" },\n ];\n var activeTool = \"pen\";\n var toolBtns = {};\n\n for (var t = 0; t < tools.length; t++) {\n (function(tool) {\n var btn = document.createElement(\"button\");\n btn.textContent = tool.label;\n if (tool.id === activeTool) btn.classList.add(\"active\");\n btn.onclick = function() {\n activeTool = tool.id;\n for (var k in toolBtns) toolBtns[k].classList.remove(\"active\");\n btn.classList.add(\"active\");\n };\n toolbar.appendChild(btn);\n toolBtns[tool.id] = btn;\n })(tools[t]);\n }\n\n // Separator\n var sep = document.createElement(\"div\");\n sep.className = \"separator\";\n toolbar.appendChild(sep);\n\n // Color picker\n var colorInput = document.createElement(\"input\");\n colorInput.type = \"color\";\n colorInput.value = p.strokeColor || \"#000000\";\n toolbar.appendChild(colorInput);\n\n // Line width\n var sizeInput = document.createElement(\"input\");\n sizeInput.type = \"range\";\n sizeInput.min = \"1\";\n sizeInput.max = \"20\";\n sizeInput.value = String(p.strokeWidth || 2);\n toolbar.appendChild(sizeInput);\n\n // Clear button\n var sep2 = document.createElement(\"div\");\n sep2.className = \"separator\";\n toolbar.appendChild(sep2);\n var clearBtn = document.createElement(\"button\");\n clearBtn.textContent = \"Clear\";\n clearBtn.onclick = function() {\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, width, height);\n strokes = [];\n };\n toolbar.appendChild(clearBtn);\n\n el.appendChild(toolbar);\n\n // Canvas area\n var area = document.createElement(\"div\");\n area.className = \"aup-canvas-area\";\n var canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n canvas.style.width = \"100%\";\n canvas.style.height = \"auto\";\n area.appendChild(canvas);\n el.appendChild(area);\n\n var ctx = canvas.getContext(\"2d\");\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, width, height);\n\n var drawing = false;\n var startX = 0, startY = 0;\n var strokes = [];\n var snapshot = null;\n\n function getPos(e) {\n var rect = canvas.getBoundingClientRect();\n var scaleX = canvas.width / rect.width;\n var scaleY = canvas.height / rect.height;\n return { x: (e.clientX - rect.left) * scaleX, y: (e.clientY - rect.top) * scaleY };\n }\n\n canvas.addEventListener(\"mousedown\", function(e) {\n drawing = true;\n var pos = getPos(e);\n startX = pos.x;\n startY = pos.y;\n if (activeTool === \"pen\" || activeTool === \"eraser\") {\n ctx.beginPath();\n ctx.moveTo(pos.x, pos.y);\n } else {\n snapshot = ctx.getImageData(0, 0, width, height);\n }\n });\n\n canvas.addEventListener(\"mousemove\", function(e) {\n if (!drawing) return;\n var pos = getPos(e);\n var lw = parseInt(sizeInput.value) || 2;\n if (activeTool === \"pen\") {\n ctx.strokeStyle = colorInput.value;\n ctx.lineWidth = lw;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.lineTo(pos.x, pos.y);\n ctx.stroke();\n } else if (activeTool === \"eraser\") {\n ctx.strokeStyle = bgColor;\n ctx.lineWidth = lw * 4;\n ctx.lineCap = \"round\";\n ctx.lineTo(pos.x, pos.y);\n ctx.stroke();\n } else if (snapshot) {\n ctx.putImageData(snapshot, 0, 0);\n ctx.strokeStyle = colorInput.value;\n ctx.lineWidth = lw;\n ctx.lineCap = \"round\";\n if (activeTool === \"line\") {\n ctx.beginPath();\n ctx.moveTo(startX, startY);\n ctx.lineTo(pos.x, pos.y);\n ctx.stroke();\n } else if (activeTool === \"rect\") {\n ctx.strokeRect(startX, startY, pos.x - startX, pos.y - startY);\n } else if (activeTool === \"circle\") {\n var rx = Math.abs(pos.x - startX) / 2;\n var ry = Math.abs(pos.y - startY) / 2;\n var cx = startX + (pos.x - startX) / 2;\n var cy = startY + (pos.y - startY) / 2;\n ctx.beginPath();\n ctx.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2);\n ctx.stroke();\n }\n }\n });\n\n canvas.addEventListener(\"mouseup\", function() {\n drawing = false;\n snapshot = null;\n });\n\n canvas.addEventListener(\"mouseleave\", function() {\n drawing = false;\n snapshot = null;\n });\n\n return el;\n }\n\n`;\n"],"mappings":";AAAA,MAAa,YAAY"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/web-page/renderers/cdn-loader.ts
|
|
3
|
+
const CDN_LOADER_JS = `
|
|
4
|
+
// ── CDN Lazy-Load Utilities ──
|
|
5
|
+
var _loadedScripts = {};
|
|
6
|
+
function loadScript(url, cb) {
|
|
7
|
+
if (_loadedScripts[url]) { if (cb) cb(); return; }
|
|
8
|
+
var s = document.createElement("script");
|
|
9
|
+
s.src = url;
|
|
10
|
+
s.onload = function() { _loadedScripts[url] = true; if (cb) cb(); };
|
|
11
|
+
s.onerror = function() { console.error("Failed to load: " + url); };
|
|
12
|
+
document.head.appendChild(s);
|
|
13
|
+
}
|
|
14
|
+
function loadCSS(url) {
|
|
15
|
+
if (document.querySelector('link[href="' + url + '"]')) return;
|
|
16
|
+
var l = document.createElement("link");
|
|
17
|
+
l.rel = "stylesheet";
|
|
18
|
+
l.href = url;
|
|
19
|
+
document.head.appendChild(l);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
exports.CDN_LOADER_JS = CDN_LOADER_JS;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//#region src/web-page/renderers/cdn-loader.ts
|
|
2
|
+
const CDN_LOADER_JS = `
|
|
3
|
+
// ── CDN Lazy-Load Utilities ──
|
|
4
|
+
var _loadedScripts = {};
|
|
5
|
+
function loadScript(url, cb) {
|
|
6
|
+
if (_loadedScripts[url]) { if (cb) cb(); return; }
|
|
7
|
+
var s = document.createElement("script");
|
|
8
|
+
s.src = url;
|
|
9
|
+
s.onload = function() { _loadedScripts[url] = true; if (cb) cb(); };
|
|
10
|
+
s.onerror = function() { console.error("Failed to load: " + url); };
|
|
11
|
+
document.head.appendChild(s);
|
|
12
|
+
}
|
|
13
|
+
function loadCSS(url) {
|
|
14
|
+
if (document.querySelector('link[href="' + url + '"]')) return;
|
|
15
|
+
var l = document.createElement("link");
|
|
16
|
+
l.rel = "stylesheet";
|
|
17
|
+
l.href = url;
|
|
18
|
+
document.head.appendChild(l);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
export { CDN_LOADER_JS };
|
|
25
|
+
//# sourceMappingURL=cdn-loader.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdn-loader.mjs","names":[],"sources":["../../../src/web-page/renderers/cdn-loader.ts"],"sourcesContent":["export const CDN_LOADER_JS = `\n // ── CDN Lazy-Load Utilities ──\n var _loadedScripts = {};\n function loadScript(url, cb) {\n if (_loadedScripts[url]) { if (cb) cb(); return; }\n var s = document.createElement(\"script\");\n s.src = url;\n s.onload = function() { _loadedScripts[url] = true; if (cb) cb(); };\n s.onerror = function() { console.error(\"Failed to load: \" + url); };\n document.head.appendChild(s);\n }\n function loadCSS(url) {\n if (document.querySelector('link[href=\"' + url + '\"]')) return;\n var l = document.createElement(\"link\");\n l.rel = \"stylesheet\";\n l.href = url;\n document.head.appendChild(l);\n }\n\n`;\n"],"mappings":";AAAA,MAAa,gBAAgB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/web-page/renderers/chart.ts
|
|
3
|
+
const CHART_JS = `
|
|
4
|
+
// ── Chart Primitive (Chart.js v4) ──
|
|
5
|
+
function renderAupChart(node) {
|
|
6
|
+
var el = document.createElement("div");
|
|
7
|
+
el.className = "aup-chart";
|
|
8
|
+
var p = node.props || {};
|
|
9
|
+
var variant = p.variant || "line";
|
|
10
|
+
if (p.height) el.style.height = p.height;
|
|
11
|
+
var canvas = document.createElement("canvas");
|
|
12
|
+
el.appendChild(canvas);
|
|
13
|
+
|
|
14
|
+
var chartData = p.data || { labels: p.labels || [], datasets: p.datasets || [] };
|
|
15
|
+
var chartInstance = null;
|
|
16
|
+
|
|
17
|
+
function chartType() {
|
|
18
|
+
return variant === "area" ? "line" : variant === "histogram" ? "bar" : variant === "gauge" ? "doughnut" : variant;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function chartOptions() {
|
|
22
|
+
return {
|
|
23
|
+
responsive: true,
|
|
24
|
+
maintainAspectRatio: false,
|
|
25
|
+
fill: variant === "area",
|
|
26
|
+
animation: chartInstance ? { duration: 400 } : undefined,
|
|
27
|
+
plugins: { legend: { labels: { color: getComputedStyle(el).color } } },
|
|
28
|
+
scales: variant === "pie" || variant === "doughnut" || variant === "gauge" ? {} : {
|
|
29
|
+
x: { ticks: { color: getComputedStyle(el).color } },
|
|
30
|
+
y: { ticks: { color: getComputedStyle(el).color } }
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function initChart() {
|
|
36
|
+
if (typeof Chart === "undefined") {
|
|
37
|
+
var loading = document.createElement("div");
|
|
38
|
+
loading.className = "aup-chart-loading";
|
|
39
|
+
loading.textContent = "Loading chart...";
|
|
40
|
+
el.insertBefore(loading, canvas);
|
|
41
|
+
loadScript("https://cdn.jsdelivr.net/npm/chart.js@4/dist/chart.umd.min.js", function() {
|
|
42
|
+
if (loading.parentNode) loading.parentNode.removeChild(loading);
|
|
43
|
+
createChart(chartData);
|
|
44
|
+
});
|
|
45
|
+
} else {
|
|
46
|
+
createChart(chartData);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function createChart(data) {
|
|
51
|
+
try {
|
|
52
|
+
chartInstance = new Chart(canvas, {
|
|
53
|
+
type: chartType(),
|
|
54
|
+
data: data,
|
|
55
|
+
options: chartOptions()
|
|
56
|
+
});
|
|
57
|
+
} catch(e) { canvas.parentNode.textContent = "Chart error: " + e.message; }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function updateChart(data) {
|
|
61
|
+
if (!chartInstance) { createChart(data); return; }
|
|
62
|
+
chartInstance.data = data;
|
|
63
|
+
chartInstance.update();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// src binding: read data from AFS path, subscribe for live updates
|
|
67
|
+
if (node.src && window.afs) {
|
|
68
|
+
var loading = document.createElement("div");
|
|
69
|
+
loading.className = "aup-chart-loading";
|
|
70
|
+
loading.textContent = "Loading data...";
|
|
71
|
+
el.insertBefore(loading, canvas);
|
|
72
|
+
|
|
73
|
+
function applyAfsData(raw) {
|
|
74
|
+
var d = (typeof raw === "object" && raw !== null) ? raw : {};
|
|
75
|
+
// Support both { labels, datasets } and { content: { labels, datasets } }
|
|
76
|
+
if (d.content && typeof d.content === "object") d = d.content;
|
|
77
|
+
var resolved = { labels: d.labels || [], datasets: d.datasets || [] };
|
|
78
|
+
if (loading.parentNode) loading.parentNode.removeChild(loading);
|
|
79
|
+
updateChart(resolved);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Initial read
|
|
83
|
+
window.afs.read(node.src).then(applyAfsData).catch(function(e) {
|
|
84
|
+
loading.textContent = "Data error: " + e.message;
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Subscribe for live updates
|
|
88
|
+
window.afs.subscribe({ type: "afs:write", path: node.src }, function(event) {
|
|
89
|
+
if (event && event.data) applyAfsData(event.data);
|
|
90
|
+
});
|
|
91
|
+
} else {
|
|
92
|
+
setTimeout(initChart, 0);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return el;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
`;
|
|
99
|
+
|
|
100
|
+
//#endregion
|
|
101
|
+
exports.CHART_JS = CHART_JS;
|