@openephemeris/mcp-server 3.13.8 → 3.13.9

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.
@@ -7,15 +7,20 @@
7
7
  <title>Chart Wheel Explorer</title>
8
8
 
9
9
 
10
- <style>:root{--bg:#010203;--surface:#040609;--surface-2:#0b0d13;--border:#13161d;--border-strong:#242932;--text:#e2e4e9;--text-secondary:#777a80;--gold:#cc9c42;--gold-dim:#7b6540;--gold-glow:rgba(204,156,66,.2);--gold-subtle:rgba(204,156,66,.1);--success:#1da871;--error:#c53443;--radius:10px;--radius-sm:6px;--radius-pill:99px;--shadow:0 4px 20px rgba(0,0,0,.45);--shadow-md:0 8px 40px rgba(0,0,0,.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 0 2px var(--gold-glow), 0 6px 24px rgba(0,0,0,.5);--planet-sun:#e9ab2b;--planet-moon:#abb8d2;--planet-mercury:#37b880;--planet-venus:#de73bd;--planet-mars:#dd4d57;--planet-jupiter:#9886ed;--planet-saturn:#589194;--planet-uranus:#24c1c9;--planet-neptune:#2f8adc;--planet-pluto:#a97cc9;--aspect-conjunction:#e9ab2b;--aspect-opposition:#dd4d57;--aspect-trine:#37b880;--aspect-square:#dd4d57;--aspect-sextile:#2f8adc;--color-fire:#ec6d3d;--color-earth:#779e4b;--color-air:#17a9cb;--color-water:#8678c9;--color-cardinal:#d9525a;--color-fixed:#cc9c42;--color-mutable:#1da871}@supports (color:color(display-p3 0 0 0)){:root{--bg:color(display-p3 .00515318 .00655345 .0110262);--surface:color(display-p3 .0181758 .0222118 .0344746);--surface-2:color(display-p3 .0438795 .0516065 .0708656);--border:color(display-p3 .0763929 .0859556 .109705);--border-strong:color(display-p3 .146313 .159736 .192938);--text:color(display-p3 .889546 .895785 .910689);--text-secondary:color(display-p3 .470023 .47923 .50135);--gold:color(display-p3 .76996 .617341 .321369);--gold-dim:color(display-p3 .469305 .400291 .270966);--gold-glow:color(display-p3 .76996 .617341 .321369/.2);--gold-subtle:color(display-p3 .76996 .617341 .321369/.1);--success:color(display-p3 .313719 .651039 .459895);--error:color(display-p3 .710345 .252818 .279408);--shadow:0 4px 20px color(display-p3 0 0 0/.45);--shadow-md:0 8px 40px color(display-p3 0 0 0/.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 0 2px var(--gold-glow), 0 6px 24px color(display-p3 0 0 0/.5);--planet-sun:color(display-p3 .877131 .680603 .28424);--planet-moon:color(display-p3 .679472 .718322 .813586);--planet-mercury:color(display-p3 .376022 .713332 .518194);--planet-venus:color(display-p3 .815343 .471375 .72873);--planet-mars:color(display-p3 .803557 .340931 .357065);--planet-jupiter:color(display-p3 .584642 .526796 .904819);--planet-saturn:color(display-p3 .398313 .564522 .578019);--planet-uranus:color(display-p3 .364235 .746318 .77845);--planet-neptune:color(display-p3 .290256 .532943 .838196);--planet-pluto:color(display-p3 .635092 .494812 .769187);--aspect-conjunction:color(display-p3 .877131 .680603 .28424);--aspect-opposition:color(display-p3 .803557 .340931 .357065);--aspect-trine:color(display-p3 .376022 .713332 .518194);--aspect-square:color(display-p3 .803557 .340931 .357065);--aspect-sextile:color(display-p3 .290256 .532943 .838196);--color-fire:color(display-p3 .864679 .454605 .289251);--color-earth:color(display-p3 .496575 .613452 .334223);--color-air:color(display-p3 .308318 .651825 .781829);--color-water:color(display-p3 .515326 .47381 .767317);--color-cardinal:color(display-p3 .790049 .355864 .367143);--color-fixed:color(display-p3 .76996 .617341 .321369);--color-mutable:color(display-p3 .313719 .651039 .459895)}}@supports (color:lab(0% 0 0)){:root{--bg:lab(.455387% .00626594 -.517511);--surface:lab(1.54195% -.000223517 -1.4246);--surface-2:lab(3.66055% -.0193194 -3.00652);--border:lab(7.15581% -.0557452 -5.11242);--border-strong:lab(16.3845% -.109613 -6.65551);--text:lab(90.6942% -.142396 -2.26941);--text-secondary:lab(51.2352% -.205308 -3.76425);--gold:lab(67.5798% 11.9379 52.333);--gold-dim:lab(44.394% 5.21129 24.4453);--gold-glow:lab(67.5798% 11.9379 52.333/.2);--gold-subtle:lab(67.5798% 11.9379 52.333/.1);--success:lab(61.2436% -46.7762 18.3644);--error:lab(45.8893% 57.7361 27.393);--shadow:0 4px 20px lab(0% 0 0/.45);--shadow-md:0 8px 40px lab(0% 0 0/.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 0 2px var(--gold-glow), 0 6px 24px lab(0% 0 0/.5);--planet-sun:lab(74.5017% 15.8159 68.8514);--planet-moon:lab(74.277% -.405759 -14.8565);--planet-mercury:lab(67.0478% -46.5952 18.3141);--planet-venus:lab(62.9358% 49.4917 -19.8999);--planet-mars:lab(54.0218% 57.6814 26.7913);--planet-jupiter:lab(60.9189% 25.1968 -50.641);--planet-saturn:lab(56.5081% -18.8848 -7.8149);--planet-uranus:lab(71.0008% -37.5682 -15.4301);--planet-neptune:lab(55.2086% -4.9496 -50.4575);--planet-pluto:lab(58.8593% 28.4679 -33.3654);--aspect-conjunction:lab(74.5017% 15.8159 68.8514);--aspect-opposition:lab(54.0218% 57.6814 26.7913);--aspect-trine:lab(67.0478% -46.5952 18.3141);--aspect-square:lab(54.0218% 57.6814 26.7913);--aspect-sextile:lab(55.2086% -4.9496 -50.4575);--color-fire:lab(61.5466% 48.3829 50.2676);--color-earth:lab(60.647% -24.5491 38.2386);--color-air:lab(63.473% -27.3149 -28.2614);--color-water:lab(54.4132% 19.4196 -40.6625);--color-cardinal:lab(54.1324% 54.4527 25.0799);--color-fixed:lab(67.5798% 11.9379 52.333);--color-mutable:lab(61.2436% -46.7762 18.3644)}}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html,body{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;height:100%}body{background:var(--bg);color:var(--text);-webkit-user-select:none;-moz-user-select:none;user-select:none;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");font-family:Geist,Space Grotesk,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.5;overflow-x:hidden}#app{flex-direction:column;display:flex;position:relative}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:14px;display:flex}#loading-state[hidden]{display:none}#loading-state p{letter-spacing:.05em;text-transform:uppercase;font-size:12px}.spinner{border:2px solid var(--border-strong);border-top-color:var(--gold);border-radius:50%;width:32px;height:32px;animation:1.1s cubic-bezier(.4,0,.6,1) infinite spin}@keyframes spin{to{transform:rotate(360deg)}}#chart-container{aspect-ratio:1;justify-content:center;align-items:center;width:100%;max-height:520px;padding:8px;display:flex;position:relative}#chart-container[hidden]{display:none}#chart-container svg{width:100%;height:100%}#chart-info{background:var(--surface);border-top:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:5px;padding:6px 12px;display:flex}#chart-info[hidden]{display:none!important}.info-chip{color:var(--text-secondary);border-radius:var(--radius-pill);white-space:nowrap;letter-spacing:.03em;background:#13161c;background:color(display-p3 .0777944 .086043 .106387);background:lab(7.16788% -.0827834 -4.39059);align-items:center;gap:3px;padding:2px 8px;font-size:10px;font-weight:500;line-height:1.6;display:inline-flex}.info-chip.sect{color:var(--gold);background:var(--gold-subtle);font-weight:600}.hit-region{cursor:pointer;fill:transparent;stroke:transparent;transition:fill .15s,stroke .15s,opacity .2s}.hit-region:hover{fill:var(--gold-subtle);stroke:var(--gold-dim);stroke-width:1px;stroke-opacity:.5}.hit-region.planet-hit{rx:12px;ry:12px}.hit-region.planet-hit:not(.dim):hover{filter:drop-shadow(0 0 6px var(--gold-glow))}.hit-region.dim{opacity:.12}.hit-region.aspect-hit{stroke-width:13px}.hit-region.aspect-hit.highlight{stroke:var(--aspect-color,var(--gold-dim));stroke-opacity:.5}.info-panel{background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:var(--shadow-md);z-index:900;opacity:0;pointer-events:none;width:min(340px,92vw);padding:14px 16px 12px;transition:opacity .18s cubic-bezier(.16,1,.3,1);position:fixed}.info-panel.visible{opacity:1;pointer-events:all}.info-header{align-items:flex-start;gap:10px;margin-bottom:12px;display:flex}.info-glyph{text-align:center;flex-shrink:0;width:34px;font-size:28px;line-height:1}.info-title{color:var(--text);flex:1;font-size:13px;font-weight:700}.info-name-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.info-pos{color:var(--text-secondary);margin-top:2px;font-family:JetBrains Mono,Courier New,monospace;font-size:11px;font-weight:400}.retro{color:var(--error);font-style:normal}.info-close{cursor:pointer;color:var(--text-secondary);background:0 0;border:none;border-radius:4px;flex-shrink:0;padding:2px 4px;font-size:15px;line-height:1;transition:color .12s}.info-close:hover{color:var(--text)}.aspects-title{text-transform:uppercase;letter-spacing:.1em;color:var(--text-secondary);margin-bottom:6px;font-size:10px;font-weight:700}.aspects-list{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;flex-direction:column;gap:4px;max-height:140px;display:flex;overflow-y:auto}.aspects-list::-webkit-scrollbar{width:3px}.aspects-list::-webkit-scrollbar-track{background:0 0}.aspects-list::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}.aspect-row{align-items:center;gap:7px;padding:3px 0;font-size:12px;display:flex}.aspect-dot{border-radius:50%;flex-shrink:0;width:7px;height:7px}.aspect-sym{text-align:center;flex-shrink:0;width:16px;font-size:14px}.aspect-other{color:var(--text);flex:1}.aspect-meta{color:var(--text-secondary);white-space:nowrap;font-family:JetBrains Mono,monospace;font-size:11px}.no-aspects{color:var(--text-secondary);padding:4px 0;font-size:11px;font-style:italic}.info-hint{color:var(--gold-dim);letter-spacing:.03em;text-align:center;margin-top:10px;font-size:10px}.ask-claude-btn{border-radius:var(--radius-sm);width:100%;color:var(--gold);letter-spacing:.04em;cursor:pointer;background:rgba(204,156,66,.12);background:color(display-p3 .76996 .617341 .321369/.12);background:lab(67.5798% 11.9379 52.333/.12);border:1px solid rgba(204,156,66,.4);border:1px solid color(display-p3 .76996 .617341 .321369/.4);border:1px solid lab(67.5798% 11.9379 52.333/.4);justify-content:center;align-items:center;gap:6px;margin-top:12px;padding:9px 16px;font-family:Geist,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;font-weight:600;transition:background .16s,border-color .16s,box-shadow .16s;display:flex}.ask-claude-btn:hover:not(:disabled){background:rgba(204,156,66,.2);background:color(display-p3 .76996 .617341 .321369/.2);background:lab(67.5798% 11.9379 52.333/.2);border-color:rgba(204,156,66,.65);border-color:color(display-p3 .76996 .617341 .321369/.65);border-color:lab(67.5798% 11.9379 52.333/.65);box-shadow:0 0 0 3px rgba(204,156,66,.12);box-shadow:0 0 0 3px color(display-p3 .76996 .617341 .321369/.12);box-shadow:0 0 0 3px lab(67.5798% 11.9379 52.333/.12)}.ask-claude-btn:disabled{opacity:.5;cursor:not-allowed}.ask-claude-btn.sending{color:var(--gold-dim);opacity:.8;cursor:wait;pointer-events:none;background:rgba(204,156,66,.08);background:color(display-p3 .76996 .617341 .321369/.08);background:lab(67.5798% 11.9379 52.333/.08);border-color:rgba(204,156,66,.25);border-color:color(display-p3 .76996 .617341 .321369/.25);border-color:lab(67.5798% 11.9379 52.333/.25)}.ask-claude-btn.sent{color:var(--success);pointer-events:none;background:rgba(29,168,113,.15);background:color(display-p3 .313719 .651039 .459895/.15);background:lab(61.2436% -46.7762 18.3644/.15);border-color:rgba(29,168,113,.5);border-color:color(display-p3 .313719 .651039 .459895/.5);border-color:lab(61.2436% -46.7762 18.3644/.5)}.ask-claude-btn.error{color:var(--error);background:rgba(197,52,67,.15);background:color(display-p3 .710345 .252818 .279408/.15);background:lab(45.8893% 57.7361 27.393/.15);border-color:rgba(197,52,67,.5);border-color:color(display-p3 .710345 .252818 .279408/.5);border-color:lab(45.8893% 57.7361 27.393/.5)}.chart-status{min-height:0;max-height:0;color:var(--gold);letter-spacing:.04em;opacity:0;background:var(--surface);border-top:1px solid var(--border);padding:0 14px;font-size:11px;font-weight:500;transition:max-height .24s cubic-bezier(.16,1,.3,1),padding .24s cubic-bezier(.16,1,.3,1),opacity .24s;overflow:hidden}.chart-status[data-active]{opacity:1;max-height:32px;padding:6px 14px}.aspect-pair-row{justify-content:space-between;align-items:center;gap:8px;padding:6px 0;display:flex}.aspect-pair-planet{flex:1;align-items:center;gap:6px;display:flex}.aspect-pair-glyph{text-align:center;flex-shrink:0;width:24px;font-size:18px;line-height:1}.aspect-pair-name{color:var(--text);font-size:12px;font-weight:600}.aspect-pair-pos{color:var(--text-secondary);margin-top:1px;font-family:JetBrains Mono,monospace;font-size:10px}.aspect-pair-sym{text-align:center;flex-shrink:0;width:24px;font-size:20px}.pattern-ask-claude-btn{border-radius:var(--radius-pill);color:var(--gold);letter-spacing:.04em;cursor:pointer;background:rgba(204,156,66,.1);background:color(display-p3 .76996 .617341 .321369/.1);background:lab(67.5798% 11.9379 52.333/.1);border:1px solid rgba(204,156,66,.35);border:1px solid color(display-p3 .76996 .617341 .321369/.35);border:1px solid lab(67.5798% 11.9379 52.333/.35);flex-shrink:0;margin-left:6px;padding:3px 10px;font-family:Geist,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:10px;font-weight:600;transition:background .15s,border-color .15s,box-shadow .15s}.pattern-ask-claude-btn:hover{background:rgba(204,156,66,.18);background:color(display-p3 .76996 .617341 .321369/.18);background:lab(67.5798% 11.9379 52.333/.18);border-color:rgba(204,156,66,.6);border-color:color(display-p3 .76996 .617341 .321369/.6);border-color:lab(67.5798% 11.9379 52.333/.6);box-shadow:0 0 0 2px rgba(204,156,66,.1);box-shadow:0 0 0 2px color(display-p3 .76996 .617341 .321369/.1);box-shadow:0 0 0 2px lab(67.5798% 11.9379 52.333/.1)}.pattern-ask-claude-btn:disabled{opacity:.45;cursor:default}.dignity-badge{border-radius:var(--radius-pill);white-space:nowrap;align-items:center;gap:3px;padding:1px 7px;font-size:10px;font-weight:600;line-height:1.6;display:inline-flex}.dignity-domicile{color:#4bc98f;color:color(display-p3 .438181 .776546 .577613);color:lab(72.8515% -46.4433 18.2719);background:rgba(29,168,113,.15);background:color(display-p3 .313719 .651039 .459895/.15);background:lab(61.2436% -46.7762 18.3644/.15);border:1px solid rgba(29,168,113,.4);border:1px solid color(display-p3 .313719 .651039 .459895/.4);border:1px solid lab(61.2436% -46.7762 18.3644/.4)}.dignity-exaltation{color:#e6b55d;color:color(display-p3 .872302 .716587 .419329);color:lab(76.8879% 11.458 50.9953);background:rgba(204,156,66,.15);background:color(display-p3 .76996 .617341 .321369/.15);background:lab(67.5798% 11.9379 52.333/.15);border:1px solid rgba(204,156,66,.4);border:1px solid color(display-p3 .76996 .617341 .321369/.4);border:1px solid lab(67.5798% 11.9379 52.333/.4)}.dignity-detriment{color:#e17174;color:color(display-p3 .827266 .46738 .465289);color:lab(61.4259% 44.7499 19.9857);background:rgba(197,52,67,.12);background:color(display-p3 .710345 .252818 .279408/.12);background:lab(45.8893% 57.7361 27.393/.12);border:1px solid rgba(197,52,67,.35);border:1px solid color(display-p3 .710345 .252818 .279408/.35);border:1px solid lab(45.8893% 57.7361 27.393/.35)}.dignity-fall{color:#7a869f;color:color(display-p3 .488637 .525017 .615022);color:lab(55.7075% -.240654 -14.7889);background:rgba(88,99,123,.12);background:color(display-p3 .353624 .387759 .473149/.12);background:lab(41.7762% -.0450611 -14.7162/.12);border:1px solid rgba(88,99,123,.3);border:1px solid color(display-p3 .353624 .387759 .473149/.3);border:1px solid lab(41.7762% -.0450611 -14.7162/.3)}#tally-panel{border-top:1px solid var(--border);background:var(--surface);flex-shrink:0;align-items:center;gap:8px;padding:5px 12px;display:flex}.tally-section{flex-direction:column;gap:3px;display:flex}.tally-row{align-items:center;gap:6px;display:flex}.tally-item{white-space:nowrap;letter-spacing:.02em;border-radius:4px;padding:1px 6px;font-size:10px;font-weight:600}.tally-item.fire{color:var(--color-fire);background:rgba(236,109,61,.12);background:color(display-p3 .864679 .454605 .289251/.12);background:lab(61.5466% 48.3829 50.2676/.12)}.tally-item.earth{color:var(--color-earth);background:rgba(119,158,75,.12);background:color(display-p3 .496575 .613452 .334223/.12);background:lab(60.647% -24.5491 38.2386/.12)}.tally-item.air{color:var(--color-air);background:rgba(23,169,203,.12);background:color(display-p3 .308318 .651825 .781829/.12);background:lab(63.473% -27.3149 -28.2614/.12)}.tally-item.water{color:var(--color-water);background:rgba(134,120,201,.12);background:color(display-p3 .515326 .47381 .767317/.12);background:lab(54.4132% 19.4196 -40.6625/.12)}.tally-item.cardinal{color:var(--color-cardinal);background:rgba(217,82,90,.1);background:color(display-p3 .790049 .355864 .367143/.1);background:lab(54.1324% 54.4527 25.0799/.1)}.tally-item.fixed{color:var(--color-fixed);background:rgba(204,156,66,.1);background:color(display-p3 .76996 .617341 .321369/.1);background:lab(67.5798% 11.9379 52.333/.1)}.tally-item.mutable{color:var(--color-mutable);background:rgba(29,168,113,.1);background:color(display-p3 .313719 .651039 .459895/.1);background:lab(61.2436% -46.7762 18.3644/.1)}.tally-bar-row{padding:2px 0}.tally-bar{background:var(--border);border-radius:2px;width:96px;height:3px;display:flex;overflow:hidden}.tally-bar-fill{height:100%;transition:width .5s cubic-bezier(.16,1,.3,1)}.tally-bar-fill.fire{background:var(--color-fire)}.tally-bar-fill.earth{background:var(--color-earth)}.tally-bar-fill.air{background:var(--color-air)}.tally-bar-fill.water{background:var(--color-water)}.tally-divider{background:var(--border-strong);flex-shrink:0;width:1px;height:26px}#patterns-strip{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:5px;padding:5px 12px;display:flex}.patterns-label{text-transform:uppercase;letter-spacing:.1em;color:var(--text-secondary);white-space:nowrap;margin-right:2px;font-size:9px;font-weight:700}.pattern-pill{border-radius:var(--radius-pill);cursor:pointer;white-space:nowrap;opacity:.75;background:0 0;border:1px solid;align-items:center;gap:4px;padding:2px 9px;font-family:Geist,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:10px;font-weight:600;transition:opacity .14s,box-shadow .14s;display:inline-flex}.pattern-pill:hover{opacity:1;box-shadow:0 0 0 2px currentColor / .2}.pattern-pill.active{color:#010203;color:color(display-p3 .00515318 .00655345 .0110262);color:lab(.455387% .00626594 -.517511);opacity:1;border-color:transparent;box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px color(display-p3 0 0 0/.3);box-shadow:0 2px 10px lab(0% 0 0/.3)}#aspect-filter{border-top:1px solid var(--border);scrollbar-width:none;flex-shrink:0;align-items:center;gap:4px;padding:4px 12px;display:flex;overflow-x:auto}#aspect-filter::-webkit-scrollbar{display:none}#aspect-filter[hidden]{display:none!important}#controls-panel{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;padding:8px 12px;display:flex}.controls-label{color:var(--text-secondary);letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;margin-right:2px;font-size:10px;font-weight:700}.control-btn{border:1px solid var(--border-strong);border-radius:var(--radius-sm);color:var(--text-secondary);cursor:pointer;white-space:nowrap;background:0 0;padding:3px 10px;font-family:Geist,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:11px;transition:background .12s,color .12s,border-color .12s}.control-btn:hover{background:var(--gold-subtle);color:var(--gold);border-color:rgba(204,156,66,.4);border-color:color(display-p3 .76996 .617341 .321369/.4);border-color:lab(67.5798% 11.9379 52.333/.4)}.control-btn.active{color:var(--gold);background:rgba(204,156,66,.18);background:color(display-p3 .76996 .617341 .321369/.18);background:lab(67.5798% 11.9379 52.333/.18);border-color:rgba(204,156,66,.6);border-color:color(display-p3 .76996 .617341 .321369/.6);border-color:lab(67.5798% 11.9379 52.333/.6);font-weight:600}.controls-divider{background:var(--border-strong);flex-shrink:0;width:1px;height:18px;margin:0 4px}.tooltip{-webkit-backdrop-filter:blur(14px)saturate(1.6);backdrop-filter:blur(14px)saturate(1.6);border:1px solid var(--border-strong);border-radius:var(--radius);pointer-events:none;z-index:1000;opacity:0;background:rgba(7,9,14,.92);background:color(display-p3 .0286832 .0352525 .0537785/.92);background:lab(2.44746% .00379235 -2.33402/.92);max-width:220px;padding:8px 12px;font-size:12px;transition:opacity .12s;position:fixed;box-shadow:0 8px 32px rgba(0,0,0,.55),inset 0 .5px rgba(255,255,255,.04);box-shadow:0 8px 32px color(display-p3 0 0 0/.55),inset 0 .5px color(display-p3 1 1 1/.04);box-shadow:0 8px 32px lab(0% 0 0/.55),inset 0 .5px lab(100% 0 0/.04)}.tooltip.visible{opacity:1}.tooltip-title{color:var(--text);margin-bottom:2px;font-weight:700}.tooltip-detail{color:var(--text-secondary);line-height:1.4}.tooltip-hint{color:var(--gold-dim);letter-spacing:.03em;margin-top:4px;font-size:10px}.error-state{text-align:center;color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;display:flex}.error-state .error-icon{opacity:.6;margin-bottom:4px;font-size:28px}.hd-action-bar{flex-wrap:wrap;gap:8px;padding:10px 16px 6px;display:flex}.action-btn{color:#d4af37;letter-spacing:.02em;cursor:pointer;white-space:nowrap;background:rgba(212,175,55,.08);border:1px solid rgba(212,175,55,.3);border-radius:8px;align-items:center;gap:6px;padding:7px 16px;font-size:12px;font-weight:600;transition:background .2s,border-color .2s,transform .1s;display:inline-flex}.action-btn:hover{background:rgba(212,175,55,.15);border-color:rgba(212,175,55,.5);transform:translateY(-1px)}.action-btn:active{background:rgba(212,175,55,.2);transform:translateY(0)}.action-btn--primary{color:#f0d060;background:linear-gradient(135deg,rgba(212,175,55,.2),rgba(180,140,30,.25));border-color:rgba(212,175,55,.5)}.action-btn--primary:hover{background:linear-gradient(135deg,rgba(212,175,55,.3),rgba(180,140,30,.35));border-color:rgba(212,175,55,.7)}.param-controls{background:var(--surface);border-top:1px solid var(--border);flex-shrink:0;padding:8px 12px}.param-controls-grid{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.param-group{flex-direction:column;gap:4px;display:flex}.param-group label{text-transform:uppercase;color:var(--text-secondary);letter-spacing:.05em;font-size:10px;font-weight:700}.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{border:1px solid var(--border-strong);color:var(--text);border-radius:var(--radius-sm);background:#07090e;background:color(display-p3 .0286832 .0352525 .0537785);background:lab(2.44746% .00379235 -2.33402);width:130px;padding:4px 8px;font-family:inherit;font-size:12px;transition:border-color .15s}.param-group input:focus{border-color:var(--gold-dim);outline:none}.param-group-loc{flex:1;position:relative}.param-group-loc input{width:100%}.loc-suggestions{background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);z-index:100;max-height:200px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto}.loc-item{color:var(--text);cursor:pointer;white-space:nowrap;text-overflow:ellipsis;border-bottom:1px solid var(--border);padding:8px 10px;font-size:12px;overflow:hidden}.loc-item:last-child{border-bottom:none}.loc-item:hover{background:var(--gold-subtle);color:var(--gold)}.param-actions{align-items:flex-end;gap:6px;padding-top:14px;display:flex}.param-btn-icon{border:1px solid var(--border-strong);color:var(--text-secondary);border-radius:var(--radius-sm);cursor:pointer;background:0 0;justify-content:center;align-items:center;width:26px;height:26px;transition:all .15s;display:flex}.param-btn-icon:hover{background:var(--surface-2);color:var(--text);border-color:var(--gold-dim)}.param-btn-primary{color:var(--gold);border-radius:var(--radius-sm);cursor:pointer;text-transform:uppercase;letter-spacing:.05em;background:rgba(204,156,66,.12);background:color(display-p3 .76996 .617341 .321369/.12);background:lab(67.5798% 11.9379 52.333/.12);border:1px solid rgba(204,156,66,.4);border:1px solid color(display-p3 .76996 .617341 .321369/.4);border:1px solid lab(67.5798% 11.9379 52.333/.4);height:26px;padding:4px 12px;font-family:inherit;font-size:11px;font-weight:600;transition:all .15s}.param-btn-primary:hover:not(:disabled){background:rgba(204,156,66,.2);background:color(display-p3 .76996 .617341 .321369/.2);background:lab(67.5798% 11.9379 52.333/.2);border-color:rgba(204,156,66,.65);border-color:color(display-p3 .76996 .617341 .321369/.65);border-color:lab(67.5798% 11.9379 52.333/.65)}.param-btn-primary:disabled{opacity:.5;cursor:not-allowed}
10
+ <style>:root{--bg:#010203;--surface:#040609;--surface-2:#0b0d13;--border:#13161d;--border-strong:#242932;--text:#e2e4e9;--text-secondary:#777a80;--gold:#cc9c42;--gold-dim:#7b6540;--gold-glow:rgba(204,156,66,.2);--gold-subtle:rgba(204,156,66,.1);--success:#1da871;--error:#c53443;--radius:10px;--radius-sm:6px;--radius-pill:99px;--shadow:0 4px 20px rgba(0,0,0,.45);--shadow-md:0 8px 40px rgba(0,0,0,.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 0 2px var(--gold-glow), 0 6px 24px rgba(0,0,0,.5);--planet-sun:#e9ab2b;--planet-moon:#abb8d2;--planet-mercury:#37b880;--planet-venus:#de73bd;--planet-mars:#dd4d57;--planet-jupiter:#9886ed;--planet-saturn:#589194;--planet-uranus:#24c1c9;--planet-neptune:#2f8adc;--planet-pluto:#a97cc9;--aspect-conjunction:#e9ab2b;--aspect-opposition:#dd4d57;--aspect-trine:#37b880;--aspect-square:#dd4d57;--aspect-sextile:#2f8adc;--color-fire:#ec6d3d;--color-earth:#779e4b;--color-air:#17a9cb;--color-water:#8678c9;--color-cardinal:#d9525a;--color-fixed:#cc9c42;--color-mutable:#1da871}@supports (color:color(display-p3 0 0 0)){:root{--bg:color(display-p3 .00515318 .00655345 .0110262);--surface:color(display-p3 .0181758 .0222118 .0344746);--surface-2:color(display-p3 .0438795 .0516065 .0708656);--border:color(display-p3 .0763929 .0859556 .109705);--border-strong:color(display-p3 .146313 .159736 .192938);--text:color(display-p3 .889546 .895785 .910689);--text-secondary:color(display-p3 .470023 .47923 .50135);--gold:color(display-p3 .76996 .617341 .321369);--gold-dim:color(display-p3 .469305 .400291 .270966);--gold-glow:color(display-p3 .76996 .617341 .321369/.2);--gold-subtle:color(display-p3 .76996 .617341 .321369/.1);--success:color(display-p3 .313719 .651039 .459895);--error:color(display-p3 .710345 .252818 .279408);--shadow:0 4px 20px color(display-p3 0 0 0/.45);--shadow-md:0 8px 40px color(display-p3 0 0 0/.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 0 2px var(--gold-glow), 0 6px 24px color(display-p3 0 0 0/.5);--planet-sun:color(display-p3 .877131 .680603 .28424);--planet-moon:color(display-p3 .679472 .718322 .813586);--planet-mercury:color(display-p3 .376022 .713332 .518194);--planet-venus:color(display-p3 .815343 .471375 .72873);--planet-mars:color(display-p3 .803557 .340931 .357065);--planet-jupiter:color(display-p3 .584642 .526796 .904819);--planet-saturn:color(display-p3 .398313 .564522 .578019);--planet-uranus:color(display-p3 .364235 .746318 .77845);--planet-neptune:color(display-p3 .290256 .532943 .838196);--planet-pluto:color(display-p3 .635092 .494812 .769187);--aspect-conjunction:color(display-p3 .877131 .680603 .28424);--aspect-opposition:color(display-p3 .803557 .340931 .357065);--aspect-trine:color(display-p3 .376022 .713332 .518194);--aspect-square:color(display-p3 .803557 .340931 .357065);--aspect-sextile:color(display-p3 .290256 .532943 .838196);--color-fire:color(display-p3 .864679 .454605 .289251);--color-earth:color(display-p3 .496575 .613452 .334223);--color-air:color(display-p3 .308318 .651825 .781829);--color-water:color(display-p3 .515326 .47381 .767317);--color-cardinal:color(display-p3 .790049 .355864 .367143);--color-fixed:color(display-p3 .76996 .617341 .321369);--color-mutable:color(display-p3 .313719 .651039 .459895)}}@supports (color:lab(0% 0 0)){:root{--bg:lab(.455387% .00626594 -.517511);--surface:lab(1.54195% -.000223517 -1.4246);--surface-2:lab(3.66055% -.0193194 -3.00652);--border:lab(7.15581% -.0557452 -5.11242);--border-strong:lab(16.3845% -.109613 -6.65551);--text:lab(90.6942% -.142396 -2.26941);--text-secondary:lab(51.2352% -.205308 -3.76425);--gold:lab(67.5798% 11.9379 52.333);--gold-dim:lab(44.394% 5.21129 24.4453);--gold-glow:lab(67.5798% 11.9379 52.333/.2);--gold-subtle:lab(67.5798% 11.9379 52.333/.1);--success:lab(61.2436% -46.7762 18.3644);--error:lab(45.8893% 57.7361 27.393);--shadow:0 4px 20px lab(0% 0 0/.45);--shadow-md:0 8px 40px lab(0% 0 0/.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 0 2px var(--gold-glow), 0 6px 24px lab(0% 0 0/.5);--planet-sun:lab(74.5017% 15.8159 68.8514);--planet-moon:lab(74.277% -.405759 -14.8565);--planet-mercury:lab(67.0478% -46.5952 18.3141);--planet-venus:lab(62.9358% 49.4917 -19.8999);--planet-mars:lab(54.0218% 57.6814 26.7913);--planet-jupiter:lab(60.9189% 25.1968 -50.641);--planet-saturn:lab(56.5081% -18.8848 -7.8149);--planet-uranus:lab(71.0008% -37.5682 -15.4301);--planet-neptune:lab(55.2086% -4.9496 -50.4575);--planet-pluto:lab(58.8593% 28.4679 -33.3654);--aspect-conjunction:lab(74.5017% 15.8159 68.8514);--aspect-opposition:lab(54.0218% 57.6814 26.7913);--aspect-trine:lab(67.0478% -46.5952 18.3141);--aspect-square:lab(54.0218% 57.6814 26.7913);--aspect-sextile:lab(55.2086% -4.9496 -50.4575);--color-fire:lab(61.5466% 48.3829 50.2676);--color-earth:lab(60.647% -24.5491 38.2386);--color-air:lab(63.473% -27.3149 -28.2614);--color-water:lab(54.4132% 19.4196 -40.6625);--color-cardinal:lab(54.1324% 54.4527 25.0799);--color-fixed:lab(67.5798% 11.9379 52.333);--color-mutable:lab(61.2436% -46.7762 18.3644)}}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html,body{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;height:100%}body{background:var(--bg);color:var(--text);-webkit-user-select:none;-moz-user-select:none;user-select:none;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");font-family:Geist,Space Grotesk,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.5;overflow-x:hidden}#app{flex-direction:column;display:flex;position:relative}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:14px;display:flex}#loading-state[hidden]{display:none}#loading-state p{letter-spacing:.05em;text-transform:uppercase;font-size:12px}.spinner{border:2px solid var(--border-strong);border-top-color:var(--gold);border-radius:50%;width:32px;height:32px;animation:1.1s cubic-bezier(.4,0,.6,1) infinite spin}@keyframes spin{to{transform:rotate(360deg)}}#chart-container{aspect-ratio:1;justify-content:center;align-items:center;width:100%;max-height:520px;padding:8px;display:flex;position:relative}#chart-container[hidden]{display:none}#chart-container svg{width:100%;height:100%}#chart-info{background:var(--surface);border-top:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:5px;padding:6px 12px;display:flex}#chart-info[hidden]{display:none!important}.info-chip{color:var(--text-secondary);border-radius:var(--radius-pill);white-space:nowrap;letter-spacing:.03em;background:#13161c;background:color(display-p3 .0777944 .086043 .106387);background:lab(7.16788% -.0827834 -4.39059);align-items:center;gap:3px;padding:2px 8px;font-size:10px;font-weight:500;line-height:1.6;display:inline-flex}.info-chip.sect{color:var(--gold);background:var(--gold-subtle);font-weight:600}.hit-region{cursor:pointer;fill:transparent;stroke:transparent;transition:fill .15s,stroke .15s,opacity .2s}.hit-region:hover{fill:var(--gold-subtle);stroke:var(--gold-dim);stroke-width:1px;stroke-opacity:.5}.hit-region.planet-hit{rx:12px;ry:12px}.hit-region.planet-hit:not(.dim):hover{filter:drop-shadow(0 0 6px var(--gold-glow))}.hit-region.dim{opacity:.12}.hit-region.aspect-hit{stroke-width:13px}.hit-region.aspect-hit.highlight{stroke:var(--aspect-color,var(--gold-dim));stroke-opacity:.5}.info-panel{background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:var(--shadow-md);z-index:900;opacity:0;pointer-events:none;width:min(340px,92vw);padding:14px 16px 12px;transition:opacity .18s cubic-bezier(.16,1,.3,1);position:fixed}.info-panel.visible{opacity:1;pointer-events:all}.info-header{align-items:flex-start;gap:10px;margin-bottom:12px;display:flex}.info-glyph{text-align:center;flex-shrink:0;width:34px;font-size:28px;line-height:1}.info-title{color:var(--text);flex:1;font-size:13px;font-weight:700}.info-name-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.info-pos{color:var(--text-secondary);margin-top:2px;font-family:JetBrains Mono,Courier New,monospace;font-size:11px;font-weight:400}.retro{color:var(--error);font-style:normal}.info-close{cursor:pointer;color:var(--text-secondary);background:0 0;border:none;border-radius:4px;flex-shrink:0;padding:2px 4px;font-size:15px;line-height:1;transition:color .12s}.info-close:hover{color:var(--text)}.aspects-title{text-transform:uppercase;letter-spacing:.1em;color:var(--text-secondary);margin-bottom:6px;font-size:10px;font-weight:700}.aspects-list{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;flex-direction:column;gap:4px;max-height:140px;display:flex;overflow-y:auto}.aspects-list::-webkit-scrollbar{width:3px}.aspects-list::-webkit-scrollbar-track{background:0 0}.aspects-list::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}.aspect-row{align-items:center;gap:7px;padding:3px 0;font-size:12px;display:flex}.aspect-dot{border-radius:50%;flex-shrink:0;width:7px;height:7px}.aspect-sym{text-align:center;flex-shrink:0;width:16px;font-size:14px}.aspect-other{color:var(--text);flex:1}.aspect-meta{color:var(--text-secondary);white-space:nowrap;font-family:JetBrains Mono,monospace;font-size:11px}.no-aspects{color:var(--text-secondary);padding:4px 0;font-size:11px;font-style:italic}.info-hint{color:var(--gold-dim);letter-spacing:.03em;text-align:center;margin-top:10px;font-size:10px}.ask-claude-btn{border-radius:var(--radius-sm);width:100%;color:var(--gold);letter-spacing:.04em;cursor:pointer;background:rgba(204,156,66,.12);background:color(display-p3 .76996 .617341 .321369/.12);background:lab(67.5798% 11.9379 52.333/.12);border:1px solid rgba(204,156,66,.4);border:1px solid color(display-p3 .76996 .617341 .321369/.4);border:1px solid lab(67.5798% 11.9379 52.333/.4);justify-content:center;align-items:center;gap:6px;margin-top:12px;padding:9px 16px;font-family:Geist,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;font-weight:600;transition:background .16s,border-color .16s,box-shadow .16s;display:flex}.ask-claude-btn:hover:not(:disabled){background:rgba(204,156,66,.2);background:color(display-p3 .76996 .617341 .321369/.2);background:lab(67.5798% 11.9379 52.333/.2);border-color:rgba(204,156,66,.65);border-color:color(display-p3 .76996 .617341 .321369/.65);border-color:lab(67.5798% 11.9379 52.333/.65);box-shadow:0 0 0 3px rgba(204,156,66,.12);box-shadow:0 0 0 3px color(display-p3 .76996 .617341 .321369/.12);box-shadow:0 0 0 3px lab(67.5798% 11.9379 52.333/.12)}.ask-claude-btn:disabled{opacity:.5;cursor:not-allowed}.ask-claude-btn.sending{color:var(--gold-dim);opacity:.8;cursor:wait;pointer-events:none;background:rgba(204,156,66,.08);background:color(display-p3 .76996 .617341 .321369/.08);background:lab(67.5798% 11.9379 52.333/.08);border-color:rgba(204,156,66,.25);border-color:color(display-p3 .76996 .617341 .321369/.25);border-color:lab(67.5798% 11.9379 52.333/.25)}.ask-claude-btn.sent{color:var(--success);pointer-events:none;background:rgba(29,168,113,.15);background:color(display-p3 .313719 .651039 .459895/.15);background:lab(61.2436% -46.7762 18.3644/.15);border-color:rgba(29,168,113,.5);border-color:color(display-p3 .313719 .651039 .459895/.5);border-color:lab(61.2436% -46.7762 18.3644/.5)}.ask-claude-btn.error{color:var(--error);background:rgba(197,52,67,.15);background:color(display-p3 .710345 .252818 .279408/.15);background:lab(45.8893% 57.7361 27.393/.15);border-color:rgba(197,52,67,.5);border-color:color(display-p3 .710345 .252818 .279408/.5);border-color:lab(45.8893% 57.7361 27.393/.5)}.chart-status{min-height:0;max-height:0;color:var(--gold);letter-spacing:.04em;opacity:0;background:var(--surface);border-top:1px solid var(--border);padding:0 14px;font-size:11px;font-weight:500;transition:max-height .24s cubic-bezier(.16,1,.3,1),padding .24s cubic-bezier(.16,1,.3,1),opacity .24s;overflow:hidden}.chart-status[data-active]{opacity:1;max-height:32px;padding:6px 14px}.aspect-pair-row{justify-content:space-between;align-items:center;gap:8px;padding:6px 0;display:flex}.aspect-pair-planet{flex:1;align-items:center;gap:6px;display:flex}.aspect-pair-glyph{text-align:center;flex-shrink:0;width:24px;font-size:18px;line-height:1}.aspect-pair-name{color:var(--text);font-size:12px;font-weight:600}.aspect-pair-pos{color:var(--text-secondary);margin-top:1px;font-family:JetBrains Mono,monospace;font-size:10px}.aspect-pair-sym{text-align:center;flex-shrink:0;width:24px;font-size:20px}.pattern-ask-claude-btn{border-radius:var(--radius-pill);color:var(--gold);letter-spacing:.04em;cursor:pointer;background:rgba(204,156,66,.1);background:color(display-p3 .76996 .617341 .321369/.1);background:lab(67.5798% 11.9379 52.333/.1);border:1px solid rgba(204,156,66,.35);border:1px solid color(display-p3 .76996 .617341 .321369/.35);border:1px solid lab(67.5798% 11.9379 52.333/.35);flex-shrink:0;margin-left:6px;padding:3px 10px;font-family:Geist,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:10px;font-weight:600;transition:background .15s,border-color .15s,box-shadow .15s}.pattern-ask-claude-btn:hover{background:rgba(204,156,66,.18);background:color(display-p3 .76996 .617341 .321369/.18);background:lab(67.5798% 11.9379 52.333/.18);border-color:rgba(204,156,66,.6);border-color:color(display-p3 .76996 .617341 .321369/.6);border-color:lab(67.5798% 11.9379 52.333/.6);box-shadow:0 0 0 2px rgba(204,156,66,.1);box-shadow:0 0 0 2px color(display-p3 .76996 .617341 .321369/.1);box-shadow:0 0 0 2px lab(67.5798% 11.9379 52.333/.1)}.pattern-ask-claude-btn:disabled{opacity:.45;cursor:default}.dignity-badge{border-radius:var(--radius-pill);white-space:nowrap;align-items:center;gap:3px;padding:1px 7px;font-size:10px;font-weight:600;line-height:1.6;display:inline-flex}.dignity-domicile{color:#4bc98f;color:color(display-p3 .438181 .776546 .577613);color:lab(72.8515% -46.4433 18.2719);background:rgba(29,168,113,.15);background:color(display-p3 .313719 .651039 .459895/.15);background:lab(61.2436% -46.7762 18.3644/.15);border:1px solid rgba(29,168,113,.4);border:1px solid color(display-p3 .313719 .651039 .459895/.4);border:1px solid lab(61.2436% -46.7762 18.3644/.4)}.dignity-exaltation{color:#e6b55d;color:color(display-p3 .872302 .716587 .419329);color:lab(76.8879% 11.458 50.9953);background:rgba(204,156,66,.15);background:color(display-p3 .76996 .617341 .321369/.15);background:lab(67.5798% 11.9379 52.333/.15);border:1px solid rgba(204,156,66,.4);border:1px solid color(display-p3 .76996 .617341 .321369/.4);border:1px solid lab(67.5798% 11.9379 52.333/.4)}.dignity-detriment{color:#e17174;color:color(display-p3 .827266 .46738 .465289);color:lab(61.4259% 44.7499 19.9857);background:rgba(197,52,67,.12);background:color(display-p3 .710345 .252818 .279408/.12);background:lab(45.8893% 57.7361 27.393/.12);border:1px solid rgba(197,52,67,.35);border:1px solid color(display-p3 .710345 .252818 .279408/.35);border:1px solid lab(45.8893% 57.7361 27.393/.35)}.dignity-fall{color:#7a869f;color:color(display-p3 .488637 .525017 .615022);color:lab(55.7075% -.240654 -14.7889);background:rgba(88,99,123,.12);background:color(display-p3 .353624 .387759 .473149/.12);background:lab(41.7762% -.0450611 -14.7162/.12);border:1px solid rgba(88,99,123,.3);border:1px solid color(display-p3 .353624 .387759 .473149/.3);border:1px solid lab(41.7762% -.0450611 -14.7162/.3)}#tally-panel{border-top:1px solid var(--border);background:var(--surface);flex-shrink:0;align-items:center;gap:8px;padding:5px 12px;display:flex}.tally-section{flex-direction:column;gap:3px;display:flex}.tally-row{align-items:center;gap:6px;display:flex}.tally-item{white-space:nowrap;letter-spacing:.02em;border-radius:4px;padding:1px 6px;font-size:10px;font-weight:600}.tally-item.fire{color:var(--color-fire);background:rgba(236,109,61,.12);background:color(display-p3 .864679 .454605 .289251/.12);background:lab(61.5466% 48.3829 50.2676/.12)}.tally-item.earth{color:var(--color-earth);background:rgba(119,158,75,.12);background:color(display-p3 .496575 .613452 .334223/.12);background:lab(60.647% -24.5491 38.2386/.12)}.tally-item.air{color:var(--color-air);background:rgba(23,169,203,.12);background:color(display-p3 .308318 .651825 .781829/.12);background:lab(63.473% -27.3149 -28.2614/.12)}.tally-item.water{color:var(--color-water);background:rgba(134,120,201,.12);background:color(display-p3 .515326 .47381 .767317/.12);background:lab(54.4132% 19.4196 -40.6625/.12)}.tally-item.cardinal{color:var(--color-cardinal);background:rgba(217,82,90,.1);background:color(display-p3 .790049 .355864 .367143/.1);background:lab(54.1324% 54.4527 25.0799/.1)}.tally-item.fixed{color:var(--color-fixed);background:rgba(204,156,66,.1);background:color(display-p3 .76996 .617341 .321369/.1);background:lab(67.5798% 11.9379 52.333/.1)}.tally-item.mutable{color:var(--color-mutable);background:rgba(29,168,113,.1);background:color(display-p3 .313719 .651039 .459895/.1);background:lab(61.2436% -46.7762 18.3644/.1)}.tally-bar-row{padding:2px 0}.tally-bar{background:var(--border);border-radius:2px;width:96px;height:3px;display:flex;overflow:hidden}.tally-bar-fill{height:100%;transition:width .5s cubic-bezier(.16,1,.3,1)}.tally-bar-fill.fire{background:var(--color-fire)}.tally-bar-fill.earth{background:var(--color-earth)}.tally-bar-fill.air{background:var(--color-air)}.tally-bar-fill.water{background:var(--color-water)}.tally-divider{background:var(--border-strong);flex-shrink:0;width:1px;height:26px}#patterns-strip{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:5px;padding:5px 12px;display:flex}.patterns-label{text-transform:uppercase;letter-spacing:.1em;color:var(--text-secondary);white-space:nowrap;margin-right:2px;font-size:9px;font-weight:700}.pattern-pill{border-radius:var(--radius-pill);cursor:pointer;white-space:nowrap;opacity:.75;background:0 0;border:1px solid;align-items:center;gap:4px;padding:2px 9px;font-family:Geist,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:10px;font-weight:600;transition:opacity .14s,box-shadow .14s;display:inline-flex}.pattern-pill:hover{opacity:1;box-shadow:0 0 0 2px currentColor / .2}.pattern-pill.active{color:#010203;color:color(display-p3 .00515318 .00655345 .0110262);color:lab(.455387% .00626594 -.517511);opacity:1;border-color:transparent;box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px color(display-p3 0 0 0/.3);box-shadow:0 2px 10px lab(0% 0 0/.3)}#aspect-filter{border-top:1px solid var(--border);scrollbar-width:none;flex-shrink:0;align-items:center;gap:4px;padding:4px 12px;display:flex;overflow-x:auto}#aspect-filter::-webkit-scrollbar{display:none}#aspect-filter[hidden]{display:none!important}#controls-panel{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;padding:8px 12px;display:flex}.controls-label{color:var(--text-secondary);letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;margin-right:2px;font-size:10px;font-weight:700}.control-btn{border:1px solid var(--border-strong);border-radius:var(--radius-sm);color:var(--text-secondary);cursor:pointer;white-space:nowrap;background:0 0;padding:3px 10px;font-family:Geist,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:11px;transition:background .12s,color .12s,border-color .12s}.control-btn:hover{background:var(--gold-subtle);color:var(--gold);border-color:rgba(204,156,66,.4);border-color:color(display-p3 .76996 .617341 .321369/.4);border-color:lab(67.5798% 11.9379 52.333/.4)}.control-btn.active{color:var(--gold);background:rgba(204,156,66,.18);background:color(display-p3 .76996 .617341 .321369/.18);background:lab(67.5798% 11.9379 52.333/.18);border-color:rgba(204,156,66,.6);border-color:color(display-p3 .76996 .617341 .321369/.6);border-color:lab(67.5798% 11.9379 52.333/.6);font-weight:600}.controls-divider{background:var(--border-strong);flex-shrink:0;width:1px;height:18px;margin:0 4px}.tooltip{-webkit-backdrop-filter:blur(14px)saturate(1.6);backdrop-filter:blur(14px)saturate(1.6);border:1px solid var(--border-strong);border-radius:var(--radius);pointer-events:none;z-index:1000;opacity:0;background:rgba(7,9,14,.92);background:color(display-p3 .0286832 .0352525 .0537785/.92);background:lab(2.44746% .00379235 -2.33402/.92);max-width:220px;padding:8px 12px;font-size:12px;transition:opacity .12s;position:fixed;box-shadow:0 8px 32px rgba(0,0,0,.55),inset 0 .5px rgba(255,255,255,.04);box-shadow:0 8px 32px color(display-p3 0 0 0/.55),inset 0 .5px color(display-p3 1 1 1/.04);box-shadow:0 8px 32px lab(0% 0 0/.55),inset 0 .5px lab(100% 0 0/.04)}.tooltip.visible{opacity:1}.tooltip-title{color:var(--text);margin-bottom:2px;font-weight:700}.tooltip-detail{color:var(--text-secondary);line-height:1.4}.tooltip-hint{color:var(--gold-dim);letter-spacing:.03em;margin-top:4px;font-size:10px}.error-state{text-align:center;color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;display:flex}.error-state .error-icon{opacity:.6;margin-bottom:4px;font-size:28px}.info-drawer{background:var(--surface-2,#080b11);border:1px solid var(--border-strong,#242933);width:100%;box-shadow:0 8px 40px rgba(0,0,0,.65), 0 0 0 1px var(--border-strong,#242933);opacity:0;pointer-events:none;border-radius:10px;max-height:0;padding:14px 16px 12px;transition:max-height .26s cubic-bezier(.16,1,.3,1),opacity .2s,padding .2s;position:relative;overflow:hidden}@supports (color:color(display-p3 0 0 0)){.info-drawer{background:var(--surface-2,color(display-p3 .0345774 .0431759 .0653236));border:1px solid var(--border-strong,color(display-p3 .144788 .159634 .196542));box-shadow:0 8px 40px color(display-p3 0 0 0/.65), 0 0 0 1px var(--border-strong,color(display-p3 .144788 .159634 .196542))}}@supports (color:lab(0% 0 0)){.info-drawer{background:var(--surface-2,lab(3.00584% .0228807 -3.15676));border:1px solid var(--border-strong,lab(16.3713% -.0768304 -7.37782));box-shadow:0 8px 40px lab(0% 0 0/.65), 0 0 0 1px var(--border-strong,lab(16.3713% -.0768304 -7.37782))}}.info-drawer:before{content:"";background:var(--border-strong,#242933);border-radius:2px;flex-shrink:0;width:36px;height:4px;margin:0 auto 10px;display:block}@supports (color:color(display-p3 0 0 0)){.info-drawer:before{background:var(--border-strong,color(display-p3 .144788 .159634 .196542))}}@supports (color:lab(0% 0 0)){.info-drawer:before{background:var(--border-strong,lab(16.3713% -.0768304 -7.37782))}}.info-drawer.open{opacity:1;pointer-events:all;max-height:500px;padding:14px 16px 12px}.hd-action-bar{flex-wrap:wrap;gap:8px;padding:10px 16px 6px;display:flex}.action-btn{color:#d4af37;letter-spacing:.02em;cursor:pointer;white-space:nowrap;background:rgba(212,175,55,.08);border:1px solid rgba(212,175,55,.3);border-radius:8px;align-items:center;gap:6px;padding:7px 16px;font-size:12px;font-weight:600;transition:background .2s,border-color .2s,transform .1s;display:inline-flex}.action-btn:hover{background:rgba(212,175,55,.15);border-color:rgba(212,175,55,.5);transform:translateY(-1px)}.action-btn:active{background:rgba(212,175,55,.2);transform:translateY(0)}.action-btn--primary{color:#f0d060;background:linear-gradient(135deg,rgba(212,175,55,.2),rgba(180,140,30,.25));border-color:rgba(212,175,55,.5)}.action-btn--primary:hover{background:linear-gradient(135deg,rgba(212,175,55,.3),rgba(180,140,30,.35));border-color:rgba(212,175,55,.7)}.pan-zoom-controls{z-index:800;flex-direction:column;gap:6px;display:flex;position:fixed;bottom:20px;right:20px}.pan-zoom-controls[hidden]{display:none!important}.pan-btn{background:var(--surface-2);border:1px solid var(--border-strong);color:var(--text);border-radius:var(--radius-sm);cursor:pointer;width:36px;height:36px;box-shadow:var(--shadow-md);justify-content:center;align-items:center;font-family:inherit;font-size:18px;transition:all .15s;display:flex}.pan-btn.reset{width:auto;padding:0 10px;font-size:11px;font-weight:500}.pan-btn:hover{background:var(--surface);border-color:var(--gold-dim);color:var(--gold)}.pan-btn:active{transform:scale(.95)}.oe-loader{width:64px;height:64px;stroke:var(--gold);stroke-width:2px;fill:none;stroke-dasharray:200;stroke-dashoffset:200px;filter:drop-shadow(0 0 4px var(--gold-glow));animation:2.5s cubic-bezier(.16,1,.3,1) infinite oe-draw}@keyframes oe-draw{0%{stroke-dashoffset:200px;stroke-opacity:.1}50%{stroke-dashoffset:0;stroke-opacity:1;filter:drop-shadow(0 0 8px var(--gold))}to{stroke-dashoffset:-200px;stroke-opacity:.1}}.param-controls{background:var(--surface);border-top:1px solid var(--border);flex-shrink:0;padding:8px 12px}.param-controls-grid{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.param-group{flex-direction:column;gap:4px;display:flex}.param-group label{text-transform:uppercase;color:var(--text-secondary);letter-spacing:.05em;font-size:10px;font-weight:700}.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{border:1px solid var(--border-strong);color:var(--text);border-radius:var(--radius-sm);background:#07090e;background:color(display-p3 .0286832 .0352525 .0537785);background:lab(2.44746% .00379235 -2.33402);width:130px;padding:4px 8px;font-family:inherit;font-size:12px;transition:border-color .15s}.param-group input:focus{border-color:var(--gold-dim);outline:none}.param-group-loc{flex:1;position:relative}.param-group-loc input{width:100%}.loc-suggestions{background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);z-index:100;max-height:200px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto}.loc-item{color:var(--text);cursor:pointer;white-space:nowrap;text-overflow:ellipsis;border-bottom:1px solid var(--border);padding:8px 10px;font-size:12px;overflow:hidden}.loc-item:last-child{border-bottom:none}.loc-item:hover{background:var(--gold-subtle);color:var(--gold)}.param-actions{align-items:flex-end;gap:6px;padding-top:14px;display:flex}.param-btn-icon{border:1px solid var(--border-strong);color:var(--text-secondary);border-radius:var(--radius-sm);cursor:pointer;background:0 0;justify-content:center;align-items:center;width:26px;height:26px;transition:all .15s;display:flex}.param-btn-icon:hover{background:var(--surface-2);color:var(--text);border-color:var(--gold-dim)}.param-btn-primary{color:var(--gold);border-radius:var(--radius-sm);cursor:pointer;text-transform:uppercase;letter-spacing:.05em;background:rgba(204,156,66,.12);background:color(display-p3 .76996 .617341 .321369/.12);background:lab(67.5798% 11.9379 52.333/.12);border:1px solid rgba(204,156,66,.4);border:1px solid color(display-p3 .76996 .617341 .321369/.4);border:1px solid lab(67.5798% 11.9379 52.333/.4);height:26px;padding:4px 12px;font-family:inherit;font-size:11px;font-weight:600;transition:all .15s}.param-btn-primary:hover:not(:disabled){background:rgba(204,156,66,.2);background:color(display-p3 .76996 .617341 .321369/.2);background:lab(67.5798% 11.9379 52.333/.2);border-color:rgba(204,156,66,.65);border-color:color(display-p3 .76996 .617341 .321369/.65);border-color:lab(67.5798% 11.9379 52.333/.65)}.param-btn-primary:disabled{opacity:.5;cursor:not-allowed}
11
11
  /*$vite$:1*/</style>
12
12
  </head>
13
13
  <body>
14
14
  <div id="app">
15
15
  <div id="loading-state">
16
- <div class="spinner"></div>
16
+ <svg class="oe-loader" viewBox="0 0 100 100"><circle cx="50" cy="50" r="45"/></svg>
17
17
  <p>Computing ephemeris…</p>
18
18
  </div>
19
+ <div id="pan-zoom-controls" class="pan-zoom-controls" hidden>
20
+ <button id="btn-zoom-in" class="pan-btn" aria-label="Zoom in">+</button>
21
+ <button id="btn-zoom-out" class="pan-btn" aria-label="Zoom out">-</button>
22
+ <button id="btn-reset-view" class="pan-btn reset" aria-label="Reset view">⟲ Reset</button>
23
+ </div>
19
24
  <div id="chart-container" hidden></div>
20
25
  <div id="chart-info" hidden></div>
21
26
  <div id="chart-status" class="chart-status"></div>
@@ -6546,81 +6551,108 @@ var Kh = class e3 extends _h {
6546
6551
  }
6547
6552
  };
6548
6553
  o(Kh, "ONE_SHOT_EVENTS", /* @__PURE__ */ new Set(["toolinput", "toolinputpartial", "toolresult", "toolcancelled"]));
6549
- var qh = 250, Jh = 250, Yh = 240, Xh = 204, Zh = 190, Qh = 159, $h = 140, eg = 134, tg = 15, ng = 20;
6554
+ function qh(e4, t2) {
6555
+ var n2, r2, i2, a2, o2, s2;
6556
+ let c2 = document.getElementById(t2), l2 = c2 == null ? void 0 : c2.querySelector("#btn-zoom-in"), u2 = c2 == null ? void 0 : c2.querySelector("#btn-zoom-out"), d2 = c2 == null ? void 0 : c2.querySelector("#btn-reset-view");
6557
+ c2 && (c2.hidden = false);
6558
+ let f2 = (n2 = (r2 = e4.getAttribute("viewBox")) == null ? void 0 : r2.split(/[\s,]+/).map(Number)) == null ? [0, 0, 500, 500] : n2, p2 = (i2 = f2[0]) == null ? 0 : i2, m2 = (a2 = f2[1]) == null ? 0 : a2, h2 = (o2 = f2[2]) == null ? 500 : o2, g2 = (s2 = f2[3]) == null ? 500 : s2, _2 = false, v2 = 0, y2 = 0, b2 = p2, x2 = m2, S2 = h2, C2 = g2, w2 = () => e4.setAttribute("viewBox", "".concat(b2, " ").concat(x2, " ").concat(S2, " ").concat(C2)), ee2 = (e5, t3 = 250, n3 = 250) => {
6559
+ let r3 = 1e3, i3 = Math.round(S2 * e5 * 10) / 10, a3 = Math.round(C2 * e5 * 10) / 10;
6560
+ i3 < 100 && (i3 = 100, a3 = 100, e5 = i3 / S2), i3 > r3 && (i3 = r3, a3 = r3, e5 = i3 / S2), i3 !== S2 && (b2 = Math.round((t3 - (t3 - b2) * e5) * 10) / 10, x2 = Math.round((n3 - (n3 - x2) * e5) * 10) / 10, S2 = i3, C2 = a3, w2());
6561
+ };
6562
+ l2 == null || l2.addEventListener("click", () => ee2(0.8)), u2 == null || u2.addEventListener("click", () => ee2(1.25)), d2 == null || d2.addEventListener("click", () => {
6563
+ b2 = p2, x2 = m2, S2 = h2, C2 = g2, w2();
6564
+ }), e4.addEventListener("wheel", (t3) => {
6565
+ t3.preventDefault();
6566
+ let n3 = Math.exp((t3.deltaY < 0 ? -1 : 1) * 0.1), r3 = e4.getBoundingClientRect(), i3 = t3.clientX - r3.left, a3 = t3.clientY - r3.top;
6567
+ ee2(n3, b2 + i3 / r3.width * S2, x2 + a3 / r3.height * C2);
6568
+ }, { passive: false }), e4.addEventListener("pointerdown", (t3) => {
6569
+ let n3 = t3.target;
6570
+ n3.closest && (n3.closest('[class*="-hit"]') || n3.closest('[class*="-activation"]') || n3.closest(".variable-arrow") || n3.closest("button")) || (_2 = true, v2 = t3.clientX, y2 = t3.clientY, e4.setPointerCapture(t3.pointerId), e4.style.cursor = "grabbing");
6571
+ }), e4.addEventListener("pointermove", (t3) => {
6572
+ if (!_2) return;
6573
+ let n3 = t3.clientX - v2, r3 = t3.clientY - y2;
6574
+ v2 = t3.clientX, y2 = t3.clientY;
6575
+ let i3 = e4.getBoundingClientRect(), a3 = n3 / i3.width * S2, o3 = r3 / i3.height * C2;
6576
+ b2 -= a3, x2 -= o3, w2();
6577
+ }), e4.addEventListener("pointerup", (t3) => {
6578
+ _2 && (_2 = false, e4.releasePointerCapture(t3.pointerId), e4.style.cursor = "default");
6579
+ });
6580
+ }
6581
+ var Jh = 250, Yh = 250, Xh = 240, Zh = 204, Qh = 190, $h = 159, eg = 140, tg = 134, ng = 15, rg = 20;
6550
6582
  function X(e4, t2, n2) {
6551
6583
  let r2 = -(e4 - n2 + 180) * Math.PI / 180;
6552
- return { x: qh + t2 * Math.cos(r2), y: Jh + t2 * Math.sin(r2) };
6584
+ return { x: Jh + t2 * Math.cos(r2), y: Yh + t2 * Math.sin(r2) };
6553
6585
  }
6554
6586
  function Z(e4) {
6555
6587
  return document.createElementNS("http://www.w3.org/2000/svg", e4);
6556
6588
  }
6557
- var rg = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", "north node": "\u260A", "south node": "\u260B", chiron: "\u26B7", "true node": "\u260A" }, ig = ["\u2648", "\u2649", "\u264A", "\u264B", "\u264C", "\u264D", "\u264E", "\u264F", "\u2650", "\u2651", "\u2652", "\u2653"], ag = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], og = { conjunction: "\u260C", opposition: "\u260D", trine: "\u25B3", square: "\u25A1", sextile: "\u26B9", quincunx: "\u26BB", semisquare: "\u2220" };
6558
- function sg(e4) {
6589
+ var ig = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", "north node": "\u260A", "south node": "\u260B", chiron: "\u26B7", "true node": "\u260A" }, ag = ["\u2648", "\u2649", "\u264A", "\u264B", "\u264C", "\u264D", "\u264E", "\u264F", "\u2650", "\u2651", "\u2652", "\u2653"], og = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], sg = { conjunction: "\u260C", opposition: "\u260D", trine: "\u25B3", square: "\u25A1", sextile: "\u26B9", quincunx: "\u26BB", semisquare: "\u2220" };
6590
+ function cg(e4) {
6559
6591
  var t2;
6560
6592
  let n2 = e4.toLowerCase(), r2 = "--aspect-".concat(n2);
6561
6593
  return getComputedStyle(document.documentElement).getPropertyValue(r2).trim() || ((t2 = { conjunction: "#9a7fd4", opposition: "#e05252", trine: "#52a8e0", square: "#e08a52", sextile: "#52c07a", quincunx: "#c0b052", semisquare: "#b07a5a" }[n2]) == null ? "#888" : t2);
6562
6594
  }
6563
- var cg = ["#e8854c", "#7aaa6a", "#5aaad0", "#8878c8", "#e8854c", "#7aaa6a", "#5aaad0", "#8878c8", "#e8854c", "#7aaa6a", "#5aaad0", "#8878c8"];
6564
- function lg(e4) {
6595
+ var lg = ["#e8854c", "#7aaa6a", "#5aaad0", "#8878c8", "#e8854c", "#7aaa6a", "#5aaad0", "#8878c8", "#e8854c", "#7aaa6a", "#5aaad0", "#8878c8"];
6596
+ function ug(e4) {
6565
6597
  let t2 = "--planet-".concat(e4.toLowerCase().replace(/\s+/g, "-"));
6566
6598
  return getComputedStyle(document.documentElement).getPropertyValue(t2).trim() || "var(--text)";
6567
6599
  }
6568
- var ug = /* @__PURE__ */ new Set(["sun", "moon", "mercury", "venus", "mars", "jupiter", "saturn", "uranus", "neptune", "pluto", "chiron", "north node", "south node", "true node"]);
6569
- function dg(e4) {
6600
+ var dg = /* @__PURE__ */ new Set(["sun", "moon", "mercury", "venus", "mars", "jupiter", "saturn", "uranus", "neptune", "pluto", "chiron", "north node", "south node", "true node"]);
6601
+ function fg(e4) {
6570
6602
  let t2 = (e4 % 360 + 360) % 360, n2 = Math.floor(t2 / 30), r2 = Math.floor(t2 % 30);
6571
- return "".concat(r2, "\xB0").concat(Math.floor((t2 % 30 - r2) * 60).toString().padStart(2, "0"), "\u2032 ").concat(ag[n2]);
6603
+ return "".concat(r2, "\xB0").concat(Math.floor((t2 % 30 - r2) * 60).toString().padStart(2, "0"), "\u2032 ").concat(og[n2]);
6572
6604
  }
6573
6605
  function Q(e4) {
6574
6606
  return e4.replace(/\b\w/g, (e5) => e5.toUpperCase());
6575
6607
  }
6576
- function fg(e4) {
6577
- return Array.isArray(e4) ? e4 : e4 && typeof e4 == "object" ? Object.entries(e4).filter(([e5]) => ug.has(e5.toLowerCase())).map(([e5, t2]) => {
6608
+ function pg(e4) {
6609
+ return Array.isArray(e4) ? e4 : e4 && typeof e4 == "object" ? Object.entries(e4).filter(([e5]) => dg.has(e5.toLowerCase())).map(([e5, t2]) => {
6578
6610
  var n2, r2, i2, a2, o2, s2;
6579
6611
  return { name: e5.toLowerCase(), longitude: (n2 = (r2 = t2.longitude) == null ? t2.lon : r2) == null ? 0 : n2, speed: (i2 = t2.longitude_speed) == null ? t2.speed : i2, retrograde: !!((a2 = t2.is_retrograde) == null ? t2.retrograde : a2), sign: (o2 = t2.sign_name) == null ? t2.sign : o2, house: (s2 = t2.house_number) == null ? t2.house : s2 };
6580
6612
  }) : [];
6581
6613
  }
6582
- var pg = document.getElementById("tooltip");
6583
- function mg(e4, t2, n2, r2, i2) {
6584
- pg.innerHTML = '\n <div class="tooltip-title">'.concat(n2, '</div>\n <div class="tooltip-detail">').concat(r2, "</div>\n ").concat(i2 ? '<div class="tooltip-hint">'.concat(i2, "</div>") : "", "\n ");
6585
- let a2 = e4 + 14, o2 = t2 + 10;
6586
- a2 + 220 > window.innerWidth && (a2 = e4 - 220 - 8), o2 + 80 > window.innerHeight && (o2 = t2 - 80 - 8), pg.style.left = "".concat(a2, "px"), pg.style.top = "".concat(o2, "px"), pg.classList.add("visible");
6614
+ var mg = document.getElementById("tooltip");
6615
+ function hg(e4, t2, n2, r2, i2) {
6616
+ mg.innerHTML = '\n <div class="tooltip-title">'.concat(n2, '</div>\n <div class="tooltip-detail">').concat(r2, "</div>\n ").concat(i2 ? '<div class="tooltip-hint">'.concat(i2, "</div>") : "", "\n ");
6617
+ let a2 = mg.getBoundingClientRect(), o2 = a2.width || 220, s2 = a2.height || 80, c2 = e4 + 14, l2 = t2 + 14;
6618
+ c2 + o2 > window.innerWidth - 14 && (c2 = e4 - o2 - 14), l2 + s2 > window.innerHeight - 14 && (l2 = t2 - s2 - 14), mg.style.left = "".concat(Math.max(14, c2), "px"), mg.style.top = "".concat(Math.max(14, l2), "px"), mg.classList.add("visible");
6587
6619
  }
6588
- function hg() {
6589
- pg.classList.remove("visible");
6620
+ function gg() {
6621
+ mg.classList.remove("visible");
6590
6622
  }
6591
- function gg(e4) {
6623
+ function _g(e4) {
6592
6624
  return Math.floor((e4 % 360 + 360) % 360 / 30);
6593
6625
  }
6594
- var _g = { sun: [4], moon: [3], mercury: [2, 5], venus: [1, 6], mars: [0, 7], jupiter: [8, 11], saturn: [9, 10] }, vg = { sun: 0, moon: 1, mercury: 5, venus: 11, mars: 9, jupiter: 3, saturn: 6 };
6595
- function yg(e4, t2) {
6596
- let n2 = e4.toLowerCase(), r2 = gg(t2), i2 = _g[n2];
6626
+ var vg = { sun: [4], moon: [3], mercury: [2, 5], venus: [1, 6], mars: [0, 7], jupiter: [8, 11], saturn: [9, 10] }, yg = { sun: 0, moon: 1, mercury: 5, venus: 11, mars: 9, jupiter: 3, saturn: 6 };
6627
+ function bg(e4, t2) {
6628
+ let n2 = e4.toLowerCase(), r2 = _g(t2), i2 = vg[n2];
6597
6629
  if (i2 != null && i2.includes(r2)) return { type: "domicile", label: "Domicile", emoji: "\u2302", cssClass: "dignity-domicile" };
6598
6630
  if (i2 && i2.map((e5) => (e5 + 6) % 12).includes(r2)) return { type: "detriment", label: "Detriment", emoji: "\u2B07", cssClass: "dignity-detriment" };
6599
- let a2 = vg[n2];
6631
+ let a2 = yg[n2];
6600
6632
  return a2 !== void 0 && a2 === r2 ? { type: "exaltation", label: "Exaltation", emoji: "\u2605", cssClass: "dignity-exaltation" } : a2 !== void 0 && (a2 + 6) % 12 === r2 ? { type: "fall", label: "Fall", emoji: "\u2193", cssClass: "dignity-fall" } : null;
6601
6633
  }
6602
- var bg = /* @__PURE__ */ new Set(["sun", "moon", "mercury", "venus", "mars", "jupiter", "saturn"]), xg = ["fire", "earth", "air", "water", "fire", "earth", "air", "water", "fire", "earth", "air", "water"], Sg = ["cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable"];
6603
- function Cg(e4, t2) {
6634
+ var xg = /* @__PURE__ */ new Set(["sun", "moon", "mercury", "venus", "mars", "jupiter", "saturn"]), Sg = ["fire", "earth", "air", "water", "fire", "earth", "air", "water", "fire", "earth", "air", "water"], Cg = ["cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable"];
6635
+ function wg(e4, t2) {
6604
6636
  let n2 = { fire: 0, earth: 0, air: 0, water: 0, cardinal: 0, fixed: 0, mutable: 0 };
6605
6637
  for (let t3 of e4) {
6606
- if (!bg.has(t3.name.toLowerCase())) continue;
6607
- let e5 = gg(t3.longitude);
6608
- n2[xg[e5]]++, n2[Sg[e5]]++;
6638
+ if (!xg.has(t3.name.toLowerCase())) continue;
6639
+ let e5 = _g(t3.longitude);
6640
+ n2[Sg[e5]]++, n2[Cg[e5]]++;
6609
6641
  }
6610
- let r2 = gg(t2);
6611
- return n2[xg[r2]]++, n2[Sg[r2]]++, n2;
6642
+ let r2 = _g(t2);
6643
+ return n2[Sg[r2]]++, n2[Cg[r2]]++, n2;
6612
6644
  }
6613
- function wg(e4, t2) {
6645
+ function Tg(e4, t2) {
6614
6646
  return [e4.toLowerCase(), t2.toLowerCase()].sort().join("|");
6615
6647
  }
6616
- function Tg(e4, t2) {
6648
+ function Eg(e4, t2) {
6617
6649
  return e4.filter((e5) => {
6618
6650
  var n2;
6619
6651
  return ((n2 = e5.type) == null ? "" : n2).toLowerCase() === t2;
6620
6652
  });
6621
6653
  }
6622
- function Eg(e4, t2) {
6623
- let n2 = [], r2 = Tg(e4, "square"), i2 = Tg(e4, "opposition"), a2 = Tg(e4, "trine"), o2 = Tg(e4, "sextile"), s2 = Tg(e4, "quincunx"), c2 = /* @__PURE__ */ new Set();
6654
+ function Dg(e4, t2) {
6655
+ let n2 = [], r2 = Eg(e4, "square"), i2 = Eg(e4, "opposition"), a2 = Eg(e4, "trine"), o2 = Eg(e4, "sextile"), s2 = Eg(e4, "quincunx"), c2 = /* @__PURE__ */ new Set();
6624
6656
  for (let e5 of i2) {
6625
6657
  let i3 = e5.planet1.toLowerCase(), a3 = e5.planet2.toLowerCase(), o3 = r2.filter((e6) => e6.planet1.toLowerCase() === i3 || e6.planet2.toLowerCase() === i3);
6626
6658
  for (let e6 of o3) {
@@ -6629,8 +6661,8 @@ function Eg(e4, t2) {
6629
6661
  let s3 = [i3, a3, o4].sort().join("|");
6630
6662
  if (!c2.has(s3) && r2.find((e7) => e7.planet1.toLowerCase() === o4 && e7.planet2.toLowerCase() === a3 || e7.planet2.toLowerCase() === o4 && e7.planet1.toLowerCase() === a3)) {
6631
6663
  c2.add(s3);
6632
- let e7 = t2.find((e8) => e8.name.toLowerCase() === o4), r3 = e7 ? Q(Sg[gg(e7.longitude)]) : "";
6633
- n2.push({ name: "T-Square", description: "".concat(r3 ? r3 + " \xB7 " : "", "Apex: ").concat(Q(o4)), planets: [.../* @__PURE__ */ new Set([i3, a3, o4])], aspectKeys: [wg(i3, a3), wg(i3, o4), wg(a3, o4)] });
6664
+ let e7 = t2.find((e8) => e8.name.toLowerCase() === o4), r3 = e7 ? Q(Cg[_g(e7.longitude)]) : "";
6665
+ n2.push({ name: "T-Square", description: "".concat(r3 ? r3 + " \xB7 " : "", "Apex: ").concat(Q(o4)), planets: [.../* @__PURE__ */ new Set([i3, a3, o4])], aspectKeys: [Tg(i3, a3), Tg(i3, o4), Tg(a3, o4)] });
6634
6666
  break;
6635
6667
  }
6636
6668
  }
@@ -6640,7 +6672,7 @@ function Eg(e4, t2) {
6640
6672
  let r3 = a2[e5], i3 = a2[t3], o3 = [r3.planet1.toLowerCase(), r3.planet2.toLowerCase()], s3 = [i3.planet1.toLowerCase(), i3.planet2.toLowerCase()], c3 = o3.find((e6) => s3.includes(e6));
6641
6673
  if (!c3) continue;
6642
6674
  let u3 = o3.find((e6) => e6 !== c3), d3 = s3.find((e6) => e6 !== c3), f3 = [u3, c3, d3].sort().join("|");
6643
- l2.has(f3) || a2.find((e6) => e6.planet1.toLowerCase() === u3 && e6.planet2.toLowerCase() === d3 || e6.planet2.toLowerCase() === u3 && e6.planet1.toLowerCase() === d3) && (l2.add(f3), n2.push({ name: "Grand Trine", description: "".concat(Q(u3), " \xB7 ").concat(Q(c3), " \xB7 ").concat(Q(d3)), planets: [u3, c3, d3], aspectKeys: [wg(u3, c3), wg(c3, d3), wg(u3, d3)] }));
6675
+ l2.has(f3) || a2.find((e6) => e6.planet1.toLowerCase() === u3 && e6.planet2.toLowerCase() === d3 || e6.planet2.toLowerCase() === u3 && e6.planet1.toLowerCase() === d3) && (l2.add(f3), n2.push({ name: "Grand Trine", description: "".concat(Q(u3), " \xB7 ").concat(Q(c3), " \xB7 ").concat(Q(d3)), planets: [u3, c3, d3], aspectKeys: [Tg(u3, c3), Tg(c3, d3), Tg(u3, d3)] }));
6644
6676
  }
6645
6677
  if (i2.length >= 2 && r2.length >= 4) for (let e5 = 0; e5 < i2.length; e5++) for (let a3 = e5 + 1; a3 < i2.length; a3++) {
6646
6678
  let o3 = i2[e5], s3 = i2[a3], [c3, l3] = [o3.planet1.toLowerCase(), o3.planet2.toLowerCase()], [u3, d3] = [s3.planet1.toLowerCase(), s3.planet2.toLowerCase()];
@@ -6651,19 +6683,19 @@ function Eg(e4, t2) {
6651
6683
  var n3, r3;
6652
6684
  return { name: e7, lon: (n3 = (r3 = t2.find((t3) => t3.name.toLowerCase() === e7)) == null ? void 0 : r3.longitude) == null ? 0 : n3 };
6653
6685
  }).sort((e7, t3) => e7.lon - t3.lon).map((e7) => e7.name);
6654
- n2.push({ name: "Grand Cross", description: e6.map(Q).join(" \xB7 "), planets: [c3, l3, u3, d3], aspectKeys: [wg(c3, l3), wg(u3, d3), ...f3.map(([e7, t3]) => wg(e7, t3))] });
6686
+ n2.push({ name: "Grand Cross", description: e6.map(Q).join(" \xB7 "), planets: [c3, l3, u3, d3], aspectKeys: [Tg(c3, l3), Tg(u3, d3), ...f3.map(([e7, t3]) => Tg(e7, t3))] });
6655
6687
  }
6656
6688
  }
6657
6689
  let u2 = /* @__PURE__ */ new Set(["north node", "south node", "true node", "chiron"]), d2 = t2.filter((e5) => !u2.has(e5.name.toLowerCase())).map((e5) => ({ name: e5.name.toLowerCase(), lon: e5.longitude })), f2 = /* @__PURE__ */ new Map();
6658
6690
  for (let { name: e5, lon: t3 } of d2) {
6659
6691
  var p2;
6660
- let n3 = gg(t3), r3 = (p2 = f2.get(n3)) == null ? [] : p2;
6692
+ let n3 = _g(t3), r3 = (p2 = f2.get(n3)) == null ? [] : p2;
6661
6693
  r3.push(e5), f2.set(n3, r3);
6662
6694
  }
6663
6695
  for (let [e5, t3] of f2) if (t3.length >= 3) {
6664
6696
  let r3 = [...t3].sort().join("|"), i3 = [];
6665
- for (let e6 = 0; e6 < t3.length; e6++) for (let n3 = e6 + 1; n3 < t3.length; n3++) i3.push(wg(t3[e6], t3[n3]));
6666
- n2.push({ name: "Stellium", description: "".concat(ag[e5], ": ").concat(t3.map(Q).join(", ")), planets: t3, aspectKeys: i3, _dedupeKey: r3 });
6697
+ for (let e6 = 0; e6 < t3.length; e6++) for (let n3 = e6 + 1; n3 < t3.length; n3++) i3.push(Tg(t3[e6], t3[n3]));
6698
+ n2.push({ name: "Stellium", description: "".concat(og[e5], ": ").concat(t3.map(Q).join(", ")), planets: t3, aspectKeys: i3, _dedupeKey: r3 });
6667
6699
  }
6668
6700
  let m2 = [...d2].sort((e5, t3) => e5.lon - t3.lon), h2 = [...m2, ...m2.map((e5) => ({ ...e5, lon: e5.lon + 360 }))], g2 = /* @__PURE__ */ new Set();
6669
6701
  for (let e5 = 0; e5 < h2.length - 2; e5++) {
@@ -6676,7 +6708,7 @@ function Eg(e4, t2) {
6676
6708
  if (g2.has(t4)) continue;
6677
6709
  if (g2.add(t4), !n2.some((e7) => e7._dedupeKey === t4)) {
6678
6710
  let t5 = [];
6679
- for (let n3 = 0; n3 < e6.length; n3++) for (let r4 = n3 + 1; r4 < e6.length; r4++) t5.push(wg(e6[n3], e6[r4]));
6711
+ for (let n3 = 0; n3 < e6.length; n3++) for (let r4 = n3 + 1; r4 < e6.length; r4++) t5.push(Tg(e6[n3], e6[r4]));
6680
6712
  n2.push({ name: "Stellium", description: "Tight cluster: ".concat(e6.map(Q).join(", ")), planets: e6, aspectKeys: t5 });
6681
6713
  }
6682
6714
  }
@@ -6686,44 +6718,39 @@ function Eg(e4, t2) {
6686
6718
  let r3 = s2[e5], i3 = s2[t3], a3 = [r3.planet1.toLowerCase(), r3.planet2.toLowerCase()], c3 = [i3.planet1.toLowerCase(), i3.planet2.toLowerCase()], l3 = a3.find((e6) => c3.includes(e6));
6687
6719
  if (!l3) continue;
6688
6720
  let u3 = a3.find((e6) => e6 !== l3), d3 = c3.find((e6) => e6 !== l3), f3 = [l3, u3, d3].sort().join("|");
6689
- _2.has(f3) || o2.find((e6) => e6.planet1.toLowerCase() === u3 && e6.planet2.toLowerCase() === d3 || e6.planet2.toLowerCase() === u3 && e6.planet1.toLowerCase() === d3) && (_2.add(f3), n2.push({ name: "Yod", description: "Apex: ".concat(Q(l3)), planets: [l3, u3, d3], aspectKeys: [wg(l3, u3), wg(l3, d3), wg(u3, d3)] }));
6721
+ _2.has(f3) || o2.find((e6) => e6.planet1.toLowerCase() === u3 && e6.planet2.toLowerCase() === d3 || e6.planet2.toLowerCase() === u3 && e6.planet1.toLowerCase() === d3) && (_2.add(f3), n2.push({ name: "Yod", description: "Apex: ".concat(Q(l3)), planets: [l3, u3, d3], aspectKeys: [Tg(l3, u3), Tg(l3, d3), Tg(u3, d3)] }));
6690
6722
  }
6691
6723
  for (let e5 of n2) delete e5._dedupeKey;
6692
6724
  return n2;
6693
6725
  }
6694
- var Dg = null, Og = null, kg = null, Ag = null, jg = null, Mg = null;
6695
- function Ng(e4) {
6696
- Mg = e4;
6726
+ var Og = null, kg = null, Ag = null, jg = null, Mg = null, Ng = null;
6727
+ function Pg(e4) {
6728
+ Ng = e4;
6697
6729
  }
6698
- var Pg = /* @__PURE__ */ new Map();
6699
- function Fg() {
6700
- return Dg || (Dg = document.createElement("div"), Dg.id = "info-panel", Dg.className = "info-panel", document.body.appendChild(Dg), Dg);
6730
+ var Fg = /* @__PURE__ */ new Map();
6731
+ function Ig() {
6732
+ return Og || (Og = document.createElement("div"), Og.id = "info-panel", Og.className = "info-panel", document.body.appendChild(Og), Og);
6701
6733
  }
6702
- function Ig(e4, t2, n2) {
6734
+ function Lg(e4, t2, n2) {
6703
6735
  var r2, i2, a2, o2;
6704
- let s2 = Fg(), c2 = (r2 = rg[t2.name.toLowerCase()]) == null ? "\u2605" : r2, l2 = (i2 = ig[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "" : i2, u2 = yg(t2.name, t2.longitude), d2 = u2 ? '<span class="dignity-badge '.concat(u2.cssClass, '" title="').concat(u2.label, '">').concat(u2.emoji, " ").concat(u2.label, "</span>") : "", f2 = n2.filter((e5) => e5.planet1.toLowerCase() === t2.name.toLowerCase() || e5.planet2.toLowerCase() === t2.name.toLowerCase()).sort((e5, t3) => {
6736
+ let s2 = Ig(), c2 = (r2 = ig[t2.name.toLowerCase()]) == null ? "\u2605" : r2, l2 = (i2 = ag[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "" : i2, u2 = bg(t2.name, t2.longitude), d2 = u2 ? '<span class="dignity-badge '.concat(u2.cssClass, '" title="').concat(u2.label, '">').concat(u2.emoji, " ").concat(u2.label, "</span>") : "", f2 = n2.filter((e5) => e5.planet1.toLowerCase() === t2.name.toLowerCase() || e5.planet2.toLowerCase() === t2.name.toLowerCase()).sort((e5, t3) => {
6705
6737
  var n3, r3;
6706
6738
  return ((n3 = e5.orb) == null ? 99 : n3) - ((r3 = t3.orb) == null ? 99 : r3);
6707
6739
  }), p2 = f2.length ? f2.map((e5) => {
6708
6740
  var n3, r3, i3, a3, o3, s3, c3;
6709
- let l3 = e5.planet1.toLowerCase() === t2.name.toLowerCase() ? e5.planet2 : e5.planet1, u3 = (n3 = rg[l3.toLowerCase()]) == null ? l3 : n3, d3 = (r3 = (i3 = og[(a3 = (o3 = e5.type) == null ? void 0 : o3.toLowerCase()) == null ? "" : a3]) == null ? e5.type : i3) == null ? "\u2014" : r3, f3 = (s3 = sg((c3 = e5.type) == null ? "" : c3)) == null ? "#888" : s3, p3 = e5.orb == null ? "" : "".concat(e5.orb.toFixed(1), "\xB0"), m3 = e5.applying === true ? "\u2197" : e5.applying === false ? "\u2198" : "\xB7";
6741
+ let l3 = e5.planet1.toLowerCase() === t2.name.toLowerCase() ? e5.planet2 : e5.planet1, u3 = (n3 = ig[l3.toLowerCase()]) == null ? l3 : n3, d3 = (r3 = (i3 = sg[(a3 = (o3 = e5.type) == null ? void 0 : o3.toLowerCase()) == null ? "" : a3]) == null ? e5.type : i3) == null ? "\u2014" : r3, f3 = (s3 = cg((c3 = e5.type) == null ? "" : c3)) == null ? "#888" : s3, p3 = e5.orb == null ? "" : "".concat(e5.orb.toFixed(1), "\xB0"), m3 = e5.applying === true ? "\u2197" : e5.applying === false ? "\u2198" : "\xB7";
6710
6742
  return '<div class="aspect-row">\n <span class="aspect-dot" style="background:'.concat(f3, '"></span>\n <span class="aspect-sym" style="color:').concat(f3, '">').concat(d3, '</span>\n <span class="aspect-other">').concat(u3, " ").concat(Q(l3), '</span>\n <span class="aspect-meta">').concat(p3, " ").concat(m3, "</span>\n </div>");
6711
- }).join("") : '<div class="no-aspects">No listed aspects</div>', m2 = jg ? '<button class="ask-claude-btn" id="ask-claude-btn">Ask Claude \u2014 Interpret</button>' : '<div class="info-hint">Click an aspect line for full interpretation</div>';
6712
- s2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph">'.concat(c2, '</span>\n <div class="info-title">\n <div class="info-name-row">\n <strong>').concat(Q(t2.name), "</strong>").concat(t2.retrograde ? " <span class='retro'>\u211E</span>" : "", "\n ").concat(d2, '\n </div>\n <div class="info-pos">').concat(l2, " ").concat(dg(t2.longitude)).concat(t2.house ? " \xB7 House ".concat(t2.house) : "", '</div>\n </div>\n <button class="info-close" id="info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title">Aspects</div>\n <div class="aspects-list">').concat(p2, "</div>\n ").concat(m2, "\n "), s2.classList.add("visible"), requestAnimationFrame(() => {
6713
- let t3 = s2.getBoundingClientRect(), n3 = s2.offsetParent, r3, i3, a3, o3;
6714
- if (n3) {
6715
- let e5 = n3.getBoundingClientRect();
6716
- r3 = e5.width, i3 = e5.height, a3 = e5.left, o3 = e5.top;
6717
- } else r3 = window.innerWidth, i3 = window.innerHeight, a3 = 0, o3 = 0;
6718
- let c3 = e4.clientX - a3 + 14, l3 = e4.clientY - o3 + 14;
6719
- c3 + t3.width > r3 - 14 && (c3 = e4.clientX - a3 - t3.width - 14), l3 + t3.height > i3 - 14 && (l3 = e4.clientY - o3 - t3.height - 14), c3 = Math.max(14, c3), l3 = Math.max(14, l3), s2.style.left = "".concat(c3, "px"), s2.style.top = "".concat(l3, "px");
6743
+ }).join("") : '<div class="no-aspects">No listed aspects</div>', m2 = Mg ? '<button class="ask-claude-btn" id="ask-claude-btn">Ask Claude \u2014 Interpret</button>' : '<div class="info-hint">Click an aspect line for full interpretation</div>';
6744
+ s2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph">'.concat(c2, '</span>\n <div class="info-title">\n <div class="info-name-row">\n <strong>').concat(Q(t2.name), "</strong>").concat(t2.retrograde ? " <span class='retro'>\u211E</span>" : "", "\n ").concat(d2, '\n </div>\n <div class="info-pos">').concat(l2, " ").concat(fg(t2.longitude)).concat(t2.house ? " \xB7 House ".concat(t2.house) : "", '</div>\n </div>\n <button class="info-close" id="info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title">Aspects</div>\n <div class="aspects-list">').concat(p2, "</div>\n ").concat(m2, "\n "), s2.classList.add("visible"), requestAnimationFrame(() => {
6745
+ let t3 = s2.getBoundingClientRect(), n3 = e4.clientX + 14, r3 = e4.clientY + 14;
6746
+ n3 + t3.width > window.innerWidth - 14 && (n3 = e4.clientX - t3.width - 14), r3 + t3.height > window.innerHeight - 14 && (r3 = e4.clientY - t3.height - 14), n3 = Math.max(14, n3), r3 = Math.max(14, r3), s2.style.left = "".concat(n3, "px"), s2.style.top = "".concat(r3, "px");
6720
6747
  }), (a2 = document.getElementById("info-close-btn")) == null || a2.addEventListener("click", () => {
6721
- zg(), Hg();
6748
+ Bg(), Ug();
6722
6749
  }), (o2 = document.getElementById("ask-claude-btn")) == null || o2.addEventListener("click", () => {
6723
6750
  var e5, n3, r3, i3, a3;
6724
- if (!jg) return;
6751
+ if (!Mg) return;
6725
6752
  let o3 = document.getElementById("ask-claude-btn");
6726
- !o3 || o3.disabled || (o3.disabled = true, o3.textContent = "Sending\u2026", o3.classList.remove("sent", "error"), o3.classList.add("sending"), jg({ type: "planet", data: { name: t2.name, longitude: t2.longitude, sign: (e5 = t2.sign) == null ? dg(t2.longitude) : e5, house: (n3 = t2.house) == null ? null : n3, retrograde: (r3 = t2.retrograde) == null ? false : r3, speed: (i3 = t2.speed) == null ? null : i3, dignity: (a3 = u2 == null ? void 0 : u2.label) == null ? null : a3, aspects: f2.map((e6) => ({ other: e6.planet1.toLowerCase() === t2.name.toLowerCase() ? e6.planet2 : e6.planet1, type: e6.type, orb: e6.orb, applying: e6.applying })) } }).then(() => {
6753
+ !o3 || o3.disabled || (o3.disabled = true, o3.textContent = "Sending\u2026", o3.classList.remove("sent", "error"), o3.classList.add("sending"), Mg({ type: "planet", data: { name: t2.name, longitude: t2.longitude, sign: (e5 = t2.sign) == null ? fg(t2.longitude) : e5, house: (n3 = t2.house) == null ? null : n3, retrograde: (r3 = t2.retrograde) == null ? false : r3, speed: (i3 = t2.speed) == null ? null : i3, dignity: (a3 = u2 == null ? void 0 : u2.label) == null ? null : a3, aspects: f2.map((e6) => ({ other: e6.planet1.toLowerCase() === t2.name.toLowerCase() ? e6.planet2 : e6.planet1, type: e6.type, orb: e6.orb, applying: e6.applying })) } }).then(() => {
6727
6754
  o3.textContent = "\u2713 Sent to Claude", o3.classList.remove("sending"), o3.classList.add("sent"), setTimeout(() => {
6728
6755
  o3.textContent = "\u2728 Ask Claude to interpret", o3.classList.remove("sent"), o3.disabled = false;
6729
6756
  }, 2500);
@@ -6732,24 +6759,19 @@ function Ig(e4, t2, n2) {
6732
6759
  }));
6733
6760
  });
6734
6761
  }
6735
- function Lg(e4, t2, n2) {
6762
+ function Rg(e4, t2, n2) {
6736
6763
  var r2, i2, a2, o2, s2, c2, l2, u2, d2, f2;
6737
- let p2 = Fg(), m2 = n2.find((e5) => e5.name.toLowerCase() === t2.planet1.toLowerCase()), h2 = n2.find((e5) => e5.name.toLowerCase() === t2.planet2.toLowerCase()), g2 = (r2 = rg[t2.planet1.toLowerCase()]) == null ? t2.planet1 : r2, _2 = (i2 = rg[t2.planet2.toLowerCase()]) == null ? t2.planet2 : i2, v2 = (a2 = og[(o2 = (s2 = t2.type) == null ? void 0 : s2.toLowerCase()) == null ? "" : o2]) == null ? "" : a2, y2 = sg((c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2), b2 = t2.orb == null ? "unknown orb" : "".concat(t2.orb.toFixed(2), "\xB0"), x2 = t2.applying === true ? "Applying (growing closer)" : t2.applying === false ? "Separating (moving apart)" : "", S2 = m2 ? "".concat(dg(m2.longitude)).concat(m2.house ? " \xB7 H".concat(m2.house) : "") : "", C2 = h2 ? "".concat(dg(h2.longitude)).concat(h2.house ? " \xB7 H".concat(h2.house) : "") : "", w2 = jg ? '<button class="ask-claude-btn" id="ask-claude-btn">Ask Claude \u2014 Interpret</button>' : "";
6764
+ let p2 = Ig(), m2 = n2.find((e5) => e5.name.toLowerCase() === t2.planet1.toLowerCase()), h2 = n2.find((e5) => e5.name.toLowerCase() === t2.planet2.toLowerCase()), g2 = (r2 = ig[t2.planet1.toLowerCase()]) == null ? t2.planet1 : r2, _2 = (i2 = ig[t2.planet2.toLowerCase()]) == null ? t2.planet2 : i2, v2 = (a2 = sg[(o2 = (s2 = t2.type) == null ? void 0 : s2.toLowerCase()) == null ? "" : o2]) == null ? "" : a2, y2 = cg((c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2), b2 = t2.orb == null ? "unknown orb" : "".concat(t2.orb.toFixed(2), "\xB0"), x2 = t2.applying === true ? "Applying (growing closer)" : t2.applying === false ? "Separating (moving apart)" : "", S2 = m2 ? "".concat(fg(m2.longitude)).concat(m2.house ? " \xB7 H".concat(m2.house) : "") : "", C2 = h2 ? "".concat(fg(h2.longitude)).concat(h2.house ? " \xB7 H".concat(h2.house) : "") : "", w2 = Mg ? '<button class="ask-claude-btn" id="ask-claude-btn">Ask Claude \u2014 Interpret</button>' : "";
6738
6765
  p2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(y2, '">').concat(v2, '</span>\n <div class="info-title">\n <div class="info-name-row">\n <strong>').concat(Q((u2 = t2.type) == null ? "Aspect" : u2), '</strong>\n </div>\n <div class="info-pos">').concat(b2).concat(x2 ? " \xB7 ".concat(x2) : "", '</div>\n </div>\n <button class="info-close" id="info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title">Planets in Aspect</div>\n <div class="aspect-pair-row">\n <div class="aspect-pair-planet">\n <span class="aspect-pair-glyph">').concat(g2, '</span>\n <div>\n <div class="aspect-pair-name">').concat(Q(t2.planet1), '</div>\n <div class="aspect-pair-pos">').concat(S2, '</div>\n </div>\n </div>\n <span class="aspect-pair-sym" style="color:').concat(y2, '">').concat(v2, '</span>\n <div class="aspect-pair-planet">\n <span class="aspect-pair-glyph">').concat(_2, '</span>\n <div>\n <div class="aspect-pair-name">').concat(Q(t2.planet2), '</div>\n <div class="aspect-pair-pos">').concat(C2, "</div>\n </div>\n </div>\n </div>\n ").concat(w2, "\n "), p2.classList.add("visible"), requestAnimationFrame(() => {
6739
- let t3 = p2.getBoundingClientRect(), n3 = p2.offsetParent, r3, i3, a3, o3;
6740
- if (n3) {
6741
- let e5 = n3.getBoundingClientRect();
6742
- r3 = e5.width, i3 = e5.height, a3 = e5.left, o3 = e5.top;
6743
- } else r3 = window.innerWidth, i3 = window.innerHeight, a3 = 0, o3 = 0;
6744
- let s3 = e4.clientX - a3 + 14, c3 = e4.clientY - o3 + 14;
6745
- s3 + t3.width > r3 - 14 && (s3 = e4.clientX - a3 - t3.width - 14), c3 + t3.height > i3 - 14 && (c3 = e4.clientY - o3 - t3.height - 14), s3 = Math.max(14, s3), c3 = Math.max(14, c3), p2.style.left = "".concat(s3, "px"), p2.style.top = "".concat(c3, "px");
6766
+ let t3 = p2.getBoundingClientRect(), n3 = e4.clientX + 14, r3 = e4.clientY + 14;
6767
+ n3 + t3.width > window.innerWidth - 14 && (n3 = e4.clientX - t3.width - 14), r3 + t3.height > window.innerHeight - 14 && (r3 = e4.clientY - t3.height - 14), n3 = Math.max(14, n3), r3 = Math.max(14, r3), p2.style.left = "".concat(n3, "px"), p2.style.top = "".concat(r3, "px");
6746
6768
  }), (d2 = document.getElementById("info-close-btn")) == null || d2.addEventListener("click", () => {
6747
- zg(), Hg();
6769
+ Bg(), Ug();
6748
6770
  }), (f2 = document.getElementById("ask-claude-btn")) == null || f2.addEventListener("click", () => {
6749
6771
  var e5, n3, r3, i3, a3, o3, s3, c3;
6750
- if (!jg) return;
6772
+ if (!Mg) return;
6751
6773
  let l3 = document.getElementById("ask-claude-btn");
6752
- !l3 || l3.disabled || (l3.disabled = true, l3.textContent = "Sending\u2026", l3.classList.add("sending"), jg({ type: "aspect", data: { planet1: t2.planet1, planet2: t2.planet2, aspect_type: (e5 = t2.type) == null ? null : e5, orb: (n3 = t2.orb) == null ? null : n3, applying: (r3 = t2.applying) == null ? null : r3, angle: (i3 = t2.angle) == null ? null : i3, planet1_sign: (a3 = m2 == null ? void 0 : m2.sign) == null ? null : a3, planet1_house: (o3 = m2 == null ? void 0 : m2.house) == null ? null : o3, planet2_sign: (s3 = h2 == null ? void 0 : h2.sign) == null ? null : s3, planet2_house: (c3 = h2 == null ? void 0 : h2.house) == null ? null : c3 } }).then(() => {
6774
+ !l3 || l3.disabled || (l3.disabled = true, l3.textContent = "Sending\u2026", l3.classList.add("sending"), Mg({ type: "aspect", data: { planet1: t2.planet1, planet2: t2.planet2, aspect_type: (e5 = t2.type) == null ? null : e5, orb: (n3 = t2.orb) == null ? null : n3, applying: (r3 = t2.applying) == null ? null : r3, angle: (i3 = t2.angle) == null ? null : i3, planet1_sign: (a3 = m2 == null ? void 0 : m2.sign) == null ? null : a3, planet1_house: (o3 = m2 == null ? void 0 : m2.house) == null ? null : o3, planet2_sign: (s3 = h2 == null ? void 0 : h2.sign) == null ? null : s3, planet2_house: (c3 = h2 == null ? void 0 : h2.house) == null ? null : c3 } }).then(() => {
6753
6775
  l3.textContent = "Sent", l3.classList.remove("sending"), l3.classList.add("sent"), setTimeout(() => {
6754
6776
  l3.textContent = "Ask Claude \u2014 Interpret", l3.classList.remove("sent"), l3.disabled = false;
6755
6777
  }, 2500);
@@ -6758,13 +6780,13 @@ function Lg(e4, t2, n2) {
6758
6780
  }));
6759
6781
  });
6760
6782
  }
6761
- function Rg(e4, t2, n2) {
6783
+ function zg(e4, t2, n2) {
6762
6784
  var r2, i2, a2, o2, s2;
6763
- let c2 = Fg(), l2 = Math.floor((t2.cusp_lon % 360 + 360) % 360 / 30), u2 = (r2 = ig[l2]) == null ? "" : r2, d2 = (i2 = (a2 = t2.sign) == null ? ag[l2] : a2) == null ? "" : i2, f2 = n2.filter((e5) => e5.house === t2.number), p2 = f2.length ? f2.map((e5) => {
6785
+ let c2 = Ig(), l2 = Math.floor((t2.cusp_lon % 360 + 360) % 360 / 30), u2 = (r2 = ag[l2]) == null ? "" : r2, d2 = (i2 = (a2 = t2.sign) == null ? og[l2] : a2) == null ? "" : i2, f2 = n2.filter((e5) => e5.house === t2.number), p2 = f2.length ? f2.map((e5) => {
6764
6786
  var t3;
6765
- let n3 = (t3 = rg[e5.name.toLowerCase()]) == null ? e5.name : t3, r3 = dg(e5.longitude), i3 = e5.retrograde ? " <span class='retro'>\u211E</span>" : "";
6787
+ let n3 = (t3 = ig[e5.name.toLowerCase()]) == null ? e5.name : t3, r3 = fg(e5.longitude), i3 = e5.retrograde ? " <span class='retro'>\u211E</span>" : "";
6766
6788
  return '<div class="aspect-row">\n <span class="aspect-sym">'.concat(n3, '</span>\n <span class="aspect-other">').concat(Q(e5.name)).concat(i3, '</span>\n <span class="aspect-meta">').concat(r3, "</span>\n </div>");
6767
- }).join("") : '<div class="no-aspects">No planets in this house</div>', m2 = jg ? '<button class="ask-claude-btn" id="ask-claude-btn">Ask Claude \u2014 Interpret</button>' : "";
6789
+ }).join("") : '<div class="no-aspects">No planets in this house</div>', m2 = Mg ? '<button class="ask-claude-btn" id="ask-claude-btn">Ask Claude \u2014 Interpret</button>' : "";
6768
6790
  c2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph">'.concat(u2, '</span>\n <div class="info-title">\n <div class="info-name-row">\n <strong>House ').concat(t2.number, '</strong>\n </div>\n <div class="info-pos">').concat(u2, " ").concat(d2, " on cusp").concat(t2.ruler ? " \xB7 ruled by ".concat(Q(t2.ruler)) : "", '</div>\n </div>\n <button class="info-close" id="info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title">Planets in House ').concat(t2.number, '</div>\n <div class="aspects-list">').concat(p2, "</div>\n ").concat(m2, "\n "), c2.classList.add("visible"), requestAnimationFrame(() => {
6769
6791
  let t3 = c2.getBoundingClientRect(), n3 = c2.offsetParent, r3, i3, a3, o3;
6770
6792
  if (n3) {
@@ -6774,14 +6796,14 @@ function Rg(e4, t2, n2) {
6774
6796
  let s3 = e4.clientX - a3 + 14, l3 = e4.clientY - o3 + 14;
6775
6797
  s3 + t3.width > r3 - 14 && (s3 = e4.clientX - a3 - t3.width - 14), l3 + t3.height > i3 - 14 && (l3 = e4.clientY - o3 - t3.height - 14), s3 = Math.max(14, s3), l3 = Math.max(14, l3), c2.style.left = "".concat(s3, "px"), c2.style.top = "".concat(l3, "px");
6776
6798
  }), (o2 = document.getElementById("info-close-btn")) == null || o2.addEventListener("click", () => {
6777
- zg(), Hg();
6799
+ Bg(), Ug();
6778
6800
  }), (s2 = document.getElementById("ask-claude-btn")) == null || s2.addEventListener("click", () => {
6779
6801
  var e5;
6780
- if (!jg) return;
6802
+ if (!Mg) return;
6781
6803
  let n3 = document.getElementById("ask-claude-btn");
6782
- !n3 || n3.disabled || (n3.disabled = true, n3.textContent = "Sending\u2026", n3.classList.add("sending"), jg({ type: "house", data: { house_number: t2.number, sign: d2, cusp_longitude: t2.cusp_lon, ruler: (e5 = t2.ruler) == null ? null : e5, planets_in_house: f2.map((e6) => {
6804
+ !n3 || n3.disabled || (n3.disabled = true, n3.textContent = "Sending\u2026", n3.classList.add("sending"), Mg({ type: "house", data: { house_number: t2.number, sign: d2, cusp_longitude: t2.cusp_lon, ruler: (e5 = t2.ruler) == null ? null : e5, planets_in_house: f2.map((e6) => {
6783
6805
  var t3, n4;
6784
- return { name: e6.name, sign: (t3 = e6.sign) == null ? dg(e6.longitude) : t3, retrograde: (n4 = e6.retrograde) == null ? false : n4 };
6806
+ return { name: e6.name, sign: (t3 = e6.sign) == null ? fg(e6.longitude) : t3, retrograde: (n4 = e6.retrograde) == null ? false : n4 };
6785
6807
  }) } }).then(() => {
6786
6808
  n3.textContent = "Sent", n3.classList.remove("sending"), n3.classList.add("sent"), setTimeout(() => {
6787
6809
  n3.textContent = "Ask Claude \u2014 Interpret", n3.classList.remove("sent"), n3.disabled = false;
@@ -6791,43 +6813,43 @@ function Rg(e4, t2, n2) {
6791
6813
  }));
6792
6814
  });
6793
6815
  }
6794
- function zg() {
6795
- Dg == null || Dg.classList.remove("visible"), Og = null, Mg == null || Mg(null);
6816
+ function Bg() {
6817
+ Og == null || Og.classList.remove("visible"), kg = null, Ng == null || Ng(null);
6796
6818
  }
6797
- function Bg(e4) {
6819
+ function Vg(e4) {
6798
6820
  let t2 = e4.toLowerCase();
6799
- Pg.forEach(({ vis: e5, color: n2 }, r2) => {
6821
+ Fg.forEach(({ vis: e5, color: n2 }, r2) => {
6800
6822
  r2.split("|").includes(t2) ? (e5.style.stroke = n2, e5.style.strokeOpacity = "0.9", e5.style.strokeWidth = "2") : (e5.style.strokeOpacity = "0.06", e5.style.strokeWidth = "0.8");
6801
- }), kg == null || kg.querySelectorAll(".planet-hit").forEach((e5) => e5.classList.toggle("dim", e5.dataset.planet !== t2));
6823
+ }), Ag == null || Ag.querySelectorAll(".planet-hit").forEach((e5) => e5.classList.toggle("dim", e5.dataset.planet !== t2));
6802
6824
  }
6803
- function Vg(e4, t2) {
6825
+ function Hg(e4, t2) {
6804
6826
  let n2 = new Set(e4.map((e5) => e5.toLowerCase())), r2 = new Set(t2);
6805
- Pg.forEach(({ vis: e5, color: t3 }, n3) => {
6827
+ Fg.forEach(({ vis: e5, color: t3 }, n3) => {
6806
6828
  r2.has(n3) ? (e5.style.stroke = t3, e5.style.strokeOpacity = "0.9", e5.style.strokeWidth = "2") : (e5.style.strokeOpacity = "0.06", e5.style.strokeWidth = "0.8");
6807
- }), kg == null || kg.querySelectorAll(".planet-hit").forEach((e5) => {
6829
+ }), Ag == null || Ag.querySelectorAll(".planet-hit").forEach((e5) => {
6808
6830
  var t3;
6809
6831
  return e5.classList.toggle("dim", !n2.has((t3 = e5.dataset.planet) == null ? "" : t3));
6810
6832
  });
6811
6833
  }
6812
- function Hg() {
6813
- Pg.forEach(({ vis: e4, color: t2, baseOpacity: n2, baseWidth: r2 }) => {
6834
+ function Ug() {
6835
+ Fg.forEach(({ vis: e4, color: t2, baseOpacity: n2, baseWidth: r2 }) => {
6814
6836
  e4.style.stroke = t2, e4.style.strokeOpacity = n2, e4.style.strokeWidth = r2;
6815
- }), kg == null || kg.querySelectorAll(".planet-hit").forEach((e4) => e4.classList.remove("dim"));
6837
+ }), Ag == null || Ag.querySelectorAll(".planet-hit").forEach((e4) => e4.classList.remove("dim"));
6816
6838
  }
6817
- function Ug(e4) {
6818
- Pg.forEach(({ vis: t2, color: n2, baseOpacity: r2, baseWidth: i2, aspectType: a2 }) => {
6839
+ function Wg(e4) {
6840
+ Fg.forEach(({ vis: t2, color: n2, baseOpacity: r2, baseWidth: i2, aspectType: a2 }) => {
6819
6841
  e4.has(a2) ? (t2.style.stroke = n2, t2.style.strokeOpacity = r2, t2.style.strokeWidth = i2) : t2.style.strokeOpacity = "0";
6820
6842
  });
6821
6843
  }
6822
- function Wg() {
6844
+ function Gg() {
6823
6845
  let e4 = /* @__PURE__ */ new Set();
6824
- return Pg.forEach(({ aspectType: t2 }) => e4.add(t2)), [...e4].sort();
6846
+ return Fg.forEach(({ aspectType: t2 }) => e4.add(t2)), [...e4].sort();
6825
6847
  }
6826
- function Gg(e4, t2, n2, r2, i2, a2, o2) {
6848
+ function Kg(e4, t2, n2, r2, i2, a2, o2) {
6827
6849
  var s2, c2, l2, u2, d2, f2, p2, m2, h2;
6828
- jg = a2 == null ? null : a2, e4.innerHTML = "", Pg.clear(), Og = null, zg();
6829
- let g2 = fg(t2.planets), _2 = (s2 = t2.houses) == null ? [] : s2, v2 = (c2 = t2.aspects) == null ? [] : c2, y2 = (l2 = (u2 = (d2 = _2[0]) == null ? void 0 : d2.cusp_lon) == null ? t2.ascendant : u2) == null ? 0 : l2, b2 = Z("svg");
6830
- b2.setAttribute("viewBox", "0 0 500 500"), b2.setAttribute("width", "100%"), b2.setAttribute("height", "100%"), b2.style.display = "block", e4.appendChild(b2), kg = b2;
6850
+ Mg = a2 == null ? null : a2, e4.innerHTML = "", Fg.clear(), kg = null, Bg();
6851
+ let g2 = pg(t2.planets), _2 = (s2 = t2.houses) == null ? [] : s2, v2 = (c2 = t2.aspects) == null ? [] : c2, y2 = (l2 = (u2 = (d2 = _2[0]) == null ? void 0 : d2.cusp_lon) == null ? t2.ascendant : u2) == null ? 0 : l2, b2 = Z("svg");
6852
+ b2.setAttribute("viewBox", "0 0 500 500"), b2.setAttribute("width", "100%"), b2.setAttribute("height", "100%"), b2.style.display = "block", e4.appendChild(b2), Ag = b2, qh(b2, "pan-zoom-controls");
6831
6853
  let x2 = Z("circle");
6832
6854
  x2.setAttribute("cx", "250"), x2.setAttribute("cy", "250"), x2.setAttribute("r", "244"), x2.style.fill = "var(--bg, #faf9f5)", x2.setAttribute("stroke", "#d4cec8"), x2.setAttribute("stroke-width", "0.5"), x2.setAttribute("pointer-events", "none"), b2.appendChild(x2);
6833
6855
  let S2 = window.matchMedia("(prefers-color-scheme: dark)").matches;
@@ -6837,34 +6859,34 @@ function Gg(e4, t2, n2, r2, i2, a2, o2) {
6837
6859
  } catch (e5) {
6838
6860
  }
6839
6861
  let C2 = Z("circle");
6840
- C2.setAttribute("cx", "250"), C2.setAttribute("cy", "250"), C2.setAttribute("r", String(Yh)), C2.setAttribute("fill", S2 ? "#141720" : "#f2ede6"), C2.setAttribute("stroke", S2 ? "#252a38" : "#c0b8a8"), C2.setAttribute("stroke-width", "0.5"), C2.setAttribute("pointer-events", "none"), b2.appendChild(C2);
6862
+ C2.setAttribute("cx", "250"), C2.setAttribute("cy", "250"), C2.setAttribute("r", String(Xh)), C2.setAttribute("fill", S2 ? "#141720" : "#f2ede6"), C2.setAttribute("stroke", S2 ? "#252a38" : "#c0b8a8"), C2.setAttribute("stroke-width", "0.5"), C2.setAttribute("pointer-events", "none"), b2.appendChild(C2);
6841
6863
  let w2 = Z("circle");
6842
- w2.setAttribute("cx", "250"), w2.setAttribute("cy", "250"), w2.setAttribute("r", String(Xh)), w2.style.fill = "var(--bg, #faf9f5)", w2.setAttribute("stroke", S2 ? "#2d3548" : "#c0b8a8"), w2.setAttribute("stroke-width", "0.5"), w2.setAttribute("pointer-events", "none"), b2.appendChild(w2);
6864
+ w2.setAttribute("cx", "250"), w2.setAttribute("cy", "250"), w2.setAttribute("r", String(Zh)), w2.style.fill = "var(--bg, #faf9f5)", w2.setAttribute("stroke", S2 ? "#2d3548" : "#c0b8a8"), w2.setAttribute("stroke-width", "0.5"), w2.setAttribute("pointer-events", "none"), b2.appendChild(w2);
6843
6865
  let ee2 = S2 ? ["rgba(200, 80, 60, 0.18)", "rgba(100,160, 70, 0.18)", "rgba(210,190, 60, 0.18)", "rgba( 70,120,200, 0.18)", "rgba(200, 80, 60, 0.18)", "rgba(100,160, 70, 0.18)", "rgba(210,190, 60, 0.18)", "rgba( 70,120,200, 0.18)", "rgba(200, 80, 60, 0.18)", "rgba(100,160, 70, 0.18)", "rgba(210,190, 60, 0.18)", "rgba( 70,120,200, 0.18)"] : ["rgba(210, 90, 60, 0.12)", "rgba( 90,150, 60, 0.12)", "rgba(200,180, 40, 0.12)", "rgba( 60,110,190, 0.12)", "rgba(210, 90, 60, 0.12)", "rgba( 90,150, 60, 0.12)", "rgba(200,180, 40, 0.12)", "rgba( 60,110,190, 0.12)", "rgba(210, 90, 60, 0.12)", "rgba( 90,150, 60, 0.12)", "rgba(200,180, 40, 0.12)", "rgba( 60,110,190, 0.12)"];
6844
6866
  for (let e5 = 0; e5 < 12; e5++) {
6845
- let t3 = e5 * 30, n3 = (e5 + 1) * 30, r3 = X(t3, Yh, y2), i3 = X(n3, Yh, y2), a3 = X(t3, Xh, y2), o3 = X(n3, Xh, y2), s3 = Z("path");
6846
- s3.setAttribute("d", ["M ".concat(r3.x.toFixed(1), " ").concat(r3.y.toFixed(1)), "A ".concat(Yh, " ").concat(Yh, " 0 0 0 ").concat(i3.x.toFixed(1), " ").concat(i3.y.toFixed(1)), "L ".concat(o3.x.toFixed(1), " ").concat(o3.y.toFixed(1)), "A ".concat(Xh, " ").concat(Xh, " 0 0 1 ").concat(a3.x.toFixed(1), " ").concat(a3.y.toFixed(1)), "Z"].join(" ")), s3.setAttribute("fill", ee2[e5]), s3.setAttribute("pointer-events", "none"), b2.appendChild(s3);
6847
- let { x: c3, y: l3 } = X(t3, Xh, y2), { x: u3, y: d3 } = X(t3, Yh, y2), f3 = Z("line");
6867
+ let t3 = e5 * 30, n3 = (e5 + 1) * 30, r3 = X(t3, Xh, y2), i3 = X(n3, Xh, y2), a3 = X(t3, Zh, y2), o3 = X(n3, Zh, y2), s3 = Z("path");
6868
+ s3.setAttribute("d", ["M ".concat(r3.x.toFixed(1), " ").concat(r3.y.toFixed(1)), "A ".concat(Xh, " ").concat(Xh, " 0 0 0 ").concat(i3.x.toFixed(1), " ").concat(i3.y.toFixed(1)), "L ".concat(o3.x.toFixed(1), " ").concat(o3.y.toFixed(1)), "A ".concat(Zh, " ").concat(Zh, " 0 0 1 ").concat(a3.x.toFixed(1), " ").concat(a3.y.toFixed(1)), "Z"].join(" ")), s3.setAttribute("fill", ee2[e5]), s3.setAttribute("pointer-events", "none"), b2.appendChild(s3);
6869
+ let { x: c3, y: l3 } = X(t3, Zh, y2), { x: u3, y: d3 } = X(t3, Xh, y2), f3 = Z("line");
6848
6870
  f3.setAttribute("x1", c3.toFixed(1)), f3.setAttribute("y1", l3.toFixed(1)), f3.setAttribute("x2", u3.toFixed(1)), f3.setAttribute("y2", d3.toFixed(1)), f3.setAttribute("stroke", S2 ? "#2d3548" : "#c0b8a8"), f3.setAttribute("stroke-width", "0.5"), f3.setAttribute("pointer-events", "none"), b2.appendChild(f3);
6849
- let { x: p3, y: m3 } = X(t3 + 15, (Xh + Yh) / 2, y2), h3 = Z("text");
6850
- h3.setAttribute("x", p3.toFixed(1)), h3.setAttribute("y", m3.toFixed(1)), h3.setAttribute("text-anchor", "middle"), h3.setAttribute("dominant-baseline", "central"), h3.setAttribute("font-size", "13"), h3.setAttribute("fill", cg[e5]), h3.setAttribute("pointer-events", "none"), h3.style.fontFamily = "serif", h3.textContent = ig[e5], b2.appendChild(h3);
6871
+ let { x: p3, y: m3 } = X(t3 + 15, (Zh + Xh) / 2, y2), h3 = Z("text");
6872
+ h3.setAttribute("x", p3.toFixed(1)), h3.setAttribute("y", m3.toFixed(1)), h3.setAttribute("text-anchor", "middle"), h3.setAttribute("dominant-baseline", "central"), h3.setAttribute("font-size", "13"), h3.setAttribute("fill", lg[e5]), h3.setAttribute("pointer-events", "none"), h3.style.fontFamily = "serif", h3.textContent = ag[e5], b2.appendChild(h3);
6851
6873
  }
6852
6874
  let te2 = Z("circle");
6853
- if (te2.setAttribute("cx", "250"), te2.setAttribute("cy", "250"), te2.setAttribute("r", String($h)), te2.style.fill = "var(--bg, #faf9f5)", te2.setAttribute("stroke", S2 ? "#2d3548" : "#c0b8a8"), te2.setAttribute("stroke-width", "0.5"), te2.setAttribute("pointer-events", "none"), b2.appendChild(te2), _2.length > 0) for (let e5 = 0; e5 < _2.length; e5++) {
6854
- let t3 = _2[e5], n3 = _2[(e5 + 1) % _2.length], r3 = [1, 4, 7, 10].includes(t3.number), { x: i3, y: a3 } = X(t3.cusp_lon, $h, y2), { x: o3, y: s3 } = X(t3.cusp_lon, Xh, y2), c3 = Z("line");
6875
+ if (te2.setAttribute("cx", "250"), te2.setAttribute("cy", "250"), te2.setAttribute("r", String(eg)), te2.style.fill = "var(--bg, #faf9f5)", te2.setAttribute("stroke", S2 ? "#2d3548" : "#c0b8a8"), te2.setAttribute("stroke-width", "0.5"), te2.setAttribute("pointer-events", "none"), b2.appendChild(te2), _2.length > 0) for (let e5 = 0; e5 < _2.length; e5++) {
6876
+ let t3 = _2[e5], n3 = _2[(e5 + 1) % _2.length], r3 = [1, 4, 7, 10].includes(t3.number), { x: i3, y: a3 } = X(t3.cusp_lon, eg, y2), { x: o3, y: s3 } = X(t3.cusp_lon, Zh, y2), c3 = Z("line");
6855
6877
  c3.setAttribute("x1", i3.toFixed(1)), c3.setAttribute("y1", a3.toFixed(1)), c3.setAttribute("x2", o3.toFixed(1)), c3.setAttribute("y2", s3.toFixed(1)), c3.setAttribute("stroke", r3 ? "#7060b8" : S2 ? "#3a3450" : "#a89898"), c3.setAttribute("stroke-width", r3 ? "1.5" : "0.7"), c3.setAttribute("pointer-events", "none"), b2.appendChild(c3);
6856
- let l3 = (n3.cusp_lon - t3.cusp_lon + 360) % 360, { x: u3, y: d3 } = X(t3.cusp_lon + l3 / 2, Qh, y2), f3 = Z("text");
6878
+ let l3 = (n3.cusp_lon - t3.cusp_lon + 360) % 360, { x: u3, y: d3 } = X(t3.cusp_lon + l3 / 2, $h, y2), f3 = Z("text");
6857
6879
  f3.setAttribute("x", u3.toFixed(1)), f3.setAttribute("y", d3.toFixed(1)), f3.setAttribute("text-anchor", "middle"), f3.setAttribute("dominant-baseline", "central"), f3.setAttribute("font-size", "9"), f3.setAttribute("fill", r3 ? "#7060b8" : "#90808a"), f3.setAttribute("pointer-events", "none"), f3.textContent = String(t3.number), b2.appendChild(f3);
6858
6880
  }
6859
6881
  let ne2 = _2.find((e5) => e5.number === 1), T2 = _2.find((e5) => e5.number === 4), re2 = _2.find((e5) => e5.number === 7), ie2 = _2.find((e5) => e5.number === 10), ae2 = [{ lon: (f2 = ne2 == null ? void 0 : ne2.cusp_lon) == null ? y2 : f2, label: "ASC" }, { lon: (p2 = re2 == null ? void 0 : re2.cusp_lon) == null ? (y2 + 180) % 360 : p2, label: "DSC" }, { lon: (m2 = ie2 == null ? void 0 : ie2.cusp_lon) == null ? (y2 + 270) % 360 : m2, label: "MC" }, { lon: (h2 = T2 == null ? void 0 : T2.cusp_lon) == null ? (y2 + 90) % 360 : h2, label: "IC" }];
6860
6882
  for (let e5 of ae2) {
6861
- let { x: t3, y: n3 } = X(e5.lon, Yh + 14, y2), r3 = Z("text");
6883
+ let { x: t3, y: n3 } = X(e5.lon, Xh + 14, y2), r3 = Z("text");
6862
6884
  r3.setAttribute("x", t3.toFixed(1)), r3.setAttribute("y", n3.toFixed(1)), r3.setAttribute("text-anchor", "middle"), r3.setAttribute("dominant-baseline", "central"), r3.setAttribute("font-size", "8"), r3.setAttribute("font-weight", "700"), r3.setAttribute("fill", "#7060b8"), r3.setAttribute("pointer-events", "none"), r3.textContent = e5.label, b2.appendChild(r3);
6863
6885
  }
6864
6886
  {
6865
6887
  let e5 = Z("g");
6866
6888
  e5.setAttribute("pointer-events", "none");
6867
- let t3 = qh - 50, n3 = Jh - 50;
6889
+ let t3 = Jh - 50, n3 = Yh - 50;
6868
6890
  e5.setAttribute("transform", "translate(".concat(t3, ",").concat(n3, ") scale(").concat(0.5813953488372093.toFixed(4), ") translate(-69,-110)")), e5.setAttribute("opacity", S2 ? "0.08" : "0.05");
6869
6891
  let r3 = Z("path");
6870
6892
  r3.setAttribute("fill", S2 ? "#F0DFC3" : "#6366f1"), r3.setAttribute("d", "M225.711945,199.983551 C225.292816,213.680542 221.995255,226.061340 214.416275,237.110443 C193.610641,267.442230 154.827423,271.316071 127.459396,255.072189 C123.775551,252.885712 120.882744,252.441498 116.873688,254.137070 C109.048920,257.446503 100.934502,259.899628 92.190125,259.379364 C83.542915,258.864868 78.616745,253.946121 78.684906,245.377151 C78.745262,237.789108 81.850891,231.152817 85.454010,224.735641 C88.304489,219.658905 91.245934,214.612274 95.084061,210.184647 C97.704369,207.161865 98.745560,203.844788 98.740883,199.721481 C98.699577,163.227264 125.082115,136.164413 161.509293,135.193466 C165.322968,135.092 169.315643,134.951 172.935333,135.916 C178.310226,137.349 182.595856,135.650 187.146591,133.280 C195.742508,128.804 204.726822,125.462 214.488632,124.281 C227.834183,122.666 234.932129,130.259 231.851456,143.429 C230.052628,151.119 226.752274,158.212 222.361359,164.760 C220.327988,167.792 220.017624,170.616 221.473969,174.100 C224.861847,182.205 225.468460,190.867 225.711945,199.983551 M212.976044,168.510834 C218.716415,160.882339 223.731537,152.880203 226.146439,143.492218 C228.308197,135.088409 225.333649,129.095078 217.846207,128.560104 C206.177933,127.726410 196.082672,132.729645 185.171341,138.349640 C187.816025,139.540573 189.463272,140.263855 191.095154,141.020279 C200.031250,145.162369 207.546783,151.055435 213.272079,159.124069 C214.113724,160.310181 215.663269,161.586777 214.829697,163.091461 C211.652573,168.826584 208.025726,174.252899 202.566681,179.006516 C201.549835,176.444733 200.923126,174.750778 200.212067,173.093002 C195.433319,161.951874 188.776291,152.487198 177.473648,146.963547 C174.609192,145.563675 172.292969,145.608887 169.595505,147.317566 C152.514618,158.137161 136.926010,170.829269 122.270142,184.706512 C120.686935,186.205612 119.364059,187.876480 119.190598,190.236053 C118.688568,197.065308 118.869385,203.864960 119.793037,210.651215 C121.255951,221.399521 126.239235,230.774902 131.349335,240.326111 C132.993088,240.252151 134.400635,239.345810 135.765091,238.453430 C144.400665,232.805634 153.133560,227.309341 161.286926,220.942139 C164.075363,218.764557 165.766891,216.649643 165.788437,212.774612 C165.823334,206.491791 170.826294,202.743942 176.973877,204.085724 C179.390350,204.613144 181.027267,204.346497 182.788132,202.634048 C193.536697,192.180939 204.343719,181.790634 212.976044,168.510834 M196.311264,238.774429 C205.223999,223.519989 207.059082,207.185013 204.308746,188.929276 C197.720764,194.995590 193.078613,201.379272 186.899475,206.146912 C184.795013,207.770645 183.863800,209.506882 184.135178,212.471619 C184.705627,218.704117 179.426636,223.881546 173.582184,222.584213 C169.742706,221.731949 167.311813,222.850525 164.693726,225.165817 C162.585052,227.030579 160.129227,228.496109 157.916992,230.251648 C151.305984,235.497787 144.002090,239.748337 136.880554,244.346085 C150.810440,260.746155 181.289062,262.140137 196.311264,238.774429 M101.954178,222.323334 C101.003220,218.898468 100.052269,215.473602 98.901512,211.329163 C91.673454,221.459351 85.061653,230.979462 83.800476,243.065674 C83.190475,248.911530 86.140854,252.991577 91.843674,253.598953 C100.879066,254.561295 109.050667,251.508087 117.776840,247.739761 C110.183830,240.480621 105.126755,232.419739 101.954178,222.323334 M129.303619,173.800827 C141.200867,163.092194 153.936737,153.435806 167.699600,144.113556 C142.265121,138.861908 122.832809,158.201233 120.741943,181.434265 C123.701614,178.779602 126.227280,176.514221 129.303619,173.800827 z"), e5.appendChild(r3), b2.appendChild(e5);
@@ -6873,104 +6895,104 @@ function Gg(e4, t2, n2, r2, i2, a2, o2) {
6873
6895
  var oe2, se2, ce2, le2, ue2, de2, fe2, pe2, me2, he2, ge2, _e2, ve2;
6874
6896
  let t3 = g2.find((t4) => t4.name.toLowerCase() === e5.planet1.toLowerCase()), n3 = g2.find((t4) => t4.name.toLowerCase() === e5.planet2.toLowerCase());
6875
6897
  if (!t3 || !n3) continue;
6876
- let r3 = (oe2 = sg((se2 = e5.type) == null ? "" : se2)) == null ? "#aaa" : oe2, { x: a3, y: o3 } = X(t3.longitude, eg, y2), { x: s3, y: c3 } = X(n3.longitude, eg, y2), l3 = Math.min((ce2 = e5.orb) == null ? 10 : ce2, 10), u3 = 0.55 - l3 / 10 * 0.38, d3 = Z("line");
6898
+ let r3 = (oe2 = cg((se2 = e5.type) == null ? "" : se2)) == null ? "#aaa" : oe2, { x: a3, y: o3 } = X(t3.longitude, tg, y2), { x: s3, y: c3 } = X(n3.longitude, tg, y2), l3 = Math.min((ce2 = e5.orb) == null ? 10 : ce2, 10), u3 = 0.55 - l3 / 10 * 0.38, d3 = Z("line");
6877
6899
  d3.setAttribute("x1", a3.toFixed(1)), d3.setAttribute("y1", o3.toFixed(1)), d3.setAttribute("x2", s3.toFixed(1)), d3.setAttribute("y2", c3.toFixed(1)), d3.setAttribute("pointer-events", "none"), d3.style.stroke = r3, d3.style.strokeOpacity = String(u3), d3.style.strokeWidth = l3 < 2 ? "1.2" : "0.8", b2.appendChild(d3);
6878
6900
  let f3 = Z("line");
6879
- f3.setAttribute("x1", a3.toFixed(1)), f3.setAttribute("y1", o3.toFixed(1)), f3.setAttribute("x2", s3.toFixed(1)), f3.setAttribute("y2", c3.toFixed(1)), f3.setAttribute("stroke", "transparent"), f3.setAttribute("stroke-width", "13"), f3.setAttribute("fill", "none"), f3.setAttribute("class", "hit-region aspect-hit"), f3.style.pointerEvents = "all", Kg(f3, "Aspect: ".concat((le2 = e5.type) == null ? "Aspect" : le2, " between ").concat(t3.name, " and ").concat(n3.name));
6880
- let p3 = (ue2 = rg[t3.name.toLowerCase()]) == null ? t3.name : ue2, m3 = (de2 = rg[n3.name.toLowerCase()]) == null ? n3.name : de2, h3 = "".concat(p3, " ").concat((fe2 = (pe2 = og[(me2 = (he2 = e5.type) == null ? void 0 : he2.toLowerCase()) == null ? "" : me2]) == null ? e5.type : pe2) == null ? "" : fe2, " ").concat(m3, " \xB7 ").concat((ge2 = (_e2 = e5.orb) == null ? void 0 : _e2.toFixed(1)) == null ? "?" : ge2, "\xB0 orb").concat(e5.applying === true ? " (applying)" : e5.applying === false ? " (separating)" : "");
6901
+ f3.setAttribute("x1", a3.toFixed(1)), f3.setAttribute("y1", o3.toFixed(1)), f3.setAttribute("x2", s3.toFixed(1)), f3.setAttribute("y2", c3.toFixed(1)), f3.setAttribute("stroke", "transparent"), f3.setAttribute("stroke-width", "13"), f3.setAttribute("fill", "none"), f3.setAttribute("class", "hit-region aspect-hit"), f3.style.pointerEvents = "all", qg(f3, "Aspect: ".concat((le2 = e5.type) == null ? "Aspect" : le2, " between ").concat(t3.name, " and ").concat(n3.name));
6902
+ let p3 = (ue2 = ig[t3.name.toLowerCase()]) == null ? t3.name : ue2, m3 = (de2 = ig[n3.name.toLowerCase()]) == null ? n3.name : de2, h3 = "".concat(p3, " ").concat((fe2 = (pe2 = sg[(me2 = (he2 = e5.type) == null ? void 0 : he2.toLowerCase()) == null ? "" : me2]) == null ? e5.type : pe2) == null ? "" : fe2, " ").concat(m3, " \xB7 ").concat((ge2 = (_e2 = e5.orb) == null ? void 0 : _e2.toFixed(1)) == null ? "?" : ge2, "\xB0 orb").concat(e5.applying === true ? " (applying)" : e5.applying === false ? " (separating)" : "");
6881
6903
  f3.addEventListener("mouseenter", (t4) => {
6882
6904
  var n4;
6883
- return mg(t4.clientX, t4.clientY, Q((n4 = e5.type) == null ? "Aspect" : n4), h3, "Click for interpretation");
6905
+ return hg(t4.clientX, t4.clientY, Q((n4 = e5.type) == null ? "Aspect" : n4), h3, "Click for interpretation");
6884
6906
  }), f3.addEventListener("mousemove", (t4) => {
6885
6907
  var n4;
6886
- return mg(t4.clientX, t4.clientY, Q((n4 = e5.type) == null ? "Aspect" : n4), h3, "Click for interpretation");
6887
- }), f3.addEventListener("mouseleave", hg), f3.addEventListener("click", (t4) => {
6908
+ return hg(t4.clientX, t4.clientY, Q((n4 = e5.type) == null ? "Aspect" : n4), h3, "Click for interpretation");
6909
+ }), f3.addEventListener("mouseleave", gg), f3.addEventListener("click", (t4) => {
6888
6910
  var n4, r4, a4, o4, s4, c4;
6889
- hg();
6890
- let l4 = "".concat((n4 = og[(r4 = (a4 = e5.type) == null ? void 0 : a4.toLowerCase()) == null ? "" : r4]) == null ? "" : n4, " ").concat(Q((o4 = e5.type) == null ? "Aspect" : o4), ": ").concat((s4 = rg[e5.planet1.toLowerCase()]) == null ? e5.planet1 : s4, " ").concat((c4 = rg[e5.planet2.toLowerCase()]) == null ? e5.planet2 : c4);
6891
- Mg == null || Mg(l4), Lg(t4, e5, g2), i2(e5);
6911
+ gg();
6912
+ let l4 = "".concat((n4 = sg[(r4 = (a4 = e5.type) == null ? void 0 : a4.toLowerCase()) == null ? "" : r4]) == null ? "" : n4, " ").concat(Q((o4 = e5.type) == null ? "Aspect" : o4), ": ").concat((s4 = ig[e5.planet1.toLowerCase()]) == null ? e5.planet1 : s4, " ").concat((c4 = ig[e5.planet2.toLowerCase()]) == null ? e5.planet2 : c4);
6913
+ Ng == null || Ng(l4), Rg(t4, e5, g2), i2(e5);
6892
6914
  });
6893
6915
  let _3 = [e5.planet1.toLowerCase(), e5.planet2.toLowerCase()].sort().join("|"), v3 = ((ve2 = e5.type) == null ? "unknown" : ve2).toLowerCase();
6894
- Pg.set(_3, { vis: d3, color: r3, baseOpacity: String(u3), baseWidth: l3 < 2 ? "1.2" : "0.8", aspectType: v3 }), b2.appendChild(f3);
6916
+ Fg.set(_3, { vis: d3, color: r3, baseOpacity: String(u3), baseWidth: l3 < 2 ? "1.2" : "0.8", aspectType: v3 }), b2.appendChild(f3);
6895
6917
  }
6896
6918
  for (let e5 of g2) {
6897
6919
  var ye2;
6898
- let t3 = (ye2 = rg[e5.name.toLowerCase()]) == null ? "\u2605" : ye2, r3 = lg(e5.name), { x: i3, y: a3 } = X(e5.longitude, Zh, y2), { x: o3, y: s3 } = X(e5.longitude, Xh - 5, y2), c3 = Z("circle");
6920
+ let t3 = (ye2 = ig[e5.name.toLowerCase()]) == null ? "\u2605" : ye2, r3 = ug(e5.name), { x: i3, y: a3 } = X(e5.longitude, Qh, y2), { x: o3, y: s3 } = X(e5.longitude, Zh - 5, y2), c3 = Z("circle");
6899
6921
  c3.setAttribute("cx", o3.toFixed(1)), c3.setAttribute("cy", s3.toFixed(1)), c3.setAttribute("r", "2.5"), c3.setAttribute("fill", r3), c3.setAttribute("opacity", "0.65"), c3.setAttribute("pointer-events", "none"), b2.appendChild(c3);
6900
6922
  let l3 = Z("text");
6901
6923
  l3.setAttribute("x", i3.toFixed(1)), l3.setAttribute("y", a3.toFixed(1)), l3.setAttribute("text-anchor", "middle"), l3.setAttribute("dominant-baseline", "central"), l3.setAttribute("font-size", "15"), l3.setAttribute("pointer-events", "none"), l3.style.fill = r3, l3.style.fontFamily = "serif", l3.textContent = t3, b2.appendChild(l3);
6902
- let u3 = Math.floor((e5.longitude % 360 + 360) % 360 % 30), { x: d3, y: f3 } = X(e5.longitude, Zh - 17, y2), p3 = Z("text");
6924
+ let u3 = Math.floor((e5.longitude % 360 + 360) % 360 % 30), { x: d3, y: f3 } = X(e5.longitude, Qh - 17, y2), p3 = Z("text");
6903
6925
  if (p3.setAttribute("x", d3.toFixed(1)), p3.setAttribute("y", f3.toFixed(1)), p3.setAttribute("text-anchor", "middle"), p3.setAttribute("dominant-baseline", "central"), p3.setAttribute("font-size", "7"), p3.setAttribute("fill", "#9080a0"), p3.setAttribute("pointer-events", "none"), p3.textContent = "".concat(u3, "\xB0"), b2.appendChild(p3), e5.retrograde) {
6904
- let { x: t4, y: n3 } = X(e5.longitude, Zh + 14, y2), r4 = Z("text");
6926
+ let { x: t4, y: n3 } = X(e5.longitude, Qh + 14, y2), r4 = Z("text");
6905
6927
  r4.setAttribute("x", t4.toFixed(1)), r4.setAttribute("y", n3.toFixed(1)), r4.setAttribute("text-anchor", "middle"), r4.setAttribute("dominant-baseline", "central"), r4.setAttribute("font-size", "8"), r4.setAttribute("fill", "#e05252"), r4.setAttribute("pointer-events", "none"), r4.textContent = "\u211E", b2.appendChild(r4);
6906
6928
  }
6907
6929
  let m3 = Z("circle");
6908
- m3.setAttribute("cx", i3.toFixed(1)), m3.setAttribute("cy", a3.toFixed(1)), m3.setAttribute("r", String(tg)), m3.setAttribute("fill", "transparent"), m3.setAttribute("class", "hit-region planet-hit"), m3.dataset.planet = e5.name.toLowerCase(), m3.style.pointerEvents = "all", Kg(m3, "Planet: ".concat(e5.name));
6909
- let h3 = "".concat(dg(e5.longitude)).concat(e5.house ? " \xB7 H".concat(e5.house) : "").concat(e5.retrograde ? " \u211E" : "");
6910
- m3.addEventListener("mouseenter", (n3) => mg(n3.clientX, n3.clientY, "".concat(t3, " ").concat(Q(e5.name)), h3, "Click for aspects")), m3.addEventListener("mousemove", (n3) => mg(n3.clientX, n3.clientY, "".concat(t3, " ").concat(Q(e5.name)), h3, "Click for aspects")), m3.addEventListener("mouseleave", hg), m3.addEventListener("click", (t4) => {
6930
+ m3.setAttribute("cx", i3.toFixed(1)), m3.setAttribute("cy", a3.toFixed(1)), m3.setAttribute("r", String(ng)), m3.setAttribute("fill", "transparent"), m3.setAttribute("class", "hit-region planet-hit"), m3.dataset.planet = e5.name.toLowerCase(), m3.style.pointerEvents = "all", qg(m3, "Planet: ".concat(e5.name));
6931
+ let h3 = "".concat(fg(e5.longitude)).concat(e5.house ? " \xB7 H".concat(e5.house) : "").concat(e5.retrograde ? " \u211E" : "");
6932
+ m3.addEventListener("mouseenter", (n3) => hg(n3.clientX, n3.clientY, "".concat(t3, " ").concat(Q(e5.name)), h3, "Click for aspects")), m3.addEventListener("mousemove", (n3) => hg(n3.clientX, n3.clientY, "".concat(t3, " ").concat(Q(e5.name)), h3, "Click for aspects")), m3.addEventListener("mouseleave", gg), m3.addEventListener("click", (t4) => {
6911
6933
  var r4;
6912
- if (hg(), Og === e5.name.toLowerCase()) {
6913
- Hg(), zg(), Mg == null || Mg(null);
6934
+ if (gg(), kg === e5.name.toLowerCase()) {
6935
+ Ug(), Bg(), Ng == null || Ng(null);
6914
6936
  return;
6915
6937
  }
6916
- Og = e5.name.toLowerCase();
6917
- let i4 = (r4 = rg[e5.name.toLowerCase()]) == null ? "" : r4;
6918
- Mg == null || Mg("".concat(i4, " ").concat(Q(e5.name), " in ").concat(dg(e5.longitude))), Bg(e5.name), Ig(t4, e5, v2), n2(e5);
6938
+ kg = e5.name.toLowerCase();
6939
+ let i4 = (r4 = ig[e5.name.toLowerCase()]) == null ? "" : r4;
6940
+ Ng == null || Ng("".concat(i4, " ").concat(Q(e5.name), " in ").concat(fg(e5.longitude))), Vg(e5.name), Lg(t4, e5, v2), n2(e5);
6919
6941
  }), b2.appendChild(m3);
6920
6942
  }
6921
6943
  for (let e5 = 0; e5 < _2.length; e5++) {
6922
6944
  var be2, xe2;
6923
- let t3 = _2[e5], n3 = _2[(e5 + 1) % _2.length], i3 = Math.floor((t3.cusp_lon % 360 + 360) % 360 / 30), a3 = (be2 = (xe2 = t3.sign) == null ? ag[i3] : xe2) == null ? "" : be2, o3 = "".concat(dg(t3.cusp_lon), " \xB7 ").concat(a3), { x: s3, y: c3 } = X(t3.cusp_lon, $h, y2), { x: l3, y: u3 } = X(t3.cusp_lon, Xh, y2), d3 = Z("line");
6924
- d3.setAttribute("x1", s3.toFixed(1)), d3.setAttribute("y1", c3.toFixed(1)), d3.setAttribute("x2", l3.toFixed(1)), d3.setAttribute("y2", u3.toFixed(1)), d3.setAttribute("stroke", "transparent"), d3.setAttribute("stroke-width", String(ng)), d3.setAttribute("fill", "none"), d3.setAttribute("class", "hit-region"), d3.style.pointerEvents = "all", Kg(d3, "House ".concat(t3.number, " Cusp")), d3.addEventListener("mouseenter", (e6) => mg(e6.clientX, e6.clientY, "House ".concat(t3.number), o3, "Click for meaning")), d3.addEventListener("mousemove", (e6) => mg(e6.clientX, e6.clientY, "House ".concat(t3.number), o3, "Click for meaning")), d3.addEventListener("mouseleave", hg), d3.addEventListener("click", (e6) => {
6945
+ let t3 = _2[e5], n3 = _2[(e5 + 1) % _2.length], i3 = Math.floor((t3.cusp_lon % 360 + 360) % 360 / 30), a3 = (be2 = (xe2 = t3.sign) == null ? og[i3] : xe2) == null ? "" : be2, o3 = "".concat(fg(t3.cusp_lon), " \xB7 ").concat(a3), { x: s3, y: c3 } = X(t3.cusp_lon, eg, y2), { x: l3, y: u3 } = X(t3.cusp_lon, Zh, y2), d3 = Z("line");
6946
+ d3.setAttribute("x1", s3.toFixed(1)), d3.setAttribute("y1", c3.toFixed(1)), d3.setAttribute("x2", l3.toFixed(1)), d3.setAttribute("y2", u3.toFixed(1)), d3.setAttribute("stroke", "transparent"), d3.setAttribute("stroke-width", String(rg)), d3.setAttribute("fill", "none"), d3.setAttribute("class", "hit-region"), d3.style.pointerEvents = "all", qg(d3, "House ".concat(t3.number, " Cusp")), d3.addEventListener("mouseenter", (e6) => hg(e6.clientX, e6.clientY, "House ".concat(t3.number), o3, "Click for meaning")), d3.addEventListener("mousemove", (e6) => hg(e6.clientX, e6.clientY, "House ".concat(t3.number), o3, "Click for meaning")), d3.addEventListener("mouseleave", gg), d3.addEventListener("click", (e6) => {
6925
6947
  var n4, i4;
6926
- hg();
6927
- let a4 = (n4 = (i4 = t3.sign) == null ? ag[Math.floor((t3.cusp_lon % 360 + 360) % 360 / 30)] : i4) == null ? "" : n4;
6928
- Mg == null || Mg("House ".concat(t3.number, " \xB7 ").concat(a4)), Rg(e6, t3, g2), r2(t3);
6948
+ gg();
6949
+ let a4 = (n4 = (i4 = t3.sign) == null ? og[Math.floor((t3.cusp_lon % 360 + 360) % 360 / 30)] : i4) == null ? "" : n4;
6950
+ Ng == null || Ng("House ".concat(t3.number, " \xB7 ").concat(a4)), zg(e6, t3, g2), r2(t3);
6929
6951
  }), b2.appendChild(d3);
6930
- let f3 = (n3.cusp_lon - t3.cusp_lon + 360) % 360, { x: p3, y: m3 } = X(t3.cusp_lon + f3 / 2, Qh, y2), h3 = Z("circle");
6931
- h3.setAttribute("cx", p3.toFixed(1)), h3.setAttribute("cy", m3.toFixed(1)), h3.setAttribute("r", "14"), h3.setAttribute("fill", "transparent"), h3.setAttribute("class", "hit-region"), h3.style.pointerEvents = "all", Kg(h3, "House ".concat(t3.number, " Area")), h3.addEventListener("mouseenter", (e6) => mg(e6.clientX, e6.clientY, "House ".concat(t3.number), o3, "Click for meaning")), h3.addEventListener("mousemove", (e6) => mg(e6.clientX, e6.clientY, "House ".concat(t3.number), o3, "Click for meaning")), h3.addEventListener("mouseleave", hg), h3.addEventListener("click", (e6) => {
6952
+ let f3 = (n3.cusp_lon - t3.cusp_lon + 360) % 360, { x: p3, y: m3 } = X(t3.cusp_lon + f3 / 2, $h, y2), h3 = Z("circle");
6953
+ h3.setAttribute("cx", p3.toFixed(1)), h3.setAttribute("cy", m3.toFixed(1)), h3.setAttribute("r", "14"), h3.setAttribute("fill", "transparent"), h3.setAttribute("class", "hit-region"), h3.style.pointerEvents = "all", qg(h3, "House ".concat(t3.number, " Area")), h3.addEventListener("mouseenter", (e6) => hg(e6.clientX, e6.clientY, "House ".concat(t3.number), o3, "Click for meaning")), h3.addEventListener("mousemove", (e6) => hg(e6.clientX, e6.clientY, "House ".concat(t3.number), o3, "Click for meaning")), h3.addEventListener("mouseleave", gg), h3.addEventListener("click", (e6) => {
6932
6954
  var n4, i4;
6933
- hg();
6934
- let a4 = (n4 = (i4 = t3.sign) == null ? ag[Math.floor((t3.cusp_lon % 360 + 360) % 360 / 30)] : i4) == null ? "" : n4;
6935
- Mg == null || Mg("House ".concat(t3.number, " \xB7 ").concat(a4)), Rg(e6, t3, g2), r2(t3);
6955
+ gg();
6956
+ let a4 = (n4 = (i4 = t3.sign) == null ? og[Math.floor((t3.cusp_lon % 360 + 360) % 360 / 30)] : i4) == null ? "" : n4;
6957
+ Ng == null || Ng("House ".concat(t3.number, " \xB7 ").concat(a4)), zg(e6, t3, g2), r2(t3);
6936
6958
  }), b2.appendChild(h3);
6937
6959
  }
6938
- Ag && document.removeEventListener("click", Ag, false), Ag = (e5) => {
6960
+ jg && document.removeEventListener("click", jg, false), jg = (e5) => {
6939
6961
  let t3 = e5.target;
6940
- t3 && typeof t3.closest == "function" && !t3.closest(".hit-region") && !t3.closest("#info-panel") && !t3.closest("#patterns-strip") && (Hg(), zg());
6941
- }, document.addEventListener("click", Ag, false);
6962
+ t3 && typeof t3.closest == "function" && !t3.closest(".hit-region") && !t3.closest("#info-panel") && !t3.closest("#patterns-strip") && (Ug(), Bg());
6963
+ }, document.addEventListener("click", jg, false);
6942
6964
  }
6943
- function Kg(e4, t2) {
6965
+ function qg(e4, t2) {
6944
6966
  e4 && (e4.setAttribute("tabindex", "0"), e4.setAttribute("role", "button"), e4.setAttribute("aria-label", t2), e4.addEventListener("keydown", (t3) => {
6945
6967
  let n2 = t3;
6946
6968
  (n2.key === "Enter" || n2.key === " ") && (n2.preventDefault(), e4.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true })));
6947
6969
  }));
6948
6970
  }
6949
- var qg = [{ label: "Placidus", value: "placidus" }, { label: "Whole Sign", value: "whole_sign" }, { label: "Equal", value: "equal" }, { label: "Koch", value: "koch" }, { label: "Regio.", value: "regiomontanus" }];
6950
- function Jg(e4, t2, n2) {
6971
+ var Jg = [{ label: "Placidus", value: "placidus" }, { label: "Whole Sign", value: "whole_sign" }, { label: "Equal", value: "equal" }, { label: "Koch", value: "koch" }, { label: "Regio.", value: "regiomontanus" }];
6972
+ function Yg(e4, t2, n2) {
6951
6973
  e4.innerHTML = "";
6952
6974
  let r2 = document.createElement("span");
6953
6975
  r2.className = "controls-label", r2.textContent = "Houses:", e4.appendChild(r2);
6954
- for (let r3 of qg) {
6976
+ for (let r3 of Jg) {
6955
6977
  let i2 = document.createElement("button");
6956
6978
  i2.className = "control-btn" + (r3.value === t2 ? " active" : ""), i2.textContent = r3.label, i2.title = "Switch to ".concat(r3.label, " house system"), i2.setAttribute("data-system", r3.value), i2.addEventListener("click", () => {
6957
6979
  e4.querySelectorAll(".control-btn").forEach((e5) => e5.classList.remove("active")), i2.classList.add("active"), i2.disabled = true, i2.textContent = "".concat(r3.label, " \u2026"), n2(r3.value);
6958
6980
  }), e4.appendChild(i2);
6959
6981
  }
6960
6982
  }
6961
- function Yg(e4, t2) {
6983
+ function Xg(e4, t2) {
6962
6984
  e4.querySelectorAll(".control-btn").forEach((e5) => {
6963
6985
  var n2;
6964
6986
  let r2 = e5.getAttribute("data-system");
6965
6987
  e5.disabled = false;
6966
- let i2 = qg.find((e6) => e6.value === r2);
6988
+ let i2 = Jg.find((e6) => e6.value === r2);
6967
6989
  e5.textContent = (n2 = i2 == null ? void 0 : i2.label) == null ? r2 : n2, e5.classList.toggle("active", r2 === t2);
6968
6990
  });
6969
6991
  }
6970
- var Xg = class {
6992
+ var Zg = class {
6971
6993
  constructor(e4) {
6972
6994
  var t2, n2, r2, i2, a2, s2;
6973
- o(this, "config", void 0), o(this, "params", void 0), o(this, "dateInput", void 0), o(this, "timeInput", void 0), o(this, "locationInput", void 0), o(this, "suggestionsMenu", void 0), o(this, "refreshBtn", void 0), o(this, "searchTimeout", null), this.config = e4, this.params = { date: ((t2 = e4.initialParams) == null ? void 0 : t2.date) || this.getTodayDate(), time: ((n2 = e4.initialParams) == null ? void 0 : n2.time) || "12:00", latitude: ((r2 = e4.initialParams) == null ? void 0 : r2.latitude) || null, longitude: ((i2 = e4.initialParams) == null ? void 0 : i2.longitude) || null, timezone: ((a2 = e4.initialParams) == null ? void 0 : a2.timezone) || null, locationName: ((s2 = e4.initialParams) == null ? void 0 : s2.locationName) || null }, this.render();
6995
+ 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), this.config = e4, this.params = { date: ((t2 = e4.initialParams) == null ? void 0 : t2.date) || this.getTodayDate(), time: ((n2 = e4.initialParams) == null ? void 0 : n2.time) || "12:00", latitude: ((r2 = e4.initialParams) == null ? void 0 : r2.latitude) || null, longitude: ((i2 = e4.initialParams) == null ? void 0 : i2.longitude) || null, timezone: ((a2 = e4.initialParams) == null ? void 0 : a2.timezone) || null, locationName: ((s2 = e4.initialParams) == null ? void 0 : s2.locationName) || null }, this.render();
6974
6996
  }
6975
6997
  getTodayDate() {
6976
6998
  return (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
@@ -6998,109 +7020,72 @@ var Xg = class {
6998
7020
  this.params.time = e5.target.value;
6999
7021
  }), r2.append(i2, this.timeInput);
7000
7022
  let a2 = document.createElement("div");
7001
- a2.className = "param-group param-group-loc";
7002
- let o2 = document.createElement("label");
7003
- o2.textContent = "Location", this.locationInput = document.createElement("input"), this.locationInput.type = "text", this.locationInput.placeholder = "Search city...", this.locationInput.value = this.params.locationName || "", this.suggestionsMenu = document.createElement("div"), this.suggestionsMenu.className = "loc-suggestions", this.suggestionsMenu.hidden = true, this.locationInput.addEventListener("input", (e5) => {
7004
- let t3 = e5.target.value;
7005
- if (this.searchTimeout && window.clearTimeout(this.searchTimeout), this.params.locationName = t3, this.params.latitude = null, t3.length < 2) {
7006
- this.suggestionsMenu.hidden = true;
7007
- return;
7008
- }
7009
- this.searchTimeout = window.setTimeout(() => this.searchLocation(t3), 300);
7010
- }), document.addEventListener("click", (e5) => {
7011
- a2.contains(e5.target) || (this.suggestionsMenu.hidden = true);
7012
- }), a2.append(o2, this.locationInput, this.suggestionsMenu);
7013
- let s2 = document.createElement("div");
7014
- if (s2.className = "param-actions", this.config.showStepControls) {
7023
+ if (a2.className = "param-actions", this.config.showStepControls) {
7015
7024
  let e5 = document.createElement("button");
7016
7025
  e5.className = "param-btn-icon", e5.innerHTML = "\u25C0", e5.title = "Previous Day", e5.addEventListener("click", () => this.stepDay(-1));
7017
7026
  let t3 = document.createElement("button");
7018
- t3.className = "param-btn-icon", t3.innerHTML = "\u25B6", t3.title = "Next Day", t3.addEventListener("click", () => this.stepDay(1)), s2.append(e5, t3);
7027
+ t3.className = "param-btn-icon", t3.innerHTML = "\u25B6", t3.title = "Next Day", t3.addEventListener("click", () => this.stepDay(1)), a2.append(e5, t3);
7019
7028
  }
7020
7029
  this.refreshBtn = document.createElement("button"), this.refreshBtn.className = "param-btn-primary", this.refreshBtn.textContent = "Refresh", this.refreshBtn.addEventListener("click", () => {
7021
- if (this.params.latitude === null || this.params.longitude === null) {
7022
- alert("Please select a location from the suggestions to ensure accurate timezone calculation.");
7023
- return;
7024
- }
7025
7030
  this.config.onRefresh(this.params);
7026
- }), s2.append(this.refreshBtn), e4.append(t2, r2, a2, s2), this.config.container.append(e4);
7031
+ }), a2.append(this.refreshBtn), e4.append(t2, r2, a2), this.config.container.append(e4);
7027
7032
  }
7028
7033
  stepDay(e4) {
7029
7034
  if (!this.params.date) return;
7030
7035
  let t2 = new Date(this.params.date);
7031
- t2.setUTCDate(t2.getUTCDate() + e4), this.params.date = t2.toISOString().split("T")[0], this.dateInput.value = this.params.date, this.params.latitude !== null && this.params.longitude !== null && this.config.onRefresh(this.params);
7032
- }
7033
- async searchLocation(e4) {
7034
- try {
7035
- var t2;
7036
- let n2 = (t2 = (await this.config.app.callServerTool({ name: "location_search", arguments: { query: e4 } })).content) == null || (t2 = t2.find((e5) => e5.type === "text")) == null ? void 0 : t2.text;
7037
- if (!n2) return;
7038
- let r2 = JSON.parse(n2).suggestions || [];
7039
- this.renderSuggestions(r2);
7040
- } catch (e5) {
7041
- console.error("[ParamControls] Location search failed:", e5);
7042
- }
7036
+ t2.setUTCDate(t2.getUTCDate() + e4), this.params.date = t2.toISOString().split("T")[0], this.dateInput.value = this.params.date, this.config.onRefresh(this.params);
7043
7037
  }
7044
- renderSuggestions(e4) {
7045
- if (this.suggestionsMenu.innerHTML = "", e4.length === 0) {
7046
- this.suggestionsMenu.hidden = true;
7047
- return;
7048
- }
7049
- this.suggestionsMenu.hidden = false, e4.forEach((e5) => {
7050
- let t2 = document.createElement("div");
7051
- t2.className = "loc-item", t2.textContent = e5.displayName, t2.addEventListener("click", () => {
7052
- this.selectLocation(e5);
7053
- }), this.suggestionsMenu.appendChild(t2);
7054
- });
7055
- }
7056
- selectLocation(e4) {
7057
- this.params.locationName = e4.displayName, this.params.latitude = e4.latitude, this.params.longitude = e4.longitude, this.params.timezone = e4.timezone || "UTC", this.locationInput.value = e4.displayName, this.suggestionsMenu.hidden = true;
7058
- }
7059
- }, Zg = "oe_mcp_first_run_";
7060
- function Qg(e4) {
7061
- return "".concat(Zg).concat(e4);
7062
- }
7038
+ }, Qg = "oe_mcp_first_run_";
7063
7039
  function $g(e4) {
7040
+ return "".concat(Qg).concat(e4);
7041
+ }
7042
+ function e_(e4) {
7064
7043
  try {
7065
- return localStorage.getItem(Qg(e4)) === "1";
7044
+ return localStorage.getItem($g(e4)) === "1";
7066
7045
  } catch (e5) {
7067
7046
  return true;
7068
7047
  }
7069
7048
  }
7070
- function e_(e4) {
7049
+ function t_(e4) {
7071
7050
  try {
7072
- localStorage.setItem(Qg(e4), "1");
7051
+ localStorage.setItem($g(e4), "1");
7073
7052
  } catch (e5) {
7074
7053
  }
7075
7054
  }
7076
- var t_ = { "chart-wheel": { stripIcon: "\u2726", stripTitle: "Welcome to your 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"], chatWelcome: "\u2726 Welcome to your Open Ephemeris Natal Chart!\n\nYour birth chart is now rendered \u2014 an exact celestial snapshot of the sky at your moment of birth.\n\nHere's what you can do:\n\u2022 **Click any planet** on the wheel for a deep astrological interpretation of its sign, house, and aspects\n\u2022 **Click any aspect line** (the lines crossing the centre) to explore how two planets interact in your chart\n\u2022 **Click any house cusp** to understand the life themes of each house\n\u2022 **Use the date/time controls** to shift the chart forward or back \u2014 watch how the sky moves\n\nWould you like me to start with a full chart overview, or is there a particular planet, sign, or life area you'd like to explore first?" }, "bi-wheel": { stripIcon: "\u2295", stripTitle: "Welcome to 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"], chatWelcome: "\u2295 Welcome to your Open Ephemeris Bi-Wheel!\n\nTwo charts are now layered \u2014 the inner wheel is your natal chart; the outer ring shows the second chart (transits or another person's planets).\n\nHere's what you can explore:\n\u2022 **Click an inner planet** to understand its natal placement\n\u2022 **Click an outer planet** to explore the transit or synastry energy it brings\n\u2022 **Click a cross-aspect line** (connecting inner and outer planets) for the precise dynamic between them\n\u2022 **Use the date controls** to step transiting planets forward or back through time\n\nWould you like a full synastry overview, a transit forecast, or shall we dive into a specific planetary connection?" }, bodygraph: { stripIcon: "\u25C8", stripTitle: "Welcome to your 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"], chatWelcome: "\u25C8 Welcome to your Open Ephemeris Human Design Bodygraph!\n\nYour bodygraph is now rendered \u2014 a living map of the energy centres, channels, and gates that define your design.\n\nHere's what you can explore:\n\u2022 **Click any centre** (the geometric shapes) \u2014 coloured centres are *defined* (consistent energy), white centres are *undefined* (open and conditioned by others)\n\u2022 **Click any channel** (the lines connecting centres) to understand its core life theme and circuit\n\u2022 **Click any gate number** for its full Rave I Ching hexagram meaning, gifts, and shadow\n\u2022 **Click a planet row** in the sidebar (left = Design/unconscious, right = Personality/conscious) for its HD archetype\n\u2022 **Click a Variable arrow** (the small chevrons near the Sun and North Node) for your Primary Health System\n\nWould you like a complete reading of your Type, Strategy, and Authority \u2014 or is there a specific centre, channel, or gate calling your attention?" } }, n_ = '\n .oe-welcome-strip {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 40px 14px 16px;\n margin: 0 0 10px 0;\n background: linear-gradient(135deg, rgba(99,102,241,0.13) 0%, rgba(139,92,246,0.09) 100%);\n border: 1px solid rgba(139,92,246,0.28);\n border-radius: 10px;\n animation: oe-strip-in 0.35s cubic-bezier(0.22,1,0.36,1) both;\n font-family: system-ui, sans-serif;\n }\n @keyframes oe-strip-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .oe-welcome-strip__icon {\n font-size: 22px;\n line-height: 1;\n opacity: 0.85;\n flex-shrink: 0;\n margin-top: 1px;\n }\n .oe-welcome-strip__body {\n flex: 1;\n min-width: 0;\n }\n .oe-welcome-strip__title {\n font-size: 13px;\n font-weight: 700;\n color: rgba(255,255,255,0.92);\n margin: 0 0 6px 0;\n letter-spacing: 0.01em;\n }\n .oe-welcome-strip__hints {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 14px;\n list-style: none;\n margin: 0;\n padding: 0;\n }\n .oe-welcome-strip__hints li {\n font-size: 11.5px;\n color: rgba(255,255,255,0.62);\n display: flex;\n align-items: center;\n gap: 5px;\n white-space: nowrap;\n }\n .oe-welcome-strip__hints li::before {\n content: "\u203A";\n color: rgba(139,92,246,0.8);\n font-weight: 700;\n font-size: 13px;\n line-height: 1;\n }\n .oe-welcome-strip__close {\n position: absolute;\n top: 8px;\n right: 10px;\n background: none;\n border: none;\n color: rgba(255,255,255,0.35);\n font-size: 17px;\n cursor: pointer;\n padding: 2px 5px;\n line-height: 1;\n border-radius: 4px;\n transition: color 0.15s, background 0.15s;\n }\n .oe-welcome-strip__close:hover {\n color: rgba(255,255,255,0.75);\n background: rgba(255,255,255,0.07);\n }\n .oe-welcome-strip.is-dismissing {\n animation: oe-strip-out 0.25s ease forwards;\n }\n @keyframes oe-strip-out {\n to { opacity: 0; transform: translateY(-4px); max-height: 0; padding: 0; margin: 0; overflow: hidden; }\n }\n';
7077
- function r_() {
7055
+ var n_ = { "chart-wheel": { stripIcon: "\u2726", stripTitle: "Welcome to your 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: "Your birth chart is now rendered \u2014 an exact celestial snapshot of the sky at your moment of birth." }, "bi-wheel": { stripIcon: "\u2295", stripTitle: "Welcome to 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 now layered \u2014 the inner wheel is your natal chart; the outer ring shows the second chart (transits or another person's planets)." }, bodygraph: { stripIcon: "\u25C8", stripTitle: "Welcome to your 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: "Your bodygraph is now rendered \u2014 a living map of the energy centres, channels, and gates that define your design." } }, r_ = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\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 background: linear-gradient(135deg, rgba(30,30,35,0.9) 0%, rgba(20,20,25,0.95) 100%);\n border: 1px solid rgba(255,215,0,0.15); /* Gold tint border */\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px rgba(0,0,0,0.5), inset 0 1px 0 rgba(255,255,255,0.1);\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: #D4AF37; /* Gold */\n line-height: 1;\n text-shadow: 0 0 10px rgba(212,175,55,0.3);\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: rgba(255,255,255,0.95);\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: rgba(255,255,255,0.8);\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: rgba(255,255,255,0.7);\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: rgba(212,175,55,0.7); /* Muted gold */\n font-size: 12px;\n padding-top: 2px;\n }\n \n .oe-welcome-hints strong {\n color: rgba(255,255,255,0.9);\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: rgba(212,175,55,0.15);\n color: #D4AF37;\n border: 1px solid rgba(212,175,55,0.3);\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: rgba(212,175,55,0.25);\n border-color: rgba(212,175,55,0.5);\n transform: translateY(-1px);\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';
7056
+ function i_() {
7078
7057
  if (document.getElementById("oe-first-run-styles")) return;
7079
7058
  let e4 = document.createElement("style");
7080
- e4.id = "oe-first-run-styles", e4.textContent = n_, document.head.appendChild(e4);
7059
+ e4.id = "oe-first-run-styles", e4.textContent = r_, document.head.appendChild(e4);
7081
7060
  }
7082
- function i_(e4, t2) {
7061
+ function a_(e4, t2) {
7083
7062
  let n2 = document.createElement("div");
7084
- n2.className = "oe-welcome-strip", n2.setAttribute("role", "status"), n2.setAttribute("aria-label", e4.stripTitle);
7085
- let r2 = e4.stripHints.map((e5) => "<li>".concat(e5, "</li>")).join("");
7086
- return n2.innerHTML = '\n <div class="oe-welcome-strip__icon" aria-hidden="true">'.concat(e4.stripIcon, '</div>\n <div class="oe-welcome-strip__body">\n <p class="oe-welcome-strip__title">').concat(e4.stripTitle, '</p>\n <ul class="oe-welcome-strip__hints">').concat(r2, '</ul>\n </div>\n <button class="oe-welcome-strip__close" aria-label="Dismiss welcome tips" title="Dismiss">\u2715</button>\n '), n2.querySelector(".oe-welcome-strip__close").addEventListener("click", () => {
7087
- n2.classList.add("is-dismissing"), n2.addEventListener("animationend", () => n2.remove(), { once: true }), e_(t2);
7063
+ n2.className = "oe-welcome-backdrop";
7064
+ let r2 = document.createElement("div");
7065
+ r2.className = "oe-welcome-modal", r2.setAttribute("role", "dialog"), r2.setAttribute("aria-label", e4.stripTitle);
7066
+ let i2 = e4.stripHints.map((e5) => "<li>".concat(e5, "</li>")).join("");
7067
+ r2.innerHTML = '\n <div class="oe-welcome-header">\n <div class="oe-welcome-icon" aria-hidden="true">'.concat(e4.stripIcon, '</div>\n <h2 class="oe-welcome-title">').concat(e4.stripTitle, '</h2>\n </div>\n <p class="oe-welcome-text">').concat(e4.modalText, '</p>\n <ul class="oe-welcome-hints">').concat(i2, '</ul>\n <button class="oe-welcome-button" aria-label="Explore the chart">Explore</button>\n '), n2.appendChild(r2);
7068
+ let a2 = r2.querySelector(".oe-welcome-button"), o2 = () => {
7069
+ n2.classList.add("is-dismissing"), n2.addEventListener("animationend", () => n2.remove(), { once: true }), t_(t2);
7070
+ };
7071
+ return a2.addEventListener("click", o2), n2.addEventListener("click", (e5) => {
7072
+ e5.target === n2 && o2();
7088
7073
  }), n2;
7089
7074
  }
7090
- function a_(e4, t2) {
7091
- if ($g(e4)) return null;
7092
- let n2 = t_[e4];
7093
- r_();
7094
- let r2 = i_(n2, e4);
7095
- return t2.insertBefore(r2, t2.firstChild), e_(e4), n2.chatWelcome;
7075
+ function o_(e4, t2) {
7076
+ if (e_(e4)) return;
7077
+ let n2 = n_[e4];
7078
+ i_();
7079
+ let r2 = a_(n2, e4);
7080
+ document.body.appendChild(r2);
7096
7081
  }
7097
- var o_ = document.getElementById("loading-state"), s_ = document.getElementById("chart-container"), c_ = document.getElementById("chart-info"), l_ = document.getElementById("chart-status"), u_ = document.getElementById("controls-panel"), d_ = document.getElementById("tally-panel"), $ = document.getElementById("patterns-strip"), f_ = document.getElementById("aspect-filter"), p_ = document.getElementById("param-controls-container");
7082
+ var s_ = document.getElementById("loading-state"), c_ = document.getElementById("chart-container"), l_ = document.getElementById("chart-info"), u_ = document.getElementById("chart-status"), d_ = document.getElementById("controls-panel"), f_ = document.getElementById("tally-panel"), $ = document.getElementById("patterns-strip"), p_ = document.getElementById("aspect-filter"), m_ = document.getElementById("param-controls-container");
7098
7083
  console.log("[ChartWheel] \u{1F680} main.ts loaded, creating App instance...");
7099
- var m_ = new Kh({ name: "Chart Wheel Explorer", version: "1.0.0" }), h_ = null, g_ = "placidus", __ = null, v_ = false, y_ = false;
7100
- function b_(e4) {
7101
- l_ && (e4 ? (l_.textContent = "\xB7 ".concat(e4), l_.setAttribute("data-active", "")) : (l_.textContent = "", l_.removeAttribute("data-active")));
7084
+ var h_ = new Kh({ name: "Chart Wheel Explorer", version: "1.0.0" }), g_ = null, __ = "placidus", v_ = null, y_ = false, b_ = false;
7085
+ function x_(e4) {
7086
+ u_ && (e4 ? (u_.textContent = "\xB7 ".concat(e4), u_.setAttribute("data-active", "")) : (u_.textContent = "", u_.removeAttribute("data-active")));
7102
7087
  }
7103
- m_.ontoolresult = (e4) => {
7088
+ h_.ontoolresult = (e4) => {
7104
7089
  var t2, n2, r2, i2, a2, o2;
7105
7090
  console.log("[ChartWheel] \u{1F4E6} ontoolresult received!", { contentLength: (t2 = (n2 = e4.content) == null ? void 0 : n2.length) == null ? 0 : t2, contentTypes: (r2 = (i2 = e4.content) == null ? void 0 : i2.map((e5) => e5.type)) == null ? [] : r2 });
7106
7091
  let s2 = null;
@@ -7113,51 +7098,49 @@ m_.ontoolresult = (e4) => {
7113
7098
  } catch (e5) {
7114
7099
  }
7115
7100
  if (!s2) {
7116
- console.error("[ChartWheel] \u274C No chart data found in tool result"), z_("Chart data could not be parsed from the server response.");
7101
+ console.error("[ChartWheel] \u274C No chart data found in tool result"), B_("Chart data could not be parsed from the server response.");
7117
7102
  return;
7118
7103
  }
7119
- if (h_ = s2, g_ = (o2 = s2.house_system) == null ? "placidus" : o2, !__) {
7104
+ if (g_ = s2, __ = (o2 = s2.house_system) == null ? "placidus" : o2, !v_) {
7120
7105
  var c2, l2, u2, d2, f2, p2, m2, h2, g2, _2;
7121
7106
  let e5 = (c2 = s2._birth_params) == null ? {} : c2, t3 = (l2 = (u2 = (d2 = e5.datetime) == null ? s2.datetime : d2) == null ? s2.birth_datetime : u2) == null ? "" : l2, n3 = (f2 = (p2 = e5.location) == null ? s2.location : p2) == null ? "" : f2, r3 = (m2 = (h2 = e5.timezone) == null ? s2.timezone : h2) == null ? "" : m2, i3 = (g2 = e5.latitude) == null ? s2.latitude : g2, a3 = (_2 = e5.longitude) == null ? s2.longitude : _2, o3 = "", v2 = "12:00";
7122
7107
  if (t3 && t3.includes("T")) {
7123
7108
  let e6 = t3.split("T");
7124
7109
  o3 = e6[0], v2 = e6[1].substring(0, 5);
7125
7110
  }
7126
- __ = new Xg({ app: m_, container: p_, initialParams: { date: o3, time: v2, locationName: n3, timezone: r3, latitude: typeof i3 == "number" ? i3 : null, longitude: typeof a3 == "number" ? a3 : null }, showStepControls: false, onRefresh: async (e6) => {
7127
- __ == null || __.setBusy(true), o_.removeAttribute("hidden"), s_.setAttribute("hidden", "");
7111
+ v_ = new Zg({ app: h_, container: m_, initialParams: { date: o3, time: v2, locationName: n3, timezone: r3, latitude: typeof i3 == "number" ? i3 : null, longitude: typeof a3 == "number" ? a3 : null }, showStepControls: false, onRefresh: async (e6) => {
7112
+ v_ == null || v_.setBusy(true), s_.removeAttribute("hidden"), c_.setAttribute("hidden", "");
7128
7113
  try {
7129
7114
  let t4 = "".concat(e6.date, "T").concat(e6.time, ":00");
7130
- await m_.callServerTool({ name: "chart_wheel_recalculate", arguments: { datetime: "".concat(t4).concat(e6.timezone ? "" : "Z"), latitude: e6.latitude, longitude: e6.longitude, timezone: e6.timezone, location: e6.locationName, house_system: g_ || "placidus", chart_type: "natal" } });
7115
+ await h_.callServerTool({ name: "chart_wheel_recalculate", arguments: { datetime: "".concat(t4).concat(e6.timezone ? "" : "Z"), latitude: e6.latitude, longitude: e6.longitude, timezone: e6.timezone, location: e6.locationName, house_system: __ || "placidus", chart_type: "natal" } });
7131
7116
  } catch (e7) {
7132
7117
  console.error("Recalculate failed:", e7);
7133
7118
  } finally {
7134
- __ == null || __.setBusy(false);
7119
+ v_ == null || v_.setBusy(false);
7135
7120
  }
7136
7121
  } });
7137
7122
  }
7138
- console.log("[ChartWheel] \u{1F3A8} Calling renderChart..."), x_(s2), console.log("[ChartWheel] \u2705 renderChart completed");
7123
+ console.log("[ChartWheel] \u{1F3A8} Calling renderChart..."), S_(s2), console.log("[ChartWheel] \u2705 renderChart completed");
7139
7124
  };
7140
- function x_(e4) {
7125
+ function S_(e4) {
7141
7126
  var t2, n2, r2, i2, a2, o2, s2;
7142
- w_ = null, o_.setAttribute("hidden", ""), s_.removeAttribute("hidden"), p_.removeAttribute("hidden"), u_.removeAttribute("hidden"), Gg(s_, e4, A_, j_, M_, L_, y_ ? N_() : void 0), Ng(b_), Jg(u_, g_, R_), S_(e4);
7143
- let c2 = a_("chart-wheel", s_);
7144
- c2 && m_.sendMessage({ role: "user", content: [{ type: "text", text: c2 }] });
7145
- let l2 = fg(e4.planets), u2 = (n2 = (r2 = (i2 = ((t2 = e4.houses) == null ? [] : t2)[0]) == null ? void 0 : i2.cusp_lon) == null ? e4.ascendant : r2) == null ? 0 : n2, d2 = (a2 = e4.aspects) == null ? [] : a2;
7146
- l2.length > 0 && C_(Cg(l2, u2)), T_(Eg(d2, l2)), O_();
7147
- let f2 = document.getElementById("cw-action-bar");
7148
- if (!f2) {
7149
- f2 = document.createElement("div"), f2.id = "cw-action-bar", f2.className = "hd-action-bar";
7127
+ T_ = null, s_.setAttribute("hidden", ""), c_.removeAttribute("hidden"), m_.removeAttribute("hidden"), d_.removeAttribute("hidden"), Kg(c_, e4, j_, M_, N_, R_, b_ ? P_() : void 0), Pg(x_), Yg(d_, __, z_), C_(e4), o_("chart-wheel", c_);
7128
+ let c2 = pg(e4.planets), l2 = (n2 = (r2 = (i2 = ((t2 = e4.houses) == null ? [] : t2)[0]) == null ? void 0 : i2.cusp_lon) == null ? e4.ascendant : r2) == null ? 0 : n2, u2 = (a2 = e4.aspects) == null ? [] : a2;
7129
+ c2.length > 0 && w_(wg(c2, l2)), E_(Dg(u2, c2)), k_();
7130
+ let d2 = document.getElementById("cw-action-bar");
7131
+ if (!d2) {
7132
+ d2 = document.createElement("div"), d2.id = "cw-action-bar", d2.className = "hd-action-bar";
7150
7133
  let e5 = document.getElementById("app");
7151
- e5 == null || e5.prepend(f2);
7134
+ e5 == null || e5.prepend(d2);
7152
7135
  }
7153
- f2.innerHTML = '\n <button class="action-btn action-btn--primary" id="cw-interpret-btn">\u2728 Interpret this chart</button>\n <button class="action-btn" id="cw-questions-btn">\u{1F4AC} Ask me questions</button>\n ', (o2 = document.getElementById("cw-interpret-btn")) == null || o2.addEventListener("click", () => void F_()), (s2 = document.getElementById("cw-questions-btn")) == null || s2.addEventListener("click", () => void I_());
7136
+ d2.innerHTML = '\n <button class="action-btn action-btn--primary" id="cw-interpret-btn">\u2728 Interpret this chart</button>\n <button class="action-btn" id="cw-questions-btn">\u{1F52E} What should I ask?</button>\n ', (o2 = document.getElementById("cw-interpret-btn")) == null || o2.addEventListener("click", () => void I_()), (s2 = document.getElementById("cw-questions-btn")) == null || s2.addEventListener("click", () => void L_());
7154
7137
  }
7155
- function S_(e4) {
7138
+ function C_(e4) {
7156
7139
  var t2, n2, r2, i2, a2, o2, s2, c2, l2, u2;
7157
- if (!c_) return;
7140
+ if (!l_) return;
7158
7141
  let d2 = (t2 = e4._birth_params) == null ? {} : t2, f2 = (n2 = (r2 = (i2 = d2.datetime) == null ? e4.datetime : i2) == null ? e4.birth_datetime : r2) == null ? "" : n2, p2 = (a2 = (o2 = d2.location) == null ? e4.location : o2) == null ? "" : a2, m2 = (s2 = (c2 = d2.timezone) == null ? e4.timezone : c2) == null ? "" : s2, h2 = (l2 = d2.latitude) == null ? e4.latitude : l2, g2 = (u2 = d2.longitude) == null ? e4.longitude : u2;
7159
- g_.charAt(0).toUpperCase() + g_.slice(1);
7160
- let _2 = fg(e4.planets).find((e5) => e5.name.toLowerCase() === "sun"), v2 = _2 != null && _2.house ? _2.house >= 7 ? "\u2609 Day Chart" : "\u263E Night Chart" : "", y2 = f2;
7142
+ __.charAt(0).toUpperCase() + __.slice(1);
7143
+ let _2 = pg(e4.planets).find((e5) => e5.name.toLowerCase() === "sun"), v2 = _2 != null && _2.house ? _2.house >= 7 ? "\u2609 Day Chart" : "\u263E Night Chart" : "", y2 = f2;
7161
7144
  try {
7162
7145
  if (f2 && f2.includes("T")) {
7163
7146
  let e5 = new Date(f2), t3 = m2 ? { timeZone: m2 } : {};
@@ -7167,18 +7150,18 @@ function S_(e4) {
7167
7150
  }
7168
7151
  let b2 = typeof h2 == "number" && typeof g2 == "number" ? "".concat(Math.abs(h2).toFixed(2), "\xB0").concat(h2 >= 0 ? "N" : "S", ", ").concat(Math.abs(g2).toFixed(2), "\xB0").concat(g2 >= 0 ? "E" : "W") : "", x2 = [];
7169
7152
  if (y2 && x2.push('<span class="info-chip" title="Birth datetime">\u{1F4C5} '.concat(y2, "</span>")), p2 && x2.push('<span class="info-chip" title="Birth location">\u{1F4CD} '.concat(p2, "</span>")), b2 && !p2 && x2.push('<span class="info-chip" title="Coordinates">\u{1F4CD} '.concat(b2, "</span>")), m2 && x2.push('<span class="info-chip" title="Timezone">\u{1F550} '.concat(m2, "</span>")), v2 && x2.push('<span class="info-chip sect" title="Sect">'.concat(v2, "</span>")), x2.length === 0) {
7170
- c_.setAttribute("hidden", "");
7153
+ l_.setAttribute("hidden", "");
7171
7154
  return;
7172
7155
  }
7173
- c_.innerHTML = x2.join(""), c_.removeAttribute("hidden");
7156
+ l_.innerHTML = x2.join(""), l_.removeAttribute("hidden");
7174
7157
  }
7175
- function C_(e4) {
7176
- if (!d_) return;
7158
+ function w_(e4) {
7159
+ if (!f_) return;
7177
7160
  let t2 = e4.fire + e4.earth + e4.air + e4.water, n2 = (e5) => t2 > 0 ? Math.round(e5 / t2 * 100) : 0;
7178
- d_.innerHTML = '\n <div class="tally-section">\n <div class="tally-row">\n <span class="tally-item fire" title="Fire">\u{1F525} '.concat(e4.fire, '</span>\n <span class="tally-item earth" title="Earth">\u{1F30D} ').concat(e4.earth, '</span>\n <span class="tally-item air" title="Air">\u{1F4A8} ').concat(e4.air, '</span>\n <span class="tally-item water" title="Water">\u{1F4A7} ').concat(e4.water, '</span>\n </div>\n <div class="tally-bar-row">\n <div class="tally-bar">\n <div class="tally-bar-fill fire" style="width:').concat(n2(e4.fire), '%" title="Fire ').concat(n2(e4.fire), '%"></div>\n <div class="tally-bar-fill earth" style="width:').concat(n2(e4.earth), '%" title="Earth ').concat(n2(e4.earth), '%"></div>\n <div class="tally-bar-fill air" style="width:').concat(n2(e4.air), '%" title="Air ').concat(n2(e4.air), '%"></div>\n <div class="tally-bar-fill water" style="width:').concat(n2(e4.water), '%" title="Water ').concat(n2(e4.water), '%"></div>\n </div>\n </div>\n </div>\n <div class="tally-divider"></div>\n <div class="tally-section">\n <div class="tally-row modality">\n <span class="tally-item cardinal" title="Cardinal">\u27F3 ').concat(e4.cardinal, '</span>\n <span class="tally-item fixed" title="Fixed">\u25A0 ').concat(e4.fixed, '</span>\n <span class="tally-item mutable" title="Mutable">\u224B ').concat(e4.mutable, "</span>\n </div>\n </div>\n "), d_.removeAttribute("hidden");
7161
+ f_.innerHTML = '\n <div class="tally-section">\n <div class="tally-row">\n <span class="tally-item fire" title="Fire">\u{1F525} '.concat(e4.fire, '</span>\n <span class="tally-item earth" title="Earth">\u{1F30D} ').concat(e4.earth, '</span>\n <span class="tally-item air" title="Air">\u{1F4A8} ').concat(e4.air, '</span>\n <span class="tally-item water" title="Water">\u{1F4A7} ').concat(e4.water, '</span>\n </div>\n <div class="tally-bar-row">\n <div class="tally-bar">\n <div class="tally-bar-fill fire" style="width:').concat(n2(e4.fire), '%" title="Fire ').concat(n2(e4.fire), '%"></div>\n <div class="tally-bar-fill earth" style="width:').concat(n2(e4.earth), '%" title="Earth ').concat(n2(e4.earth), '%"></div>\n <div class="tally-bar-fill air" style="width:').concat(n2(e4.air), '%" title="Air ').concat(n2(e4.air), '%"></div>\n <div class="tally-bar-fill water" style="width:').concat(n2(e4.water), '%" title="Water ').concat(n2(e4.water), '%"></div>\n </div>\n </div>\n </div>\n <div class="tally-divider"></div>\n <div class="tally-section">\n <div class="tally-row modality">\n <span class="tally-item cardinal" title="Cardinal">\u27F3 ').concat(e4.cardinal, '</span>\n <span class="tally-item fixed" title="Fixed">\u25A0 ').concat(e4.fixed, '</span>\n <span class="tally-item mutable" title="Mutable">\u224B ').concat(e4.mutable, "</span>\n </div>\n </div>\n "), f_.removeAttribute("hidden");
7179
7162
  }
7180
- var w_ = null;
7181
- function T_(e4) {
7163
+ var T_ = null;
7164
+ function E_(e4) {
7182
7165
  if (!$) return;
7183
7166
  if (e4.length === 0) {
7184
7167
  $.setAttribute("hidden", ""), $.innerHTML = "";
@@ -7193,10 +7176,10 @@ function T_(e4) {
7193
7176
  let t3 = document.createElement("button");
7194
7177
  t3.className = "pattern-ask-claude-btn", t3.textContent = "\u2728 Ask Claude", t3.style.display = "none", $.appendChild(t3), t3.addEventListener("click", () => {
7195
7178
  var n2;
7196
- let r2 = w_;
7179
+ let r2 = T_;
7197
7180
  if (r2 === null) return;
7198
7181
  let i2 = e4[r2];
7199
- t3.disabled = true, t3.textContent = "\u23F3 Sending\u2026", L_({ type: "pattern", data: { name: i2.name, planets: i2.planets, description: (n2 = i2.description) == null ? "" : n2 } }).then(() => {
7182
+ t3.disabled = true, t3.textContent = "\u23F3 Sending\u2026", R_({ type: "pattern", data: { name: i2.name, planets: i2.planets, description: (n2 = i2.description) == null ? "" : n2 } }).then(() => {
7200
7183
  t3.textContent = "\u2713 Sent", setTimeout(() => {
7201
7184
  t3.textContent = "\u2728 Ask Claude", t3.disabled = false;
7202
7185
  }, 2500);
@@ -7209,112 +7192,118 @@ function T_(e4) {
7209
7192
  t3.addEventListener("click", () => {
7210
7193
  var n2;
7211
7194
  let r2 = Number(t3.dataset.idx), i2 = e4[r2], a2 = (n2 = t3.dataset.color) == null ? "#888" : n2, o2 = $.querySelector(".pattern-ask-claude-btn");
7212
- w_ === r2 ? (w_ = null, Hg(), o2 && (o2.style.display = "none"), $.querySelectorAll(".pattern-pill").forEach((e5) => {
7195
+ T_ === r2 ? (T_ = null, Ug(), o2 && (o2.style.display = "none"), $.querySelectorAll(".pattern-pill").forEach((e5) => {
7213
7196
  var t4;
7214
7197
  e5.classList.remove("active");
7215
7198
  let n3 = (t4 = e5.dataset.color) == null ? "#888" : t4;
7216
7199
  e5.style.color = n3, e5.style.borderColor = n3, e5.style.background = "transparent";
7217
- })) : (w_ = r2, $.querySelectorAll(".pattern-pill").forEach((e5) => {
7200
+ })) : (T_ = r2, $.querySelectorAll(".pattern-pill").forEach((e5) => {
7218
7201
  var t4;
7219
7202
  e5.classList.remove("active");
7220
7203
  let n3 = (t4 = e5.dataset.color) == null ? "#888" : t4;
7221
7204
  e5.style.color = n3, e5.style.borderColor = n3, e5.style.background = "transparent";
7222
- }), t3.classList.add("active"), t3.style.background = a2, t3.style.color = "#fff", t3.style.borderColor = a2, Vg(i2.planets, i2.aspectKeys), o2 && (o2.style.display = "", o2.textContent = "\u2728 Ask Claude", o2.disabled = false));
7205
+ }), t3.classList.add("active"), t3.style.background = a2, t3.style.color = "#fff", t3.style.borderColor = a2, Hg(i2.planets, i2.aspectKeys), o2 && (o2.style.display = "", o2.textContent = "\u2728 Ask Claude", o2.disabled = false));
7223
7206
  });
7224
7207
  });
7225
7208
  }
7226
- var E_ = { conjunction: "#9a7fd4", opposition: "#e05252", trine: "#52a8e0", square: "#e08a52", sextile: "#52c07a", quincunx: "#c0b052", semisquare: "#b07a5a" }, D_ = null;
7227
- function O_() {
7228
- if (!f_) return;
7229
- let e4 = Wg();
7209
+ var D_ = { conjunction: "#9a7fd4", opposition: "#e05252", trine: "#52a8e0", square: "#e08a52", sextile: "#52c07a", quincunx: "#c0b052", semisquare: "#b07a5a" }, O_ = null;
7210
+ function k_() {
7211
+ if (!p_) return;
7212
+ let e4 = Gg();
7230
7213
  if (e4.length === 0) {
7231
- f_.setAttribute("hidden", "");
7214
+ p_.setAttribute("hidden", "");
7232
7215
  return;
7233
7216
  }
7234
- D_ = new Set(e4);
7217
+ O_ = new Set(e4);
7235
7218
  let t2 = (e5) => e5.charAt(0).toUpperCase() + e5.slice(1);
7236
- f_.innerHTML = '\n <span class="patterns-label">Aspects:</span>\n '.concat(e4.map((e5) => {
7219
+ p_.innerHTML = '\n <span class="patterns-label">Aspects:</span>\n '.concat(e4.map((e5) => {
7237
7220
  var n2, r2;
7238
- let i2 = (n2 = E_[e5]) == null ? "#888" : n2, a2 = (r2 = og[e5]) == null ? "" : r2;
7221
+ let i2 = (n2 = D_[e5]) == null ? "#888" : n2, a2 = (r2 = sg[e5]) == null ? "" : r2;
7239
7222
  return '\n <button class="pattern-pill aspect-type-pill active"\n data-type="'.concat(e5, '"\n data-color="').concat(i2, '"\n style="background:').concat(i2, ";color:#fff;border-color:").concat(i2, '"\n title="Toggle ').concat(t2(e5), ' aspects">\n ').concat(a2, " ").concat(t2(e5), "\n </button>\n ");
7240
- }).join(""), "\n "), f_.removeAttribute("hidden"), f_.querySelectorAll(".aspect-type-pill").forEach((e5) => {
7223
+ }).join(""), "\n "), p_.removeAttribute("hidden"), p_.querySelectorAll(".aspect-type-pill").forEach((e5) => {
7241
7224
  e5.addEventListener("click", () => {
7242
7225
  var t3, n2;
7243
- if (!D_) return;
7226
+ if (!O_) return;
7244
7227
  let r2 = (t3 = e5.dataset.type) == null ? "" : t3, i2 = (n2 = e5.dataset.color) == null ? "#888" : n2;
7245
- D_.has(r2) ? (D_.delete(r2), e5.classList.remove("active"), e5.style.background = "transparent", e5.style.color = i2) : (D_.add(r2), e5.classList.add("active"), e5.style.background = i2, e5.style.color = "#fff"), w_ = null, $ == null || $.querySelectorAll(".pattern-pill").forEach((e6) => {
7228
+ O_.has(r2) ? (O_.delete(r2), e5.classList.remove("active"), e5.style.background = "transparent", e5.style.color = i2) : (O_.add(r2), e5.classList.add("active"), e5.style.background = i2, e5.style.color = "#fff"), T_ = null, $ == null || $.querySelectorAll(".pattern-pill").forEach((e6) => {
7246
7229
  var t4;
7247
7230
  e6.classList.remove("active");
7248
7231
  let n3 = (t4 = e6.dataset.color) == null ? "#888" : t4;
7249
7232
  e6.style.color = n3, e6.style.borderColor = n3, e6.style.background = "transparent";
7250
7233
  });
7251
7234
  let a2 = $ == null ? void 0 : $.querySelector(".pattern-ask-claude-btn");
7252
- a2 && (a2.style.display = "none"), Ug(D_);
7235
+ a2 && (a2.style.display = "none"), Wg(O_);
7253
7236
  });
7254
7237
  });
7255
7238
  }
7256
- async function k_(e4, t2) {
7257
- if (v_) try {
7239
+ async function A_(e4, t2) {
7240
+ if (y_) try {
7258
7241
  let n2 = "[Chart Wheel] User selected ".concat(e4, ": ").concat(JSON.stringify(t2, null, 2));
7259
- await m_.updateModelContext({ content: [{ type: "text", text: n2 }] }), console.log("[ChartWheel] \u{1F4CB} Model context updated: ".concat(e4));
7242
+ await h_.updateModelContext({ content: [{ type: "text", text: n2 }] }), console.log("[ChartWheel] \u{1F4CB} Model context updated: ".concat(e4));
7260
7243
  } catch (e5) {
7261
7244
  console.warn("[ChartWheel] \u26A0\uFE0F updateModelContext failed:", e5);
7262
7245
  }
7263
7246
  }
7264
- async function A_(e4) {
7247
+ async function j_(e4) {
7265
7248
  var t2, n2, r2, i2;
7266
- w_ = null, $ == null || $.querySelectorAll(".pattern-pill").forEach((e5) => {
7249
+ T_ = null, $ == null || $.querySelectorAll(".pattern-pill").forEach((e5) => {
7267
7250
  var t3;
7268
7251
  e5.classList.remove("active");
7269
7252
  let n3 = (t3 = e5.dataset.color) == null ? "#888" : t3;
7270
7253
  e5.style.color = n3, e5.style.borderColor = n3, e5.style.background = "transparent";
7271
- }), await k_("planet", { planet: e4.name, longitude: e4.longitude, sign: (t2 = e4.sign) == null ? null : t2, house: (n2 = e4.house) == null ? null : n2, retrograde: (r2 = e4.retrograde) == null ? false : r2, speed: (i2 = e4.speed) == null ? null : i2 });
7254
+ }), await A_("planet", { planet: e4.name, longitude: e4.longitude, sign: (t2 = e4.sign) == null ? null : t2, house: (n2 = e4.house) == null ? null : n2, retrograde: (r2 = e4.retrograde) == null ? false : r2, speed: (i2 = e4.speed) == null ? null : i2 });
7272
7255
  }
7273
- async function j_(e4) {
7256
+ async function M_(e4) {
7274
7257
  var t2, n2;
7275
- await k_("house", { house_number: e4.number, sign: (t2 = e4.sign) == null ? null : t2, cusp_longitude: e4.cusp_lon, ruler: (n2 = e4.ruler) == null ? null : n2 });
7258
+ await A_("house", { house_number: e4.number, sign: (t2 = e4.sign) == null ? null : t2, cusp_longitude: e4.cusp_lon, ruler: (n2 = e4.ruler) == null ? null : n2 });
7276
7259
  }
7277
- async function M_(e4) {
7260
+ async function N_(e4) {
7278
7261
  var t2, n2, r2, i2;
7279
- await k_("aspect", { planet1: e4.planet1, planet2: e4.planet2, aspect_type: (t2 = e4.type) == null ? null : t2, orb: (n2 = e4.orb) == null ? null : n2, applying: (r2 = e4.applying) == null ? null : r2, angle: (i2 = e4.angle) == null ? null : i2 });
7262
+ await A_("aspect", { planet1: e4.planet1, planet2: e4.planet2, aspect_type: (t2 = e4.type) == null ? null : t2, orb: (n2 = e4.orb) == null ? null : n2, applying: (r2 = e4.applying) == null ? null : r2, angle: (i2 = e4.angle) == null ? null : i2 });
7280
7263
  }
7281
- function N_() {
7264
+ function P_() {
7282
7265
  return async (e4) => {
7283
7266
  try {
7284
7267
  var t2, n2;
7285
- let r2 = await m_.createSamplingMessage({ messages: [{ role: "user", content: { type: "text", text: "(Astrology Exploration Suite Context)\nYou are interpreting a specific interactive element. Please keep it concise, just 2-3 sentences max.\n\nUser Request: ".concat(e4) } }], systemPrompt: "You are an astrological AI. Give a very concise, focused interpretation.", maxTokens: 300 });
7268
+ let r2 = await h_.createSamplingMessage({ messages: [{ role: "user", content: { type: "text", text: "(Astrology Exploration Suite Context)\nYou are interpreting a specific interactive element. Please keep it concise, just 2-3 sentences max.\n\nUser Request: ".concat(e4) } }], systemPrompt: "You are an astrological AI. Give a very concise, focused interpretation.", maxTokens: 300 });
7286
7269
  return (t2 = r2 == null || (n2 = r2.content) == null ? void 0 : n2.text) == null ? null : t2;
7287
7270
  } catch (e5) {
7288
7271
  return console.error("[ChartWheel] Sampling failed:", e5), "Unable to load interpretation right now.";
7289
7272
  }
7290
7273
  };
7291
7274
  }
7292
- async function P_(e4) {
7275
+ async function F_(e4) {
7293
7276
  try {
7294
- (await m_.sendMessage({ role: "user", content: [{ type: "text", text: e4 }] })).isError && console.error("[ChartWheel] Host rejected sendMessage");
7277
+ (await h_.sendMessage({ role: "user", content: [{ type: "text", text: e4 }] })).isError && console.error("[ChartWheel] Host rejected sendMessage");
7295
7278
  } catch (e5) {
7296
7279
  console.error("[ChartWheel] sendMessage failed:", e5);
7297
7280
  }
7298
7281
  }
7299
- async function F_() {
7282
+ async function I_() {
7300
7283
  var e4, t2, n2, r2;
7301
- if (!h_) return;
7302
- let i2 = h_, a2 = (e4 = i2._birth_params) == null ? {} : e4, o2 = (t2 = (n2 = a2.name) == null ? a2.location : n2) == null ? "this person" : t2, s2 = fg(i2.planets), c2 = ((r2 = i2.aspects) == null ? [] : r2).filter((e5) => {
7284
+ if (!g_) return;
7285
+ let i2 = g_, a2 = (e4 = i2._birth_params) == null ? {} : e4, o2 = (t2 = (n2 = a2.name) == null ? a2.location : n2) == null ? "this person" : t2, s2 = pg(i2.planets), c2 = ((r2 = i2.aspects) == null ? [] : r2).filter((e5) => {
7303
7286
  var t3;
7304
7287
  return ["conjunction", "opposition", "trine", "square", "sextile"].includes((t3 = e5.type) == null ? "" : t3);
7305
7288
  }).slice(0, 8).map((e5) => " \u2022 ".concat(e5.planet1, " ").concat(e5.type, " ").concat(e5.planet2, " (").concat(Number(e5.orb).toFixed(1), "\xB0, ").concat(e5.applying ? "applying" : "separating", ")")).join("\n") || " \u2022 No major aspects found";
7306
- await P_("Please give a complete natal chart interpretation for ".concat(o2, ".\n\nKey planet placements:\n").concat(s2.slice(0, 5).map((e5) => {
7289
+ await F_("Please give a complete natal chart interpretation for ".concat(o2, ".\n\nKey planet placements:\n").concat(s2.slice(0, 5).map((e5) => {
7307
7290
  var t3;
7308
7291
  return " \u2022 ".concat(e5.name, " in ").concat((t3 = e5.sign) == null ? "?" : t3).concat(e5.house ? ", House ".concat(e5.house) : "").concat(e5.retrograde ? " \u211E" : "");
7309
7292
  }).join("\n"), "\n\nMajor aspects:\n").concat(c2, "\n\nCover: (1) Core identity and soul purpose (Sun, Moon, Ascendant), (2) The chart's dominant element, modality, and overall signature, (3) The most significant aspects and their psychological themes, (4) Key life areas of focus and challenge, (5) A practical synthesis \u2014 who is this person and what is their path?"));
7310
7293
  }
7311
- async function I_() {
7312
- var e4, t2, n2;
7313
- if (!h_) return;
7314
- let r2 = (e4 = h_._birth_params) == null ? {} : e4;
7315
- await P_("I'm viewing an interactive natal chart for ".concat((t2 = (n2 = r2.name) == null ? r2.location : n2) == null ? "this chart" : t2, ". What would you like to explore? You can ask about any planet, house, aspect, or life theme \u2014 I'll interpret it in the context of this chart."));
7294
+ async function L_() {
7295
+ var e4, t2, n2, r2;
7296
+ if (!g_) return;
7297
+ let i2 = g_, a2 = (e4 = i2._birth_params) == null ? {} : e4;
7298
+ await F_("I'm exploring the natal chart for ".concat((t2 = (n2 = a2.name) == null ? a2.location : n2) == null ? "this chart" : t2, ". Key placements: ").concat(pg(i2.planets).slice(0, 4).map((e5) => {
7299
+ var t3;
7300
+ return "".concat(e5.name, " in ").concat((t3 = e5.sign) == null ? "?" : t3).concat(e5.house ? " H".concat(e5.house) : "");
7301
+ }).join(", ") || "unknown placements", ". Major aspects: ").concat(((r2 = i2.aspects) == null ? [] : r2).filter((e5) => {
7302
+ var t3;
7303
+ return ["conjunction", "opposition", "trine", "square", "sextile"].includes((t3 = e5.type) == null ? "" : t3);
7304
+ }).slice(0, 5).map((e5) => "".concat(e5.planet1, " ").concat(e5.type, " ").concat(e5.planet2, " (").concat(Number(e5.orb).toFixed(1), "\xB0)")).join(", ") || "none detected", ".\n\nBased on this chart, please suggest 3-4 specific, insightful questions I could ask to understand this person more deeply \u2014 such as how particular placements manifest in real life, the most significant aspect dynamics, or how to integrate the chart's core tensions. Present each as a tappable question I can ask you."));
7316
7305
  }
7317
- async function L_(e4) {
7306
+ async function R_(e4) {
7318
7307
  let t2 = "";
7319
7308
  if (e4.type === "planet") {
7320
7309
  var n2;
@@ -7337,21 +7326,21 @@ async function L_(e4) {
7337
7326
  }
7338
7327
  if (t2) try {
7339
7328
  console.log("[ChartWheel] \u{1F4AC} Sending interpretation request to Claude...");
7340
- let e5 = await m_.sendMessage({ role: "user", content: [{ type: "text", text: t2 }] });
7329
+ let e5 = await h_.sendMessage({ role: "user", content: [{ type: "text", text: t2 }] });
7341
7330
  if (e5.isError) throw console.error("[ChartWheel] \u274C Host rejected sendMessage:", e5), Error("Host rejected message");
7342
7331
  console.log("[ChartWheel] \u2705 Message sent to chat thread");
7343
7332
  } catch (e5) {
7344
7333
  throw console.error("[ChartWheel] \u274C sendMessage failed:", e5), e5;
7345
7334
  }
7346
7335
  }
7347
- async function R_(e4) {
7348
- if (!(h_ != null && h_._birth_params)) {
7349
- Yg(u_, g_);
7336
+ async function z_(e4) {
7337
+ if (!(g_ != null && g_._birth_params)) {
7338
+ Xg(d_, __);
7350
7339
  return;
7351
7340
  }
7352
7341
  try {
7353
7342
  var t2, n2, r2, i2, a2;
7354
- let o2 = await m_.callServerTool({ name: "chart_wheel_recalculate", arguments: { datetime: h_._birth_params.datetime, timezone: (t2 = h_._birth_params.timezone) == null ? void 0 : t2, latitude: (n2 = h_._birth_params.latitude) == null ? void 0 : n2, longitude: (r2 = h_._birth_params.longitude) == null ? void 0 : r2, location: (i2 = h_._birth_params.location) == null ? void 0 : i2, house_system: e4 } }), s2 = null;
7343
+ let o2 = await h_.callServerTool({ name: "chart_wheel_recalculate", arguments: { datetime: g_._birth_params.datetime, timezone: (t2 = g_._birth_params.timezone) == null ? void 0 : t2, latitude: (n2 = g_._birth_params.latitude) == null ? void 0 : n2, longitude: (r2 = g_._birth_params.longitude) == null ? void 0 : r2, location: (i2 = g_._birth_params.location) == null ? void 0 : i2, house_system: e4 } }), s2 = null;
7355
7344
  for (let e5 of (a2 = o2.content) == null ? [] : a2) if (e5.type === "text" && e5.text) try {
7356
7345
  let t3 = JSON.parse(e5.text);
7357
7346
  if (t3 && typeof t3 == "object") {
@@ -7360,21 +7349,21 @@ async function R_(e4) {
7360
7349
  }
7361
7350
  } catch (e6) {
7362
7351
  }
7363
- s2 ? (h_ = s2, g_ = e4, x_(s2)) : Yg(u_, g_);
7352
+ s2 ? (g_ = s2, __ = e4, S_(s2)) : Xg(d_, __);
7364
7353
  } catch (e5) {
7365
- console.error("[Chart] Recalculate failed:", e5), Yg(u_, g_);
7354
+ console.error("[Chart] Recalculate failed:", e5), Xg(d_, __);
7366
7355
  }
7367
7356
  }
7368
- function z_(e4) {
7369
- o_.setAttribute("hidden", ""), s_.innerHTML = '\n <div class="error-state">\n <div class="error-icon">\u26A0\uFE0F</div>\n <p>'.concat(e4, "</p>\n </div>\n "), s_.removeAttribute("hidden");
7357
+ function B_(e4) {
7358
+ s_.setAttribute("hidden", ""), c_.innerHTML = '\n <div class="error-state">\n <div class="error-icon">\u26A0\uFE0F</div>\n <p>'.concat(e4, "</p>\n </div>\n "), c_.removeAttribute("hidden");
7370
7359
  }
7371
7360
  console.log("[ChartWheel] \u{1F50C} Calling app.connect()..."), (async () => {
7372
7361
  try {
7373
- await m_.connect(), console.log("[ChartWheel] \u2705 app.connect() completed \u2014 handshake OK");
7374
- let e4 = m_.getHostCapabilities();
7375
- v_ = !!(e4 != null && e4.modelContext), y_ = !!(e4 != null && e4.sampling), console.log("[ChartWheel] \u{1F50D} Host capabilities:", { modelContext: v_, serverTools: !!(e4 != null && e4.serverTools), sampling: y_ }), h_ && (console.log("[ChartWheel] \u{1F504} Re-rendering with interpretation mode enabled"), x_(h_));
7362
+ await h_.connect(), console.log("[ChartWheel] \u2705 app.connect() completed \u2014 handshake OK");
7363
+ let e4 = h_.getHostCapabilities();
7364
+ y_ = !!(e4 != null && e4.modelContext), b_ = !!(e4 != null && e4.sampling), console.log("[ChartWheel] \u{1F50D} Host capabilities:", { modelContext: y_, serverTools: !!(e4 != null && e4.serverTools), sampling: b_ }), g_ && (console.log("[ChartWheel] \u{1F504} Re-rendering with interpretation mode enabled"), S_(g_));
7376
7365
  } catch (e4) {
7377
- console.error("[ChartWheel] \u274C app.connect() FAILED:", e4), z_("Connection failed: ".concat(e4 instanceof Error ? e4.message : String(e4)));
7366
+ console.error("[ChartWheel] \u274C app.connect() FAILED:", e4), B_("Connection failed: ".concat(e4 instanceof Error ? e4.message : String(e4)));
7378
7367
  }
7379
7368
  })();
7380
7369
  </script>