@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,105 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/web-page/renderers/moonphase.ts
|
|
3
|
+
const MOONPHASE_JS = `
|
|
4
|
+
// ── Moon Phase Primitive (Pure JS, zero deps) ──
|
|
5
|
+
function renderAupMoonPhase(node) {
|
|
6
|
+
var el = document.createElement("div");
|
|
7
|
+
el.className = "aup-moonphase";
|
|
8
|
+
var p = node.props || {};
|
|
9
|
+
var mode = p.mode || "today"; // "today" | "month"
|
|
10
|
+
var targetDate = p.date ? new Date(p.date) : new Date();
|
|
11
|
+
|
|
12
|
+
// ── Moon phase calculation (inline, no library needed) ──
|
|
13
|
+
var SYNODIC = 29.53058770576;
|
|
14
|
+
var START_JDN = 2451550.1;
|
|
15
|
+
var BOUNDS = { WXC: 1, FQ: 6.382647, WXG: 8.382647, FM: 13.765294, WNG: 15.765294, LQ: 21.147941, WNC: 23.147941, NMU: 28.530588, NMUE: 29.530588 };
|
|
16
|
+
var PHASE_NAMES = ["New Moon","Waxing Crescent","First Quarter","Waxing Gibbous","Full Moon","Waning Gibbous","Last Quarter","Waning Crescent"];
|
|
17
|
+
var PHASE_EMOJI = ["\\u{1F311}","\\u{1F312}","\\u{1F313}","\\u{1F314}","\\u{1F315}","\\u{1F316}","\\u{1F317}","\\u{1F318}"];
|
|
18
|
+
|
|
19
|
+
function _toJDN(d) {
|
|
20
|
+
var day = d.getUTCDate(), mo = d.getUTCMonth() + 1, yr = d.getFullYear();
|
|
21
|
+
var a = Math.trunc((14 - mo) / 12), y = yr + 4800 - a, m = mo + 12 * a - 3;
|
|
22
|
+
return day + Math.trunc((153 * m + 2) / 5) + 365 * y + Math.trunc(y / 4) - Math.trunc(y / 100) + Math.trunc(y / 400) - 32045;
|
|
23
|
+
}
|
|
24
|
+
function _lunarDay(d) {
|
|
25
|
+
var raw = (_toJDN(d) - START_JDN) / SYNODIC;
|
|
26
|
+
var frac = raw - Math.floor(raw);
|
|
27
|
+
return (frac < 0 ? frac + 1 : frac) * SYNODIC;
|
|
28
|
+
}
|
|
29
|
+
function _phaseIndex(ld) {
|
|
30
|
+
if (ld < BOUNDS.WXC) return 0;
|
|
31
|
+
if (ld < BOUNDS.FQ) return 1;
|
|
32
|
+
if (ld < BOUNDS.WXG) return 2;
|
|
33
|
+
if (ld < BOUNDS.FM) return 3;
|
|
34
|
+
if (ld < BOUNDS.WNG) return 4;
|
|
35
|
+
if (ld < BOUNDS.LQ) return 5;
|
|
36
|
+
if (ld < BOUNDS.WNC) return 6;
|
|
37
|
+
if (ld < BOUNDS.NMU) return 7;
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
function _illumination(ld) { return (1 - Math.cos((ld / SYNODIC) * 2 * Math.PI)) / 2; }
|
|
41
|
+
|
|
42
|
+
var ld = _lunarDay(targetDate);
|
|
43
|
+
var pi = _phaseIndex(ld);
|
|
44
|
+
var illum = _illumination(ld);
|
|
45
|
+
|
|
46
|
+
// Visual moon emoji
|
|
47
|
+
var visual = document.createElement("div");
|
|
48
|
+
visual.className = "aup-moonphase-visual";
|
|
49
|
+
visual.textContent = PHASE_EMOJI[pi];
|
|
50
|
+
el.appendChild(visual);
|
|
51
|
+
|
|
52
|
+
// Phase name
|
|
53
|
+
var name = document.createElement("div");
|
|
54
|
+
name.className = "aup-moonphase-name";
|
|
55
|
+
name.textContent = PHASE_NAMES[pi];
|
|
56
|
+
el.appendChild(name);
|
|
57
|
+
|
|
58
|
+
// Details
|
|
59
|
+
var details = document.createElement("div");
|
|
60
|
+
details.className = "aup-moonphase-details";
|
|
61
|
+
details.innerHTML = "<span>Day " + ld.toFixed(1) + " / " + SYNODIC.toFixed(1) + "</span>"
|
|
62
|
+
+ "<span>Illumination: " + (illum * 100).toFixed(1) + "%</span>"
|
|
63
|
+
+ "<span>" + targetDate.toLocaleDateString(p.locale || undefined, { year: "numeric", month: "long", day: "numeric" }) + "</span>";
|
|
64
|
+
el.appendChild(details);
|
|
65
|
+
|
|
66
|
+
// Month view
|
|
67
|
+
if (mode === "month") {
|
|
68
|
+
var grid = document.createElement("div");
|
|
69
|
+
grid.className = "aup-moonphase-month";
|
|
70
|
+
var yr = targetDate.getFullYear(), mo = targetDate.getMonth();
|
|
71
|
+
var daysInMonth = new Date(yr, mo + 1, 0).getDate();
|
|
72
|
+
var todayStr = new Date().toISOString().slice(0, 10);
|
|
73
|
+
for (var day = 1; day <= daysInMonth; day++) {
|
|
74
|
+
var d = new Date(yr, mo, day);
|
|
75
|
+
var dld = _lunarDay(d);
|
|
76
|
+
var dpi = _phaseIndex(dld);
|
|
77
|
+
var cell = document.createElement("div");
|
|
78
|
+
cell.className = "aup-moonphase-month-day";
|
|
79
|
+
if (d.toISOString().slice(0, 10) === todayStr) cell.classList.add("today");
|
|
80
|
+
cell.innerHTML = "<span class='moon-emoji'>" + PHASE_EMOJI[dpi] + "</span><span>" + day + "</span>";
|
|
81
|
+
grid.appendChild(cell);
|
|
82
|
+
}
|
|
83
|
+
el.appendChild(grid);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src binding
|
|
87
|
+
if (p.src && window.afs) {
|
|
88
|
+
window.afs.read(p.src).then(function(result) {
|
|
89
|
+
if (result && result.content) {
|
|
90
|
+
var newDate = new Date(result.content.date || result.content);
|
|
91
|
+
var nld = _lunarDay(newDate);
|
|
92
|
+
var npi = _phaseIndex(nld);
|
|
93
|
+
visual.textContent = PHASE_EMOJI[npi];
|
|
94
|
+
name.textContent = PHASE_NAMES[npi];
|
|
95
|
+
}
|
|
96
|
+
}).catch(function() {});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return el;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
`;
|
|
103
|
+
|
|
104
|
+
//#endregion
|
|
105
|
+
exports.MOONPHASE_JS = MOONPHASE_JS;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
//#region src/web-page/renderers/moonphase.ts
|
|
2
|
+
const MOONPHASE_JS = `
|
|
3
|
+
// ── Moon Phase Primitive (Pure JS, zero deps) ──
|
|
4
|
+
function renderAupMoonPhase(node) {
|
|
5
|
+
var el = document.createElement("div");
|
|
6
|
+
el.className = "aup-moonphase";
|
|
7
|
+
var p = node.props || {};
|
|
8
|
+
var mode = p.mode || "today"; // "today" | "month"
|
|
9
|
+
var targetDate = p.date ? new Date(p.date) : new Date();
|
|
10
|
+
|
|
11
|
+
// ── Moon phase calculation (inline, no library needed) ──
|
|
12
|
+
var SYNODIC = 29.53058770576;
|
|
13
|
+
var START_JDN = 2451550.1;
|
|
14
|
+
var BOUNDS = { WXC: 1, FQ: 6.382647, WXG: 8.382647, FM: 13.765294, WNG: 15.765294, LQ: 21.147941, WNC: 23.147941, NMU: 28.530588, NMUE: 29.530588 };
|
|
15
|
+
var PHASE_NAMES = ["New Moon","Waxing Crescent","First Quarter","Waxing Gibbous","Full Moon","Waning Gibbous","Last Quarter","Waning Crescent"];
|
|
16
|
+
var PHASE_EMOJI = ["\\u{1F311}","\\u{1F312}","\\u{1F313}","\\u{1F314}","\\u{1F315}","\\u{1F316}","\\u{1F317}","\\u{1F318}"];
|
|
17
|
+
|
|
18
|
+
function _toJDN(d) {
|
|
19
|
+
var day = d.getUTCDate(), mo = d.getUTCMonth() + 1, yr = d.getFullYear();
|
|
20
|
+
var a = Math.trunc((14 - mo) / 12), y = yr + 4800 - a, m = mo + 12 * a - 3;
|
|
21
|
+
return day + Math.trunc((153 * m + 2) / 5) + 365 * y + Math.trunc(y / 4) - Math.trunc(y / 100) + Math.trunc(y / 400) - 32045;
|
|
22
|
+
}
|
|
23
|
+
function _lunarDay(d) {
|
|
24
|
+
var raw = (_toJDN(d) - START_JDN) / SYNODIC;
|
|
25
|
+
var frac = raw - Math.floor(raw);
|
|
26
|
+
return (frac < 0 ? frac + 1 : frac) * SYNODIC;
|
|
27
|
+
}
|
|
28
|
+
function _phaseIndex(ld) {
|
|
29
|
+
if (ld < BOUNDS.WXC) return 0;
|
|
30
|
+
if (ld < BOUNDS.FQ) return 1;
|
|
31
|
+
if (ld < BOUNDS.WXG) return 2;
|
|
32
|
+
if (ld < BOUNDS.FM) return 3;
|
|
33
|
+
if (ld < BOUNDS.WNG) return 4;
|
|
34
|
+
if (ld < BOUNDS.LQ) return 5;
|
|
35
|
+
if (ld < BOUNDS.WNC) return 6;
|
|
36
|
+
if (ld < BOUNDS.NMU) return 7;
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
function _illumination(ld) { return (1 - Math.cos((ld / SYNODIC) * 2 * Math.PI)) / 2; }
|
|
40
|
+
|
|
41
|
+
var ld = _lunarDay(targetDate);
|
|
42
|
+
var pi = _phaseIndex(ld);
|
|
43
|
+
var illum = _illumination(ld);
|
|
44
|
+
|
|
45
|
+
// Visual moon emoji
|
|
46
|
+
var visual = document.createElement("div");
|
|
47
|
+
visual.className = "aup-moonphase-visual";
|
|
48
|
+
visual.textContent = PHASE_EMOJI[pi];
|
|
49
|
+
el.appendChild(visual);
|
|
50
|
+
|
|
51
|
+
// Phase name
|
|
52
|
+
var name = document.createElement("div");
|
|
53
|
+
name.className = "aup-moonphase-name";
|
|
54
|
+
name.textContent = PHASE_NAMES[pi];
|
|
55
|
+
el.appendChild(name);
|
|
56
|
+
|
|
57
|
+
// Details
|
|
58
|
+
var details = document.createElement("div");
|
|
59
|
+
details.className = "aup-moonphase-details";
|
|
60
|
+
details.innerHTML = "<span>Day " + ld.toFixed(1) + " / " + SYNODIC.toFixed(1) + "</span>"
|
|
61
|
+
+ "<span>Illumination: " + (illum * 100).toFixed(1) + "%</span>"
|
|
62
|
+
+ "<span>" + targetDate.toLocaleDateString(p.locale || undefined, { year: "numeric", month: "long", day: "numeric" }) + "</span>";
|
|
63
|
+
el.appendChild(details);
|
|
64
|
+
|
|
65
|
+
// Month view
|
|
66
|
+
if (mode === "month") {
|
|
67
|
+
var grid = document.createElement("div");
|
|
68
|
+
grid.className = "aup-moonphase-month";
|
|
69
|
+
var yr = targetDate.getFullYear(), mo = targetDate.getMonth();
|
|
70
|
+
var daysInMonth = new Date(yr, mo + 1, 0).getDate();
|
|
71
|
+
var todayStr = new Date().toISOString().slice(0, 10);
|
|
72
|
+
for (var day = 1; day <= daysInMonth; day++) {
|
|
73
|
+
var d = new Date(yr, mo, day);
|
|
74
|
+
var dld = _lunarDay(d);
|
|
75
|
+
var dpi = _phaseIndex(dld);
|
|
76
|
+
var cell = document.createElement("div");
|
|
77
|
+
cell.className = "aup-moonphase-month-day";
|
|
78
|
+
if (d.toISOString().slice(0, 10) === todayStr) cell.classList.add("today");
|
|
79
|
+
cell.innerHTML = "<span class='moon-emoji'>" + PHASE_EMOJI[dpi] + "</span><span>" + day + "</span>";
|
|
80
|
+
grid.appendChild(cell);
|
|
81
|
+
}
|
|
82
|
+
el.appendChild(grid);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src binding
|
|
86
|
+
if (p.src && window.afs) {
|
|
87
|
+
window.afs.read(p.src).then(function(result) {
|
|
88
|
+
if (result && result.content) {
|
|
89
|
+
var newDate = new Date(result.content.date || result.content);
|
|
90
|
+
var nld = _lunarDay(newDate);
|
|
91
|
+
var npi = _phaseIndex(nld);
|
|
92
|
+
visual.textContent = PHASE_EMOJI[npi];
|
|
93
|
+
name.textContent = PHASE_NAMES[npi];
|
|
94
|
+
}
|
|
95
|
+
}).catch(function() {});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return el;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
`;
|
|
102
|
+
|
|
103
|
+
//#endregion
|
|
104
|
+
export { MOONPHASE_JS };
|
|
105
|
+
//# sourceMappingURL=moonphase.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moonphase.mjs","names":[],"sources":["../../../src/web-page/renderers/moonphase.ts"],"sourcesContent":["export const MOONPHASE_JS = `\n // ── Moon Phase Primitive (Pure JS, zero deps) ──\n function renderAupMoonPhase(node) {\n var el = document.createElement(\"div\");\n el.className = \"aup-moonphase\";\n var p = node.props || {};\n var mode = p.mode || \"today\"; // \"today\" | \"month\"\n var targetDate = p.date ? new Date(p.date) : new Date();\n\n // ── Moon phase calculation (inline, no library needed) ──\n var SYNODIC = 29.53058770576;\n var START_JDN = 2451550.1;\n var BOUNDS = { WXC: 1, FQ: 6.382647, WXG: 8.382647, FM: 13.765294, WNG: 15.765294, LQ: 21.147941, WNC: 23.147941, NMU: 28.530588, NMUE: 29.530588 };\n var PHASE_NAMES = [\"New Moon\",\"Waxing Crescent\",\"First Quarter\",\"Waxing Gibbous\",\"Full Moon\",\"Waning Gibbous\",\"Last Quarter\",\"Waning Crescent\"];\n var PHASE_EMOJI = [\"\\\\u{1F311}\",\"\\\\u{1F312}\",\"\\\\u{1F313}\",\"\\\\u{1F314}\",\"\\\\u{1F315}\",\"\\\\u{1F316}\",\"\\\\u{1F317}\",\"\\\\u{1F318}\"];\n\n function _toJDN(d) {\n var day = d.getUTCDate(), mo = d.getUTCMonth() + 1, yr = d.getFullYear();\n var a = Math.trunc((14 - mo) / 12), y = yr + 4800 - a, m = mo + 12 * a - 3;\n return day + Math.trunc((153 * m + 2) / 5) + 365 * y + Math.trunc(y / 4) - Math.trunc(y / 100) + Math.trunc(y / 400) - 32045;\n }\n function _lunarDay(d) {\n var raw = (_toJDN(d) - START_JDN) / SYNODIC;\n var frac = raw - Math.floor(raw);\n return (frac < 0 ? frac + 1 : frac) * SYNODIC;\n }\n function _phaseIndex(ld) {\n if (ld < BOUNDS.WXC) return 0;\n if (ld < BOUNDS.FQ) return 1;\n if (ld < BOUNDS.WXG) return 2;\n if (ld < BOUNDS.FM) return 3;\n if (ld < BOUNDS.WNG) return 4;\n if (ld < BOUNDS.LQ) return 5;\n if (ld < BOUNDS.WNC) return 6;\n if (ld < BOUNDS.NMU) return 7;\n return 0;\n }\n function _illumination(ld) { return (1 - Math.cos((ld / SYNODIC) * 2 * Math.PI)) / 2; }\n\n var ld = _lunarDay(targetDate);\n var pi = _phaseIndex(ld);\n var illum = _illumination(ld);\n\n // Visual moon emoji\n var visual = document.createElement(\"div\");\n visual.className = \"aup-moonphase-visual\";\n visual.textContent = PHASE_EMOJI[pi];\n el.appendChild(visual);\n\n // Phase name\n var name = document.createElement(\"div\");\n name.className = \"aup-moonphase-name\";\n name.textContent = PHASE_NAMES[pi];\n el.appendChild(name);\n\n // Details\n var details = document.createElement(\"div\");\n details.className = \"aup-moonphase-details\";\n details.innerHTML = \"<span>Day \" + ld.toFixed(1) + \" / \" + SYNODIC.toFixed(1) + \"</span>\"\n + \"<span>Illumination: \" + (illum * 100).toFixed(1) + \"%</span>\"\n + \"<span>\" + targetDate.toLocaleDateString(p.locale || undefined, { year: \"numeric\", month: \"long\", day: \"numeric\" }) + \"</span>\";\n el.appendChild(details);\n\n // Month view\n if (mode === \"month\") {\n var grid = document.createElement(\"div\");\n grid.className = \"aup-moonphase-month\";\n var yr = targetDate.getFullYear(), mo = targetDate.getMonth();\n var daysInMonth = new Date(yr, mo + 1, 0).getDate();\n var todayStr = new Date().toISOString().slice(0, 10);\n for (var day = 1; day <= daysInMonth; day++) {\n var d = new Date(yr, mo, day);\n var dld = _lunarDay(d);\n var dpi = _phaseIndex(dld);\n var cell = document.createElement(\"div\");\n cell.className = \"aup-moonphase-month-day\";\n if (d.toISOString().slice(0, 10) === todayStr) cell.classList.add(\"today\");\n cell.innerHTML = \"<span class='moon-emoji'>\" + PHASE_EMOJI[dpi] + \"</span><span>\" + day + \"</span>\";\n grid.appendChild(cell);\n }\n el.appendChild(grid);\n }\n\n // src binding\n if (p.src && window.afs) {\n window.afs.read(p.src).then(function(result) {\n if (result && result.content) {\n var newDate = new Date(result.content.date || result.content);\n var nld = _lunarDay(newDate);\n var npi = _phaseIndex(nld);\n visual.textContent = PHASE_EMOJI[npi];\n name.textContent = PHASE_NAMES[npi];\n }\n }).catch(function() {});\n }\n\n return el;\n }\n\n`;\n"],"mappings":";AAAA,MAAa,eAAe"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/web-page/renderers/natal-chart.ts
|
|
3
|
+
const NATAL_CHART_JS = `
|
|
4
|
+
// ── Natal Chart Primitive (@astrodraw/astrochart v3) ──
|
|
5
|
+
var _astroChartLoaded = false;
|
|
6
|
+
|
|
7
|
+
function _setNatalStatus(el, message) {
|
|
8
|
+
el.innerHTML = "";
|
|
9
|
+
var status = document.createElement("div");
|
|
10
|
+
status.className = "aup-natal-chart-loading";
|
|
11
|
+
status.textContent = message;
|
|
12
|
+
el.appendChild(status);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function _appendCell(row, value, strong) {
|
|
16
|
+
var td = document.createElement("td");
|
|
17
|
+
if (strong) {
|
|
18
|
+
var bold = document.createElement("strong");
|
|
19
|
+
bold.textContent = value;
|
|
20
|
+
td.appendChild(bold);
|
|
21
|
+
} else {
|
|
22
|
+
td.textContent = value;
|
|
23
|
+
}
|
|
24
|
+
row.appendChild(td);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function _appendHead(table, headers) {
|
|
28
|
+
var thead = document.createElement("thead");
|
|
29
|
+
var tr = document.createElement("tr");
|
|
30
|
+
for (var i = 0; i < headers.length; i++) {
|
|
31
|
+
var th = document.createElement("th");
|
|
32
|
+
th.textContent = headers[i];
|
|
33
|
+
tr.appendChild(th);
|
|
34
|
+
}
|
|
35
|
+
thead.appendChild(tr);
|
|
36
|
+
table.appendChild(thead);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function renderAupNatalChart(node) {
|
|
40
|
+
var el = document.createElement("div");
|
|
41
|
+
el.className = "aup-natal-chart";
|
|
42
|
+
var p = node.props || {};
|
|
43
|
+
var variant = p.variant || "radix"; // "radix" | "transit" | "aspects-table" | "planets-table"
|
|
44
|
+
var height = p.height || "500px";
|
|
45
|
+
var width = parseInt(p.width) || 500;
|
|
46
|
+
var chartSize = parseInt(p.size) || Math.min(width, 500);
|
|
47
|
+
|
|
48
|
+
// Data format: { planets: {"Sun":[degrees], "Moon":[degrees], ...}, cusps: [12 house cusps] }
|
|
49
|
+
var data = p.data || null;
|
|
50
|
+
|
|
51
|
+
// ── Aspects / Planets table mode (no chart rendering, calculation only) ──
|
|
52
|
+
if (variant === "aspects-table" || variant === "planets-table") {
|
|
53
|
+
if (!data || !data.planets) {
|
|
54
|
+
_setNatalStatus(el, "No chart data provided");
|
|
55
|
+
return el;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (variant === "planets-table") {
|
|
59
|
+
var planetsDiv = document.createElement("div");
|
|
60
|
+
planetsDiv.className = "aup-natal-planets";
|
|
61
|
+
var tbl = document.createElement("table");
|
|
62
|
+
_appendHead(tbl, ["Planet", "Longitude", "Sign", "Degree in Sign"]);
|
|
63
|
+
var tbody = document.createElement("tbody");
|
|
64
|
+
var SIGNS = ["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"];
|
|
65
|
+
for (var planet in data.planets) {
|
|
66
|
+
if (data.planets.hasOwnProperty(planet)) {
|
|
67
|
+
var deg = Number(data.planets[planet] && data.planets[planet][0]);
|
|
68
|
+
if (!isFinite(deg)) continue;
|
|
69
|
+
var signIdx = Math.floor(deg / 30) % 12;
|
|
70
|
+
if (signIdx < 0) signIdx += 12;
|
|
71
|
+
var degInSign = ((deg % 30) + 30) % 30;
|
|
72
|
+
var row = document.createElement("tr");
|
|
73
|
+
_appendCell(row, String(planet), true);
|
|
74
|
+
_appendCell(row, deg.toFixed(2) + "\\u00B0");
|
|
75
|
+
_appendCell(row, SIGNS[signIdx]);
|
|
76
|
+
_appendCell(row, degInSign.toFixed(2) + "\\u00B0");
|
|
77
|
+
tbody.appendChild(row);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
tbl.appendChild(tbody);
|
|
81
|
+
planetsDiv.appendChild(tbl);
|
|
82
|
+
el.appendChild(planetsDiv);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (variant === "aspects-table") {
|
|
86
|
+
// Inline aspect calculation (no library needed — port of AspectCalculator core logic)
|
|
87
|
+
var ASPECTS_DEF = { conjunction: { degree: 0, orbit: 10 }, square: { degree: 90, orbit: 8 }, trine: { degree: 120, orbit: 8 }, opposition: { degree: 180, orbit: 10 }, sextile: { degree: 60, orbit: 6 } };
|
|
88
|
+
var aspectsList = [];
|
|
89
|
+
var planetNames = Object.keys(data.planets);
|
|
90
|
+
for (var i = 0; i < planetNames.length; i++) {
|
|
91
|
+
for (var j = i + 1; j < planetNames.length; j++) {
|
|
92
|
+
var pA = planetNames[i], pB = planetNames[j];
|
|
93
|
+
var degA = Number(data.planets[pA] && data.planets[pA][0]);
|
|
94
|
+
var degB = Number(data.planets[pB] && data.planets[pB][0]);
|
|
95
|
+
if (!isFinite(degA) || !isFinite(degB)) continue;
|
|
96
|
+
var gap = Math.abs(degA - degB);
|
|
97
|
+
if (gap > 180) gap = 360 - gap;
|
|
98
|
+
for (var aspName in ASPECTS_DEF) {
|
|
99
|
+
var asp = ASPECTS_DEF[aspName];
|
|
100
|
+
var orbitMin = asp.degree - asp.orbit / 2, orbitMax = asp.degree + asp.orbit / 2;
|
|
101
|
+
if (gap >= orbitMin && gap <= orbitMax) {
|
|
102
|
+
var precisionNum = Math.abs(gap - asp.degree);
|
|
103
|
+
aspectsList.push({
|
|
104
|
+
from: pA,
|
|
105
|
+
to: pB,
|
|
106
|
+
aspect: aspName,
|
|
107
|
+
precision: precisionNum.toFixed(2),
|
|
108
|
+
precisionNum: precisionNum,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
aspectsList.sort(function(a, b) { return a.precisionNum - b.precisionNum; });
|
|
115
|
+
|
|
116
|
+
var aspDiv = document.createElement("div");
|
|
117
|
+
aspDiv.className = "aup-natal-aspects";
|
|
118
|
+
var aspTbl = document.createElement("table");
|
|
119
|
+
_appendHead(aspTbl, ["Planet", "Aspect", "Planet", "Orb"]);
|
|
120
|
+
var aspBody = document.createElement("tbody");
|
|
121
|
+
for (var k = 0; k < aspectsList.length; k++) {
|
|
122
|
+
var a = aspectsList[k];
|
|
123
|
+
var aspRow = document.createElement("tr");
|
|
124
|
+
_appendCell(aspRow, String(a.from));
|
|
125
|
+
_appendCell(aspRow, String(a.aspect), true);
|
|
126
|
+
_appendCell(aspRow, String(a.to));
|
|
127
|
+
_appendCell(aspRow, String(a.precision) + "\\u00B0");
|
|
128
|
+
aspBody.appendChild(aspRow);
|
|
129
|
+
}
|
|
130
|
+
aspTbl.appendChild(aspBody);
|
|
131
|
+
aspDiv.appendChild(aspTbl);
|
|
132
|
+
el.appendChild(aspDiv);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return el;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ── SVG Chart mode — lazy-load @astrodraw/astrochart from CDN ──
|
|
139
|
+
el.style.minHeight = height;
|
|
140
|
+
_setNatalStatus(el, "Loading natal chart...");
|
|
141
|
+
|
|
142
|
+
if (!data || !data.planets || !data.cusps) {
|
|
143
|
+
_setNatalStatus(
|
|
144
|
+
el,
|
|
145
|
+
"No chart data provided. Expected: { planets: {Sun: [deg], ...}, cusps: [12 values] }",
|
|
146
|
+
);
|
|
147
|
+
return el;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
var CDN_URL = "https://cdn.jsdelivr.net/npm/@astrodraw/astrochart@3.0.2/dist/astrochart.js";
|
|
151
|
+
|
|
152
|
+
function _initChart() {
|
|
153
|
+
el.innerHTML = "";
|
|
154
|
+
var chartContainerId = "aup-natal-" + (node.id || Math.random().toString(36).slice(2));
|
|
155
|
+
var container = document.createElement("div");
|
|
156
|
+
container.id = chartContainerId;
|
|
157
|
+
container.style.cssText = "display: flex; justify-content: center;";
|
|
158
|
+
el.appendChild(container);
|
|
159
|
+
|
|
160
|
+
// Detect dark mode
|
|
161
|
+
var bgHex = getComputedStyle(document.documentElement).getPropertyValue("--bg").trim();
|
|
162
|
+
var isDark = false;
|
|
163
|
+
if (bgHex && bgHex.charAt(0) === "#") {
|
|
164
|
+
var r = parseInt(bgHex.slice(1, 3), 16) || 0;
|
|
165
|
+
var g = parseInt(bgHex.slice(3, 5), 16) || 0;
|
|
166
|
+
var b = parseInt(bgHex.slice(5, 7), 16) || 0;
|
|
167
|
+
isDark = (r + g + b) / 3 < 128;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
var chartSettings = {
|
|
171
|
+
COLOR_BACKGROUND: "transparent",
|
|
172
|
+
POINTS_COLOR: isDark ? "#e2e8f0" : "#1e293b",
|
|
173
|
+
SIGNS_COLOR: isDark ? "#cbd5e1" : "#334155",
|
|
174
|
+
CIRCLE_COLOR: isDark ? "#475569" : "#94a3b8",
|
|
175
|
+
LINE_COLOR: isDark ? "#475569" : "#94a3b8",
|
|
176
|
+
CUSPS_FONT_COLOR: isDark ? "#94a3b8" : "#64748b",
|
|
177
|
+
SYMBOL_AXIS_FONT_COLOR: isDark ? "#e2e8f0" : "#1e293b",
|
|
178
|
+
};
|
|
179
|
+
if (p.settings) {
|
|
180
|
+
for (var sk in p.settings) {
|
|
181
|
+
if (p.settings.hasOwnProperty(sk)) chartSettings[sk] = p.settings[sk];
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
try {
|
|
186
|
+
var astroLib = window.astrochart;
|
|
187
|
+
if (!astroLib || !astroLib.Chart) {
|
|
188
|
+
_setNatalStatus(el, "AstroChart library not loaded");
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
var chart = new astroLib.Chart(chartContainerId, chartSize, chartSize, chartSettings);
|
|
192
|
+
var radix = chart.radix(data);
|
|
193
|
+
radix.aspects();
|
|
194
|
+
|
|
195
|
+
// Transit overlay
|
|
196
|
+
if (variant === "transit" && p.transitData) {
|
|
197
|
+
var transit = radix.transit(p.transitData);
|
|
198
|
+
transit.aspects();
|
|
199
|
+
}
|
|
200
|
+
} catch (err) {
|
|
201
|
+
var errMsg = err && err.message ? err.message : String(err);
|
|
202
|
+
_setNatalStatus(el, "Chart error: " + errMsg);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (_astroChartLoaded || window.astrochart) {
|
|
207
|
+
_astroChartLoaded = true;
|
|
208
|
+
_initChart();
|
|
209
|
+
} else {
|
|
210
|
+
loadScript(CDN_URL, function() {
|
|
211
|
+
_astroChartLoaded = true;
|
|
212
|
+
_initChart();
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return el;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
`;
|
|
220
|
+
|
|
221
|
+
//#endregion
|
|
222
|
+
exports.NATAL_CHART_JS = NATAL_CHART_JS;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
//#region src/web-page/renderers/natal-chart.ts
|
|
2
|
+
const NATAL_CHART_JS = `
|
|
3
|
+
// ── Natal Chart Primitive (@astrodraw/astrochart v3) ──
|
|
4
|
+
var _astroChartLoaded = false;
|
|
5
|
+
|
|
6
|
+
function _setNatalStatus(el, message) {
|
|
7
|
+
el.innerHTML = "";
|
|
8
|
+
var status = document.createElement("div");
|
|
9
|
+
status.className = "aup-natal-chart-loading";
|
|
10
|
+
status.textContent = message;
|
|
11
|
+
el.appendChild(status);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function _appendCell(row, value, strong) {
|
|
15
|
+
var td = document.createElement("td");
|
|
16
|
+
if (strong) {
|
|
17
|
+
var bold = document.createElement("strong");
|
|
18
|
+
bold.textContent = value;
|
|
19
|
+
td.appendChild(bold);
|
|
20
|
+
} else {
|
|
21
|
+
td.textContent = value;
|
|
22
|
+
}
|
|
23
|
+
row.appendChild(td);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function _appendHead(table, headers) {
|
|
27
|
+
var thead = document.createElement("thead");
|
|
28
|
+
var tr = document.createElement("tr");
|
|
29
|
+
for (var i = 0; i < headers.length; i++) {
|
|
30
|
+
var th = document.createElement("th");
|
|
31
|
+
th.textContent = headers[i];
|
|
32
|
+
tr.appendChild(th);
|
|
33
|
+
}
|
|
34
|
+
thead.appendChild(tr);
|
|
35
|
+
table.appendChild(thead);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function renderAupNatalChart(node) {
|
|
39
|
+
var el = document.createElement("div");
|
|
40
|
+
el.className = "aup-natal-chart";
|
|
41
|
+
var p = node.props || {};
|
|
42
|
+
var variant = p.variant || "radix"; // "radix" | "transit" | "aspects-table" | "planets-table"
|
|
43
|
+
var height = p.height || "500px";
|
|
44
|
+
var width = parseInt(p.width) || 500;
|
|
45
|
+
var chartSize = parseInt(p.size) || Math.min(width, 500);
|
|
46
|
+
|
|
47
|
+
// Data format: { planets: {"Sun":[degrees], "Moon":[degrees], ...}, cusps: [12 house cusps] }
|
|
48
|
+
var data = p.data || null;
|
|
49
|
+
|
|
50
|
+
// ── Aspects / Planets table mode (no chart rendering, calculation only) ──
|
|
51
|
+
if (variant === "aspects-table" || variant === "planets-table") {
|
|
52
|
+
if (!data || !data.planets) {
|
|
53
|
+
_setNatalStatus(el, "No chart data provided");
|
|
54
|
+
return el;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (variant === "planets-table") {
|
|
58
|
+
var planetsDiv = document.createElement("div");
|
|
59
|
+
planetsDiv.className = "aup-natal-planets";
|
|
60
|
+
var tbl = document.createElement("table");
|
|
61
|
+
_appendHead(tbl, ["Planet", "Longitude", "Sign", "Degree in Sign"]);
|
|
62
|
+
var tbody = document.createElement("tbody");
|
|
63
|
+
var SIGNS = ["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"];
|
|
64
|
+
for (var planet in data.planets) {
|
|
65
|
+
if (data.planets.hasOwnProperty(planet)) {
|
|
66
|
+
var deg = Number(data.planets[planet] && data.planets[planet][0]);
|
|
67
|
+
if (!isFinite(deg)) continue;
|
|
68
|
+
var signIdx = Math.floor(deg / 30) % 12;
|
|
69
|
+
if (signIdx < 0) signIdx += 12;
|
|
70
|
+
var degInSign = ((deg % 30) + 30) % 30;
|
|
71
|
+
var row = document.createElement("tr");
|
|
72
|
+
_appendCell(row, String(planet), true);
|
|
73
|
+
_appendCell(row, deg.toFixed(2) + "\\u00B0");
|
|
74
|
+
_appendCell(row, SIGNS[signIdx]);
|
|
75
|
+
_appendCell(row, degInSign.toFixed(2) + "\\u00B0");
|
|
76
|
+
tbody.appendChild(row);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
tbl.appendChild(tbody);
|
|
80
|
+
planetsDiv.appendChild(tbl);
|
|
81
|
+
el.appendChild(planetsDiv);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (variant === "aspects-table") {
|
|
85
|
+
// Inline aspect calculation (no library needed — port of AspectCalculator core logic)
|
|
86
|
+
var ASPECTS_DEF = { conjunction: { degree: 0, orbit: 10 }, square: { degree: 90, orbit: 8 }, trine: { degree: 120, orbit: 8 }, opposition: { degree: 180, orbit: 10 }, sextile: { degree: 60, orbit: 6 } };
|
|
87
|
+
var aspectsList = [];
|
|
88
|
+
var planetNames = Object.keys(data.planets);
|
|
89
|
+
for (var i = 0; i < planetNames.length; i++) {
|
|
90
|
+
for (var j = i + 1; j < planetNames.length; j++) {
|
|
91
|
+
var pA = planetNames[i], pB = planetNames[j];
|
|
92
|
+
var degA = Number(data.planets[pA] && data.planets[pA][0]);
|
|
93
|
+
var degB = Number(data.planets[pB] && data.planets[pB][0]);
|
|
94
|
+
if (!isFinite(degA) || !isFinite(degB)) continue;
|
|
95
|
+
var gap = Math.abs(degA - degB);
|
|
96
|
+
if (gap > 180) gap = 360 - gap;
|
|
97
|
+
for (var aspName in ASPECTS_DEF) {
|
|
98
|
+
var asp = ASPECTS_DEF[aspName];
|
|
99
|
+
var orbitMin = asp.degree - asp.orbit / 2, orbitMax = asp.degree + asp.orbit / 2;
|
|
100
|
+
if (gap >= orbitMin && gap <= orbitMax) {
|
|
101
|
+
var precisionNum = Math.abs(gap - asp.degree);
|
|
102
|
+
aspectsList.push({
|
|
103
|
+
from: pA,
|
|
104
|
+
to: pB,
|
|
105
|
+
aspect: aspName,
|
|
106
|
+
precision: precisionNum.toFixed(2),
|
|
107
|
+
precisionNum: precisionNum,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
aspectsList.sort(function(a, b) { return a.precisionNum - b.precisionNum; });
|
|
114
|
+
|
|
115
|
+
var aspDiv = document.createElement("div");
|
|
116
|
+
aspDiv.className = "aup-natal-aspects";
|
|
117
|
+
var aspTbl = document.createElement("table");
|
|
118
|
+
_appendHead(aspTbl, ["Planet", "Aspect", "Planet", "Orb"]);
|
|
119
|
+
var aspBody = document.createElement("tbody");
|
|
120
|
+
for (var k = 0; k < aspectsList.length; k++) {
|
|
121
|
+
var a = aspectsList[k];
|
|
122
|
+
var aspRow = document.createElement("tr");
|
|
123
|
+
_appendCell(aspRow, String(a.from));
|
|
124
|
+
_appendCell(aspRow, String(a.aspect), true);
|
|
125
|
+
_appendCell(aspRow, String(a.to));
|
|
126
|
+
_appendCell(aspRow, String(a.precision) + "\\u00B0");
|
|
127
|
+
aspBody.appendChild(aspRow);
|
|
128
|
+
}
|
|
129
|
+
aspTbl.appendChild(aspBody);
|
|
130
|
+
aspDiv.appendChild(aspTbl);
|
|
131
|
+
el.appendChild(aspDiv);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return el;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ── SVG Chart mode — lazy-load @astrodraw/astrochart from CDN ──
|
|
138
|
+
el.style.minHeight = height;
|
|
139
|
+
_setNatalStatus(el, "Loading natal chart...");
|
|
140
|
+
|
|
141
|
+
if (!data || !data.planets || !data.cusps) {
|
|
142
|
+
_setNatalStatus(
|
|
143
|
+
el,
|
|
144
|
+
"No chart data provided. Expected: { planets: {Sun: [deg], ...}, cusps: [12 values] }",
|
|
145
|
+
);
|
|
146
|
+
return el;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
var CDN_URL = "https://cdn.jsdelivr.net/npm/@astrodraw/astrochart@3.0.2/dist/astrochart.js";
|
|
150
|
+
|
|
151
|
+
function _initChart() {
|
|
152
|
+
el.innerHTML = "";
|
|
153
|
+
var chartContainerId = "aup-natal-" + (node.id || Math.random().toString(36).slice(2));
|
|
154
|
+
var container = document.createElement("div");
|
|
155
|
+
container.id = chartContainerId;
|
|
156
|
+
container.style.cssText = "display: flex; justify-content: center;";
|
|
157
|
+
el.appendChild(container);
|
|
158
|
+
|
|
159
|
+
// Detect dark mode
|
|
160
|
+
var bgHex = getComputedStyle(document.documentElement).getPropertyValue("--bg").trim();
|
|
161
|
+
var isDark = false;
|
|
162
|
+
if (bgHex && bgHex.charAt(0) === "#") {
|
|
163
|
+
var r = parseInt(bgHex.slice(1, 3), 16) || 0;
|
|
164
|
+
var g = parseInt(bgHex.slice(3, 5), 16) || 0;
|
|
165
|
+
var b = parseInt(bgHex.slice(5, 7), 16) || 0;
|
|
166
|
+
isDark = (r + g + b) / 3 < 128;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
var chartSettings = {
|
|
170
|
+
COLOR_BACKGROUND: "transparent",
|
|
171
|
+
POINTS_COLOR: isDark ? "#e2e8f0" : "#1e293b",
|
|
172
|
+
SIGNS_COLOR: isDark ? "#cbd5e1" : "#334155",
|
|
173
|
+
CIRCLE_COLOR: isDark ? "#475569" : "#94a3b8",
|
|
174
|
+
LINE_COLOR: isDark ? "#475569" : "#94a3b8",
|
|
175
|
+
CUSPS_FONT_COLOR: isDark ? "#94a3b8" : "#64748b",
|
|
176
|
+
SYMBOL_AXIS_FONT_COLOR: isDark ? "#e2e8f0" : "#1e293b",
|
|
177
|
+
};
|
|
178
|
+
if (p.settings) {
|
|
179
|
+
for (var sk in p.settings) {
|
|
180
|
+
if (p.settings.hasOwnProperty(sk)) chartSettings[sk] = p.settings[sk];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
var astroLib = window.astrochart;
|
|
186
|
+
if (!astroLib || !astroLib.Chart) {
|
|
187
|
+
_setNatalStatus(el, "AstroChart library not loaded");
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
var chart = new astroLib.Chart(chartContainerId, chartSize, chartSize, chartSettings);
|
|
191
|
+
var radix = chart.radix(data);
|
|
192
|
+
radix.aspects();
|
|
193
|
+
|
|
194
|
+
// Transit overlay
|
|
195
|
+
if (variant === "transit" && p.transitData) {
|
|
196
|
+
var transit = radix.transit(p.transitData);
|
|
197
|
+
transit.aspects();
|
|
198
|
+
}
|
|
199
|
+
} catch (err) {
|
|
200
|
+
var errMsg = err && err.message ? err.message : String(err);
|
|
201
|
+
_setNatalStatus(el, "Chart error: " + errMsg);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (_astroChartLoaded || window.astrochart) {
|
|
206
|
+
_astroChartLoaded = true;
|
|
207
|
+
_initChart();
|
|
208
|
+
} else {
|
|
209
|
+
loadScript(CDN_URL, function() {
|
|
210
|
+
_astroChartLoaded = true;
|
|
211
|
+
_initChart();
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return el;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
`;
|
|
219
|
+
|
|
220
|
+
//#endregion
|
|
221
|
+
export { NATAL_CHART_JS };
|
|
222
|
+
//# sourceMappingURL=natal-chart.mjs.map
|