@openephemeris/mcp-server 4.15.0 → 4.15.1

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.
@@ -33,7 +33,7 @@
33
33
  <div id="tooltip" class="tooltip" aria-live="polite"></div>
34
34
  <div id="aspect-filter" hidden></div>
35
35
  <div id="param-controls-container" hidden></div>
36
- <div id="chart-hint" class="chart-hint">Click any planet or cross-aspect to explore · Ask Claude for deep interpretation</div>
36
+ <div id="chart-hint" class="chart-hint">Click any planet or cross-aspect to explore · Ask for a deep interpretation</div>
37
37
  </div>
38
38
  <script type="module">var e = Object.defineProperty, t = (t2, n2) => {
39
39
  let r2 = {};
@@ -6814,15 +6814,15 @@ function hv(e5, t2, n2, r2, i2) {
6814
6814
  var a2, o2;
6815
6815
  let s2 = bv(), c2 = mv[t2];
6816
6816
  if (!c2) return;
6817
- let l2 = J_(n2), u2 = Math.floor((n2 % 360 + 360) % 360 / 30), d2 = H_[u2], f2 = U_[u2], p2 = F_[u2], m2 = G_(u2), h2 = i2 ? "".concat(i2, " \xB7 Natal") : "Inner \xB7 Natal", g2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-angle-btn">\u2728 Ask Claude to interpret</button>' : "";
6817
+ let l2 = J_(n2), u2 = Math.floor((n2 % 360 + 360) % 360 / 30), d2 = H_[u2], f2 = U_[u2], p2 = F_[u2], m2 = G_(u2), h2 = i2 ? "".concat(i2, " \xB7 Natal") : "Inner \xB7 Natal", g2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-angle-btn">\u2728 Interpret this</button>' : "";
6818
6818
  s2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:#7060b8;font-family:system-ui;font-weight:700;font-size:14px">'.concat(Q(c2.symbol), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:6px;flex-wrap:wrap;">\n <strong>').concat(Q(c2.title), '</strong>\n <span class="wheel-badge inner">').concat(Q(h2), '</span>\n </div>\n <div class="info-subtitle">').concat(Q(p2), " ").concat(Q(l2), '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div style="font-size:11px;color:var(--text-secondary,#888);margin:6px 0 4px">\n <span style="color:').concat(m2, ';margin-right:4px">').concat(Q(p2), "</span>\n <em>").concat(Q(d2), " \xB7 ").concat(Q(f2), '</em>\n </div>\n <div style="font-size:12px;line-height:1.55;margin-bottom:8px">').concat(Q(c2.meaning), '</div>\n <div class="aspects-title">').concat(Q(c2.keyword), '</div>\n <div class="aspects-list">\n ').concat(c2.themes.map((e6) => '<div class="aspect-row"><span class="aspect-other">'.concat(Q(e6), "</span></div>")).join(""), "\n </div>\n ").concat(g2, "\n "), s2.classList.add("open"), s2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (a2 = document.getElementById("bi-info-close-btn")) == null || a2.addEventListener("click", () => {
6819
6819
  xv(), Ov();
6820
6820
  }), (o2 = document.getElementById("bi-ask-claude-angle-btn")) == null || o2.addEventListener("click", () => {
6821
6821
  if (!rv) return;
6822
6822
  let e6 = document.getElementById("bi-ask-claude-angle-btn");
6823
6823
  !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), rv({ type: "angle_interpretation", data: { angle: c2.title, longitude: n2, sign: I_[u2], position: l2, element: d2, modality: f2, mode: r2 } }).then(() => {
6824
- e6.textContent = "\u2713 Sent to Claude", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6825
- e6.textContent = "\u2728 Ask Claude to interpret", e6.classList.remove("sent"), e6.disabled = false;
6824
+ e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6825
+ e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
6826
6826
  }, 2500);
6827
6827
  }).catch(() => {
6828
6828
  e6.textContent = "\u26A0 Failed \u2014 tap to retry", e6.classList.remove("sending"), e6.classList.add("error"), e6.disabled = false;
@@ -6842,7 +6842,7 @@ function vv(e5, t2, n2, r2, i2, a2, o2, s2) {
6842
6842
  let p2 = bv(), m2 = Math.floor((t2.cusp_lon % 360 + 360) % 360 / 30), h2 = (c2 = (l2 = t2.sign) == null ? I_[m2] : l2) == null ? "" : c2, g2 = (u2 = F_[m2]) == null ? "" : u2, _2 = _v(o2, t2.cusp_lon, n2.cusp_lon), v2 = _v(s2, t2.cusp_lon, n2.cusp_lon), y2 = i2 || "Natal", b2 = r2 === "synastry" ? a2 == null ? "Synastry" : a2 : "Transit", x2 = (e6, t3) => e6.length === 0 ? '<div class="no-aspects">\u2014</div>' : e6.map((e7) => {
6843
6843
  let n3 = J_(e7.longitude), r3 = e7.retrograde ? " \u211E" : "";
6844
6844
  return '<div class="aspect-row">\n <span class="wheel-badge '.concat(t3, '" style="font-size:9px">').concat(Q(t3 === "inner" ? y2 : b2), '</span>\n <span class="aspect-other">').concat(Q(Z(e7.name))).concat(r3, '</span>\n <span class="aspect-meta">').concat(Q(n3), "</span>\n </div>");
6845
- }).join(""), S2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-house-btn">\u2728 Ask Claude to interpret</button>' : "";
6845
+ }).join(""), S2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-house-btn">\u2728 Interpret this</button>' : "";
6846
6846
  p2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:#7060b8;font-family:system-ui;font-weight:700;font-size:14px">'.concat(t2.number, '</span>\n <div class="info-title">\n <div><strong>House ').concat(t2.number, '</strong></div>\n <div class="info-subtitle">').concat(Q(g2), " ").concat(Q(h2), " on cusp").concat(t2.ruler ? " \xB7 ruled by ".concat(Q(Z(t2.ruler))) : "", '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title" style="margin-top:6px">').concat(Q(y2), ' planets</div>\n <div class="aspects-list">').concat(x2(_2, "inner"), '</div>\n <div class="aspects-title" style="margin-top:8px">').concat(Q(b2), ' planets currently here</div>\n <div class="aspects-list">').concat(x2(v2, "outer"), "</div>\n ").concat(S2, "\n "), p2.classList.add("open"), p2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (d2 = document.getElementById("bi-info-close-btn")) == null || d2.addEventListener("click", () => {
6847
6847
  xv(), Ov();
6848
6848
  }), (f2 = document.getElementById("bi-ask-claude-house-btn")) == null || f2.addEventListener("click", () => {
@@ -6856,8 +6856,8 @@ function vv(e5, t2, n2, r2, i2, a2, o2, s2) {
6856
6856
  var t3;
6857
6857
  return { name: e7.name, position: J_(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6858
6858
  }) } }).then(() => {
6859
- n3.textContent = "\u2713 Sent to Claude", n3.classList.remove("sending"), n3.classList.add("sent"), setTimeout(() => {
6860
- n3.textContent = "\u2728 Ask Claude to interpret", n3.classList.remove("sent"), n3.disabled = false;
6859
+ n3.textContent = "\u2713 Sent", n3.classList.remove("sending"), n3.classList.add("sent"), setTimeout(() => {
6860
+ n3.textContent = "\u2728 Interpret this", n3.classList.remove("sent"), n3.disabled = false;
6861
6861
  }, 2500);
6862
6862
  }).catch(() => {
6863
6863
  n3.textContent = "\u26A0 Failed \u2014 tap to retry", n3.classList.remove("sending"), n3.classList.add("error"), n3.disabled = false;
@@ -6869,7 +6869,7 @@ function yv(e5, t2, n2, r2, i2, a2, o2) {
6869
6869
  let l2 = bv(), u2 = I_[t2], d2 = F_[t2], f2 = H_[t2], p2 = U_[t2], m2 = (e6) => Math.floor((e6.longitude % 360 + 360) % 360 / 30) === t2, h2 = a2.filter(m2), g2 = o2.filter(m2), _2 = r2 || "Natal", v2 = n2 === "synastry" ? i2 == null ? "Synastry" : i2 : "Transit", y2 = (e6, t3) => e6.length === 0 ? '<div class="no-aspects">\u2014</div>' : e6.map((e7) => {
6870
6870
  let n3 = J_(e7.longitude), r3 = e7.retrograde ? " \u211E" : "";
6871
6871
  return '<div class="aspect-row">\n <span class="wheel-badge '.concat(t3, '" style="font-size:9px">').concat(Q(t3 === "inner" ? _2 : v2), '</span>\n <span class="aspect-other">').concat(Q(Z(e7.name))).concat(r3, '</span>\n <span class="aspect-meta">').concat(Q(n3), "</span>\n </div>");
6872
- }).join(""), b2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-sign-btn">\u2728 Ask Claude to interpret</button>' : "";
6872
+ }).join(""), b2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-sign-btn">\u2728 Interpret this</button>' : "";
6873
6873
  l2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(G_(t2), ';font-family:serif;font-weight:700;font-size:16px">').concat(Q(d2), '</span>\n <div class="info-title">\n <div><strong>').concat(Q(u2), '</strong></div>\n <div class="info-subtitle"><em>').concat(Q(Z(f2)), " \xB7 ").concat(Q(Z(p2)), '</em></div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title" style="margin-top:6px">').concat(Q(_2), " planets in ").concat(Q(u2), '</div>\n <div class="aspects-list">').concat(y2(h2, "inner"), '</div>\n <div class="aspects-title" style="margin-top:8px">').concat(Q(v2), " planets currently in ").concat(Q(u2), '</div>\n <div class="aspects-list">').concat(y2(g2, "outer"), "</div>\n ").concat(b2, "\n "), l2.classList.add("open"), l2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (s2 = document.getElementById("bi-info-close-btn")) == null || s2.addEventListener("click", () => {
6874
6874
  xv(), Ov();
6875
6875
  }), (c2 = document.getElementById("bi-ask-claude-sign-btn")) == null || c2.addEventListener("click", () => {
@@ -6882,8 +6882,8 @@ function yv(e5, t2, n2, r2, i2, a2, o2) {
6882
6882
  var t3;
6883
6883
  return { name: e7.name, position: J_(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6884
6884
  }) } }).then(() => {
6885
- e6.textContent = "\u2713 Sent to Claude", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6886
- e6.textContent = "\u2728 Ask Claude to interpret", e6.classList.remove("sent"), e6.disabled = false;
6885
+ e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6886
+ e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
6887
6887
  }, 2500);
6888
6888
  }).catch(() => {
6889
6889
  e6.textContent = "\u26A0 Failed \u2014 tap to retry", e6.classList.remove("sending"), e6.classList.add("error"), e6.disabled = false;
@@ -6920,7 +6920,7 @@ function Sv(e5, t2, n2, r2, i2, a2, o2) {
6920
6920
  var t3, r3, a3, o3, s3, c3, l3;
6921
6921
  let u3 = n2 === "inner" ? e6.planet2 : e6.planet1, d3 = (t3 = P_[u3.toLowerCase()]) == null ? u3 : t3, f3 = (r3 = (a3 = L_[(o3 = (s3 = e6.type) == null ? void 0 : s3.toLowerCase()) == null ? "" : o3]) == null ? e6.type : a3) == null ? "\u2014" : r3, p3 = R_((c3 = (l3 = e6.type) == null ? void 0 : l3.toLowerCase()) == null ? "" : c3), m3 = "".concat(e6.orb.toFixed(1), "\xB0"), h3 = i2 === "transit" ? e6.applying ? "\u2197" : "\u2198" : e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide";
6922
6922
  return '<div class="aspect-row">\n <span class="aspect-dot" style="background:'.concat(p3, '"></span>\n <span class="aspect-sym" style="color:').concat(p3, '">').concat(f3, '</span>\n <span class="aspect-other">').concat(Q(d3), " ").concat(Q(Z(u3)), '</span>\n <span class="aspect-meta">').concat(m3, " ").concat(h3, "</span>\n </div>");
6923
- }).join("") : '<div class="no-aspects">No cross-aspects within orb</div>', b2 = (l2 = I_[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "Unknown" : l2, x2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-planet-btn">\u2728 Ask Claude to interpret</button>' : "";
6923
+ }).join("") : '<div class="no-aspects">No cross-aspects within orb</div>', b2 = (l2 = I_[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "Unknown" : l2, x2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-planet-btn">\u2728 Interpret this</button>' : "";
6924
6924
  f2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph">'.concat(Q(p2), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:6px;flex-wrap:wrap;">\n <strong>').concat(Q(Z(t2.name)), "</strong>\n ").concat(t2.retrograde ? "<span style='color:#e05252'>\u211E</span>" : "", "\n ").concat(h2 ? '<span class="dignity-badge '.concat(h2.cssClass, '">').concat(h2.emoji, " ").concat(Q(h2.label), "</span>") : "", '\n <span class="wheel-badge ').concat(_2, '">').concat(Q(g2), '</span>\n </div>\n <div class="info-subtitle">').concat(Q(m2), " ").concat(Q(J_(t2.longitude))).concat(t2.house ? " \xB7 House ".concat(t2.house) : "", '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title">Cross-Aspects</div>\n <div class="aspects-list">').concat(y2, "</div>\n ").concat(x2, "\n "), f2.classList.add("open"), f2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (u2 = document.getElementById("bi-info-close-btn")) == null || u2.addEventListener("click", () => {
6925
6925
  xv(), Ov();
6926
6926
  }), (d2 = document.getElementById("bi-ask-claude-planet-btn")) == null || d2.addEventListener("click", () => {
@@ -6928,8 +6928,8 @@ function Sv(e5, t2, n2, r2, i2, a2, o2) {
6928
6928
  if (!rv) return;
6929
6929
  let a3 = document.getElementById("bi-ask-claude-planet-btn");
6930
6930
  !a3 || a3.disabled || (a3.disabled = true, a3.textContent = "\u23F3 Sending\u2026", a3.classList.add("sending"), rv({ type: "planet", data: { planet_name: t2.name, wheel: n2, longitude: t2.longitude, sign: b2, position: "".concat(Math.floor(t2.longitude % 30), "\xB0 ").concat(b2), house: (e6 = t2.house) == null ? null : e6, retrograde: (r3 = t2.retrograde) == null ? false : r3, mode: i2, cross_aspects: v2.map((e7) => ({ type: e7.type, partner: n2 === "inner" ? e7.planet2 : e7.planet1, orb: e7.orb, applying: e7.applying, orb_label: i2 === "transit" ? e7.applying ? "applying" : "separating" : e7.orb <= 1 ? "exact" : e7.orb <= 3 ? "tight" : "wide" })) } }).then(() => {
6931
- a3.textContent = "\u2713 Sent to Claude", a3.classList.remove("sending"), a3.classList.add("sent"), setTimeout(() => {
6932
- a3.textContent = "\u2728 Ask Claude to interpret", a3.classList.remove("sent"), a3.disabled = false;
6931
+ a3.textContent = "\u2713 Sent", a3.classList.remove("sending"), a3.classList.add("sent"), setTimeout(() => {
6932
+ a3.textContent = "\u2728 Interpret this", a3.classList.remove("sent"), a3.disabled = false;
6933
6933
  }, 2500);
6934
6934
  }).catch(() => {
6935
6935
  a3.textContent = "\u26A0 Failed \u2014 tap to retry", a3.classList.remove("sending"), a3.classList.add("error"), a3.disabled = false;
@@ -6938,15 +6938,15 @@ function Sv(e5, t2, n2, r2, i2, a2, o2) {
6938
6938
  }
6939
6939
  function Cv(e5, t2, n2, r2, i2) {
6940
6940
  var a2, o2, s2, c2, l2, u2, d2, f2, p2;
6941
- let m2 = bv(), h2 = (a2 = P_[t2.planet1.toLowerCase()]) == null ? "\u2605" : a2, g2 = (o2 = P_[t2.planet2.toLowerCase()]) == null ? "\u2605" : o2, _2 = (s2 = L_[(c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2]) == null ? t2.type : s2, v2 = R_((u2 = (d2 = t2.type) == null ? void 0 : d2.toLowerCase()) == null ? "" : u2), y2 = r2 ? "".concat(r2, "'s ").concat(Z(t2.planet1)) : Z(t2.planet1), b2 = n2 === "transit" ? "Tr. ".concat(Z(t2.planet2)) : i2 ? "".concat(i2, "'s ").concat(Z(t2.planet2)) : Z(t2.planet2), x2 = n2 === "transit" ? t2.applying ? "\u2197 Applying" : "\u2198 Separating" : t2.orb <= 1 ? "Exact" : t2.orb <= 3 ? "Tight" : "Wide", S2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-asp-btn">\u2728 Ask Claude to interpret</button>' : "";
6941
+ let m2 = bv(), h2 = (a2 = P_[t2.planet1.toLowerCase()]) == null ? "\u2605" : a2, g2 = (o2 = P_[t2.planet2.toLowerCase()]) == null ? "\u2605" : o2, _2 = (s2 = L_[(c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2]) == null ? t2.type : s2, v2 = R_((u2 = (d2 = t2.type) == null ? void 0 : d2.toLowerCase()) == null ? "" : u2), y2 = r2 ? "".concat(r2, "'s ").concat(Z(t2.planet1)) : Z(t2.planet1), b2 = n2 === "transit" ? "Tr. ".concat(Z(t2.planet2)) : i2 ? "".concat(i2, "'s ").concat(Z(t2.planet2)) : Z(t2.planet2), x2 = n2 === "transit" ? t2.applying ? "\u2197 Applying" : "\u2198 Separating" : t2.orb <= 1 ? "Exact" : t2.orb <= 3 ? "Tight" : "Wide", S2 = rv ? '<button class="ask-claude-btn" id="bi-ask-claude-asp-btn">\u2728 Interpret this</button>' : "";
6942
6942
  m2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(v2, '">').concat(Q(String(_2)), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:5px;flex-wrap:wrap;">\n <strong>').concat(Q(h2), " ").concat(Q(y2), '</strong>\n <span style="color:').concat(v2, '">').concat(Q(String(_2)), "</span>\n <strong>").concat(Q(g2), " ").concat(Q(b2), '</strong>\n </div>\n <div class="info-subtitle">').concat(t2.orb.toFixed(1), "\xB0 orb \xB7 ").concat(Q(x2), '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div style="display:flex;gap:6px;margin-bottom:10px;">\n <span class="wheel-badge inner">Inner \xB7 ').concat(Q(y2), '</span>\n <span class="wheel-badge outer">Outer \xB7 ').concat(Q(b2), "</span>\n </div>\n ").concat(S2, "\n "), m2.classList.add("open"), m2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (f2 = document.getElementById("bi-info-close-btn")) == null || f2.addEventListener("click", () => {
6943
6943
  xv(), Ov();
6944
6944
  }), (p2 = document.getElementById("bi-ask-claude-asp-btn")) == null || p2.addEventListener("click", () => {
6945
6945
  if (!rv) return;
6946
6946
  let e6 = document.getElementById("bi-ask-claude-asp-btn");
6947
6947
  !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), rv({ type: "cross_aspect", data: { planet1: t2.planet1, wheel1: t2.wheel1, planet2: t2.planet2, wheel2: t2.wheel2, aspect_type: t2.type, orb: t2.orb, applying: t2.applying, mode: n2 } }).then(() => {
6948
- e6.textContent = "\u2713 Sent to Claude", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6949
- e6.textContent = "\u2728 Ask Claude to interpret", e6.classList.remove("sent"), e6.disabled = false;
6948
+ e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6949
+ e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
6950
6950
  }, 2500);
6951
6951
  }).catch(() => {
6952
6952
  e6.textContent = "\u26A0 Failed \u2014 tap to retry", e6.classList.remove("sending"), e6.classList.add("error"), e6.disabled = false;
@@ -7349,7 +7349,28 @@ function Wv(e5) {
7349
7349
  let t2 = e5.filter((e6) => e6.items.length > 0).map((e6) => '<div class="legend-group"><span class="legend-group-title">'.concat(Hv(e6.title), "</span>") + e6.items.map((e7) => '<span class="legend-item"><span class="legend-glyph">'.concat(Hv(e7.glyph), "</span>").concat(Hv(e7.label), "</span>")).join("") + "</div>").join("");
7350
7350
  return t2 ? '<details class="glyph-legend"><summary><span class="legend-spark">\u2726</span> Legend</summary><div class="legend-body">'.concat(t2, "</div></details>") : "";
7351
7351
  }
7352
- var Gv = class e4 {
7352
+ var Gv = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.\d+)?$/;
7353
+ function Kv(e5, t2) {
7354
+ if (!e5) return null;
7355
+ let n2 = Gv.exec(e5.trim());
7356
+ if (n2) {
7357
+ let [, e6, t3, r3, i2, a2, o2] = n2, s2 = new Date(Date.UTC(+e6, t3 - 1, +r3, +i2, +a2, o2 ? +o2 : 0));
7358
+ return isNaN(s2.getTime()) ? null : { date: s2, timeZone: "UTC" };
7359
+ }
7360
+ let r2 = new Date(e5);
7361
+ return isNaN(r2.getTime()) ? null : { date: r2, timeZone: t2 || "UTC" };
7362
+ }
7363
+ function qv(e5) {
7364
+ var t2;
7365
+ if (!e5) return "";
7366
+ let n2 = [], r2 = (t2 = e5.location) == null ? void 0 : t2.trim();
7367
+ if (r2 ? n2.push(r2) : typeof e5.latitude == "number" && typeof e5.longitude == "number" && n2.push("".concat(e5.latitude.toFixed(2), ", ").concat(e5.longitude.toFixed(2))), e5.datetime) {
7368
+ let t3 = /^\d{4}-\d{2}-\d{2}/.test(e5.datetime.trim()) ? Kv(e5.datetime, e5.timezone) : null;
7369
+ t3 ? n2.push(t3.date.toLocaleString("en-US", { timeZone: t3.timeZone, day: "numeric", month: "short", year: "numeric", hour: "numeric", minute: "2-digit" })) : n2.push(e5.datetime);
7370
+ }
7371
+ return n2.join(" \xB7 ");
7372
+ }
7373
+ var Jv = class e4 {
7353
7374
  constructor(t2) {
7354
7375
  var n2, r2, i2, a2, s2, c2;
7355
7376
  o(this, "config", void 0), o(this, "params", void 0), o(this, "dateInput", void 0), o(this, "timeInput", void 0), o(this, "refreshBtn", void 0), o(this, "locInput", void 0), o(this, "locDropdown", void 0), o(this, "summaryBar", void 0), o(this, "extraToggleInput", void 0), o(this, "searchTimeout", null), o(this, "searchVersion", 0), o(this, "isSearching", false), o(this, "suggestions", []), o(this, "activeIndex", -1), o(this, "selecting", false), o(this, "listboxId", "loc-listbox-".concat(e4.comboSeq++)), this.config = t2, this.params = { date: ((n2 = t2.initialParams) == null ? void 0 : n2.date) || this.getTodayDate(), time: ((r2 = t2.initialParams) == null ? void 0 : r2.time) || "12:00", latitude: ((i2 = t2.initialParams) == null ? void 0 : i2.latitude) || null, longitude: ((a2 = t2.initialParams) == null ? void 0 : a2.longitude) || null, timezone: ((s2 = t2.initialParams) == null ? void 0 : s2.timezone) || null, locationName: ((c2 = t2.initialParams) == null ? void 0 : c2.locationName) || null }, this.render();
@@ -7529,14 +7550,14 @@ var Gv = class e4 {
7529
7550
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
7530
7551
  }
7531
7552
  };
7532
- o(Gv, "comboSeq", 0);
7533
- var Kv = { "chart-wheel": { stripIcon: "\u2726", stripTitle: "About the Natal Chart", stripHints: ["Click any <strong>planet</strong> for a deep placement reading", "Click any <strong>aspect line</strong> for its dynamic interpretation", "Click any <strong>house cusp</strong> for house themes", "Use the <strong>date controls</strong> to move through time"], modalText: "This wheel is an exact celestial snapshot of the sky at a given moment and place \u2014 every planet, house, and aspect line is clickable." }, "bi-wheel": { stripIcon: "\u2295", stripTitle: "About the Bi-Wheel", stripHints: ["Click any <strong>inner planet</strong> for natal placement depth", "Click any <strong>outer planet</strong> for transit or synastry meaning", "Click a <strong>cross-aspect line</strong> for inter-chart dynamics", "Use the <strong>date controls</strong> to advance transits"], modalText: "Two charts are layered here \u2014 the inner wheel is the natal chart; the outer ring shows the second chart (transits or another person's planets)." }, bodygraph: { stripIcon: "\u25C8", stripTitle: "About the Bodygraph", stripHints: ["Click any <strong>center</strong> (defined or undefined) for its meaning", "Click any <strong>channel</strong> to explore its life theme", "Click any <strong>gate number</strong> for its I Ching hexagram reading", "Click a <strong>planet row</strong> in the sidebar for its HD role"], modalText: "The bodygraph is a living map of the energy centres, channels, and gates that define a Human Design chart." }, "vedic-chart": { stripIcon: "\u{1F549}", stripTitle: "About the Jyotish Chart", stripHints: ["Click any <strong>rashi cell</strong> for its themes and any planets placed there", "The <strong>diagonal mark</strong> shows the Lagna (Ascendant) rashi", "Use the <strong>action bar</strong> for a full chart interpretation", "Click <strong>Moon &amp; Nakshatra</strong> for lunar mansion detail"], modalText: "This is a Vedic birth chart rendered as a South Indian Rashi grid \u2014 sidereal planetary placements by fixed sign." }, "transit-timeline": { stripIcon: "\u2604", stripTitle: "About the Transit Timeline", stripHints: ["Each entry is an <strong>exact transit hit</strong> \u2014 a transiting planet contacting a natal point", "Events are <strong>grouped by month</strong> in chronological order", "The <strong>\u211E marker</strong> flags a retrograde crossing", "Click any transit for a focused <strong>interpretation</strong>"], modalText: "This timeline lists upcoming transits to the natal chart \u2014 the exact dates outer-planet energies activate each placement." }, "moon-phase": { stripIcon: "\u263E", stripTitle: "About the Moon Phase Dial", stripHints: ["Click the <strong>Moon</strong> for its phase interpretation", "Click the <strong>Void-of-Course</strong> card when the Moon is VOC", "Use the <strong>date control</strong> to move the sky to any moment"], modalText: "The dial shows the Moon's live illumination, phase, sign, and void-of-course status for the selected moment." }, bazi: { stripIcon: "\u56DB", stripTitle: "About the BaZi Chart", stripHints: ["Click any <strong>pillar</strong> (Year, Month, Day, Hour) for its interpretation", "The <strong>Day Master</strong> is the core identity element", "The <strong>Wu Xing bar</strong> shows the Five Element balance"], modalText: "This BaZi (Four Pillars of Destiny) chart maps the Heavenly Stems and Earthly Branches present at a given moment of birth." } }, qv = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: oklch(0% 0 0 / 0.55);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: oe-fade-in 0.4s ease both;\n font-family: system-ui, sans-serif;\n }\n\n .oe-welcome-modal {\n /* Themed, not hardcoded: the title/text/hints below all resolve through\n var(--text\u2026), so a fixed dark surface here meant that once the light\n palette became reachable the modal rendered near-black text on a\n near-black card \u2014 1.09:1, effectively invisible. The fallback is the\n previous literal, and every app\'s dark --surface is oklch(11-12%), so\n dark rendering is unchanged. */\n background: var(--surface, oklch(11% 0.010 265));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px oklch(0% 0 0 / 0.55), inset 0 1px 0 oklch(100% 0 0 / 0.06);\n animation: oe-modal-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n @keyframes oe-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes oe-modal-in {\n from { opacity: 0; transform: scale(0.95) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .oe-welcome-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n }\n\n .oe-welcome-icon {\n font-size: 28px;\n color: var(--gold, oklch(72% 0.12 80));\n line-height: 1;\n text-shadow: 0 0 10px var(--gold-glow, oklch(72% 0.12 80 / 0.30));\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--text, oklch(92% 0.006 265));\n margin: 0;\n letter-spacing: 0.02em;\n }\n\n .oe-welcome-text {\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--text-secondary, oklch(68% 0.008 265));\n margin: 0;\n }\n\n .oe-welcome-hints {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin: 8px 0 12px 0;\n padding: 0;\n list-style: none;\n }\n\n .oe-welcome-hints li {\n font-size: 13.5px;\n line-height: 1.4;\n color: var(--text-secondary, oklch(68% 0.008 265));\n display: flex;\n align-items: flex-start;\n gap: 10px;\n opacity: 0;\n animation: oe-fade-in 0.4s ease forwards;\n }\n\n /* Stagger the hints */\n .oe-welcome-hints li:nth-child(1) { animation-delay: 0.15s; }\n .oe-welcome-hints li:nth-child(2) { animation-delay: 0.25s; }\n .oe-welcome-hints li:nth-child(3) { animation-delay: 0.35s; }\n .oe-welcome-hints li:nth-child(4) { animation-delay: 0.45s; }\n\n .oe-welcome-hints li::before {\n content: "\u2726";\n color: var(--gold-dim, oklch(52% 0.06 80));\n font-size: 12px;\n padding-top: 2px;\n }\n\n .oe-welcome-hints strong {\n color: var(--text, oklch(92% 0.006 265));\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: var(--gold-subtle, oklch(72% 0.12 80 / 0.10));\n color: var(--gold, oklch(72% 0.12 80));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease, border-color 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: oklch(72% 0.12 80 / 0.18);\n border-color: oklch(72% 0.12 80 / 0.40);\n }\n\n .oe-welcome-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n\n .oe-welcome-backdrop.is-dismissing {\n animation: oe-fade-out 0.3s ease forwards;\n }\n\n .oe-welcome-backdrop.is-dismissing .oe-welcome-modal {\n animation: oe-modal-out 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes oe-fade-out {\n to { opacity: 0; }\n }\n\n @keyframes oe-modal-out {\n to { opacity: 0; transform: scale(0.95) translateY(10px); }\n }\n';
7534
- function Jv() {
7553
+ o(Jv, "comboSeq", 0);
7554
+ var Yv = { "chart-wheel": { stripIcon: "\u2726", stripTitle: "About the Natal Chart", stripHints: ["Click any <strong>planet</strong> for a deep placement reading", "Click any <strong>aspect line</strong> for its dynamic interpretation", "Click any <strong>house cusp</strong> for house themes", "Use the <strong>date controls</strong> to move through time"], modalText: "This wheel is an exact celestial snapshot of the sky at a given moment and place \u2014 every planet, house, and aspect line is clickable." }, "bi-wheel": { stripIcon: "\u2295", stripTitle: "About the Bi-Wheel", stripHints: ["Click any <strong>inner planet</strong> for natal placement depth", "Click any <strong>outer planet</strong> for transit or synastry meaning", "Click a <strong>cross-aspect line</strong> for inter-chart dynamics", "Use the <strong>date controls</strong> to advance transits"], modalText: "Two charts are layered here \u2014 the inner wheel is the natal chart; the outer ring shows the second chart (transits or another person's planets)." }, bodygraph: { stripIcon: "\u25C8", stripTitle: "About the Bodygraph", stripHints: ["Click any <strong>center</strong> (defined or undefined) for its meaning", "Click any <strong>channel</strong> to explore its life theme", "Click any <strong>gate number</strong> for its I Ching hexagram reading", "Click a <strong>planet row</strong> in the sidebar for its HD role"], modalText: "The bodygraph is a living map of the energy centres, channels, and gates that define a Human Design chart." }, "vedic-chart": { stripIcon: "\u{1F549}", stripTitle: "About the Jyotish Chart", stripHints: ["Click any <strong>rashi cell</strong> for its themes and any planets placed there", "The <strong>diagonal mark</strong> shows the Lagna (Ascendant) rashi", "Use the <strong>action bar</strong> for a full chart interpretation", "Click <strong>Moon &amp; Nakshatra</strong> for lunar mansion detail"], modalText: "This is a Vedic birth chart rendered as a South Indian Rashi grid \u2014 sidereal planetary placements by fixed sign." }, "transit-timeline": { stripIcon: "\u2604", stripTitle: "About the Transit Timeline", stripHints: ["Each entry is an <strong>exact transit hit</strong> \u2014 a transiting planet contacting a natal point", "Events are <strong>grouped by month</strong> in chronological order", "The <strong>\u211E marker</strong> flags a retrograde crossing", "Click any transit for a focused <strong>interpretation</strong>"], modalText: "This timeline lists upcoming transits to the natal chart \u2014 the exact dates outer-planet energies activate each placement." }, "moon-phase": { stripIcon: "\u263E", stripTitle: "About the Moon Phase Dial", stripHints: ["Click the <strong>Moon</strong> for its phase interpretation", "Click the <strong>Void-of-Course</strong> card when the Moon is VOC", "Use the <strong>date control</strong> to move the sky to any moment"], modalText: "The dial shows the Moon's live illumination, phase, sign, and void-of-course status for the selected moment." }, bazi: { stripIcon: "\u56DB", stripTitle: "About the BaZi Chart", stripHints: ["Click any <strong>pillar</strong> (Year, Month, Day, Hour) for its interpretation", "The <strong>Day Master</strong> is the core identity element", "The <strong>Wu Xing bar</strong> shows the Five Element balance"], modalText: "This BaZi (Four Pillars of Destiny) chart maps the Heavenly Stems and Earthly Branches present at a given moment of birth." } }, Xv = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: oklch(0% 0 0 / 0.55);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: oe-fade-in 0.4s ease both;\n font-family: system-ui, sans-serif;\n }\n\n .oe-welcome-modal {\n /* Themed, not hardcoded: the title/text/hints below all resolve through\n var(--text\u2026), so a fixed dark surface here meant that once the light\n palette became reachable the modal rendered near-black text on a\n near-black card \u2014 1.09:1, effectively invisible. The fallback is the\n previous literal, and every app\'s dark --surface is oklch(11-12%), so\n dark rendering is unchanged. */\n background: var(--surface, oklch(11% 0.010 265));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px oklch(0% 0 0 / 0.55), inset 0 1px 0 oklch(100% 0 0 / 0.06);\n animation: oe-modal-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n @keyframes oe-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes oe-modal-in {\n from { opacity: 0; transform: scale(0.95) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .oe-welcome-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n }\n\n .oe-welcome-icon {\n font-size: 28px;\n color: var(--gold, oklch(72% 0.12 80));\n line-height: 1;\n text-shadow: 0 0 10px var(--gold-glow, oklch(72% 0.12 80 / 0.30));\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--text, oklch(92% 0.006 265));\n margin: 0;\n letter-spacing: 0.02em;\n }\n\n .oe-welcome-text {\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--text-secondary, oklch(68% 0.008 265));\n margin: 0;\n }\n\n .oe-welcome-hints {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin: 8px 0 12px 0;\n padding: 0;\n list-style: none;\n }\n\n .oe-welcome-hints li {\n font-size: 13.5px;\n line-height: 1.4;\n color: var(--text-secondary, oklch(68% 0.008 265));\n display: flex;\n align-items: flex-start;\n gap: 10px;\n opacity: 0;\n animation: oe-fade-in 0.4s ease forwards;\n }\n\n /* Stagger the hints */\n .oe-welcome-hints li:nth-child(1) { animation-delay: 0.15s; }\n .oe-welcome-hints li:nth-child(2) { animation-delay: 0.25s; }\n .oe-welcome-hints li:nth-child(3) { animation-delay: 0.35s; }\n .oe-welcome-hints li:nth-child(4) { animation-delay: 0.45s; }\n\n .oe-welcome-hints li::before {\n content: "\u2726";\n color: var(--gold-dim, oklch(52% 0.06 80));\n font-size: 12px;\n padding-top: 2px;\n }\n\n .oe-welcome-hints strong {\n color: var(--text, oklch(92% 0.006 265));\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: var(--gold-subtle, oklch(72% 0.12 80 / 0.10));\n color: var(--gold, oklch(72% 0.12 80));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease, border-color 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: oklch(72% 0.12 80 / 0.18);\n border-color: oklch(72% 0.12 80 / 0.40);\n }\n\n .oe-welcome-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n\n .oe-welcome-backdrop.is-dismissing {\n animation: oe-fade-out 0.3s ease forwards;\n }\n\n .oe-welcome-backdrop.is-dismissing .oe-welcome-modal {\n animation: oe-modal-out 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes oe-fade-out {\n to { opacity: 0; }\n }\n\n @keyframes oe-modal-out {\n to { opacity: 0; transform: scale(0.95) translateY(10px); }\n }\n';
7555
+ function Zv() {
7535
7556
  if (document.getElementById("oe-first-run-styles")) return;
7536
7557
  let e5 = document.createElement("style");
7537
- e5.id = "oe-first-run-styles", e5.textContent = qv, document.head.appendChild(e5);
7558
+ e5.id = "oe-first-run-styles", e5.textContent = Xv, document.head.appendChild(e5);
7538
7559
  }
7539
- function Yv(e5) {
7560
+ function Qv(e5) {
7540
7561
  let t2 = document.activeElement, n2 = document.createElement("div");
7541
7562
  n2.className = "oe-welcome-backdrop";
7542
7563
  let r2 = document.createElement("div");
@@ -7554,34 +7575,34 @@ function Yv(e5) {
7554
7575
  e6.key === "Escape" && (e6.preventDefault(), o2()), e6.key === "Tab" && (e6.preventDefault(), a2.focus());
7555
7576
  }), requestAnimationFrame(() => a2.focus()), n2;
7556
7577
  }
7557
- function Xv(e5) {
7558
- Jv();
7559
- let t2 = Yv(Kv[e5]);
7578
+ function $v(e5) {
7579
+ Zv();
7580
+ let t2 = Qv(Yv[e5]);
7560
7581
  document.body.appendChild(t2);
7561
7582
  }
7562
- var Zv = "\n .oe-info-button {\n position: fixed;\n top: 12px;\n right: 12px;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n background: var(--surface-2, oklch(16% 0.010 265));\n border: 1px solid var(--border-strong, oklch(30% 0.010 265));\n color: var(--text-secondary, oklch(68% 0.008 265));\n font: 600 14px/1 Georgia, serif;\n font-style: italic;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 9998;\n transition: all 150ms ease;\n }\n\n .oe-info-button:hover {\n background: var(--surface, oklch(11% 0.010 265));\n border-color: var(--gold-dim, oklch(52% 0.06 80));\n color: var(--gold, oklch(72% 0.12 80));\n }\n\n .oe-info-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n";
7563
- function Qv() {
7583
+ var ey = "\n .oe-info-button {\n position: fixed;\n top: 12px;\n right: 12px;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n background: var(--surface-2, oklch(16% 0.010 265));\n border: 1px solid var(--border-strong, oklch(30% 0.010 265));\n color: var(--text-secondary, oklch(68% 0.008 265));\n font: 600 14px/1 Georgia, serif;\n font-style: italic;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 9998;\n transition: all 150ms ease;\n }\n\n .oe-info-button:hover {\n background: var(--surface, oklch(11% 0.010 265));\n border-color: var(--gold-dim, oklch(52% 0.06 80));\n color: var(--gold, oklch(72% 0.12 80));\n }\n\n .oe-info-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n";
7584
+ function ty() {
7564
7585
  if (document.getElementById("oe-info-button-styles")) return;
7565
7586
  let e5 = document.createElement("style");
7566
- e5.id = "oe-info-button-styles", e5.textContent = Zv, document.head.appendChild(e5);
7587
+ e5.id = "oe-info-button-styles", e5.textContent = ey, document.head.appendChild(e5);
7567
7588
  }
7568
- function $v(e5) {
7589
+ function ny(e5) {
7569
7590
  if (document.getElementById("oe-info-button")) return;
7570
- Qv();
7591
+ ty();
7571
7592
  let t2 = document.createElement("button");
7572
- t2.id = "oe-info-button", t2.className = "oe-info-button", t2.setAttribute("aria-label", "About this chart"), t2.title = "About this chart", t2.textContent = "i", t2.addEventListener("click", () => Xv(e5)), document.body.appendChild(t2);
7593
+ t2.id = "oe-info-button", t2.className = "oe-info-button", t2.setAttribute("aria-label", "About this chart"), t2.title = "About this chart", t2.textContent = "i", t2.addEventListener("click", () => $v(e5)), document.body.appendChild(t2);
7573
7594
  }
7574
- function ey(e5) {
7595
+ function ry(e5) {
7575
7596
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
7576
7597
  }
7577
- function ty(e5) {
7578
- let { container: t2, message: n2, onRetry: r2, retryLabel: i2 = "\u21BA Try again" } = e5, a2 = r2 ? '<button class="error-retry-btn" type="button">'.concat(ey(i2), "</button>") : "";
7579
- if (t2.innerHTML = '<div class="error-state" role="alert"><div class="error-icon" aria-hidden="true">\u26A0\uFE0F</div><p class="error-msg">'.concat(ey(n2), "</p>") + a2 + "</div>", t2.removeAttribute("hidden"), r2) {
7598
+ function iy(e5) {
7599
+ let { container: t2, message: n2, onRetry: r2, retryLabel: i2 = "\u21BA Try again" } = e5, a2 = r2 ? '<button class="error-retry-btn" type="button">'.concat(ry(i2), "</button>") : "";
7600
+ if (t2.innerHTML = '<div class="error-state" role="alert"><div class="error-icon" aria-hidden="true">\u26A0\uFE0F</div><p class="error-msg">'.concat(ry(n2), "</p>") + a2 + "</div>", t2.removeAttribute("hidden"), r2) {
7580
7601
  var o2;
7581
7602
  (o2 = t2.querySelector(".error-retry-btn")) == null || o2.addEventListener("click", r2);
7582
7603
  }
7583
7604
  }
7584
- function ny(e5) {
7605
+ function ay(e5) {
7585
7606
  var t2;
7586
7607
  if (!e5) return null;
7587
7608
  if (e5.structuredContent != null && typeof e5.structuredContent == "object") return e5.structuredContent;
@@ -7594,7 +7615,7 @@ function ny(e5) {
7594
7615
  }
7595
7616
  return null;
7596
7617
  }
7597
- function ry(e5, t2, n2 = []) {
7618
+ function oy(e5, t2, n2 = []) {
7598
7619
  var r2, i2;
7599
7620
  if (!t2 || t2.querySelector("#btn-fullscreen")) return;
7600
7621
  let a2 = document.createElement("button");
@@ -7670,21 +7691,21 @@ function ry(e5, t2, n2 = []) {
7670
7691
  let e6 = document.getElementById("fs-hint-banner");
7671
7692
  e6 && e6.remove();
7672
7693
  let t3 = document.createElement("div");
7673
- t3.id = "fs-hint-banner", Object.assign(t3.style, { position: "fixed", top: "12px", left: "50%", transform: "translateX(-50%)", background: "oklch(14% 0.012 265 / 0.90)", backdropFilter: "blur(12px)", WebkitBackdropFilter: "blur(12px)", border: "1px solid oklch(72% 0.12 80 / 0.3)", borderRadius: "20px", padding: "6px 16px", fontSize: "11px", fontWeight: "600", color: "oklch(80% 0.08 80)", letterSpacing: "0.04em", zIndex: "9999", pointerEvents: "none", opacity: "0", transition: "opacity 300ms ease", whiteSpace: "nowrap" }), t3.textContent = "Esc \u2014 exit fullscreen & return to Claude chat", document.body.appendChild(t3), requestAnimationFrame(() => {
7694
+ t3.id = "fs-hint-banner", Object.assign(t3.style, { position: "fixed", top: "12px", left: "50%", transform: "translateX(-50%)", background: "oklch(14% 0.012 265 / 0.90)", backdropFilter: "blur(12px)", WebkitBackdropFilter: "blur(12px)", border: "1px solid oklch(72% 0.12 80 / 0.3)", borderRadius: "20px", padding: "6px 16px", fontSize: "11px", fontWeight: "600", color: "oklch(80% 0.08 80)", letterSpacing: "0.04em", zIndex: "9999", pointerEvents: "none", opacity: "0", transition: "opacity 300ms ease", whiteSpace: "nowrap" }), t3.textContent = "Esc \u2014 exit fullscreen & return to chat", document.body.appendChild(t3), requestAnimationFrame(() => {
7674
7695
  t3.style.opacity = "1";
7675
7696
  }), setTimeout(() => {
7676
7697
  t3.style.opacity = "0", setTimeout(() => t3.remove(), 350);
7677
7698
  }, 4e3);
7678
7699
  }
7679
7700
  }
7680
- function iy(e5, t2) {
7701
+ function sy(e5, t2) {
7681
7702
  e5.ontoolcancelled = (e6) => {
7682
7703
  var n2, r2, i2;
7683
7704
  let a2 = (n2 = e6.reason) == null ? "Tool call was cancelled" : n2;
7684
- console.warn("[AppChrome] Tool cancelled:", a2), (r2 = t2.statusFn) == null || r2.call(t2, null), !t2.loadingEl.hidden && t2.loadingEl.getAttribute("hidden") === null && (t2.loadingEl.setAttribute("hidden", ""), t2.contentEl.removeAttribute("hidden")), (i2 = t2.paramControls) == null || (i2 = i2.call(t2)) == null || i2.setBusy(false), ay(a2);
7705
+ console.warn("[AppChrome] Tool cancelled:", a2), (r2 = t2.statusFn) == null || r2.call(t2, null), !t2.loadingEl.hidden && t2.loadingEl.getAttribute("hidden") === null && (t2.loadingEl.setAttribute("hidden", ""), t2.contentEl.removeAttribute("hidden")), (i2 = t2.paramControls) == null || (i2 = i2.call(t2)) == null || i2.setBusy(false), cy(a2);
7685
7706
  };
7686
7707
  }
7687
- function ay(e5) {
7708
+ function cy(e5) {
7688
7709
  var t2;
7689
7710
  (t2 = document.getElementById("cancel-toast")) == null || t2.remove();
7690
7711
  let n2 = document.createElement("div");
@@ -7692,7 +7713,7 @@ function ay(e5) {
7692
7713
  n2.classList.remove("visible"), setTimeout(() => n2.remove(), 300);
7693
7714
  }, 3e3);
7694
7715
  }
7695
- function oy(e5) {
7716
+ function ly(e5) {
7696
7717
  var t2;
7697
7718
  function n2(e6) {
7698
7719
  if (!e6) return;
@@ -7705,67 +7726,67 @@ function oy(e5) {
7705
7726
  n2(e6);
7706
7727
  });
7707
7728
  }
7708
- var sy = document.getElementById("chart-container"), cy = document.getElementById("loading-state"), ly = document.getElementById("mode-badge"), uy = document.getElementById("chart-status"), dy = document.getElementById("aspect-filter"), fy = document.getElementById("chart-provenance"), py = document.getElementById("bi-patterns-strip"), my = document.getElementById("param-controls-container"), hy = new r_({ name: "Bi-Wheel Chart Explorer", version: "1.0.0" }), $ = null, gy = null, _y = false, vy = false, yy = "placidus";
7729
+ var uy = document.getElementById("chart-container"), dy = document.getElementById("loading-state"), fy = document.getElementById("mode-badge"), py = document.getElementById("chart-status"), my = document.getElementById("aspect-filter"), hy = document.getElementById("chart-provenance"), gy = document.getElementById("bi-patterns-strip"), _y = document.getElementById("param-controls-container"), vy = new r_({ name: "Bi-Wheel Chart Explorer", version: "1.0.0" }), $ = null, yy = null, by = false, xy = false, Sy = "placidus";
7709
7730
  m_(() => {
7710
- $ && Jy($);
7731
+ $ && Zy($);
7711
7732
  });
7712
- var by = "true";
7713
- function xy(e5) {
7714
- if (uy) {
7733
+ var Cy = "true";
7734
+ function wy(e5) {
7735
+ if (py) {
7715
7736
  if (!e5) {
7716
- uy.classList.remove("visible");
7737
+ py.classList.remove("visible");
7717
7738
  return;
7718
7739
  }
7719
- uy.textContent = "\xB7 ".concat(e5), uy.classList.add("visible");
7740
+ py.textContent = "\xB7 ".concat(e5), py.classList.add("visible");
7720
7741
  }
7721
7742
  }
7722
- nv(xy);
7723
- function Sy() {
7724
- cy.hidden = false, sy.hidden = true, ly.hidden = true, fy && (fy.hidden = true), py && (py.hidden = true, py.innerHTML = "");
7743
+ nv(wy);
7744
+ function Ty() {
7745
+ dy.hidden = false, uy.hidden = true, fy.hidden = true, hy && (hy.hidden = true), gy && (gy.hidden = true, gy.innerHTML = "");
7725
7746
  }
7726
- function Cy() {
7727
- cy.hidden = true, sy.hidden = false, sy.classList.remove("refreshing"), ly.hidden = false, fy && (fy.hidden = false);
7747
+ function Ey() {
7748
+ dy.hidden = true, uy.hidden = false, uy.classList.remove("refreshing"), fy.hidden = false, hy && (hy.hidden = false);
7728
7749
  }
7729
- function wy() {
7730
- if (!$ || sy.hidden) {
7731
- Sy();
7750
+ function Dy() {
7751
+ if (!$ || uy.hidden) {
7752
+ Ty();
7732
7753
  return;
7733
7754
  }
7734
- sy.classList.add("refreshing");
7755
+ uy.classList.add("refreshing");
7735
7756
  }
7736
- function Ty() {
7737
- sy.classList.remove("refreshing"), sy.classList.remove("chart-rendered"), sy.offsetWidth, sy.classList.add("chart-rendered");
7757
+ function Oy() {
7758
+ uy.classList.remove("refreshing"), uy.classList.remove("chart-rendered"), uy.offsetWidth, uy.classList.add("chart-rendered");
7738
7759
  }
7739
- function Ey(e5, t2) {
7740
- cy.hidden = true, fy && (fy.hidden = true), ty({ container: sy, message: e5, onRetry: t2 });
7760
+ function ky(e5, t2) {
7761
+ dy.hidden = true, hy && (hy.hidden = true), iy({ container: uy, message: e5, onRetry: t2 });
7741
7762
  }
7742
- function Dy(e5) {
7763
+ function Ay(e5) {
7743
7764
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
7744
7765
  }
7745
- async function Oy(e5) {
7766
+ async function jy(e5) {
7746
7767
  try {
7747
- (await hy.sendMessage({ role: "user", content: [{ type: "text", text: e5 }] })).isError && console.error("[BiWheel] Host rejected sendMessage");
7768
+ (await vy.sendMessage({ role: "user", content: [{ type: "text", text: e5 }] })).isError && console.error("[BiWheel] Host rejected sendMessage");
7748
7769
  } catch (e6) {
7749
7770
  console.error("[BiWheel] sendMessage failed:", e6);
7750
7771
  }
7751
7772
  }
7752
- function ky(e5) {
7753
- let t2 = ny(e5);
7773
+ function My(e5) {
7774
+ let t2 = ay(e5);
7754
7775
  return t2 && "inner" in t2 && "outer" in t2 ? t2 : null;
7755
7776
  }
7756
- var Ay = [{ label: "Tight", mult: 0.55 }, { label: "Standard", mult: 1 }, { label: "Wide", mult: 1.6 }], jy = true, My = 1;
7757
- function Ny() {
7777
+ var Ny = [{ label: "Tight", mult: 0.55 }, { label: "Standard", mult: 1 }, { label: "Wide", mult: 1.6 }], Py = true, Fy = 1;
7778
+ function Iy() {
7758
7779
  var e5, t2, n2;
7759
- if (!dy) return;
7780
+ if (!my) return;
7760
7781
  let r2 = (t2 = { synastry: "Synastry \u2192 Natal", transit: "Transit \u2192 Natal", progressed: "Progressions \u2192 Natal", solar_return: "Solar Return \u2192 Natal", lunar_return: "Lunar Return \u2192 Natal", solar_arc: "Solar Arc \u2192 Natal" }[(e5 = $ == null ? void 0 : $.mode) == null ? "synastry" : e5]) == null ? "Cross-Wheel" : t2, i2 = [{ key: "placidus", label: "Placidus" }, { key: "whole_sign", label: "Whole Sign" }, { key: "equal", label: "Equal" }, { key: "koch", label: "Koch" }, { key: "regiomontanus", label: "Regio." }], a2 = (() => {
7761
7782
  var e6, t3;
7762
7783
  let n3 = /* @__PURE__ */ new Set();
7763
7784
  for (let r3 of [...(e6 = $ == null ? void 0 : $.inner) == null ? [] : e6, ...(t3 = $ == null ? void 0 : $.outer) == null ? [] : t3]) r3 && typeof r3 == "object" && "name" in r3 && n3.add(String(r3.name).toLowerCase());
7764
7785
  return n3.has("north_node") && n3.has("true_node");
7765
7786
  })();
7766
- X_(by);
7767
- let o2 = a2 ? '\n <div class="asp-section">\n <span class="asp-section-label">Nodes</span>\n <button class="orb-preset-btn node-btn'.concat(by === "mean" ? " active" : "", '" data-node="mean" title="Mean lunar node (averaged orbit)">Mean</button>\n <button class="orb-preset-btn node-btn').concat(by === "true" ? " active" : "", '" data-node="true" title="True (osculating) lunar node">True</button>\n </div>') : "";
7768
- jy = true, dy.innerHTML = '\n <div class="asp-panel">\n <div class="asp-section">\n <span class="asp-section-label">Aspects</span>\n <button class="aspect-toggle-btn active" id="aspect-vis-toggle"\n title="Toggle all aspect lines &amp; symbols">\n <span class="toggle-icon">\u2295</span> '.concat(r2, '\n </button>\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Orb</span>\n ').concat(Ay.map((e6) => '<button class="orb-preset-btn'.concat(e6.mult === My ? " active" : "", '" data-mult="').concat(e6.mult, '" title="').concat(e6.label, ' orbs">').concat(e6.label, "</button>")).join(""), '\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Houses</span>\n ').concat(i2.map((e6) => '<button class="orb-preset-btn house-btn'.concat(e6.key === yy ? " active" : "", '" data-hs="').concat(e6.key, '" title="').concat(e6.label, ' houses">').concat(e6.label, "</button>")).join(""), "\n </div>").concat(o2, "\n </div>\n ");
7787
+ X_(Cy);
7788
+ let o2 = a2 ? '\n <div class="asp-section">\n <span class="asp-section-label">Nodes</span>\n <button class="orb-preset-btn node-btn'.concat(Cy === "mean" ? " active" : "", '" data-node="mean" title="Mean lunar node (averaged orbit)">Mean</button>\n <button class="orb-preset-btn node-btn').concat(Cy === "true" ? " active" : "", '" data-node="true" title="True (osculating) lunar node">True</button>\n </div>') : "";
7789
+ Py = true, my.innerHTML = '\n <div class="asp-panel">\n <div class="asp-section">\n <span class="asp-section-label">Aspects</span>\n <button class="aspect-toggle-btn active" id="aspect-vis-toggle"\n title="Toggle all aspect lines &amp; symbols">\n <span class="toggle-icon">\u2295</span> '.concat(r2, '\n </button>\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Orb</span>\n ').concat(Ny.map((e6) => '<button class="orb-preset-btn'.concat(e6.mult === Fy ? " active" : "", '" data-mult="').concat(e6.mult, '" title="').concat(e6.label, ' orbs">').concat(e6.label, "</button>")).join(""), '\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Houses</span>\n ').concat(i2.map((e6) => '<button class="orb-preset-btn house-btn'.concat(e6.key === Sy ? " active" : "", '" data-hs="').concat(e6.key, '" title="').concat(e6.label, ' houses">').concat(e6.label, "</button>")).join(""), "\n </div>").concat(o2, "\n </div>\n ");
7769
7790
  let s2 = [...Q_($ == null ? void 0 : $.inner), ...Q_($ == null ? void 0 : $.outer)], c2 = /* @__PURE__ */ new Set(), l2 = [];
7770
7791
  for (let e6 of s2) {
7771
7792
  let t3 = e6.name.toLowerCase();
@@ -7781,96 +7802,96 @@ function Ny() {
7781
7802
  var t3;
7782
7803
  return { glyph: (t3 = L_[e6]) == null ? "" : t3, label: Uv(e6) };
7783
7804
  }).filter((e6) => e6.glyph);
7784
- dy.insertAdjacentHTML("beforeend", Wv([{ title: "Bodies", items: l2 }, { title: "Aspects", items: u2 }])), dy.removeAttribute("hidden");
7805
+ my.insertAdjacentHTML("beforeend", Wv([{ title: "Bodies", items: l2 }, { title: "Aspects", items: u2 }])), my.removeAttribute("hidden");
7785
7806
  let d2 = document.getElementById("aspect-vis-toggle");
7786
7807
  d2 == null || d2.addEventListener("click", () => {
7787
- jy = !jy, kv(jy), d2.classList.toggle("active", jy), d2.querySelector(".toggle-icon").textContent = jy ? "\u2295" : "\u2296";
7788
- }), dy.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e6) => {
7808
+ Py = !Py, kv(Py), d2.classList.toggle("active", Py), d2.querySelector(".toggle-icon").textContent = Py ? "\u2295" : "\u2296";
7809
+ }), my.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e6) => {
7789
7810
  e6.addEventListener("click", () => {
7790
7811
  var t3;
7791
7812
  let n3 = parseFloat((t3 = e6.dataset.mult) == null ? "1" : t3);
7792
- n3 !== My && (My = n3, dy.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e7) => e7.classList.toggle("active", e7.dataset.mult === String(n3))), $ && Py($, n3));
7813
+ n3 !== Fy && (Fy = n3, my.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e7) => e7.classList.toggle("active", e7.dataset.mult === String(n3))), $ && Ly($, n3));
7793
7814
  });
7794
- }), dy.querySelectorAll(".house-btn").forEach((e6) => {
7815
+ }), my.querySelectorAll(".house-btn").forEach((e6) => {
7795
7816
  e6.addEventListener("click", () => {
7796
7817
  var t3;
7797
7818
  let n3 = (t3 = e6.dataset.hs) == null ? "placidus" : t3;
7798
- n3 === yy || !$ || (yy = n3, dy.querySelectorAll(".house-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.hs === n3)), Qy(n3));
7819
+ n3 === Sy || !$ || (Sy = n3, my.querySelectorAll(".house-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.hs === n3)), tb(n3));
7799
7820
  });
7800
- }), dy.querySelectorAll(".node-btn").forEach((e6) => {
7821
+ }), my.querySelectorAll(".node-btn").forEach((e6) => {
7801
7822
  e6.addEventListener("click", () => {
7802
7823
  let t3 = e6.dataset.node === "mean" ? "mean" : "true";
7803
- t3 === by || !$ || (by = t3, X_(t3), dy.querySelectorAll(".node-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.node === t3)), Py($, My));
7824
+ t3 === Cy || !$ || (Cy = t3, X_(t3), my.querySelectorAll(".node-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.node === t3)), Ly($, Fy));
7804
7825
  });
7805
7826
  });
7806
7827
  }
7807
- function Py(e5, t2) {
7828
+ function Ly(e5, t2) {
7808
7829
  var n2, r2, i2, a2;
7809
7830
  let o2 = Q_(e5.inner), s2 = Q_(e5.outer), c2 = ev(o2, s2, t2), l2 = { ...e5, cross_aspects: c2 };
7810
- zv(sy, l2, $y, eb, Uy, qy()), jy || kv(false);
7831
+ zv(uy, l2, nb, rb, Ky, Xy()), Py || kv(false);
7811
7832
  let u2 = (r2 = (i2 = (a2 = ((n2 = l2.inner_houses) == null ? [] : n2)[0]) == null ? void 0 : a2.cusp_lon) == null ? l2.ascendant : i2) == null ? 0 : r2;
7812
- Zy(Nv(c2), o2, s2, u2);
7833
+ eb(Nv(c2), o2, s2, u2);
7813
7834
  }
7814
- var Fy = null;
7815
- function Iy(e5) {
7816
- Fy = e5, e5 ? sy.setAttribute("data-focus", e5) : sy.removeAttribute("data-focus"), ly.querySelectorAll(".mode-badge-name").forEach((t2) => {
7835
+ var Ry = null;
7836
+ function zy(e5) {
7837
+ Ry = e5, e5 ? uy.setAttribute("data-focus", e5) : uy.removeAttribute("data-focus"), fy.querySelectorAll(".mode-badge-name").forEach((t2) => {
7817
7838
  let n2 = t2.dataset.focus;
7818
7839
  t2.classList.toggle("focused", n2 === e5);
7819
- }), $ && Hy($, e5);
7840
+ }), $ && Gy($, e5);
7820
7841
  }
7821
- function Ly(e5) {
7842
+ function By(e5) {
7822
7843
  var t2, n2, r2, i2, a2, o2, s2;
7823
7844
  let c2 = (t2 = e5.mode) == null ? "synastry" : t2, l2 = (n2 = (r2 = e5._birth_params_inner) == null ? void 0 : r2.location) == null ? "Person 1" : n2, u2 = (i2 = (a2 = e5._birth_params_outer) == null ? void 0 : a2.location) == null ? c2 === "transit" ? "Transits" : "Person 2" : i2;
7824
- Fy = null, sy.removeAttribute("data-focus");
7845
+ Ry = null, uy.removeAttribute("data-focus");
7825
7846
  let d2 = "";
7826
7847
  if (c2 === "transit" && (o2 = e5._birth_params_outer) != null && o2.datetime) try {
7827
- let t3 = new Date(e5._birth_params_outer.datetime);
7828
- isNaN(t3.getTime()) || (d2 = '<span class="mode-badge-date">'.concat(Dy(t3.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" })), "</span>"));
7848
+ let t3 = Kv(e5._birth_params_outer.datetime, e5._birth_params_outer.timezone);
7849
+ t3 && (d2 = '<span class="mode-badge-date">'.concat(Ay(t3.date.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", timeZone: t3.timeZone })), "</span>"));
7829
7850
  } catch (e6) {
7830
7851
  }
7831
- ly.innerHTML = '\n <button class="mode-badge-name inner-name" data-focus="inner" title="Click to focus inner (natal) wheel">\n <span class="mode-badge-dot-inner"></span>'.concat(Dy(l2), '\n </button>\n <button class="mode-badge-swap" title="Toggle focus">\u21C4</button>\n <button class="mode-badge-name outer-name" data-focus="outer" title="Click to focus outer (').concat(c2, ') wheel">\n <span class="mode-badge-dot-outer"></span>').concat(Dy(u2), "\n </button>\n ").concat(d2), ly.querySelectorAll(".mode-badge-name").forEach((e6) => {
7852
+ fy.innerHTML = '\n <button class="mode-badge-name inner-name" data-focus="inner" title="Click to focus inner (natal) wheel">\n <span class="mode-badge-dot-inner"></span>'.concat(Ay(l2), '\n </button>\n <button class="mode-badge-swap" title="Toggle focus">\u21C4</button>\n <button class="mode-badge-name outer-name" data-focus="outer" title="Click to focus outer (').concat(c2, ') wheel">\n <span class="mode-badge-dot-outer"></span>').concat(Ay(u2), "\n </button>\n ").concat(d2), fy.querySelectorAll(".mode-badge-name").forEach((e6) => {
7832
7853
  e6.addEventListener("click", () => {
7833
7854
  let t3 = e6.dataset.focus;
7834
- Iy(Fy === t3 ? null : t3);
7855
+ zy(Ry === t3 ? null : t3);
7835
7856
  });
7836
- }), (s2 = ly.querySelector(".mode-badge-swap")) == null || s2.addEventListener("click", () => {
7837
- Iy(Fy === "inner" ? "outer" : "inner");
7857
+ }), (s2 = fy.querySelector(".mode-badge-swap")) == null || s2.addEventListener("click", () => {
7858
+ zy(Ry === "inner" ? "outer" : "inner");
7838
7859
  });
7839
7860
  }
7840
- var Ry = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], zy = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", asc: "AC", mc: "MC" };
7841
- function By(e5, t2) {
7861
+ var Vy = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], Hy = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", asc: "AC", mc: "MC" };
7862
+ function Uy(e5, t2) {
7842
7863
  var n2, r2;
7843
7864
  let i2 = e5.find((e6) => e6.name.toLowerCase() === t2);
7844
7865
  if (!i2) return "\u2014";
7845
7866
  let a2 = Math.floor((i2.longitude % 360 + 360) % 360 / 30), o2 = Math.floor(i2.longitude % 30);
7846
- return "".concat((n2 = zy[t2]) == null ? t2 : n2, " ").concat(o2, "\xB0 ").concat((r2 = Ry[a2]) == null ? "" : r2);
7867
+ return "".concat((n2 = Hy[t2]) == null ? t2 : n2, " ").concat(o2, "\xB0 ").concat((r2 = Vy[a2]) == null ? "" : r2);
7847
7868
  }
7848
- function Vy(e5, t2) {
7869
+ function Wy(e5, t2) {
7849
7870
  try {
7850
- let n2 = new Date(e5);
7851
- if (isNaN(n2.getTime())) return e5;
7852
- let r2 = { timeZone: t2 || "UTC" };
7853
- return n2.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", ...r2 }) + " \xB7 " + n2.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit", hour12: true, ...r2 });
7871
+ let n2 = Kv(e5, t2);
7872
+ if (!n2) return e5;
7873
+ let { date: r2, timeZone: i2 } = n2;
7874
+ return r2.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", timeZone: i2 }) + " \xB7 " + r2.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit", hour12: true, timeZone: i2 });
7854
7875
  } catch (t3) {
7855
7876
  return e5;
7856
7877
  }
7857
7878
  }
7858
- function Hy(e5, t2) {
7879
+ function Gy(e5, t2) {
7859
7880
  var n2, r2, i2, a2, o2;
7860
- if (!fy) return;
7861
- let s2 = t2 == null ? "inner" : t2, c2 = s2 === "inner" ? e5.inner : e5.outer, l2 = s2 === "inner" ? e5._birth_params_inner : e5._birth_params_outer, u2 = (n2 = e5.mode) == null ? "synastry" : n2, d2 = (r2 = l2 == null ? void 0 : l2.location) == null ? s2 === "inner" ? "Inner chart" : u2 === "transit" ? "Transits" : "Outer chart" : r2, f2 = (i2 = l2 == null ? void 0 : l2.timezone) == null ? null : i2, p2 = l2 != null && l2.datetime ? Vy(l2.datetime, f2) : null, m2 = s2 === "inner" ? e5.inner_houses : (a2 = e5.outer_houses) == null ? [] : a2, h2 = (o2 = e5.house_system) == null ? m2.length > 0 ? "Placidus" : null : o2, g2 = By(c2, "sun"), _2 = By(c2, "moon"), v2 = By(c2, "asc");
7881
+ if (!hy) return;
7882
+ let s2 = t2 == null ? "inner" : t2, c2 = s2 === "inner" ? e5.inner : e5.outer, l2 = s2 === "inner" ? e5._birth_params_inner : e5._birth_params_outer, u2 = (n2 = e5.mode) == null ? "synastry" : n2, d2 = (r2 = l2 == null ? void 0 : l2.location) == null ? s2 === "inner" ? "Inner chart" : u2 === "transit" ? "Transits" : "Outer chart" : r2, f2 = (i2 = l2 == null ? void 0 : l2.timezone) == null ? null : i2, p2 = l2 != null && l2.datetime ? Wy(l2.datetime, f2) : null, m2 = s2 === "inner" ? e5.inner_houses : (a2 = e5.outer_houses) == null ? [] : a2, h2 = (o2 = e5.house_system) == null ? m2.length > 0 ? "Placidus" : null : o2, g2 = Uy(c2, "sun"), _2 = Uy(c2, "moon"), v2 = Uy(c2, "asc");
7862
7883
  if (v2 === "AC \u2014" && m2.length > 0) {
7863
7884
  let e6 = m2.find((e7) => e7.number === 1);
7864
7885
  if (e6) {
7865
7886
  var y2;
7866
7887
  let t3 = Math.floor((e6.cusp_lon % 360 + 360) % 360 / 30);
7867
- v2 = "AC ".concat(Math.floor(e6.cusp_lon % 30), "\xB0 ").concat((y2 = Ry[t3]) == null ? "" : y2);
7888
+ v2 = "AC ".concat(Math.floor(e6.cusp_lon % 30), "\xB0 ").concat((y2 = Vy[t3]) == null ? "" : y2);
7868
7889
  }
7869
7890
  }
7870
7891
  let b2 = s2 === "outer" && u2 === "transit" ? "Transit" : s2 === "outer" ? "Synastry" : "Natal";
7871
- fy.innerHTML = '\n <div class="prov-name">'.concat(Dy(d2), '\n <span class="prov-mode-tag">').concat(Dy(b2), '</span>\n </div>\n <div class="prov-trio">\n <span class="prov-planet">').concat(Dy(g2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(Dy(_2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(Dy(v2), "</span>\n </div>\n ").concat(p2 ? '<div class="prov-meta">'.concat(Dy(p2)).concat(f2 ? ' <span class="prov-tz">'.concat(Dy(f2), "</span>") : "", "</div>") : "", "\n ").concat(h2 ? '<div class="prov-meta">'.concat(Dy(h2), " houses</div>") : "", "\n "), fy.hidden = false;
7892
+ hy.innerHTML = '\n <div class="prov-name">'.concat(Ay(d2), '\n <span class="prov-mode-tag">').concat(Ay(b2), '</span>\n </div>\n <div class="prov-trio">\n <span class="prov-planet">').concat(Ay(g2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(Ay(_2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(Ay(v2), "</span>\n </div>\n ").concat(p2 ? '<div class="prov-meta">'.concat(Ay(p2)).concat(f2 ? ' <span class="prov-tz">'.concat(Ay(f2), "</span>") : "", "</div>") : "", "\n ").concat(h2 ? '<div class="prov-meta">'.concat(Ay(h2), " houses</div>") : "", "\n "), hy.hidden = false;
7872
7893
  }
7873
- async function Uy(e5) {
7894
+ async function Ky(e5) {
7874
7895
  var t2;
7875
7896
  let n2 = (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2, r2 = "";
7876
7897
  if (e5.type === "planet") {
@@ -7896,31 +7917,37 @@ async function Uy(e5) {
7896
7917
  let t3 = e5.data, i3 = (m2 = t3.planets) == null ? [] : m2, a3 = n2 === "transit" ? "natal" : "inner", o3 = n2 === "transit" ? "transit" : "outer", s3 = i3.length > 0 ? i3.map((e6) => "".concat(e6.name, " (").concat(e6.wheel === "inner" ? a3 : o3, ")")).join(", ") : "the involved planets";
7897
7918
  r2 = "Interpret the ".concat(String(t3.name), " forming in this ").concat(n2, " bi-wheel involving ").concat(s3, ". ") + (t3.description ? "".concat(String(t3.description), ". ") : "") + "This is a cross-chart pattern \u2014 it spans both wheels, so the meaning lives in the interaction between the ".concat(a3, " foundation and the ").concat(o3, " activation. Give a rich interpretation covering: (1) the core dynamic this pattern creates, (2) how the ").concat(a3, " planets set the stage, (3) what the ").concat(o3, " planets activate or challenge, (4) the psychological theme and practical expression").concat(n2 === "transit" ? ", and (5) timing \u2014 what to do with this energy now" : "", ".");
7898
7919
  }
7899
- r2 && await Oy(r2);
7920
+ if (!r2) return;
7921
+ let h2 = qv($ == null ? void 0 : $._birth_params_inner), g2 = qv($ == null ? void 0 : $._birth_params_outer);
7922
+ if (h2 || g2) {
7923
+ let e6 = n2 === "transit" ? "Natal" : "Inner wheel", t3 = n2 === "transit" ? "Transits" : "Outer wheel";
7924
+ r2 = "".concat([h2 ? "".concat(e6, ": ").concat(h2) : "", g2 ? "".concat(t3, ": ").concat(g2) : ""].filter(Boolean).join("\n"), "\n\n").concat(r2);
7925
+ }
7926
+ await jy(r2);
7900
7927
  }
7901
- async function Wy() {
7928
+ async function qy() {
7902
7929
  var e5, t2, n2, r2, i2, a2, o2, s2;
7903
7930
  if (!$) return;
7904
7931
  let c2 = $, l2 = (e5 = c2.mode) == null ? "synastry" : e5, u2 = String((t2 = (n2 = c2._birth_params_inner) == null ? void 0 : n2.location) == null ? "Person 1" : t2), d2 = l2 === "transit" ? "transits (".concat(String((r2 = (i2 = c2._birth_params_outer) == null ? void 0 : i2.location) == null ? "today" : r2), ")") : String((a2 = (o2 = c2._birth_params_outer) == null ? void 0 : o2.location) == null ? "Person 2" : a2), f2 = ((s2 = c2.cross_aspects) == null ? [] : s2).slice(0, 8).map((e6) => " \u2022 ".concat(e6.planet1, " ").concat(e6.type, " ").concat(e6.planet2, " (").concat(e6.orb.toFixed(1), "\xB0").concat(e6.applying === void 0 ? "" : ", ".concat(e6.applying ? "applying" : "separating"), ")")).join("\n") || " \u2022 No cross-aspects within orb";
7905
- await Oy(l2 === "transit" ? "Please interpret this transit chart for ".concat(u2, ".\n\nKey transit cross-aspects:\n").concat(f2, "\n\nCover: (1) The most significant active transits and their themes, (2) Timing \u2014 what's applying vs separating, (3) Practical guidance \u2014 what to focus on now, (4) The overall energetic signature of this moment in time.") : "Please interpret this synastry bi-wheel between ".concat(u2, " and ").concat(d2, ".\n\nTop cross-wheel aspects:\n").concat(f2, "\n\nCover: (1) The core relational dynamic and overall compatibility theme, (2) The most significant planet-to-planet contacts and their meaning, (3) Areas of natural ease vs creative tension, (4) How each person experiences the other energetically."));
7932
+ await jy(l2 === "transit" ? "Please interpret this transit chart for ".concat(u2, ".\n\nKey transit cross-aspects:\n").concat(f2, "\n\nCover: (1) The most significant active transits and their themes, (2) Timing \u2014 what's applying vs separating, (3) Practical guidance \u2014 what to focus on now, (4) The overall energetic signature of this moment in time.") : "Please interpret this synastry bi-wheel between ".concat(u2, " and ").concat(d2, ".\n\nTop cross-wheel aspects:\n").concat(f2, "\n\nCover: (1) The core relational dynamic and overall compatibility theme, (2) The most significant planet-to-planet contacts and their meaning, (3) Areas of natural ease vs creative tension, (4) How each person experiences the other energetically."));
7906
7933
  }
7907
- async function Gy() {
7934
+ async function Jy() {
7908
7935
  var e5, t2, n2, r2, i2, a2;
7909
7936
  if (!$) return;
7910
7937
  let o2 = $, s2 = (e5 = o2.mode) == null ? "synastry" : e5, c2 = String((t2 = (n2 = o2._birth_params_inner) == null ? void 0 : n2.location) == null ? "Person 1" : t2), l2 = s2 === "transit" ? "today's transits" : String((r2 = (i2 = o2._birth_params_outer) == null ? void 0 : i2.location) == null ? "Person 2" : r2), u2 = ((a2 = o2.cross_aspects) == null ? [] : a2).slice(0, 6).map((e6) => "".concat(e6.planet1, " ").concat(e6.type, " ").concat(e6.planet2, " (").concat(e6.orb.toFixed(1), "\xB0)")).join(", ") || "none detected";
7911
- await Oy(s2 === "transit" ? "I'm exploring a transit chart for ".concat(c2, ". The active cross-aspects include: ").concat(u2, ".\n\nBased on these transits, please suggest 3-4 specific, insightful questions I could ask to understand this moment \u2014 such as what each transit means for different life areas, timing, or how to work with the energy consciously. Present each as a tappable question I can ask you.") : "I'm exploring a synastry chart between ".concat(c2, " and ").concat(l2, ". The key cross-wheel contacts include: ").concat(u2, ".\n\nBased on these connections, please suggest 3-4 specific, insightful questions I could ask to understand this relationship dynamic \u2014 such as what specific aspects mean, areas of natural ease or tension, or how these two charts interact. Present each as a tappable question I can ask you."));
7938
+ await jy(s2 === "transit" ? "I'm exploring a transit chart for ".concat(c2, ". The active cross-aspects include: ").concat(u2, ".\n\nBased on these transits, please suggest 3-4 specific, insightful questions I could ask to understand this moment \u2014 such as what each transit means for different life areas, timing, or how to work with the energy consciously. Present each as a tappable question I can ask you.") : "I'm exploring a synastry chart between ".concat(c2, " and ").concat(l2, ". The key cross-wheel contacts include: ").concat(u2, ".\n\nBased on these connections, please suggest 3-4 specific, insightful questions I could ask to understand this relationship dynamic \u2014 such as what specific aspects mean, areas of natural ease or tension, or how these two charts interact. Present each as a tappable question I can ask you."));
7912
7939
  }
7913
- async function Ky(e5) {
7914
- if (_y) try {
7940
+ async function Yy(e5) {
7941
+ if (by) try {
7915
7942
  var t2;
7916
- await hy.updateModelContext({ content: [{ type: "text", text: "User selected ".concat(e5.type, ": ").concat(JSON.stringify(e5.data, null, 2), "\nMode: ").concat((t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2) }] });
7943
+ await vy.updateModelContext({ content: [{ type: "text", text: "User selected ".concat(e5.type, ": ").concat(JSON.stringify(e5.data, null, 2), "\nMode: ").concat((t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2) }] });
7917
7944
  } catch (e6) {
7918
7945
  }
7919
7946
  }
7920
- function qy() {
7921
- if (vy) return async (e5) => {
7947
+ function Xy() {
7948
+ if (xy) return async (e5) => {
7922
7949
  var t2;
7923
- let n2 = await hy.createSamplingMessage({ maxTokens: 150, systemPrompt: "You are an expert astrologer interpreting a ".concat(($ == null ? void 0 : $.mode) === "synastry" ? "synastry (relationship)" : "".concat((t2 = $ == null ? void 0 : $.mode) == null ? "transit" : t2, " (planetary weather)"), " chart. Give a focused, mode-appropriate interpretation. Insightful and concise."), messages: [{ role: "user", content: { type: "text", text: e5 } }] });
7950
+ let n2 = await vy.createSamplingMessage({ maxTokens: 150, systemPrompt: "You are an expert astrologer interpreting a ".concat(($ == null ? void 0 : $.mode) === "synastry" ? "synastry (relationship)" : "".concat((t2 = $ == null ? void 0 : $.mode) == null ? "transit" : t2, " (planetary weather)"), " chart. Give a focused, mode-appropriate interpretation. Insightful and concise."), messages: [{ role: "user", content: { type: "text", text: e5 } }] });
7924
7951
  if (n2.isError) {
7925
7952
  var r2, i2;
7926
7953
  throw Error((r2 = (i2 = n2.error) == null ? void 0 : i2.message) == null ? "Sampling failed" : r2);
@@ -7930,133 +7957,133 @@ function qy() {
7930
7957
  throw Error("Unexpected sampling response format");
7931
7958
  };
7932
7959
  }
7933
- function Jy(e5) {
7960
+ function Zy(e5) {
7934
7961
  var t2, n2, r2, i2, a2, o2, s2;
7935
- $ = e5, clearTimeout(nb), Ly(e5), zv(sy, e5, $y, eb, Uy, qy()), Ny(), Hy(e5, Fy);
7962
+ $ = e5, clearTimeout(ab), By(e5), zv(uy, e5, nb, rb, Ky, Xy()), Iy(), Gy(e5, Ry);
7936
7963
  let c2 = Q_(e5.inner), l2 = Q_(e5.outer), u2 = (n2 = (r2 = (i2 = ((t2 = e5.inner_houses) == null ? [] : t2)[0]) == null ? void 0 : i2.cusp_lon) == null ? e5.ascendant : r2) == null ? 0 : n2;
7937
- Zy(Nv((a2 = e5.cross_aspects) == null ? [] : a2), c2, l2, u2), e5.house_system && (yy = e5.house_system);
7964
+ eb(Nv((a2 = e5.cross_aspects) == null ? [] : a2), c2, l2, u2), e5.house_system && (Sy = e5.house_system);
7938
7965
  let d2 = document.getElementById("bi-action-bar");
7939
7966
  if (!d2) {
7940
7967
  d2 = document.createElement("div"), d2.id = "bi-action-bar", d2.className = "hd-action-bar";
7941
7968
  let e6 = document.querySelector("#fs-bottom-bar [data-column='right']");
7942
7969
  if (e6) e6.appendChild(d2);
7943
7970
  else {
7944
- let e7 = document.getElementById("app"), t3 = ly.parentElement === e7 ? ly : null;
7971
+ let e7 = document.getElementById("app"), t3 = fy.parentElement === e7 ? fy : null;
7945
7972
  e7 == null || e7.insertBefore(d2, t3);
7946
7973
  }
7947
7974
  }
7948
- d2.innerHTML = '\n <button class="action-btn action-btn--primary" id="bi-interpret-btn">\u2728 Interpret this chart</button>\n <button class="action-btn" id="bi-questions-btn">\u{1F52E} What should I ask?</button>\n ', (o2 = d2.querySelector("#bi-interpret-btn")) == null || o2.addEventListener("click", () => void Wy()), (s2 = d2.querySelector("#bi-questions-btn")) == null || s2.addEventListener("click", () => void Gy()), Cy(), Ty(), $v("bi-wheel");
7975
+ d2.innerHTML = '\n <button class="action-btn action-btn--primary" id="bi-interpret-btn">\u2728 Interpret this chart</button>\n <button class="action-btn" id="bi-questions-btn">\u{1F52E} What should I ask?</button>\n ', (o2 = d2.querySelector("#bi-interpret-btn")) == null || o2.addEventListener("click", () => void qy()), (s2 = d2.querySelector("#bi-questions-btn")) == null || s2.addEventListener("click", () => void Jy()), Ey(), Oy(), ny("bi-wheel");
7949
7976
  }
7950
- var Yy = null, Xy = { "Cross Trine": "#52a8e0", "Cross T-Square": "#e08a52", "Cross Stellium": "#9a7fd4" };
7951
- function Zy(e5, t2, n2, r2) {
7952
- if (!py) return;
7977
+ var Qy = null, $y = { "Cross Trine": "#52a8e0", "Cross T-Square": "#e08a52", "Cross Stellium": "#9a7fd4" };
7978
+ function eb(e5, t2, n2, r2) {
7979
+ if (!gy) return;
7953
7980
  if (e5.length === 0) {
7954
- py.hidden = true, py.innerHTML = "";
7981
+ gy.hidden = true, gy.innerHTML = "";
7955
7982
  return;
7956
7983
  }
7957
- Yy = null, py.innerHTML = '\n <span class="patterns-label">Cross-Patterns:</span>\n '.concat(e5.map((e6, t3) => {
7984
+ Qy = null, gy.innerHTML = '\n <span class="patterns-label">Cross-Patterns:</span>\n '.concat(e5.map((e6, t3) => {
7958
7985
  var n3;
7959
- let r3 = (n3 = Xy[e6.name]) == null ? "#888" : n3;
7986
+ let r3 = (n3 = $y[e6.name]) == null ? "#888" : n3;
7960
7987
  return '<button class="pattern-pill"\n data-idx="'.concat(t3, '"\n data-color="').concat(r3, '"\n style="color:').concat(r3, ";border-color:").concat(r3, '"\n title="').concat(e6.description, '">\n ').concat(e6.name, '\n <span class="pattern-pill-detail">').concat(e6.description, "</span>\n </button>");
7961
- }).join(""), "\n "), py.removeAttribute("hidden");
7988
+ }).join(""), "\n "), gy.removeAttribute("hidden");
7962
7989
  let i2 = document.createElement("button");
7963
- i2.className = "pattern-ask-claude-btn", i2.textContent = "\u2728 Ask Claude", i2.style.display = "none", py.appendChild(i2), i2.addEventListener("click", () => {
7990
+ i2.className = "pattern-ask-claude-btn", i2.textContent = "\u2728 Interpret", i2.style.display = "none", gy.appendChild(i2), i2.addEventListener("click", () => {
7964
7991
  var t3;
7965
- let n3 = Yy;
7992
+ let n3 = Qy;
7966
7993
  if (n3 === null) return;
7967
7994
  let r3 = e5[n3];
7968
- r3 && (i2.disabled = true, i2.textContent = "\u23F3 Sending\u2026", Uy({ type: "pattern", data: { name: r3.name, planets: r3.planets, description: (t3 = r3.description) == null ? "" : t3 } }).then(() => {
7995
+ r3 && (i2.disabled = true, i2.textContent = "\u23F3 Sending\u2026", Ky({ type: "pattern", data: { name: r3.name, planets: r3.planets, description: (t3 = r3.description) == null ? "" : t3 } }).then(() => {
7969
7996
  i2.textContent = "\u2713 Sent", setTimeout(() => {
7970
- i2.textContent = "\u2728 Ask Claude", i2.disabled = false;
7997
+ i2.textContent = "\u2728 Interpret", i2.disabled = false;
7971
7998
  }, 2500);
7972
7999
  }).catch(() => {
7973
8000
  i2.textContent = "\u26A0 Failed", i2.disabled = false;
7974
8001
  }));
7975
- }), py.querySelectorAll(".pattern-pill").forEach((a2) => {
8002
+ }), gy.querySelectorAll(".pattern-pill").forEach((a2) => {
7976
8003
  a2.addEventListener("click", () => {
7977
8004
  var o2, s2;
7978
8005
  let c2 = parseInt((o2 = a2.dataset.idx) == null ? "-1" : o2, 10), l2 = e5[c2];
7979
8006
  if (!l2) return;
7980
8007
  let u2 = (s2 = a2.dataset.color) == null ? "#888" : s2;
7981
- if (Yy === c2) {
7982
- Yy = null, a2.classList.remove("active"), a2.style.background = "transparent", a2.style.color = u2, a2.style.borderColor = u2, Ov(), Lv(), i2.style.display = "none";
8008
+ if (Qy === c2) {
8009
+ Qy = null, a2.classList.remove("active"), a2.style.background = "transparent", a2.style.color = u2, a2.style.borderColor = u2, Ov(), Lv(), i2.style.display = "none";
7983
8010
  return;
7984
8011
  }
7985
- Yy = c2, py.querySelectorAll(".pattern-pill").forEach((e6) => {
8012
+ Qy = c2, gy.querySelectorAll(".pattern-pill").forEach((e6) => {
7986
8013
  var t3;
7987
8014
  e6.classList.remove("active");
7988
8015
  let n3 = (t3 = e6.dataset.color) == null ? "#888" : t3;
7989
8016
  e6.style.color = n3, e6.style.borderColor = n3, e6.style.background = "transparent";
7990
- }), a2.classList.add("active"), a2.style.background = u2, a2.style.color = "#fff", a2.style.borderColor = u2, Rv(l2), Lv(), Iv(l2, t2, n2, r2), i2.style.display = "", i2.textContent = "\u2728 Ask Claude", i2.disabled = false;
8017
+ }), a2.classList.add("active"), a2.style.background = u2, a2.style.color = "#fff", a2.style.borderColor = u2, Rv(l2), Lv(), Iv(l2, t2, n2, r2), i2.style.display = "", i2.textContent = "\u2728 Interpret", i2.disabled = false;
7991
8018
  });
7992
8019
  });
7993
8020
  }
7994
- async function Qy(e5) {
8021
+ async function tb(e5) {
7995
8022
  if (!$) return;
7996
8023
  let t2 = $;
7997
- wy();
8024
+ Dy();
7998
8025
  try {
7999
8026
  var n2, r2, i2, a2, o2, s2, c2, l2, u2, d2;
8000
- let f2 = new Promise((e6, t3) => setTimeout(() => t3(Error("House system recalculate timed out")), 3e4)), p2 = ky(await Promise.race([hy.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n2 = t2._birth_params_inner) == null ? void 0 : n2.datetime, person1_latitude: (r2 = t2._birth_params_inner) == null ? void 0 : r2.latitude, person1_longitude: (i2 = t2._birth_params_inner) == null ? void 0 : i2.longitude, person1_timezone: (a2 = t2._birth_params_inner) == null ? void 0 : a2.timezone, person1_name: (o2 = t2._birth_params_inner) == null ? void 0 : o2.location, person2_datetime: (s2 = t2._birth_params_outer) == null ? void 0 : s2.datetime, person2_latitude: (c2 = t2._birth_params_outer) == null ? void 0 : c2.latitude, person2_longitude: (l2 = t2._birth_params_outer) == null ? void 0 : l2.longitude, person2_timezone: (u2 = t2._birth_params_outer) == null ? void 0 : u2.timezone, person2_name: (d2 = t2._birth_params_outer) == null ? void 0 : d2.location, house_system: e5 } }), f2]));
8001
- p2 ? Jy(p2) : $ && Cy();
8027
+ let f2 = new Promise((e6, t3) => setTimeout(() => t3(Error("House system recalculate timed out")), 3e4)), p2 = My(await Promise.race([vy.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n2 = t2._birth_params_inner) == null ? void 0 : n2.datetime, person1_latitude: (r2 = t2._birth_params_inner) == null ? void 0 : r2.latitude, person1_longitude: (i2 = t2._birth_params_inner) == null ? void 0 : i2.longitude, person1_timezone: (a2 = t2._birth_params_inner) == null ? void 0 : a2.timezone, person1_name: (o2 = t2._birth_params_inner) == null ? void 0 : o2.location, person2_datetime: (s2 = t2._birth_params_outer) == null ? void 0 : s2.datetime, person2_latitude: (c2 = t2._birth_params_outer) == null ? void 0 : c2.latitude, person2_longitude: (l2 = t2._birth_params_outer) == null ? void 0 : l2.longitude, person2_timezone: (u2 = t2._birth_params_outer) == null ? void 0 : u2.timezone, person2_name: (d2 = t2._birth_params_outer) == null ? void 0 : d2.location, house_system: e5 } }), f2]));
8028
+ p2 ? Zy(p2) : $ && Ey();
8002
8029
  } catch (e6) {
8003
- console.error("[BiWheel] House system recalculate failed:", e6), $ && Cy();
8030
+ console.error("[BiWheel] House system recalculate failed:", e6), $ && Ey();
8004
8031
  }
8005
8032
  }
8006
- function $y(e5, t2, n2) {
8033
+ function nb(e5, t2, n2) {
8007
8034
  var r2, i2, a2, o2, s2;
8008
8035
  let c2 = Math.floor((e5.longitude % 360 + 360) % 360 / 30), l2 = (r2 = (i2 = e5.sign) == null ? ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"][c2] : i2) == null ? "Unknown" : r2;
8009
- Ky({ type: "planet", data: { planet_name: e5.name, wheel: t2, longitude: e5.longitude, sign: l2, position: "".concat(Math.floor(e5.longitude % 30), "\xB0 ").concat(l2), house: (a2 = e5.house) == null ? null : a2, retrograde: (o2 = e5.retrograde) == null ? false : o2, mode: (s2 = $ == null ? void 0 : $.mode) == null ? "synastry" : s2, cross_aspects: n2.filter((n3) => t2 === "inner" && n3.planet1 === e5.name || t2 === "outer" && n3.planet2 === e5.name).slice(0, 5).map((e6) => ({ type: e6.type, partner: t2 === "inner" ? e6.planet2 : e6.planet1, orb: e6.orb, applying: e6.applying, orb_label: e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide" })) } });
8036
+ Yy({ type: "planet", data: { planet_name: e5.name, wheel: t2, longitude: e5.longitude, sign: l2, position: "".concat(Math.floor(e5.longitude % 30), "\xB0 ").concat(l2), house: (a2 = e5.house) == null ? null : a2, retrograde: (o2 = e5.retrograde) == null ? false : o2, mode: (s2 = $ == null ? void 0 : $.mode) == null ? "synastry" : s2, cross_aspects: n2.filter((n3) => t2 === "inner" && n3.planet1 === e5.name || t2 === "outer" && n3.planet2 === e5.name).slice(0, 5).map((e6) => ({ type: e6.type, partner: t2 === "inner" ? e6.planet2 : e6.planet1, orb: e6.orb, applying: e6.applying, orb_label: e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide" })) } });
8010
8037
  }
8011
- function eb(e5) {
8038
+ function rb(e5) {
8012
8039
  var t2;
8013
8040
  let n2 = $ == null ? void 0 : $.inner.find((t3) => t3.name === e5.planet1), r2 = $ == null ? void 0 : $.outer.find((t3) => t3.name === e5.planet2), i2 = n2 ? Math.floor((n2.longitude % 360 + 360) % 360 / 30) : NaN, a2 = r2 ? Math.floor((r2.longitude % 360 + 360) % 360 / 30) : NaN, o2 = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"];
8014
- Ky({ type: "cross_aspect", data: { planet1: e5.planet1, wheel1: e5.wheel1, planet2: e5.planet2, wheel2: e5.wheel2, aspect_type: e5.type, orb: e5.orb, applying: e5.applying, planet1_sign: isNaN(i2) ? null : o2[i2], planet2_sign: isNaN(a2) ? null : o2[a2], mode: (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2 } });
8041
+ Yy({ type: "cross_aspect", data: { planet1: e5.planet1, wheel1: e5.wheel1, planet2: e5.planet2, wheel2: e5.wheel2, aspect_type: e5.type, orb: e5.orb, applying: e5.applying, planet1_sign: isNaN(i2) ? null : o2[i2], planet2_sign: isNaN(a2) ? null : o2[a2], mode: (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2 } });
8015
8042
  }
8016
- hy.ontoolresult = (e5) => {
8017
- clearTimeout(nb);
8018
- let t2 = ky(e5);
8043
+ vy.ontoolresult = (e5) => {
8044
+ clearTimeout(ab);
8045
+ let t2 = My(e5);
8019
8046
  if (!t2) {
8020
- Ey("The chart didn't load. Tap to try again.", tb);
8047
+ ky("The chart didn't load. Tap to try again.", ib);
8021
8048
  return;
8022
8049
  }
8023
- if (!gy) {
8050
+ if (!yy) {
8024
8051
  var n2, r2, i2, a2;
8025
8052
  let e6 = (n2 = t2._birth_params_outer) == null ? {} : n2, o2 = (r2 = e6.datetime) == null ? "" : r2, s2 = (i2 = e6.location) == null ? "" : i2, c2 = (a2 = e6.timezone) == null ? "" : a2, l2 = e6.latitude, u2 = e6.longitude, d2 = "", f2 = "12:00";
8026
8053
  if (o2 && o2.includes("T")) {
8027
8054
  let e7 = o2.split("T");
8028
8055
  d2 = e7[0], f2 = e7[1].substring(0, 5);
8029
8056
  }
8030
- gy = new Gv({ app: hy, container: my, initialParams: { date: d2, time: f2, locationName: s2, timezone: c2, latitude: typeof l2 == "number" ? l2 : null, longitude: typeof u2 == "number" ? u2 : null }, showStepControls: t2.mode === "transit", costHint: "~2 credits", onRefresh: async (e7) => {
8031
- gy == null || gy.setBusy(true), wy(), my.setAttribute("hidden", "");
8057
+ yy = new Jv({ app: vy, container: _y, initialParams: { date: d2, time: f2, locationName: s2, timezone: c2, latitude: typeof l2 == "number" ? l2 : null, longitude: typeof u2 == "number" ? u2 : null }, showStepControls: t2.mode === "transit", costHint: "~2 credits", onRefresh: async (e7) => {
8058
+ yy == null || yy.setBusy(true), Dy(), _y.setAttribute("hidden", "");
8032
8059
  try {
8033
8060
  var n3, r3, i3, a3, o3;
8034
- let s3 = "".concat(e7.date, "T").concat(e7.time, ":00"), c3 = new Promise((e8, t3) => setTimeout(() => t3(Error("Bi-wheel recalculate timed out after 30s")), 3e4)), l3 = ky(await Promise.race([hy.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n3 = t2._birth_params_inner) == null ? void 0 : n3.datetime, person1_latitude: (r3 = t2._birth_params_inner) == null ? void 0 : r3.latitude, person1_longitude: (i3 = t2._birth_params_inner) == null ? void 0 : i3.longitude, person1_timezone: (a3 = t2._birth_params_inner) == null ? void 0 : a3.timezone, person1_name: (o3 = t2._birth_params_inner) == null ? void 0 : o3.location, person2_datetime: "".concat(s3).concat(e7.timezone ? "" : "Z"), person2_latitude: e7.latitude, person2_longitude: e7.longitude, person2_timezone: e7.timezone, person2_name: e7.locationName } }), c3]));
8035
- l3 ? Jy(l3) : $ && Cy();
8061
+ let s3 = "".concat(e7.date, "T").concat(e7.time, ":00"), c3 = new Promise((e8, t3) => setTimeout(() => t3(Error("Bi-wheel recalculate timed out after 30s")), 3e4)), l3 = My(await Promise.race([vy.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n3 = t2._birth_params_inner) == null ? void 0 : n3.datetime, person1_latitude: (r3 = t2._birth_params_inner) == null ? void 0 : r3.latitude, person1_longitude: (i3 = t2._birth_params_inner) == null ? void 0 : i3.longitude, person1_timezone: (a3 = t2._birth_params_inner) == null ? void 0 : a3.timezone, person1_name: (o3 = t2._birth_params_inner) == null ? void 0 : o3.location, person2_datetime: "".concat(s3).concat(e7.timezone ? "" : "Z"), person2_latitude: e7.latitude, person2_longitude: e7.longitude, person2_timezone: e7.timezone, person2_name: e7.locationName } }), c3]));
8062
+ l3 ? Zy(l3) : $ && Ey();
8036
8063
  } catch (e8) {
8037
- console.error("[BiWheel] Recalculate failed or timed out:", e8), $ && Cy();
8064
+ console.error("[BiWheel] Recalculate failed or timed out:", e8), $ && Ey();
8038
8065
  } finally {
8039
- gy == null || gy.setBusy(false), my.removeAttribute("hidden");
8066
+ yy == null || yy.setBusy(false), _y.removeAttribute("hidden");
8040
8067
  }
8041
8068
  } });
8042
8069
  }
8043
- Jy(t2), my.removeAttribute("hidden");
8070
+ Zy(t2), _y.removeAttribute("hidden");
8044
8071
  };
8045
- function tb() {
8046
- clearTimeout(nb), Sy(), nb = setTimeout(() => {
8047
- sy.hidden && Ey("The chart didn't load. Tap to try again.", tb);
8048
- }, 3e4), hy.sendMessage({ role: "user", content: [{ type: "text", text: "Please regenerate the bi-wheel chart." }] }).catch(() => {
8072
+ function ib() {
8073
+ clearTimeout(ab), Ty(), ab = setTimeout(() => {
8074
+ uy.hidden && ky("The chart didn't load. Tap to try again.", ib);
8075
+ }, 3e4), vy.sendMessage({ role: "user", content: [{ type: "text", text: "Please regenerate the bi-wheel chart." }] }).catch(() => {
8049
8076
  });
8050
8077
  }
8051
- var nb = setTimeout(() => {
8052
- sy.hidden && Ey("Chart data is taking longer than expected.", tb);
8078
+ var ab = setTimeout(() => {
8079
+ uy.hidden && ky("Chart data is taking longer than expected.", ib);
8053
8080
  }, 3e4);
8054
- Sy(), iy(hy, { loadingEl: cy, contentEl: sy, statusFn: xy, paramControls: () => gy }), (async () => {
8081
+ Ty(), sy(vy, { loadingEl: dy, contentEl: uy, statusFn: wy, paramControls: () => yy }), (async () => {
8055
8082
  try {
8056
- await hy.connect();
8057
- let e5 = hy.getHostCapabilities();
8058
- _y = !!(e5 != null && e5.modelContext), vy = !!(e5 != null && e5.sampling), ry(hy, document.getElementById("pan-zoom-controls"), ["mode-badge", "aspect-filter", "param-controls-container", "chart-provenance", "bi-patterns-strip", "bi-action-bar"]), oy(hy), h_(hy, () => {
8059
- $ && Jy($);
8083
+ await vy.connect();
8084
+ let e5 = vy.getHostCapabilities();
8085
+ by = !!(e5 != null && e5.modelContext), xy = !!(e5 != null && e5.sampling), oy(vy, document.getElementById("pan-zoom-controls"), ["mode-badge", "aspect-filter", "param-controls-container", "chart-provenance", "bi-patterns-strip", "bi-action-bar"]), ly(vy), h_(vy, () => {
8086
+ $ && Zy($);
8060
8087
  });
8061
8088
  } catch (e5) {
8062
8089
  console.error("[BiWheel] connect() failed:", e5);