diff --git a/static/app.js b/static/app.js
index 84dadee..699dee5 100644
--- a/static/app.js
+++ b/static/app.js
@@ -186,6 +186,7 @@ function filterChart(d) {
);
})();
let lastSyn = null;
+let synSwapped = false;
/* ---------------- tabs ---------------- */
document.querySelectorAll("#tabs button").forEach((b) =>
@@ -502,6 +503,7 @@ $("#syn-go").addEventListener("click", async () => {
});
const d = await res.json();
if (d.error) throw new Error(d.error);
+ synSwapped = false;
renderSynastry(d);
} catch (ex) {
err.textContent = ex.message;
@@ -534,9 +536,18 @@ function renderSynastry(d0, scroll = true) {
-
- Biwheel: ${esc(nameA)} outer · ${esc(nameB)} inner, in ${esc(nameA)}'s houses.
`;
- $("#syn-wheel").innerHTML = wheelSVG(d.chart_a, d.chart_b);
+ `;
+ const base = synSwapped ? d.chart_b : d.chart_a;
+ const over = synSwapped ? d.chart_a : d.chart_b;
+ const baseName = synSwapped ? nameB : nameA;
+ const overName = synSwapped ? nameA : nameB;
+ if (base.time_unknown && !over.time_unknown) {
+ $("#syn-legend").innerHTML = `${esc(baseName)}'s birth time is unknown — houses/rotation are its noon solar chart. Swap to frame by ${esc(overName)}.`;
+ } else {
+ $("#syn-legend").innerHTML =
+ `Biwheel: ${esc(baseName)} outer · ${esc(overName)} inner, in ${esc(baseName)}'s houses.`;
+ }
+ $("#syn-wheel").innerHTML = wheelSVG(base, over);
// inter-aspect grid: rows = A points, cols = B points
const cls = (a) => ({ Conjunction: "asp-gold", Opposition: "asp-red", Square: "asp-red", Trine: "asp-blue", Sextile: "asp-green" }[a.aspect] || "asp-dim");
@@ -568,6 +579,10 @@ function renderSynastry(d0, scroll = true) {
if (scroll) $("#syn-results").scrollIntoView({ behavior: "smooth" });
}
$("#syn-print").addEventListener("click", () => window.print());
+$("#syn-swap").addEventListener("click", () => {
+ synSwapped = !synSwapped;
+ if (lastSyn) renderSynastry(lastSyn, false);
+});
/* ---------------- aspect reference ---------------- */
(async function loadReference() {
diff --git a/static/index.html b/static/index.html
index a0c3765..b0f2b02 100644
--- a/static/index.html
+++ b/static/index.html
@@ -127,6 +127,10 @@
+
+
+
+
Inter-Aspect Grid (rows = first chart, columns = partner)
diff --git a/static/style.css b/static/style.css
index cf8245b..85c1857 100644
--- a/static/style.css
+++ b/static/style.css
@@ -140,6 +140,9 @@ td.dign { color: var(--gold); font-size: 12px; }
.gauge .lbl { font-size: 11px; color: var(--dim); text-transform: uppercase; letter-spacing: 1px; }
#syn-blendbar { flex: 1; min-width: 220px; height: 14px; border-radius: 7px; background: var(--red); overflow: hidden; }
#syn-blendbar div { height: 100%; background: linear-gradient(90deg, #5cc58a, #5fa8e0); }
+#syn-wheelbar { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 8px; font-size: 13px; color: var(--dim); }
+#syn-swap { font-size: 13px; padding: 6px 12px; background: #1a1a2e; }
+#syn-swap:hover { background: #262640; }
#syn-wheel svg { width: 100%; max-width: 720px; height: auto; display: block; margin: 0 auto; }
#syn-grid th { color: var(--gold); }
#syn-grid td, #syn-grid th { text-align: center; padding: 4px 6px; min-width: 30px; }
@@ -152,7 +155,7 @@ td.dign { color: var(--gold); font-size: 12px; }
@media print {
body { background: #fff; color: #000; font-size: 12px; }
- header, #form-card, #tabs, footer, #print-btn, #toolbar, #layers, #syn-picker, #syn-print { display: none !important; }
+ header, #form-card, #tabs, footer, #print-btn, #toolbar, #layers, #syn-picker, #syn-print, #syn-swap { display: none !important; }
#results { border: none; background: none; }
.tab { display: block !important; }
#report .item b, #report h4, h3 { color: #000; }