@openephemeris/mcp-server 3.14.0 → 3.16.0

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,7 +7,7 @@
7
7
  <title>Bi-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);--inner-glyph:#a494f6;--inner-tick:#7a6cbc;--inner-ring:#090810;--inner-stroke:#24222d;--outer-glyph:#e6ac3d;--outer-tick:#ac7d1b;--outer-ring:#070503;--outer-stroke:#342d20;--xasp-conjunction:#a494f6;--xasp-opposition:#dd4d57;--xasp-trine:#00b4bb;--xasp-square:#ec6d3d;--xasp-sextile:#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);--inner-glyph:color(display-p3 .63252 .582093 .937636);--inner-tick:color(display-p3 .469481 .426877 .716469);--inner-ring:color(display-p3 .0342889 .0311906 .0606274);--inner-stroke:color(display-p3 .139053 .135371 .174039);--outer-glyph:color(display-p3 .866978 .684443 .324483);--outer-tick:color(display-p3 .645333 .49681 .196492);--outer-ring:color(display-p3 .0275363 .0215619 .01263);--outer-stroke:color(display-p3 .20063 .175863 .129743);--xasp-conjunction:color(display-p3 .63252 .582093 .937636);--xasp-opposition:color(display-p3 .803557 .340931 .357065);--xasp-trine:color(display-p3 .311493 .696068 .728277);--xasp-square:color(display-p3 .864679 .454605 .289251);--xasp-sextile: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);--inner-glyph:lab(65.7597% 22.6847 -47.4333);--inner-tick:lab(49.7428% 19.7831 -40.5855);--inner-ring:lab(2.38607% 1.22919 -3.41513);--inner-stroke:lab(13.9501% 2.71787 -6.94334);--outer-glyph:lab(74.5248% 14.3487 62.5064);--outer-tick:lab(55.9353% 12.6865 55.2442);--outer-ring:lab(1.56667% .268132 1.12634);--outer-stroke:lab(18.8428% 1.96196 9.88836);--xasp-conjunction:lab(65.7597% 22.6847 -47.4333);--xasp-opposition:lab(54.0218% 57.6814 26.7913);--xasp-trine:lab(66.3586% -37.5367 -15.4041);--xasp-square:lab(61.5466% 48.3829 50.2676);--xasp-sextile:lab(61.2436% -46.7762 18.3644)}}*,:before,:after{box-sizing:border-box;margin:0;padding:0}[hidden]{display:none!important}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.030'/%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:hidden}#app{flex-direction:column;height:100%;min-height:440px;display:flex;position:relative;overflow:hidden}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:14px;display:flex}#loading-state p{letter-spacing:.06em;text-transform:uppercase;font-size:11px}.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}}#chart-container{flex:1 1 0;justify-content:center;align-items:center;width:100%;min-height:240px;padding:8px;transition:opacity .28s;display:flex;position:relative;overflow:hidden}#chart-container svg{width:100%;height:100%;transition:opacity .22s,filter .22s;display:block}#chart-container.refreshing svg{opacity:.35;filter:blur(1.5px)saturate(.4);pointer-events:none}#chart-container.refreshing:after{content:"";border:1.5px solid var(--gold);opacity:0;pointer-events:none;border-radius:50%;animation:1.2s cubic-bezier(.4,0,.6,1) infinite refresh-ring;position:absolute;top:8px;bottom:8px;left:8px;right:8px}@keyframes refresh-ring{0%{opacity:0;transform:scale(.96)}40%{opacity:.45;transform:scale(1)}to{opacity:0;transform:scale(1.04)}}@keyframes chart-fade-in{0%{opacity:0;transform:scale(.985)}to{opacity:1;transform:scale(1)}}#chart-container.chart-rendered svg{animation:.32s cubic-bezier(.16,1,.3,1) both chart-fade-in}#mode-badge{border-top:1px solid var(--border);background:var(--surface);flex-shrink:0;justify-content:center;align-items:center;gap:10px;padding:6px 14px;font-size:11px;display:flex}.mode-badge-inner{color:var(--inner-glyph);letter-spacing:.02em;align-items:center;gap:5px;font-weight:600;display:inline-flex}.mode-badge-outer{color:var(--outer-glyph);letter-spacing:.02em;align-items:center;gap:5px;font-weight:600;display:inline-flex}.mode-badge-sep{color:var(--text-secondary);font-weight:400}.mode-badge-dot-inner{background:var(--inner-tick);border-radius:50%;flex-shrink:0;width:8px;height:8px}.mode-badge-dot-outer{background:var(--outer-tick);border-radius:50%;flex-shrink:0;width:8px;height:8px}.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:.45}.hit-region.planet-hit{rx:12px;ry:12px}.hit-region.planet-hit:not(.dim):hover{filter:drop-shadow(0 0 5px var(--gold-glow))}.hit-region.dim{opacity:.12}.hit-region.aspect-hit{stroke-width:20px}.info-drawer{background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--radius);width:100%;box-shadow:var(--shadow-md);opacity:0;pointer-events:none;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}.info-drawer:before{content:"";background:var(--border-strong);border-radius:2px;flex-shrink:0;width:36px;height:4px;margin:0 auto 10px;display:block}.info-drawer.open{opacity:1;pointer-events:all;scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;flex-shrink:0;max-height:min(40vh,360px);padding:14px 16px 12px;overflow-y:auto}.info-header{align-items:flex-start;gap:10px;margin-bottom:12px;display:flex}.info-glyph{text-align:center;flex-shrink:0;width:32px;font-size:26px;line-height:1}.info-title{color:var(--text);flex:1;font-size:13px;font-weight:700}.info-subtitle{color:var(--text-secondary);margin-top:2px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:400}.wheel-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}.wheel-badge.inner{color:var(--inner-glyph);background:rgba(164,148,246,.12);background:color(display-p3 .63252 .582093 .937636/.12);background:lab(65.7597% 22.6847 -47.4333/.12);border:1px solid rgba(164,148,246,.3);border:1px solid color(display-p3 .63252 .582093 .937636/.3);border:1px solid lab(65.7597% 22.6847 -47.4333/.3)}.wheel-badge.outer{color:var(--outer-glyph);background:rgba(230,172,61,.12);background:color(display-p3 .866978 .684443 .324483/.12);background:lab(74.5248% 14.3487 62.5064/.12);border:1px solid rgba(230,172,61,.3);border:1px solid color(display-p3 .866978 .684443 .324483/.3);border:1px solid lab(74.5248% 14.3487 62.5064/.3)}.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:130px;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}.tooltip{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;-webkit-backdrop-filter:blur(14px)saturate(1.6);backdrop-filter:blur(14px)saturate(1.6);border-radius:var(--radius,10px);pointer-events:none;z-index:1000;opacity:0;background:rgba(12,12,22,.94);border:1px solid rgba(60,58,80,.8);max-width:240px;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)}.tooltip.visible{opacity:1}.tooltip-title{color:#e8e8f4;margin-bottom:2px;font-weight:700}.tooltip-detail{color:#9090b0;line-height:1.4}.tooltip-hint{color:#a08840;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}.error-state .error-msg{color:var(--text-secondary);text-align:center;max-width:280px;font-size:13px;line-height:1.5}#chart-hint{text-align:center;color:var(--text-secondary);letter-spacing:.04em;opacity:.65;flex-shrink:0;padding:4px 12px 6px;font-size:10px}.chart-status{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:var(--radius-pill);color:var(--gold);z-index:900;opacity:0;pointer-events:none;letter-spacing:.04em;background:rgba(7,9,14,.92);background:color(display-p3 .0286832 .0352525 .0537785/.92);background:lab(2.44746% .00379235 -2.33402/.92);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);max-height:0;padding:5px 16px;font-size:11px;font-weight:600;transition:max-height .24s cubic-bezier(.16,1,.3,1),opacity .24s,transform .24s cubic-bezier(.16,1,.3,1);position:fixed;top:10px;left:50%;overflow:hidden;transform:translate(-50%)translateY(-10px);box-shadow:0 4px 20px rgba(0,0,0,.5),0 0 0 1px rgba(204,156,66,.1);box-shadow:0 4px 20px color(display-p3 0 0 0/.5),0 0 0 1px color(display-p3 .76996 .617341 .321369/.1);box-shadow:0 4px 20px lab(0% 0 0/.5),0 0 0 1px lab(67.5798% 11.9379 52.333/.1)}.chart-status.visible{opacity:1;max-height:44px;transform:translate(-50%)translateY(0)}.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:.45;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)}.hd-action-bar{flex-wrap:wrap;flex-shrink:0;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:absolute;bottom:12px;right:12px}.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)}.pan-btn--fullscreen{width:36px;height:36px}body.is-fullscreen{height:100vh;overflow:hidden}body.is-fullscreen #app{flex-direction:column;gap:0;width:100vw;height:100vh;padding:0;display:flex;overflow:hidden}body.is-fullscreen #chart-container{min-height:0;aspect-ratio:unset;flex:1;justify-content:center;align-items:center;padding:16px 24px 0;display:flex;overflow:hidden}body.is-fullscreen #chart-container>svg{width:auto;max-width:100%;height:100%;max-height:100%}body.is-fullscreen #bi-info-drawer{display:none}body.is-fullscreen #loading-state{flex:1;height:auto;min-height:0}body.is-fullscreen .pan-zoom-controls{top:16px;right:16px}#fs-bottom-bar{border-top:1px solid var(--border);background:#020306;background:color(display-p3 .0100648 .0127997 .0215356);background:lab(.889429% .0122339 -1.01076);flex-shrink:0;grid-template-rows:1fr;grid-template-columns:220px 1fr 220px;height:240px;min-height:180px;max-height:280px;display:grid}#fs-bottom-bar [data-column=left],#fs-bottom-bar [data-column=right]{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;flex-direction:column;gap:4px;padding:10px 14px 12px;display:flex;overflow-x:hidden;overflow-y:auto}#fs-bottom-bar [data-column=left]{border-right:1px solid var(--border)}#fs-bottom-bar [data-column=center]{pointer-events:none}#fs-bottom-bar [data-column=right]{border-left:1px solid var(--border);overflow-y:auto}#fs-bottom-bar [data-column=right] .info-drawer--fs{min-height:0;box-shadow:none;scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;background:0 0;border:none;border-radius:0;flex:1;padding:0;overflow-y:auto;opacity:1!important;pointer-events:all!important;max-height:none!important}#fs-bottom-bar [data-column=right] .info-drawer--fs:before{display:none}#fs-bottom-bar [data-column]>*+*{border-top:1px solid var(--border);margin-top:4px;padding-top:8px}#fs-bottom-bar .bi-action-bar,#fs-bottom-bar .cw-action-bar{flex-direction:column;padding:8px 0 0}#fs-bottom-bar .action-btn{justify-content:center;width:100%}.cancel-toast{background:var(--surface-2,#1e1e2e);border:1px solid var(--border-strong,#444);color:var(--text-muted,#aaa);border-radius:var(--radius-sm,6px);opacity:0;z-index:9999;pointer-events:none;box-shadow:var(--shadow-md,0 4px 12px rgba(0,0,0,.3));padding:8px 16px;font-family:inherit;font-size:12px;transition:opacity .3s,transform .3s;position:fixed;bottom:20px;left:50%;transform:translate(-50%)translateY(20px)}.cancel-toast.visible{opacity:1;transform:translate(-50%)translateY(0)}.dignity-badge{letter-spacing:.03em;border-radius:4px;padding:1px 6px;font-size:10px;font-weight:600;display:inline-block}.dignity-domicile{color:#cc9c42;color:color(display-p3 .76996 .617341 .321369);color:lab(67.5798% 11.9379 52.333);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,.3);border:1px solid color(display-p3 .76996 .617341 .321369/.3);border:1px solid lab(67.5798% 11.9379 52.333/.3)}.dignity-exaltation{color:#1da871;color:color(display-p3 .313719 .651039 .459895);color:lab(61.2436% -46.7762 18.3644);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,.3);border:1px solid color(display-p3 .313719 .651039 .459895/.3);border:1px solid lab(61.2436% -46.7762 18.3644/.3)}.dignity-detriment,.dignity-fall{color:#c53443;color:color(display-p3 .710345 .252818 .279408);color:lab(45.8893% 57.7361 27.393);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,.25);border:1px solid color(display-p3 .710345 .252818 .279408/.25);border:1px solid lab(45.8893% 57.7361 27.393/.25)}.mode-badge-name{cursor:pointer;font-family:inherit;font-size:inherit;letter-spacing:.02em;background:0 0;border:none;border-radius:4px;align-items:center;gap:5px;padding:2px 6px;font-weight:600;transition:background .15s,color .15s;display:inline-flex}.mode-badge-name.inner-name{color:var(--inner-glyph)}.mode-badge-name.outer-name{color:var(--outer-glyph)}.mode-badge-name:hover{background:rgba(255,255,255,.06);background:color(display-p3 1 1 1/.06);background:lab(100% 0 0/.06)}.mode-badge-name.focused{color:var(--gold);background:rgba(204,156,66,.12);background:color(display-p3 .76996 .617341 .321369/.12);background:lab(67.5798% 11.9379 52.333/.12)}.mode-badge-swap{cursor:pointer;color:var(--text-secondary);background:0 0;border:none;align-items:center;padding:2px 4px;font-size:13px;line-height:1;transition:color .15s,transform .15s;display:inline-flex}.mode-badge-swap:hover{color:var(--gold);transform:scaleX(-1)}.mode-badge-date{color:var(--text-secondary);letter-spacing:.02em;font-size:10px;font-weight:400}#chart-container[data-focus=inner] .outer-planet-group,#chart-container[data-focus=outer] .inner-planet-group{opacity:.25;transition:opacity .25s}#aspect-filter{padding:0}.asp-panel{flex-wrap:wrap;align-items:center;gap:4px 12px;padding:4px 12px;display:flex}.aspect-toggle-btn,.orb-preset-btn{padding:2px 8px!important;font-size:10px!important}.asp-section{align-items:center;gap:6px;display:flex}.asp-section-label{letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);white-space:nowrap;font-size:10px;font-weight:700}.aspect-toggle-btn,.orb-preset-btn{border:1.5px solid var(--border-strong);color:var(--text-secondary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:20px;padding:4px 10px;font-size:11px;font-weight:600;transition:background .15s,color .15s,border-color .15s}.aspect-toggle-btn:hover,.orb-preset-btn:hover{border-color:var(--gold-dim);color:var(--text)}.aspect-toggle-btn.active{background:var(--gold);border-color:var(--gold);color:#0d0802;color:color(display-p3 .0492866 .0328715 .0111297);color:lab(2.4863% .883393 2.81807)}.orb-preset-btn.active{background:var(--surface-2);border-color:var(--gold);color:var(--gold)}.aspect-toggle-btn .toggle-icon{font-size:13px;line-height:1}.chart-provenance{border-bottom:1px solid var(--border);background:var(--surface);flex-flow:wrap;flex-shrink:0;justify-content:center;align-items:baseline;gap:2px 10px;padding:5px 12px;font-size:10px;animation:.2s both prov-in;display:flex}.chart-provenance>*{align-items:baseline;gap:6px;display:inline-flex}@keyframes prov-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.prov-name{color:var(--text);letter-spacing:.01em;align-items:center;gap:7px;font-size:11px;font-weight:600;display:flex}.prov-mode-tag{letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary);background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-pill);padding:1px 6px;font-size:9px;font-weight:500}.prov-trio{color:var(--text);align-items:center;gap:6px;font-size:11px;display:flex}.prov-planet{font-variant-numeric:tabular-nums;letter-spacing:.01em}.prov-sep{color:var(--border-strong);font-size:12px}.prov-meta{color:var(--text-secondary);letter-spacing:.02em;font-size:10px}.prov-tz{opacity:.7;font-size:9px}.error-state{flex-direction:column;justify-content:center;align-items:center;gap:12px;height:100%;min-height:200px;padding:24px;display:flex}.error-icon{opacity:.7;font-size:28px}.error-msg{color:var(--text-secondary);text-align:center;max-width:260px;font-size:12px;line-height:1.5}.error-retry-btn{border-radius:var(--radius-pill);border:1px solid var(--border-strong);background:var(--surface-2);color:var(--text);font:inherit;cursor:pointer;letter-spacing:.02em;margin-top:4px;padding:7px 20px;font-size:11px;font-weight:500;transition:all .18s}.error-retry-btn:hover{background:var(--gold-subtle);border-color:var(--gold-dim);color:var(--gold)}.chart-layer{opacity:1;transform-origin:310px 310px;animation:.5s cubic-bezier(.16,1,.3,1) both svgLayerAssemble;animation-delay:calc(var(--layer-index,0) * 80ms);transform:scale(1)}@keyframes svgLayerAssemble{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}.floating-action-btn:after{content:"";background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);width:50%;height:100%;animation:3s 2s infinite shimmer;position:absolute;top:0;left:-100%;transform:skew(-20deg)}@keyframes shimmer{0%{left:-100%}20%{left:200%}to{left:200%}}@keyframes slideUpFadeIn{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes slideUpFadeInPanel{0%{opacity:0;transform:translateY(12px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.patterns-strip{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;align-items:center;gap:4px;padding:4px 12px;font-size:10px;animation:.22s cubic-bezier(.16,1,.3,1) both slideUpFadeInPanel;display:flex}.pattern-pill{padding:2px 8px!important;font-size:10px!important}.patterns-label{letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);white-space:nowrap;margin-right:2px;font-size:10px;font-weight:700}.pattern-pill{border-radius:var(--radius-pill);cursor:pointer;letter-spacing:.01em;border:1.5px solid;align-items:center;gap:4px;padding:3px 10px;font-size:11px;font-weight:600;transition:background .15s,opacity .15s,transform .12s;display:inline-flex}.pattern-pill:hover{opacity:.85;transform:scale(1.03)}.pattern-pill.active{box-shadow:0 0 0 2px}.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}.tally-panel{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;align-items:center;gap:6px 14px;padding:5px 12px 6px;font-size:11px;animation:.22s cubic-bezier(.16,1,.3,1) both slideUpFadeInPanel;display:flex}.tally-section{flex-direction:column;gap:4px;display:flex}.tally-row{align-items:flex-start;gap:10px;display:flex}.tally-row.modality{gap:12px}.tally-item{border-radius:var(--radius-pill);cursor:pointer;white-space:nowrap;border:1.5px solid transparent;align-items:center;gap:4px;padding:2px 8px;font-size:12px;font-weight:700;transition:background .14s,border-color .14s,transform .12s;display:inline-flex}.tally-item:hover{transform:scale(1.06)}.tally-item.active{border-color:currentColor;box-shadow:0 0 0 2px}.tally-item.fire{color:#ff744f;color:color(display-p3 .936486 .485321 .346768);color:lab(66.005% 52.9628 47.7034);background:rgba(255,116,79,.1);background:color(display-p3 .936486 .485321 .346768/.1);background:lab(66.005% 52.9628 47.7034/.1)}.tally-item.earth{color:#68a244;color:color(display-p3 .458546 .627532 .315071);color:lab(60.9267% -32.2405 41.5215);background:rgba(104,162,68,.1);background:color(display-p3 .458546 .627532 .315071/.1);background:lab(60.9267% -32.2405 41.5215/.1)}.tally-item.air{color:#2fb5d8;color:color(display-p3 .359655 .701622 .832954);color:lab(68.1219% -27.5396 -28.3166);background:rgba(47,181,216,.1);background:color(display-p3 .359655 .701622 .832954/.1);background:lab(68.1219% -27.5396 -28.3166/.1)}.tally-item.water{color:#7792ee;color:color(display-p3 .487398 .569622 .908946);color:lab(61.5869% 9.51821 -50.2978);background:rgba(119,146,238,.1);background:color(display-p3 .487398 .569622 .908946/.1);background:lab(61.5869% 9.51821 -50.2978/.1)}.tally-item.cardinal{color:#cc9c42;color:color(display-p3 .76996 .617341 .321369);color:lab(67.5798% 11.9379 52.333);background:rgba(204,156,66,.08);background:color(display-p3 .76996 .617341 .321369/.08);background:lab(67.5798% 11.9379 52.333/.08)}.tally-item.fixed{color:#a486d7;color:color(display-p3 .623892 .531312 .823026);color:lab(61.2732% 24.0176 -37.6492);background:rgba(164,134,215,.08);background:color(display-p3 .623892 .531312 .823026/.08);background:lab(61.2732% 24.0176 -37.6492/.08)}.tally-item.mutable{color:#24a592;color:color(display-p3 .315103 .636668 .572864);color:lab(60.7802% -38.5122 -.286269);background:rgba(36,165,146,.08);background:color(display-p3 .315103 .636668 .572864/.08);background:lab(60.7802% -38.5122 -.286269/.08)}.tally-planets{flex-wrap:wrap;gap:2px 4px;padding:0 4px;display:flex}.tally-planet-chip{cursor:pointer;opacity:.75;font-size:13px;line-height:1;transition:opacity .12s,transform .12s}.tally-planet-chip:hover{opacity:1;transform:scale(1.15)}.tally-bar-row{padding:0 2px}.tally-bar{background:var(--surface-2);border-radius:2px;width:80px;height:4px;display:flex;overflow:hidden}.tally-bar-fill{height:100%;transition:width .3s cubic-bezier(.16,1,.3,1)}.tally-bar-fill.fire{background:#ff744f;background:color(display-p3 .936486 .485321 .346768);background:lab(66.005% 52.9628 47.7034)}.tally-bar-fill.earth{background:#68a244;background:color(display-p3 .458546 .627532 .315071);background:lab(60.9267% -32.2405 41.5215)}.tally-bar-fill.air{background:#2fb5d8;background:color(display-p3 .359655 .701622 .832954);background:lab(68.1219% -27.5396 -28.3166)}.tally-bar-fill.water{background:#7792ee;background:color(display-p3 .487398 .569622 .908946);background:lab(61.5869% 9.51821 -50.2978)}.tally-divider{background:var(--border-strong);flex-shrink:0;align-self:center;width:1px;height:28px}.dignity-panel{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;align-items:center;gap:6px;padding:5px 12px 6px;font-size:11px;animation:.22s cubic-bezier(.16,1,.3,1) both slideUpFadeInPanel;display:flex}.dignity-chip{border-radius:var(--radius-pill);cursor:pointer;white-space:nowrap;border:1.5px solid transparent;align-items:center;gap:3px;padding:2px 8px 2px 6px;font-size:12px;font-weight:600;transition:border-color .14s,box-shadow .14s,transform .12s;display:inline-flex}.dignity-chip:hover{transform:scale(1.06)}.dignity-chip.active{border-color:currentColor;box-shadow:0 0 0 2px}.dignity-wheel-badge{opacity:.7;margin-left:1px;font-size:8px}.dignity-wheel-badge.inner{color:var(--inner-glyph)}.dignity-wheel-badge.outer{color:var(--outer-glyph)}@media (prefers-color-scheme:light){:root{--bg:#f7f5f1;--surface:#fff;--surface-2:#f1eee9;--border:#dbd7d0;--border-strong:#bdb6ac;--text:#101215;--text-secondary:#4f5359;--gold:#8d5f00;--gold-dim:#6d4b00;--gold-glow:rgba(141,95,0,.25);--gold-subtle:rgba(141,95,0,.1);--success:#007145;--error:#b1002b;--shadow:0 4px 20px rgba(0,0,0,.1);--shadow-md:0 8px 32px rgba(0,0,0,.14), 0 0 0 1px var(--border-strong);--inner-ring:#e7e7ee;--inner-stroke:#978ed2;--inner-glyph:#422b83;--inner-tick:#5e4f9c;--outer-ring:#f6f1e9;--outer-stroke:#ae7c00;--outer-glyph:#704a00;--outer-tick:#8a6000;--xasp-conjunction:#4f3a92;--xasp-opposition:#9d0026;--xasp-trine:#005b60;--xasp-square:#982f00;--xasp-sextile:#005833}@supports (color:color(display-p3 0 0 0)){:root{--bg:color(display-p3 .967616 .959866 .945308);--surface:color(display-p3 1 1 1);--surface-2:color(display-p3 .943798 .93351 .914195);--border:color(display-p3 .855616 .842987 .819292);--border-strong:color(display-p3 .73602 .716348 .67952);--text:color(display-p3 .0633107 .0687189 .081922);--text-secondary:color(display-p3 .313002 .323251 .348016);--gold:color(display-p3 .542549 .371783 -.107551);--gold-dim:color(display-p3 .414099 .299019 .034461);--gold-glow:color(display-p3 .542549 .371783 -.107551/.25);--gold-subtle:color(display-p3 .542549 .371783 -.107551/.1);--success:color(display-p3 -.0793084 .456092 .255685);--error:color(display-p3 .642198 .101724 .18242);--shadow:0 4px 20px color(display-p3 0 0 0/.1);--shadow-md:0 8px 32px color(display-p3 0 0 0/.14), 0 0 0 1px var(--border-strong);--inner-ring:color(display-p3 .907095 .905197 .931783);--inner-stroke:color(display-p3 .58664 .556304 .804254);--inner-glyph:color(display-p3 .245423 .171497 .493494);--inner-tick:color(display-p3 .358729 .312313 .591881);--outer-ring:color(display-p3 .961514 .946019 .916957);--outer-stroke:color(display-p3 .654857 .492962 .151277);--outer-glyph:color(display-p3 .448097 .281046 -.133276);--outer-tick:color(display-p3 .524671 .380491 .0387678);--xasp-conjunction:color(display-p3 .295896 .228956 .554264);--xasp-opposition:color(display-p3 .566502 .0969703 .161549);--xasp-trine:color(display-p3 -.136655 .362311 .395877);--xasp-square:color(display-p3 .576596 .182695 -.0331795);--xasp-sextile:color(display-p3 -.0802406 .354845 .187391)}}@supports (color:lab(0% 0 0)){:root{--bg:lab(96.5376% .34076 2.2589);--surface:lab(100% 0 0);--surface-2:lab(94.2232% .459731 3.01526);--border:lab(86.1085% .583261 3.77473);--border-strong:lab(74.5232% .975847 6.06879);--text:lab(5.23809% -.0738502 -2.43738);--text-secondary:lab(34.9842% -.210047 -4.49809);--gold:lab(44.1995% 17.0662 84.3373);--gold-dim:lab(35.0077% 11.3181 50.9422);--gold-glow:lab(44.1995% 17.0662 84.3373/.25);--gold-subtle:lab(44.1995% 17.0662 84.3373/.1);--success:lab(41.7514% -55.3249 21.5039);--error:lab(37.5238% 64.2774 32.6097);--shadow:0 4px 20px lab(0% 0 0/.1);--shadow-md:0 8px 32px lab(0% 0 0/.14), 0 0 0 1px var(--border-strong);--inner-ring:lab(91.7856% 1.21665 -3.54931);--inner-stroke:lab(61.7097% 15.1373 -34.1533);--inner-glyph:lab(24.6169% 28.6686 -46.7313);--inner-tick:lab(38.0413% 20.9664 -40.377);--outer-ring:lab(95.394% .703871 4.53229);--outer-stroke:lab(55.9083% 14.2142 62.5614);--outer-glyph:lab(34.836% 18.3832 78.9849);--outer-tick:lab(44.2758% 13.6718 62.9124);--xasp-conjunction:lab(30.5613% 27.1755 -46.8105);--xasp-opposition:lab(33.102% 57.8409 29.1456);--xasp-trine:lab(33.8513% -37.0741 -15.1222);--xasp-square:lab(35.9066% 49.947 64.0775);--xasp-sextile:lab(32.2083% -48.6822 18.8909)}}html,body{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background-image:none}.tooltip{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;color:var(--text);border-color:var(--border-strong);background:rgba(255,255,255,.96);background:color(display-p3 1 1 1/.96);background:lab(100% 0 0/.96);box-shadow:0 8px 32px rgba(0,0,0,.18),inset 0 .5px rgba(255,255,255,.6);box-shadow:0 8px 32px color(display-p3 0 0 0/.18),inset 0 .5px color(display-p3 1 1 1/.6);box-shadow:0 8px 32px lab(0% 0 0/.18),inset 0 .5px lab(100% 0 0/.6)}.tooltip-title{color:var(--text)}.tooltip-detail{color:var(--text-secondary)}.tooltip-hint{color:var(--gold-dim)}.chart-status{color:var(--gold);background:rgba(247,245,241,.92);background:color(display-p3 .967616 .959866 .945308/.92);background:lab(96.5376% .34076 2.2589/.92);border-color:rgba(141,95,0,.35);border-color:color(display-p3 .542549 .371783 -.107551/.35);border-color:lab(44.1995% 17.0662 84.3373/.35)}.chart-provenance{background:var(--surface)}.hit-region:hover{fill:rgba(141,95,0,.1);fill:color(display-p3 .542549 .371783 -.107551/.1);fill:lab(44.1995% 17.0662 84.3373/.1);stroke:var(--gold-dim)}.pan-btn{background:var(--surface)}.pan-btn:hover{background:var(--surface-2)}#fs-bottom-bar{background:#f7f5f1;background:color(display-p3 .967616 .959866 .945308);background:lab(96.5376% .34076 2.2589);border-top-color:#caced4;border-top-color:color(display-p3 .796183 .806346 .830691);border-top-color:lab(82.5562% -.22167 -3.77336)}#fs-bottom-bar [data-column=left],#fs-bottom-bar [data-column=right]{background:#f1eeea;background:color(display-p3 .941472 .933762 .919279);background:lab(94.2176% .341028 2.25905)}#fs-bottom-bar [data-column=left]{border-right-color:#caced4;border-right-color:color(display-p3 .796183 .806346 .830691);border-right-color:lab(82.5562% -.22167 -3.77336)}#fs-bottom-bar [data-column=right]{border-left-color:#caced4;border-left-color:color(display-p3 .796183 .806346 .830691);border-left-color:lab(82.5562% -.22167 -3.77336)}#fs-bottom-bar [data-column]>*+*{border-top-color:#caced4;border-top-color:color(display-p3 .796183 .806346 .830691);border-top-color:lab(82.5562% -.22167 -3.77336)}.cancel-toast{background:var(--surface);border-color:var(--border-strong);color:var(--text-secondary)}}.param-controls{background:var(--surface);border-top:1px solid var(--border);flex-shrink:0;padding:6px 12px}.param-controls-grid{flex-wrap:wrap;align-items:center;gap:6px 10px;display:flex}.param-group{flex-direction:row;align-items:center;gap:6px;display:flex}.param-group label{text-transform:uppercase;color:var(--text-secondary);letter-spacing:.06em;white-space:nowrap;font-size:10px;font-weight:700}.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{background:var(--surface-2);border:1px solid var(--border-strong);color:var(--text);color-scheme:inherit;border-radius:var(--radius-sm);width:120px;height:24px;padding:3px 6px;font-family:inherit;font-size:11px}@media (prefers-reduced-motion:no-preference){.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{transition:border-color .15s}}.param-group input:focus{border-color:var(--gold-dim);outline:none}.loc-searching{border-color:var(--gold-dim)!important}@media (prefers-reduced-motion:no-preference){.loc-searching{animation:1s ease-in-out infinite alternate loc-pulse}}@keyframes loc-pulse{0%{border-color:var(--gold-dim)}to{border-color:rgba(204,156,66,.55);border-color:color(display-p3 .76996 .617341 .321369/.55);border-color:lab(67.5798% 11.9379 52.333/.55)}}.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);z-index:100;max-height:200px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 4px 12px rgba(0,0,0,.35);box-shadow:0 4px 12px color(display-p3 0 0 0/.35);box-shadow:0 4px 12px lab(0% 0 0/.35)}.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}@media (prefers-reduced-motion:no-preference){.loc-item{transition:background .1s,color .1s}}.loc-item:hover{background:var(--gold-subtle);color:var(--gold)}.loc-status{color:var(--text-secondary);letter-spacing:.01em;padding:8px 10px;font-size:11px;font-style:italic}.loc-status-error{color:#d76a5a;color:color(display-p3 .788241 .439621 .373983);color:lab(58.1265% 42.6447 29.9439);font-style:normal;font-weight:600}.param-actions{align-items:center;gap:6px;margin-left:auto;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:24px;height:24px;display:flex}@media (prefers-reduced-motion:no-preference){.param-btn-icon{transition:background .15s,border-color .15s,color .15s}}.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:.06em;white-space:nowrap;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:24px;padding:3px 10px;font-family:inherit;font-size:10px;font-weight:600}@media (prefers-reduced-motion:no-preference){.param-btn-primary{transition:background .15s,border-color .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}@media (prefers-color-scheme:light){.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{border-color:var(--border-strong);color:var(--text);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background:#fdfcf9;background:color(display-p3 .990365 .986474 .97916);background:lab(98.849% .167578 1.1277)}.loc-suggestions{border-color:var(--border-strong);background:#fdfcf9;background:color(display-p3 .990365 .986474 .97916);background:lab(98.849% .167578 1.1277)}.param-btn-primary{background:rgba(160,112,0,.12);background:color(display-p3 .615135 .441554 -.0204711/.12);background:lab(51.2092% 16.2654 78.3504/.12);border-color:rgba(160,112,0,.4);border-color:color(display-p3 .615135 .441554 -.0204711/.4);border-color:lab(51.2092% 16.2654 78.3504/.4)}.param-btn-primary:hover:not(:disabled){background:rgba(160,112,0,.22);background:color(display-p3 .615135 .441554 -.0204711/.22);background:lab(51.2092% 16.2654 78.3504/.22);border-color:rgba(160,112,0,.65);border-color:color(display-p3 .615135 .441554 -.0204711/.65);border-color:lab(51.2092% 16.2654 78.3504/.65)}}.param-summary-bar{border-bottom:1px solid var(--border);flex-wrap:wrap;align-items:baseline;gap:2px 0;margin-bottom:4px;padding:3px 4px 5px;font-size:10px;line-height:1.3;display:flex}.param-summary-bar[hidden]{display:none}.summary-name{color:var(--gold,#d6a54d);letter-spacing:.01em;padding-right:2px;font-size:12px;font-weight:700}@supports (color:color(display-p3 0 0 0)){.summary-name{color:var(--gold,color(display-p3 .808073 .654274 .358094))}}@supports (color:lab(0% 0 0)){.summary-name{color:var(--gold,lab(71.071% 11.7474 51.7651))}}.summary-datetime{font-variant-numeric:tabular-nums;color:#a8a49e;color:color(display-p3 .655561 .643538 .620997);color:lab(67.5481% .590652 3.77966);align-items:baseline;gap:4px;font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-size:11px;display:inline-flex}.summary-time-sep{color:var(--border-strong);opacity:.7;font-family:inherit;font-size:9px}.summary-loc{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;max-width:200px;padding-left:2px;font-size:11px;font-style:italic;overflow:hidden}.summary-sep{background:var(--border-strong);opacity:.5;vertical-align:middle;flex-shrink:0;width:1px;height:11px;margin:0 7px;display:inline-block}
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);--on-gold:#0d0802;--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);--inner-glyph:#a494f6;--inner-tick:#7a6cbc;--inner-ring:#090810;--inner-stroke:#24222d;--outer-glyph:#e6ac3d;--outer-tick:#ac7d1b;--outer-ring:#070503;--outer-stroke:#342d20;--xasp-conjunction:#a494f6;--xasp-opposition:#dd4d57;--xasp-trine:#00b4bb;--xasp-square:#ec6d3d;--xasp-sextile:#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);--on-gold:color(display-p3 .0492866 .0328715 .0111297);--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);--inner-glyph:color(display-p3 .63252 .582093 .937636);--inner-tick:color(display-p3 .469481 .426877 .716469);--inner-ring:color(display-p3 .0342889 .0311906 .0606274);--inner-stroke:color(display-p3 .139053 .135371 .174039);--outer-glyph:color(display-p3 .866978 .684443 .324483);--outer-tick:color(display-p3 .645333 .49681 .196492);--outer-ring:color(display-p3 .0275363 .0215619 .01263);--outer-stroke:color(display-p3 .20063 .175863 .129743);--xasp-conjunction:color(display-p3 .63252 .582093 .937636);--xasp-opposition:color(display-p3 .803557 .340931 .357065);--xasp-trine:color(display-p3 .311493 .696068 .728277);--xasp-square:color(display-p3 .864679 .454605 .289251);--xasp-sextile: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);--on-gold:lab(2.4863% .883393 2.81807);--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);--inner-glyph:lab(65.7597% 22.6847 -47.4333);--inner-tick:lab(49.7428% 19.7831 -40.5855);--inner-ring:lab(2.38607% 1.22919 -3.41513);--inner-stroke:lab(13.9501% 2.71787 -6.94334);--outer-glyph:lab(74.5248% 14.3487 62.5064);--outer-tick:lab(55.9353% 12.6865 55.2442);--outer-ring:lab(1.56667% .268132 1.12634);--outer-stroke:lab(18.8428% 1.96196 9.88836);--xasp-conjunction:lab(65.7597% 22.6847 -47.4333);--xasp-opposition:lab(54.0218% 57.6814 26.7913);--xasp-trine:lab(66.3586% -37.5367 -15.4041);--xasp-square:lab(61.5466% 48.3829 50.2676);--xasp-sextile:lab(61.2436% -46.7762 18.3644)}}*,:before,:after{box-sizing:border-box;margin:0;padding:0}[hidden]{display:none!important}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.030'/%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 p{letter-spacing:.06em;text-transform:uppercase;font-size:11px}.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}}#chart-container{aspect-ratio:1;justify-content:center;align-items:center;width:100%;max-height:520px;padding:8px;transition:opacity .28s;display:flex;position:relative;overflow:hidden}#chart-container svg{width:100%;height:100%;transition:opacity .22s,filter .22s;display:block}#chart-container.refreshing svg{opacity:.35;filter:blur(1.5px)saturate(.4);pointer-events:none}#chart-container.refreshing:after{content:"";border:1.5px solid var(--gold);opacity:0;pointer-events:none;border-radius:50%;animation:1.2s cubic-bezier(.4,0,.6,1) infinite refresh-ring;position:absolute;top:8px;bottom:8px;left:8px;right:8px}@keyframes refresh-ring{0%{opacity:0;transform:scale(.96)}40%{opacity:.45;transform:scale(1)}to{opacity:0;transform:scale(1.04)}}@keyframes chart-fade-in{0%{opacity:0;transform:scale(.985)}to{opacity:1;transform:scale(1)}}#chart-container.chart-rendered svg{animation:.32s cubic-bezier(.16,1,.3,1) both chart-fade-in}#mode-badge{border-top:1px solid var(--border);background:var(--surface);flex-shrink:0;justify-content:center;align-items:center;gap:10px;padding:6px 14px;font-size:11px;display:flex}.mode-badge-inner{color:var(--inner-glyph);letter-spacing:.02em;align-items:center;gap:5px;font-weight:600;display:inline-flex}.mode-badge-outer{color:var(--outer-glyph);letter-spacing:.02em;align-items:center;gap:5px;font-weight:600;display:inline-flex}.mode-badge-sep{color:var(--text-secondary);font-weight:400}.mode-badge-dot-inner{background:var(--inner-tick);border-radius:50%;flex-shrink:0;width:8px;height:8px}.mode-badge-dot-outer{background:var(--outer-tick);border-radius:50%;flex-shrink:0;width:8px;height:8px}.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:.45}.hit-region.planet-hit{rx:12px;ry:12px}.hit-region.planet-hit:not(.dim):hover{filter:drop-shadow(0 0 5px var(--gold-glow))}.hit-region.dim{opacity:.12}.hit-region.aspect-hit{stroke-width:20px}.info-drawer{background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--radius);width:100%;box-shadow:var(--shadow-md);opacity:0;pointer-events:none;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}.info-drawer:before{content:"";background:var(--border-strong);border-radius:2px;flex-shrink:0;width:36px;height:4px;margin:0 auto 10px;display:block}.info-drawer.open{opacity:1;pointer-events:all;scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;flex-shrink:0;max-height:min(40vh,360px);padding:14px 16px 12px;overflow-y:auto}.info-header{align-items:flex-start;gap:10px;margin-bottom:12px;display:flex}.info-glyph{text-align:center;flex-shrink:0;width:32px;font-size:26px;line-height:1}.info-title{color:var(--text);flex:1;font-size:13px;font-weight:700}.info-subtitle{color:var(--text-secondary);margin-top:2px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:400}.wheel-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}.wheel-badge.inner{color:var(--inner-glyph);background:rgba(164,148,246,.12);background:color(display-p3 .63252 .582093 .937636/.12);background:lab(65.7597% 22.6847 -47.4333/.12);border:1px solid rgba(164,148,246,.3);border:1px solid color(display-p3 .63252 .582093 .937636/.3);border:1px solid lab(65.7597% 22.6847 -47.4333/.3)}.wheel-badge.outer{color:var(--outer-glyph);background:rgba(230,172,61,.12);background:color(display-p3 .866978 .684443 .324483/.12);background:lab(74.5248% 14.3487 62.5064/.12);border:1px solid rgba(230,172,61,.3);border:1px solid color(display-p3 .866978 .684443 .324483/.3);border:1px solid lab(74.5248% 14.3487 62.5064/.3)}.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:130px;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}.tooltip{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;-webkit-backdrop-filter:blur(14px)saturate(1.6);backdrop-filter:blur(14px)saturate(1.6);border-radius:var(--radius,10px);pointer-events:none;z-index:1000;opacity:0;background:rgba(12,12,22,.94);border:1px solid rgba(60,58,80,.8);max-width:240px;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)}.tooltip.visible{opacity:1}.tooltip-title{color:#e8e8f4;margin-bottom:2px;font-weight:700}.tooltip-detail{color:#9090b0;line-height:1.4}.tooltip-hint{color:#a08840;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}.error-state .error-msg{color:var(--text-secondary);text-align:center;max-width:280px;font-size:13px;line-height:1.5}#chart-hint{text-align:center;color:var(--text-secondary);letter-spacing:.04em;flex-shrink:0;padding:4px 12px 6px;font-size:10px}.chart-status{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:var(--radius-pill);color:var(--gold);z-index:900;opacity:0;pointer-events:none;letter-spacing:.04em;background:rgba(7,9,14,.92);background:color(display-p3 .0286832 .0352525 .0537785/.92);background:lab(2.44746% .00379235 -2.33402/.92);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);max-height:0;padding:5px 16px;font-size:11px;font-weight:600;transition:max-height .24s cubic-bezier(.16,1,.3,1),opacity .24s,transform .24s cubic-bezier(.16,1,.3,1);position:fixed;top:10px;left:50%;overflow:hidden;transform:translate(-50%)translateY(-10px);box-shadow:0 4px 20px rgba(0,0,0,.5),0 0 0 1px rgba(204,156,66,.1);box-shadow:0 4px 20px color(display-p3 0 0 0/.5),0 0 0 1px color(display-p3 .76996 .617341 .321369/.1);box-shadow:0 4px 20px lab(0% 0 0/.5),0 0 0 1px lab(67.5798% 11.9379 52.333/.1)}.chart-status.visible{opacity:1;max-height:44px;transform:translate(-50%)translateY(0)}.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:.45;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)}.hd-action-bar{flex-wrap:wrap;flex-shrink:0;gap:8px;padding:10px 16px 6px;display:flex}.action-btn{color:var(--gold);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:var(--gold);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:absolute;bottom:12px;right:12px}.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)}.pan-btn--fullscreen{width:36px;height:36px}body.is-fullscreen{height:100vh;overflow:hidden}body.is-fullscreen #app{flex-direction:column;gap:0;width:100vw;height:100vh;padding:0;display:flex;overflow:hidden}body.is-fullscreen #chart-container{min-height:0;aspect-ratio:unset;flex:1;justify-content:center;align-items:center;padding:16px 24px 0;display:flex;overflow:hidden}body.is-fullscreen #chart-container>svg{width:auto;max-width:100%;height:100%;max-height:100%}body.is-fullscreen #bi-info-drawer{display:none}body.is-fullscreen #loading-state{flex:1;height:auto;min-height:0}body.is-fullscreen .pan-zoom-controls{top:16px;right:16px}#fs-bottom-bar{border-top:1px solid var(--border);background:#020306;background:color(display-p3 .0100648 .0127997 .0215356);background:lab(.889429% .0122339 -1.01076);flex-shrink:0;grid-template-rows:1fr;grid-template-columns:220px 1fr 220px;height:240px;min-height:180px;max-height:280px;display:grid}#fs-bottom-bar [data-column=left],#fs-bottom-bar [data-column=right]{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;flex-direction:column;gap:4px;padding:10px 14px 12px;display:flex;overflow-x:hidden;overflow-y:auto}#fs-bottom-bar [data-column=left]{border-right:1px solid var(--border)}#fs-bottom-bar [data-column=center]{pointer-events:none}#fs-bottom-bar [data-column=right]{border-left:1px solid var(--border);overflow-y:auto}#fs-bottom-bar [data-column=right] .info-drawer--fs{min-height:0;box-shadow:none;scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;background:0 0;border:none;border-radius:0;flex:1;padding:0;overflow-y:auto;opacity:1!important;pointer-events:all!important;max-height:none!important}#fs-bottom-bar [data-column=right] .info-drawer--fs:before{display:none}#fs-bottom-bar [data-column]>*+*{border-top:1px solid var(--border);margin-top:4px;padding-top:8px}#fs-bottom-bar .bi-action-bar,#fs-bottom-bar .cw-action-bar{flex-direction:column;padding:8px 0 0}#fs-bottom-bar .action-btn{justify-content:center;width:100%}.cancel-toast{background:var(--surface-2,#1e1e2e);border:1px solid var(--border-strong,#444);color:var(--text-muted,#aaa);border-radius:var(--radius-sm,6px);opacity:0;z-index:9999;pointer-events:none;box-shadow:var(--shadow-md,0 4px 12px rgba(0,0,0,.3));padding:8px 16px;font-family:inherit;font-size:12px;transition:opacity .3s,transform .3s;position:fixed;bottom:20px;left:50%;transform:translate(-50%)translateY(20px)}.cancel-toast.visible{opacity:1;transform:translate(-50%)translateY(0)}.dignity-badge{letter-spacing:.03em;border-radius:4px;padding:1px 6px;font-size:10px;font-weight:600;display:inline-block}.dignity-domicile{color:#cc9c42;color:color(display-p3 .76996 .617341 .321369);color:lab(67.5798% 11.9379 52.333);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,.3);border:1px solid color(display-p3 .76996 .617341 .321369/.3);border:1px solid lab(67.5798% 11.9379 52.333/.3)}.dignity-exaltation{color:#1da871;color:color(display-p3 .313719 .651039 .459895);color:lab(61.2436% -46.7762 18.3644);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,.3);border:1px solid color(display-p3 .313719 .651039 .459895/.3);border:1px solid lab(61.2436% -46.7762 18.3644/.3)}.dignity-detriment,.dignity-fall{color:#c53443;color:color(display-p3 .710345 .252818 .279408);color:lab(45.8893% 57.7361 27.393);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,.25);border:1px solid color(display-p3 .710345 .252818 .279408/.25);border:1px solid lab(45.8893% 57.7361 27.393/.25)}.mode-badge-name{cursor:pointer;font-family:inherit;font-size:inherit;letter-spacing:.02em;background:0 0;border:none;border-radius:4px;align-items:center;gap:5px;padding:2px 6px;font-weight:600;transition:background .15s,color .15s;display:inline-flex}.mode-badge-name.inner-name{color:var(--inner-glyph)}.mode-badge-name.outer-name{color:var(--outer-glyph)}.mode-badge-name:hover{background:rgba(255,255,255,.06);background:color(display-p3 1 1 1/.06);background:lab(100% 0 0/.06)}.mode-badge-name.focused{color:var(--gold);background:rgba(204,156,66,.12);background:color(display-p3 .76996 .617341 .321369/.12);background:lab(67.5798% 11.9379 52.333/.12)}.mode-badge-swap{cursor:pointer;color:var(--text-secondary);background:0 0;border:none;align-items:center;padding:2px 4px;font-size:13px;line-height:1;transition:color .15s,transform .15s;display:inline-flex}.mode-badge-swap:hover{color:var(--gold);transform:scaleX(-1)}.mode-badge-date{color:var(--text-secondary);letter-spacing:.02em;font-size:10px;font-weight:400}#chart-container[data-focus=inner] .outer-planet-group,#chart-container[data-focus=outer] .inner-planet-group{opacity:.25;transition:opacity .25s}#aspect-filter{padding:0}.asp-panel{flex-wrap:wrap;align-items:center;gap:4px 12px;padding:4px 12px;display:flex}.aspect-toggle-btn,.orb-preset-btn{padding:2px 8px!important;font-size:10px!important}.asp-section{align-items:center;gap:6px;display:flex}.asp-section-label{letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);white-space:nowrap;font-size:10px;font-weight:700}.aspect-toggle-btn,.orb-preset-btn{border:1.5px solid var(--border-strong);color:var(--text-secondary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:20px;padding:4px 10px;font-size:11px;font-weight:600;transition:background .15s,color .15s,border-color .15s}.aspect-toggle-btn:hover,.orb-preset-btn:hover{border-color:var(--gold-dim);color:var(--text)}.aspect-toggle-btn.active{background:var(--gold);border-color:var(--gold);color:var(--on-gold)}.glyph-legend{margin-top:8px;font-size:11px}.glyph-legend>summary{cursor:pointer;border:1px solid var(--border);color:var(--text-secondary);-webkit-user-select:none;-moz-user-select:none;user-select:none;border-radius:999px;align-items:center;gap:5px;padding:4px 10px;list-style:none;display:inline-flex}.glyph-legend>summary::-webkit-details-marker{display:none}.glyph-legend>summary:hover{color:var(--text);border-color:var(--gold-dim)}.glyph-legend[open]>summary{color:var(--text)}.glyph-legend .legend-spark{color:var(--gold)}.legend-body{flex-direction:column;gap:10px;padding:10px 2px 2px;display:flex}.legend-group{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.legend-group-title{text-transform:uppercase;letter-spacing:.08em;color:var(--text-secondary);width:100%;font-size:9px}.legend-item{color:var(--text-secondary);align-items:center;gap:4px;display:inline-flex}.legend-glyph{color:var(--text);text-align:center;min-width:16px;font-size:14px}.orb-preset-btn.active{background:var(--surface-2);border-color:var(--gold);color:var(--gold)}.aspect-toggle-btn .toggle-icon{font-size:13px;line-height:1}.chart-provenance{border-bottom:1px solid var(--border);background:var(--surface);flex-flow:wrap;flex-shrink:0;justify-content:center;align-items:baseline;gap:2px 10px;padding:5px 12px;font-size:10px;animation:.2s both prov-in;display:flex}.chart-provenance>*{align-items:baseline;gap:6px;display:inline-flex}@keyframes prov-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.prov-name{color:var(--text);letter-spacing:.01em;align-items:center;gap:7px;font-size:11px;font-weight:600;display:flex}.prov-mode-tag{letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary);background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-pill);padding:1px 6px;font-size:9px;font-weight:500}.prov-trio{color:var(--text);align-items:center;gap:6px;font-size:11px;display:flex}.prov-planet{font-variant-numeric:tabular-nums;letter-spacing:.01em}.prov-sep{color:var(--border-strong);font-size:12px}.prov-meta{color:var(--text-secondary);letter-spacing:.02em;font-size:10px}.prov-tz{opacity:.7;font-size:9px}.error-state{flex-direction:column;justify-content:center;align-items:center;gap:12px;height:100%;min-height:200px;padding:24px;display:flex}.error-icon{opacity:.7;font-size:28px}.error-msg{color:var(--text-secondary);text-align:center;max-width:260px;font-size:12px;line-height:1.5}.error-retry-btn{border-radius:var(--radius-pill);border:1px solid var(--border-strong);background:var(--surface-2);color:var(--text);font:inherit;cursor:pointer;letter-spacing:.02em;margin-top:4px;padding:7px 20px;font-size:11px;font-weight:500;transition:all .18s}.error-retry-btn:hover{background:var(--gold-subtle);border-color:var(--gold-dim);color:var(--gold)}.chart-layer{opacity:1;transform-origin:310px 310px;animation:.5s cubic-bezier(.16,1,.3,1) both svgLayerAssemble;animation-delay:calc(var(--layer-index,0) * 80ms);transform:scale(1)}@keyframes svgLayerAssemble{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}.floating-action-btn:after{content:"";background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);width:50%;height:100%;animation:3s 2s infinite shimmer;position:absolute;top:0;left:-100%;transform:skew(-20deg)}@keyframes shimmer{0%{left:-100%}20%{left:200%}to{left:200%}}@keyframes slideUpFadeIn{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes slideUpFadeInPanel{0%{opacity:0;transform:translateY(12px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.patterns-strip{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;align-items:center;gap:4px;padding:4px 12px;font-size:10px;animation:.22s cubic-bezier(.16,1,.3,1) both slideUpFadeInPanel;display:flex}.pattern-pill{padding:2px 8px!important;font-size:10px!important}.patterns-label{letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);white-space:nowrap;margin-right:2px;font-size:10px;font-weight:700}.pattern-pill{border-radius:var(--radius-pill);cursor:pointer;letter-spacing:.01em;border:1.5px solid;align-items:center;gap:4px;padding:3px 10px;font-size:11px;font-weight:600;transition:background .15s,opacity .15s,transform .12s;display:inline-flex}.pattern-pill:hover{opacity:.85;transform:scale(1.03)}.pattern-pill.active{box-shadow:0 0 0 2px}.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}.tally-panel{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;align-items:center;gap:6px 14px;padding:5px 12px 6px;font-size:11px;animation:.22s cubic-bezier(.16,1,.3,1) both slideUpFadeInPanel;display:flex}.tally-section{flex-direction:column;gap:4px;display:flex}.tally-row{align-items:flex-start;gap:10px;display:flex}.tally-row.modality{gap:12px}.tally-item{border-radius:var(--radius-pill);cursor:pointer;white-space:nowrap;border:1.5px solid transparent;align-items:center;gap:4px;padding:2px 8px;font-size:12px;font-weight:700;transition:background .14s,border-color .14s,transform .12s;display:inline-flex}.tally-item:hover{transform:scale(1.06)}.tally-item.active{border-color:currentColor;box-shadow:0 0 0 2px}.tally-item.fire{color:#ff744f;color:color(display-p3 .936486 .485321 .346768);color:lab(66.005% 52.9628 47.7034);background:rgba(255,116,79,.1);background:color(display-p3 .936486 .485321 .346768/.1);background:lab(66.005% 52.9628 47.7034/.1)}.tally-item.earth{color:#68a244;color:color(display-p3 .458546 .627532 .315071);color:lab(60.9267% -32.2405 41.5215);background:rgba(104,162,68,.1);background:color(display-p3 .458546 .627532 .315071/.1);background:lab(60.9267% -32.2405 41.5215/.1)}.tally-item.air{color:#2fb5d8;color:color(display-p3 .359655 .701622 .832954);color:lab(68.1219% -27.5396 -28.3166);background:rgba(47,181,216,.1);background:color(display-p3 .359655 .701622 .832954/.1);background:lab(68.1219% -27.5396 -28.3166/.1)}.tally-item.water{color:#7792ee;color:color(display-p3 .487398 .569622 .908946);color:lab(61.5869% 9.51821 -50.2978);background:rgba(119,146,238,.1);background:color(display-p3 .487398 .569622 .908946/.1);background:lab(61.5869% 9.51821 -50.2978/.1)}.tally-item.cardinal{color:#cc9c42;color:color(display-p3 .76996 .617341 .321369);color:lab(67.5798% 11.9379 52.333);background:rgba(204,156,66,.08);background:color(display-p3 .76996 .617341 .321369/.08);background:lab(67.5798% 11.9379 52.333/.08)}.tally-item.fixed{color:#a486d7;color:color(display-p3 .623892 .531312 .823026);color:lab(61.2732% 24.0176 -37.6492);background:rgba(164,134,215,.08);background:color(display-p3 .623892 .531312 .823026/.08);background:lab(61.2732% 24.0176 -37.6492/.08)}.tally-item.mutable{color:#24a592;color:color(display-p3 .315103 .636668 .572864);color:lab(60.7802% -38.5122 -.286269);background:rgba(36,165,146,.08);background:color(display-p3 .315103 .636668 .572864/.08);background:lab(60.7802% -38.5122 -.286269/.08)}.tally-planets{flex-wrap:wrap;gap:2px 4px;padding:0 4px;display:flex}.tally-planet-chip{cursor:pointer;opacity:.75;font-size:13px;line-height:1;transition:opacity .12s,transform .12s}.tally-planet-chip:hover{opacity:1;transform:scale(1.15)}.tally-bar-row{padding:0 2px}.tally-bar{background:var(--surface-2);border-radius:2px;width:80px;height:4px;display:flex;overflow:hidden}.tally-bar-fill{height:100%;transition:width .3s cubic-bezier(.16,1,.3,1)}.tally-bar-fill.fire{background:#ff744f;background:color(display-p3 .936486 .485321 .346768);background:lab(66.005% 52.9628 47.7034)}.tally-bar-fill.earth{background:#68a244;background:color(display-p3 .458546 .627532 .315071);background:lab(60.9267% -32.2405 41.5215)}.tally-bar-fill.air{background:#2fb5d8;background:color(display-p3 .359655 .701622 .832954);background:lab(68.1219% -27.5396 -28.3166)}.tally-bar-fill.water{background:#7792ee;background:color(display-p3 .487398 .569622 .908946);background:lab(61.5869% 9.51821 -50.2978)}.tally-divider{background:var(--border-strong);flex-shrink:0;align-self:center;width:1px;height:28px}.dignity-panel{border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;align-items:center;gap:6px;padding:5px 12px 6px;font-size:11px;animation:.22s cubic-bezier(.16,1,.3,1) both slideUpFadeInPanel;display:flex}.dignity-chip{border-radius:var(--radius-pill);cursor:pointer;white-space:nowrap;border:1.5px solid transparent;align-items:center;gap:3px;padding:2px 8px 2px 6px;font-size:12px;font-weight:600;transition:border-color .14s,box-shadow .14s,transform .12s;display:inline-flex}.dignity-chip:hover{transform:scale(1.06)}.dignity-chip.active{border-color:currentColor;box-shadow:0 0 0 2px}.dignity-wheel-badge{opacity:.7;margin-left:1px;font-size:8px}.dignity-wheel-badge.inner{color:var(--inner-glyph)}.dignity-wheel-badge.outer{color:var(--outer-glyph)}@media (prefers-color-scheme:light){:root{--bg:#f7f5f1;--surface:#fff;--surface-2:#f1eee9;--border:#dbd7d0;--border-strong:#bdb6ac;--text:#101215;--text-secondary:#4f5359;--gold:#825700;--gold-dim:#6d4b00;--gold-glow:rgba(130,87,0,.25);--gold-subtle:rgba(130,87,0,.1);--on-gold:#fcf4e6;--success:#007145;--error:#b1002b;--shadow:0 4px 20px rgba(0,0,0,.1);--shadow-md:0 8px 32px rgba(0,0,0,.14), 0 0 0 1px var(--border-strong);--inner-ring:#e7e7ee;--inner-stroke:#978ed2;--inner-glyph:#422b83;--inner-tick:#5e4f9c;--outer-ring:#f6f1e9;--outer-stroke:#ae7c00;--outer-glyph:#704a00;--outer-tick:#8a6000;--xasp-conjunction:#4f3a92;--xasp-opposition:#9d0026;--xasp-trine:#005b60;--xasp-square:#982f00;--xasp-sextile:#005833}@supports (color:color(display-p3 0 0 0)){:root{--bg:color(display-p3 .967616 .959866 .945308);--surface:color(display-p3 1 1 1);--surface-2:color(display-p3 .943798 .93351 .914195);--border:color(display-p3 .855616 .842987 .819292);--border-strong:color(display-p3 .73602 .716348 .67952);--text:color(display-p3 .0633107 .0687189 .081922);--text-secondary:color(display-p3 .313002 .323251 .348016);--gold:color(display-p3 .49809 .342102 -.0880434);--gold-dim:color(display-p3 .414099 .299019 .034461);--gold-glow:color(display-p3 .49809 .342102 -.0880434/.25);--gold-subtle:color(display-p3 .49809 .342102 -.0880434/.1);--on-gold:color(display-p3 .983924 .957955 .909341);--success:color(display-p3 -.0793084 .456092 .255685);--error:color(display-p3 .642198 .101724 .18242);--shadow:0 4px 20px color(display-p3 0 0 0/.1);--shadow-md:0 8px 32px color(display-p3 0 0 0/.14), 0 0 0 1px var(--border-strong);--inner-ring:color(display-p3 .907095 .905197 .931783);--inner-stroke:color(display-p3 .58664 .556304 .804254);--inner-glyph:color(display-p3 .245423 .171497 .493494);--inner-tick:color(display-p3 .358729 .312313 .591881);--outer-ring:color(display-p3 .961514 .946019 .916957);--outer-stroke:color(display-p3 .654857 .492962 .151277);--outer-glyph:color(display-p3 .448097 .281046 -.133276);--outer-tick:color(display-p3 .524671 .380491 .0387678);--xasp-conjunction:color(display-p3 .295896 .228956 .554264);--xasp-opposition:color(display-p3 .566502 .0969703 .161549);--xasp-trine:color(display-p3 -.136655 .362311 .395877);--xasp-square:color(display-p3 .576596 .182695 -.0331795);--xasp-sextile:color(display-p3 -.0802406 .354845 .187391)}}@supports (color:lab(0% 0 0)){:root{--bg:lab(96.5376% .34076 2.2589);--surface:lab(100% 0 0);--surface-2:lab(94.2232% .459731 3.01526);--border:lab(86.1085% .583261 3.77473);--border-strong:lab(74.5232% .975847 6.06879);--text:lab(5.23809% -.0738502 -2.43738);--text-secondary:lab(34.9842% -.210047 -4.49809);--gold:lab(40.7346% 15.7445 75.3139);--gold-dim:lab(35.0077% 11.3181 50.9422);--gold-glow:lab(40.7346% 15.7445 75.3139/.25);--gold-subtle:lab(40.7346% 15.7445 75.3139/.1);--on-gold:lab(96.574% 1.22038 7.58642);--success:lab(41.7514% -55.3249 21.5039);--error:lab(37.5238% 64.2774 32.6097);--shadow:0 4px 20px lab(0% 0 0/.1);--shadow-md:0 8px 32px lab(0% 0 0/.14), 0 0 0 1px var(--border-strong);--inner-ring:lab(91.7856% 1.21665 -3.54931);--inner-stroke:lab(61.7097% 15.1373 -34.1533);--inner-glyph:lab(24.6169% 28.6686 -46.7313);--inner-tick:lab(38.0413% 20.9664 -40.377);--outer-ring:lab(95.394% .703871 4.53229);--outer-stroke:lab(55.9083% 14.2142 62.5614);--outer-glyph:lab(34.836% 18.3832 78.9849);--outer-tick:lab(44.2758% 13.6718 62.9124);--xasp-conjunction:lab(30.5613% 27.1755 -46.8105);--xasp-opposition:lab(33.102% 57.8409 29.1456);--xasp-trine:lab(33.8513% -37.0741 -15.1222);--xasp-square:lab(35.9066% 49.947 64.0775);--xasp-sextile:lab(32.2083% -48.6822 18.8909)}}html,body{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background-image:none}.tooltip{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;color:var(--text);border-color:var(--border-strong);background:rgba(255,255,255,.96);background:color(display-p3 1 1 1/.96);background:lab(100% 0 0/.96);box-shadow:0 8px 32px rgba(0,0,0,.18),inset 0 .5px rgba(255,255,255,.6);box-shadow:0 8px 32px color(display-p3 0 0 0/.18),inset 0 .5px color(display-p3 1 1 1/.6);box-shadow:0 8px 32px lab(0% 0 0/.18),inset 0 .5px lab(100% 0 0/.6)}.tooltip-title{color:var(--text)}.tooltip-detail{color:var(--text-secondary)}.tooltip-hint{color:var(--gold-dim)}.chart-status{color:var(--gold);background:rgba(247,245,241,.92);background:color(display-p3 .967616 .959866 .945308/.92);background:lab(96.5376% .34076 2.2589/.92);border-color:rgba(141,95,0,.35);border-color:color(display-p3 .542549 .371783 -.107551/.35);border-color:lab(44.1995% 17.0662 84.3373/.35)}.chart-provenance{background:var(--surface)}.hit-region:hover{fill:rgba(141,95,0,.1);fill:color(display-p3 .542549 .371783 -.107551/.1);fill:lab(44.1995% 17.0662 84.3373/.1);stroke:var(--gold-dim)}.pan-btn{background:var(--surface)}.pan-btn:hover{background:var(--surface-2)}#fs-bottom-bar{background:#f7f5f1;background:color(display-p3 .967616 .959866 .945308);background:lab(96.5376% .34076 2.2589);border-top-color:#caced4;border-top-color:color(display-p3 .796183 .806346 .830691);border-top-color:lab(82.5562% -.22167 -3.77336)}#fs-bottom-bar [data-column=left],#fs-bottom-bar [data-column=right]{background:#f1eeea;background:color(display-p3 .941472 .933762 .919279);background:lab(94.2176% .341028 2.25905)}#fs-bottom-bar [data-column=left]{border-right-color:#caced4;border-right-color:color(display-p3 .796183 .806346 .830691);border-right-color:lab(82.5562% -.22167 -3.77336)}#fs-bottom-bar [data-column=right]{border-left-color:#caced4;border-left-color:color(display-p3 .796183 .806346 .830691);border-left-color:lab(82.5562% -.22167 -3.77336)}#fs-bottom-bar [data-column]>*+*{border-top-color:#caced4;border-top-color:color(display-p3 .796183 .806346 .830691);border-top-color:lab(82.5562% -.22167 -3.77336)}.cancel-toast{background:var(--surface);border-color:var(--border-strong);color:var(--text-secondary)}}@media (max-width:480px){body,#app{padding:0}#pan-zoom-controls{flex-wrap:wrap;gap:6px}.pan-btn{min-width:40px;min-height:40px}.controls,.control-row,#date-controls{flex-wrap:wrap;gap:8px}}.param-controls{background:var(--surface);border-top:1px solid var(--border);flex-shrink:0;padding:6px 12px}.param-controls-grid{flex-wrap:wrap;align-items:center;gap:6px 10px;display:flex}.param-group{flex-direction:row;align-items:center;gap:6px;display:flex}.param-group label{text-transform:uppercase;color:var(--text-secondary);letter-spacing:.06em;white-space:nowrap;font-size:10px;font-weight:700}.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{background:var(--surface-2);border:1px solid var(--border-strong);color:var(--text);color-scheme:inherit;border-radius:var(--radius-sm);width:120px;height:24px;padding:3px 6px;font-family:inherit;font-size:11px}@media (prefers-reduced-motion:no-preference){.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{transition:border-color .15s}}.param-group input:focus{border-color:var(--gold-dim);outline:none}.loc-searching{border-color:var(--gold-dim)!important}@media (prefers-reduced-motion:no-preference){.loc-searching{animation:1s ease-in-out infinite alternate loc-pulse}}@keyframes loc-pulse{0%{border-color:var(--gold-dim)}to{border-color:rgba(204,156,66,.55);border-color:color(display-p3 .76996 .617341 .321369/.55);border-color:lab(67.5798% 11.9379 52.333/.55)}}.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);z-index:100;max-height:200px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 4px 12px rgba(0,0,0,.35);box-shadow:0 4px 12px color(display-p3 0 0 0/.35);box-shadow:0 4px 12px lab(0% 0 0/.35)}.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}@media (prefers-reduced-motion:no-preference){.loc-item{transition:background .1s,color .1s}}.loc-item:hover{background:var(--gold-subtle);color:var(--gold)}.loc-status{color:var(--text-secondary);letter-spacing:.01em;padding:8px 10px;font-size:11px;font-style:italic}.loc-status-error{color:#d76a5a;color:color(display-p3 .788241 .439621 .373983);color:lab(58.1265% 42.6447 29.9439);font-style:normal;font-weight:600}.param-actions{align-items:center;gap:6px;margin-left:auto;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:24px;height:24px;display:flex}@media (prefers-reduced-motion:no-preference){.param-btn-icon{transition:background .15s,border-color .15s,color .15s}}.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:.06em;white-space:nowrap;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:24px;padding:3px 10px;font-family:inherit;font-size:10px;font-weight:600}@media (prefers-reduced-motion:no-preference){.param-btn-primary{transition:background .15s,border-color .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}@media (prefers-color-scheme:light){.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{border-color:var(--border-strong);color:var(--text);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background:#fdfcf9;background:color(display-p3 .990365 .986474 .97916);background:lab(98.849% .167578 1.1277)}.loc-suggestions{border-color:var(--border-strong);background:#fdfcf9;background:color(display-p3 .990365 .986474 .97916);background:lab(98.849% .167578 1.1277)}.param-btn-primary{background:rgba(160,112,0,.12);background:color(display-p3 .615135 .441554 -.0204711/.12);background:lab(51.2092% 16.2654 78.3504/.12);border-color:rgba(160,112,0,.4);border-color:color(display-p3 .615135 .441554 -.0204711/.4);border-color:lab(51.2092% 16.2654 78.3504/.4)}.param-btn-primary:hover:not(:disabled){background:rgba(160,112,0,.22);background:color(display-p3 .615135 .441554 -.0204711/.22);background:lab(51.2092% 16.2654 78.3504/.22);border-color:rgba(160,112,0,.65);border-color:color(display-p3 .615135 .441554 -.0204711/.65);border-color:lab(51.2092% 16.2654 78.3504/.65)}}.param-summary-bar{border-bottom:1px solid var(--border);flex-wrap:wrap;align-items:baseline;gap:2px 0;margin-bottom:4px;padding:3px 4px 5px;font-size:10px;line-height:1.3;display:flex}.param-summary-bar[hidden]{display:none}.summary-name{color:var(--gold,#d6a54d);letter-spacing:.01em;padding-right:2px;font-size:12px;font-weight:700}@supports (color:color(display-p3 0 0 0)){.summary-name{color:var(--gold,color(display-p3 .808073 .654274 .358094))}}@supports (color:lab(0% 0 0)){.summary-name{color:var(--gold,lab(71.071% 11.7474 51.7651))}}.summary-datetime{font-variant-numeric:tabular-nums;color:var(--text-secondary);align-items:baseline;gap:4px;font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-size:11px;display:inline-flex}.summary-time-sep{color:var(--border-strong);opacity:.7;font-family:inherit;font-size:9px}.summary-loc{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;max-width:200px;padding-left:2px;font-size:11px;font-style:italic;overflow:hidden}.summary-sep{background:var(--border-strong);opacity:.5;vertical-align:middle;flex-shrink:0;width:1px;height:11px;margin:0 7px;display:inline-block}
11
11
  /*$vite$:1*/</style>
12
12
  </head>
13
13
  <body>
@@ -6678,19 +6678,29 @@ function X(e4) {
6678
6678
  function Z(e4) {
6679
6679
  return String(e4).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
6680
6680
  }
6681
- function R_(e4) {
6682
- return Array.isArray(e4) ? e4.filter((e5) => e5 && typeof e5.longitude == "number" && isFinite(e5.longitude)) : e4 && typeof e4 == "object" ? Object.entries(e4).filter(([e5]) => I_.has(e5.toLowerCase())).map(([e5, t2]) => {
6681
+ var R_ = "true";
6682
+ function z_(e4) {
6683
+ R_ = e4;
6684
+ }
6685
+ function B_(e4) {
6686
+ let t2 = e4.some((e5) => e5.name === "true_node"), n2 = e4.some((e5) => e5.name === "north_node");
6687
+ if (!t2 || !n2) return e4;
6688
+ let r2 = R_ === "true" ? "north_node" : "true_node";
6689
+ return e4.filter((e5) => e5.name !== r2);
6690
+ }
6691
+ function V_(e4) {
6692
+ return Array.isArray(e4) ? B_(e4.filter((e5) => e5 && typeof e5.longitude == "number" && isFinite(e5.longitude))) : e4 && typeof e4 == "object" ? B_(Object.entries(e4).filter(([e5]) => I_.has(e5.toLowerCase())).map(([e5, t2]) => {
6683
6693
  var n2, r2, i2, a2, o2, s2;
6684
6694
  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 };
6685
- }) : [];
6695
+ })) : [];
6686
6696
  }
6687
- var z_ = [{ type: "conjunction", angle: 0, orb: 8 }, { type: "opposition", angle: 180, orb: 8 }, { type: "trine", angle: 120, orb: 6 }, { type: "square", angle: 90, orb: 5 }, { type: "sextile", angle: 60, orb: 4 }];
6688
- function B_(e4, t2, n2 = 1) {
6697
+ var H_ = [{ type: "conjunction", angle: 0, orb: 8 }, { type: "opposition", angle: 180, orb: 8 }, { type: "trine", angle: 120, orb: 6 }, { type: "square", angle: 90, orb: 5 }, { type: "sextile", angle: 60, orb: 4 }];
6698
+ function U_(e4, t2, n2 = 1) {
6689
6699
  let r2 = [];
6690
6700
  for (let o2 of e4) for (let e5 of t2) {
6691
6701
  let t3 = Math.abs(o2.longitude - e5.longitude) % 360;
6692
6702
  t3 > 180 && (t3 = 360 - t3);
6693
- for (let s2 of z_) {
6703
+ for (let s2 of H_) {
6694
6704
  let c2 = s2.orb * n2, l2 = Math.abs(t3 - s2.angle);
6695
6705
  if (l2 <= c2) {
6696
6706
  var i2, a2;
@@ -6702,39 +6712,39 @@ function B_(e4, t2, n2 = 1) {
6702
6712
  }
6703
6713
  return r2.sort((e5, t3) => e5.orb - t3.orb).slice(0, 40);
6704
6714
  }
6705
- var V_ = null;
6706
- function H_(e4) {
6707
- V_ = e4;
6715
+ var W_ = null;
6716
+ function G_(e4) {
6717
+ W_ = e4;
6708
6718
  }
6709
- var U_ = null, W_ = null;
6710
- function G_() {
6711
- return W_ || (W_ = document.getElementById("tooltip")), W_;
6719
+ var K_ = null, q_ = null;
6720
+ function J_() {
6721
+ return q_ || (q_ = document.getElementById("tooltip")), q_;
6712
6722
  }
6713
- function K_(e4, t2, n2, r2, i2) {
6714
- let a2 = G_();
6723
+ function Y_(e4, t2, n2, r2, i2) {
6724
+ let a2 = J_();
6715
6725
  a2.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 ");
6716
6726
  let o2 = a2.getBoundingClientRect(), s2 = o2.width || 240, c2 = o2.height || 80, l2 = e4 + 14, u2 = t2 + 10;
6717
6727
  l2 + s2 > window.innerWidth && (l2 = e4 - s2 - 8), u2 + c2 > window.innerHeight && (u2 = t2 - c2 - 8), a2.style.left = "".concat(l2, "px"), a2.style.top = "".concat(u2, "px"), a2.classList.add("visible");
6718
6728
  }
6719
- function q_() {
6720
- G_().classList.remove("visible");
6729
+ function X_() {
6730
+ J_().classList.remove("visible");
6721
6731
  }
6722
- var J_ = { sun: "identity & vitality", moon: "emotions & instincts", mercury: "mind & communication", venus: "love & values", mars: "drive & desire", jupiter: "expansion & meaning", saturn: "discipline & mastery", uranus: "innovation & rebellion", neptune: "dreams & transcendence", pluto: "transformation & power", chiron: "wound & healing", "north node": "soul direction", "south node": "past-life gifts", "true node": "soul direction" }, Y_ = { conjunction: "fusion & amplification", opposition: "polarity & integration", trine: "ease & natural flow", square: "tension & growth", sextile: "opportunity & cooperation", quincunx: "adjustment & recalibration", semisquare: "friction & minor tension" }, X_ = null, Q = null, Z_ = /* @__PURE__ */ new Map();
6723
- function Q_(e4) {
6732
+ var Z_ = { sun: "identity & vitality", moon: "emotions & instincts", mercury: "mind & communication", venus: "love & values", mars: "drive & desire", jupiter: "expansion & meaning", saturn: "discipline & mastery", uranus: "innovation & rebellion", neptune: "dreams & transcendence", pluto: "transformation & power", chiron: "wound & healing", "north node": "soul direction", "south node": "past-life gifts", "true node": "soul direction" }, Q_ = { conjunction: "fusion & amplification", opposition: "polarity & integration", trine: "ease & natural flow", square: "tension & growth", sextile: "opportunity & cooperation", quincunx: "adjustment & recalibration", semisquare: "friction & minor tension" }, $_ = null, Q = null, ev = /* @__PURE__ */ new Map();
6733
+ function tv(e4) {
6724
6734
  return "".concat(e4.planet1, "|inner|").concat(e4.planet2, "|outer|").concat(e4.type);
6725
6735
  }
6726
- var $_ = { ASC: { title: "Ascendant", symbol: "AC", keyword: "self & first impressions", meaning: "The Ascendant is the mask you wear before the world \u2014 your embodied presence, physical appearance, and instinctive approach to new situations.", themes: ["identity", "appearance", "beginnings", "vitality", "self-projection"] }, DSC: { title: "Descendant", symbol: "DC", keyword: "partnership & mirrors", meaning: "The Descendant describes what you seek in others and the qualities you project onto relationships \u2014 the face you recognise in those you're drawn to.", themes: ["partnership", "marriage", "open enemies", "projection", "attraction"] }, MC: { title: "Midheaven", symbol: "MC", keyword: "vocation & public legacy", meaning: "The Midheaven marks the chart's highest point and governs reputation, career, and the long arc of your public life.", themes: ["career", "ambition", "reputation", "authority", "life direction"] }, IC: { title: "Imum Coeli", symbol: "IC", keyword: "roots & inner foundation", meaning: "The IC anchors the chart at its lowest point \u2014 home, ancestry, psychological foundations, and the private self that sustains the public Midheaven.", themes: ["home", "family", "ancestry", "inner life", "psychological roots"] } };
6727
- function ev(e4, t2, n2, r2, i2) {
6736
+ var nv = { ASC: { title: "Ascendant", symbol: "AC", keyword: "self & first impressions", meaning: "The Ascendant is the mask you wear before the world \u2014 your embodied presence, physical appearance, and instinctive approach to new situations.", themes: ["identity", "appearance", "beginnings", "vitality", "self-projection"] }, DSC: { title: "Descendant", symbol: "DC", keyword: "partnership & mirrors", meaning: "The Descendant describes what you seek in others and the qualities you project onto relationships \u2014 the face you recognise in those you're drawn to.", themes: ["partnership", "marriage", "open enemies", "projection", "attraction"] }, MC: { title: "Midheaven", symbol: "MC", keyword: "vocation & public legacy", meaning: "The Midheaven marks the chart's highest point and governs reputation, career, and the long arc of your public life.", themes: ["career", "ambition", "reputation", "authority", "life direction"] }, IC: { title: "Imum Coeli", symbol: "IC", keyword: "roots & inner foundation", meaning: "The IC anchors the chart at its lowest point \u2014 home, ancestry, psychological foundations, and the private self that sustains the public Midheaven.", themes: ["home", "family", "ancestry", "inner life", "psychological roots"] } };
6737
+ function rv(e4, t2, n2, r2, i2) {
6728
6738
  var a2, o2;
6729
- let s2 = av(), c2 = $_[t2];
6739
+ let s2 = cv(), c2 = nv[t2];
6730
6740
  if (!c2) return;
6731
- let l2 = L_(n2), u2 = Math.floor((n2 % 360 + 360) % 360 / 30), d2 = M_[u2], f2 = N_[u2], p2 = T_[u2], m2 = P_[u2], h2 = i2 ? "".concat(i2, " \xB7 Natal") : "Inner \xB7 Natal", g2 = U_ ? '<button class="ask-claude-btn" id="bi-ask-claude-angle-btn">\u2728 Ask Claude to interpret</button>' : "";
6741
+ let l2 = L_(n2), u2 = Math.floor((n2 % 360 + 360) % 360 / 30), d2 = M_[u2], f2 = N_[u2], p2 = T_[u2], m2 = P_[u2], h2 = i2 ? "".concat(i2, " \xB7 Natal") : "Inner \xB7 Natal", g2 = K_ ? '<button class="ask-claude-btn" id="bi-ask-claude-angle-btn">\u2728 Ask Claude to interpret</button>' : "";
6732
6742
  s2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:#7060b8;font-family:system-ui;font-weight:700;font-size:14px">'.concat(Z(c2.symbol), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:6px;flex-wrap:wrap;">\n <strong>').concat(Z(c2.title), '</strong>\n <span class="wheel-badge inner">').concat(Z(h2), '</span>\n </div>\n <div class="info-subtitle">').concat(Z(p2), " ").concat(Z(l2), '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div style="font-size:11px;color:var(--text-secondary,#888);margin:6px 0 4px">\n <span style="color:').concat(m2, ';margin-right:4px">').concat(Z(p2), "</span>\n <em>").concat(Z(d2), " \xB7 ").concat(Z(f2), '</em>\n </div>\n <div style="font-size:12px;line-height:1.55;margin-bottom:8px">').concat(Z(c2.meaning), '</div>\n <div class="aspects-title">').concat(Z(c2.keyword), '</div>\n <div class="aspects-list">\n ').concat(c2.themes.map((e5) => '<div class="aspect-row"><span class="aspect-other">'.concat(Z(e5), "</span></div>")).join(""), "\n </div>\n ").concat(g2, "\n "), s2.classList.add("open"), s2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (a2 = document.getElementById("bi-info-close-btn")) == null || a2.addEventListener("click", () => {
6733
- ov(), pv();
6743
+ lv(), gv();
6734
6744
  }), (o2 = document.getElementById("bi-ask-claude-angle-btn")) == null || o2.addEventListener("click", () => {
6735
- if (!U_) return;
6745
+ if (!K_) return;
6736
6746
  let e5 = document.getElementById("bi-ask-claude-angle-btn");
6737
- !e5 || e5.disabled || (e5.disabled = true, e5.textContent = "\u23F3 Sending\u2026", e5.classList.add("sending"), U_({ type: "angle_interpretation", data: { angle: c2.title, longitude: n2, sign: E_[u2], position: l2, element: d2, modality: f2, mode: r2 } }).then(() => {
6747
+ !e5 || e5.disabled || (e5.disabled = true, e5.textContent = "\u23F3 Sending\u2026", e5.classList.add("sending"), K_({ type: "angle_interpretation", data: { angle: c2.title, longitude: n2, sign: E_[u2], position: l2, element: d2, modality: f2, mode: r2 } }).then(() => {
6738
6748
  e5.textContent = "\u2713 Sent to Claude", e5.classList.remove("sending"), e5.classList.add("sent"), setTimeout(() => {
6739
6749
  e5.textContent = "\u2728 Ask Claude to interpret", e5.classList.remove("sent"), e5.disabled = false;
6740
6750
  }, 2500);
@@ -6743,27 +6753,27 @@ function ev(e4, t2, n2, r2, i2) {
6743
6753
  }));
6744
6754
  });
6745
6755
  }
6746
- var tv = { 1: "Identity & self", 2: "Resources & values", 3: "Mind & local", 4: "Roots & home", 5: "Creativity & play", 6: "Work & wellbeing", 7: "Partnership", 8: "Depth & shared", 9: "Meaning & travel", 10: "Vocation & visibility", 11: "Community & vision", 12: "Inner life" };
6747
- function nv(e4, t2, n2) {
6756
+ var iv = { 1: "Identity & self", 2: "Resources & values", 3: "Mind & local", 4: "Roots & home", 5: "Creativity & play", 6: "Work & wellbeing", 7: "Partnership", 8: "Depth & shared", 9: "Meaning & travel", 10: "Vocation & visibility", 11: "Community & vision", 12: "Inner life" };
6757
+ function av(e4, t2, n2) {
6748
6758
  let r2 = (n2 - t2 + 360) % 360;
6749
6759
  return e4.filter((e5) => {
6750
6760
  let n3 = (e5.longitude - t2 + 360) % 360;
6751
6761
  return n3 >= 0 && n3 < r2;
6752
6762
  });
6753
6763
  }
6754
- function rv(e4, t2, n2, r2, i2, a2, o2, s2) {
6764
+ function ov(e4, t2, n2, r2, i2, a2, o2, s2) {
6755
6765
  var c2, l2, u2, d2, f2;
6756
- let p2 = av(), m2 = Math.floor((t2.cusp_lon % 360 + 360) % 360 / 30), h2 = (c2 = (l2 = t2.sign) == null ? E_[m2] : l2) == null ? "" : c2, g2 = (u2 = T_[m2]) == null ? "" : u2, _2 = nv(o2, t2.cusp_lon, n2.cusp_lon), v2 = nv(s2, t2.cusp_lon, n2.cusp_lon), y2 = i2 || "Natal", b2 = r2 === "synastry" ? a2 == null ? "Synastry" : a2 : "Transit", x2 = (e5, t3) => e5.length === 0 ? '<div class="no-aspects">\u2014</div>' : e5.map((e6) => {
6766
+ let p2 = cv(), m2 = Math.floor((t2.cusp_lon % 360 + 360) % 360 / 30), h2 = (c2 = (l2 = t2.sign) == null ? E_[m2] : l2) == null ? "" : c2, g2 = (u2 = T_[m2]) == null ? "" : u2, _2 = av(o2, t2.cusp_lon, n2.cusp_lon), v2 = av(s2, t2.cusp_lon, n2.cusp_lon), y2 = i2 || "Natal", b2 = r2 === "synastry" ? a2 == null ? "Synastry" : a2 : "Transit", x2 = (e5, t3) => e5.length === 0 ? '<div class="no-aspects">\u2014</div>' : e5.map((e6) => {
6757
6767
  let n3 = L_(e6.longitude), r3 = e6.retrograde ? " \u211E" : "";
6758
6768
  return '<div class="aspect-row">\n <span class="wheel-badge '.concat(t3, '" style="font-size:9px">').concat(Z(t3 === "inner" ? y2 : b2), '</span>\n <span class="aspect-other">').concat(Z(X(e6.name))).concat(r3, '</span>\n <span class="aspect-meta">').concat(Z(n3), "</span>\n </div>");
6759
- }).join(""), S2 = U_ ? '<button class="ask-claude-btn" id="bi-ask-claude-house-btn">\u2728 Ask Claude to interpret</button>' : "";
6769
+ }).join(""), S2 = K_ ? '<button class="ask-claude-btn" id="bi-ask-claude-house-btn">\u2728 Ask Claude to interpret</button>' : "";
6760
6770
  p2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:#7060b8;font-family:system-ui;font-weight:700;font-size:14px">'.concat(t2.number, '</span>\n <div class="info-title">\n <div><strong>House ').concat(t2.number, '</strong></div>\n <div class="info-subtitle">').concat(Z(g2), " ").concat(Z(h2), " on cusp").concat(t2.ruler ? " \xB7 ruled by ".concat(Z(X(t2.ruler))) : "", '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title" style="margin-top:6px">').concat(Z(y2), ' planets</div>\n <div class="aspects-list">').concat(x2(_2, "inner"), '</div>\n <div class="aspects-title" style="margin-top:8px">').concat(Z(b2), ' planets currently here</div>\n <div class="aspects-list">').concat(x2(v2, "outer"), "</div>\n ").concat(S2, "\n "), p2.classList.add("open"), p2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (d2 = document.getElementById("bi-info-close-btn")) == null || d2.addEventListener("click", () => {
6761
- ov(), pv();
6771
+ lv(), gv();
6762
6772
  }), (f2 = document.getElementById("bi-ask-claude-house-btn")) == null || f2.addEventListener("click", () => {
6763
6773
  var e5;
6764
- if (!U_) return;
6774
+ if (!K_) return;
6765
6775
  let n3 = document.getElementById("bi-ask-claude-house-btn");
6766
- !n3 || n3.disabled || (n3.disabled = true, n3.textContent = "\u23F3 Sending\u2026", n3.classList.add("sending"), U_({ type: "house", data: { house_number: t2.number, cusp_sign: h2, cusp_longitude: t2.cusp_lon, ruler: (e5 = t2.ruler) == null ? null : e5, mode: r2, inner_label: y2, outer_label: b2, inner_planets: _2.map((e6) => {
6776
+ !n3 || n3.disabled || (n3.disabled = true, n3.textContent = "\u23F3 Sending\u2026", n3.classList.add("sending"), K_({ type: "house", data: { house_number: t2.number, cusp_sign: h2, cusp_longitude: t2.cusp_lon, ruler: (e5 = t2.ruler) == null ? null : e5, mode: r2, inner_label: y2, outer_label: b2, inner_planets: _2.map((e6) => {
6767
6777
  var t3;
6768
6778
  return { name: e6.name, position: L_(e6.longitude), retrograde: (t3 = e6.retrograde) == null ? false : t3 };
6769
6779
  }), outer_planets: v2.map((e6) => {
@@ -6778,18 +6788,18 @@ function rv(e4, t2, n2, r2, i2, a2, o2, s2) {
6778
6788
  }));
6779
6789
  });
6780
6790
  }
6781
- function iv(e4, t2, n2, r2, i2, a2, o2) {
6791
+ function sv(e4, t2, n2, r2, i2, a2, o2) {
6782
6792
  var s2, c2;
6783
- let l2 = av(), u2 = E_[t2], d2 = T_[t2], f2 = M_[t2], p2 = N_[t2], m2 = (e5) => Math.floor((e5.longitude % 360 + 360) % 360 / 30) === t2, h2 = a2.filter(m2), g2 = o2.filter(m2), _2 = r2 || "Natal", v2 = n2 === "synastry" ? i2 == null ? "Synastry" : i2 : "Transit", y2 = (e5, t3) => e5.length === 0 ? '<div class="no-aspects">\u2014</div>' : e5.map((e6) => {
6793
+ let l2 = cv(), u2 = E_[t2], d2 = T_[t2], f2 = M_[t2], p2 = N_[t2], m2 = (e5) => Math.floor((e5.longitude % 360 + 360) % 360 / 30) === t2, h2 = a2.filter(m2), g2 = o2.filter(m2), _2 = r2 || "Natal", v2 = n2 === "synastry" ? i2 == null ? "Synastry" : i2 : "Transit", y2 = (e5, t3) => e5.length === 0 ? '<div class="no-aspects">\u2014</div>' : e5.map((e6) => {
6784
6794
  let n3 = L_(e6.longitude), r3 = e6.retrograde ? " \u211E" : "";
6785
6795
  return '<div class="aspect-row">\n <span class="wheel-badge '.concat(t3, '" style="font-size:9px">').concat(Z(t3 === "inner" ? _2 : v2), '</span>\n <span class="aspect-other">').concat(Z(X(e6.name))).concat(r3, '</span>\n <span class="aspect-meta">').concat(Z(n3), "</span>\n </div>");
6786
- }).join(""), b2 = U_ ? '<button class="ask-claude-btn" id="bi-ask-claude-sign-btn">\u2728 Ask Claude to interpret</button>' : "";
6796
+ }).join(""), b2 = K_ ? '<button class="ask-claude-btn" id="bi-ask-claude-sign-btn">\u2728 Ask Claude to interpret</button>' : "";
6787
6797
  l2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(P_[t2], ';font-family:serif;font-weight:700;font-size:16px">').concat(Z(d2), '</span>\n <div class="info-title">\n <div><strong>').concat(Z(u2), '</strong></div>\n <div class="info-subtitle"><em>').concat(Z(X(f2)), " \xB7 ").concat(Z(X(p2)), '</em></div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title" style="margin-top:6px">').concat(Z(_2), " planets in ").concat(Z(u2), '</div>\n <div class="aspects-list">').concat(y2(h2, "inner"), '</div>\n <div class="aspects-title" style="margin-top:8px">').concat(Z(v2), " planets currently in ").concat(Z(u2), '</div>\n <div class="aspects-list">').concat(y2(g2, "outer"), "</div>\n ").concat(b2, "\n "), l2.classList.add("open"), l2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (s2 = document.getElementById("bi-info-close-btn")) == null || s2.addEventListener("click", () => {
6788
- ov(), pv();
6798
+ lv(), gv();
6789
6799
  }), (c2 = document.getElementById("bi-ask-claude-sign-btn")) == null || c2.addEventListener("click", () => {
6790
- if (!U_) return;
6800
+ if (!K_) return;
6791
6801
  let e5 = document.getElementById("bi-ask-claude-sign-btn");
6792
- !e5 || e5.disabled || (e5.disabled = true, e5.textContent = "\u23F3 Sending\u2026", e5.classList.add("sending"), U_({ type: "sign", data: { sign: u2, element: X(f2), modality: X(p2), mode: n2, inner_label: _2, outer_label: v2, inner_planets: h2.map((e6) => {
6802
+ !e5 || e5.disabled || (e5.disabled = true, e5.textContent = "\u23F3 Sending\u2026", e5.classList.add("sending"), K_({ type: "sign", data: { sign: u2, element: X(f2), modality: X(p2), mode: n2, inner_label: _2, outer_label: v2, inner_planets: h2.map((e6) => {
6793
6803
  var t3;
6794
6804
  return { name: e6.name, position: L_(e6.longitude), retrograde: (t3 = e6.retrograde) == null ? false : t3 };
6795
6805
  }), outer_planets: g2.map((e6) => {
@@ -6804,7 +6814,7 @@ function iv(e4, t2, n2, r2, i2, a2, o2) {
6804
6814
  }));
6805
6815
  });
6806
6816
  }
6807
- function av() {
6817
+ function cv() {
6808
6818
  if (document.body.classList.contains("is-fullscreen")) {
6809
6819
  let e5 = document.querySelector("#fs-bottom-bar [data-column='right']");
6810
6820
  if (e5) {
@@ -6812,36 +6822,36 @@ function av() {
6812
6822
  return t3 || (t3 = document.createElement("div"), t3.className = "info-drawer info-drawer--fs", e5.appendChild(t3)), t3;
6813
6823
  }
6814
6824
  }
6815
- if (X_ && X_.isConnected) return X_;
6816
- X_ = document.createElement("div"), X_.id = "bi-info-drawer", X_.className = "info-drawer";
6825
+ if ($_ && $_.isConnected) return $_;
6826
+ $_ = document.createElement("div"), $_.id = "bi-info-drawer", $_.className = "info-drawer";
6817
6827
  let e4 = document.getElementById("chart-container");
6818
- if (e4 != null && e4.parentElement) e4.parentElement.insertBefore(X_, e4.nextSibling);
6828
+ if (e4 != null && e4.parentElement) e4.parentElement.insertBefore($_, e4.nextSibling);
6819
6829
  else {
6820
6830
  var t2;
6821
- (t2 = document.getElementById("app")) == null || t2.appendChild(X_);
6831
+ (t2 = document.getElementById("app")) == null || t2.appendChild($_);
6822
6832
  }
6823
- return X_;
6833
+ return $_;
6824
6834
  }
6825
- function ov() {
6835
+ function lv() {
6826
6836
  var e4;
6827
- X_ == null || X_.classList.remove("open"), (e4 = document.querySelector("#fs-bottom-bar [data-column='right'] .info-drawer--fs")) == null || e4.classList.remove("open"), V_ == null || V_(null);
6837
+ $_ == null || $_.classList.remove("open"), (e4 = document.querySelector("#fs-bottom-bar [data-column='right'] .info-drawer--fs")) == null || e4.classList.remove("open"), W_ == null || W_(null);
6828
6838
  }
6829
- function sv(e4, t2, n2, r2, i2, a2, o2) {
6839
+ function uv(e4, t2, n2, r2, i2, a2, o2) {
6830
6840
  var s2, c2, l2, u2, d2;
6831
- let f2 = av(), p2 = (s2 = w_[t2.name.toLowerCase()]) == null ? "\u2605" : s2, m2 = (c2 = T_[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "" : c2, h2 = j_(t2.name, t2.longitude), g2;
6841
+ let f2 = cv(), p2 = (s2 = w_[t2.name.toLowerCase()]) == null ? "\u2605" : s2, m2 = (c2 = T_[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "" : c2, h2 = j_(t2.name, t2.longitude), g2;
6832
6842
  g2 = n2 === "inner" ? a2 ? "".concat(a2, " \xB7 Natal") : "Inner \xB7 Natal" : i2 === "transit" ? "Outer \xB7 Transit" : o2 ? "".concat(o2, " \xB7 Synastry") : "Outer \xB7 Synastry";
6833
6843
  let _2 = n2, v2 = r2.filter((e5) => n2 === "inner" && e5.planet1 === t2.name || n2 === "outer" && e5.planet2 === t2.name).sort((e5, t3) => e5.orb - t3.orb), y2 = v2.length ? v2.map((e5) => {
6834
6844
  var t3, r3, a3, o3, s3, c3, l3;
6835
6845
  let u3 = n2 === "inner" ? e5.planet2 : e5.planet1, d3 = (t3 = w_[u3.toLowerCase()]) == null ? u3 : t3, f3 = (r3 = (a3 = D_[(o3 = (s3 = e5.type) == null ? void 0 : s3.toLowerCase()) == null ? "" : o3]) == null ? e5.type : a3) == null ? "\u2014" : r3, p3 = O_((c3 = (l3 = e5.type) == null ? void 0 : l3.toLowerCase()) == null ? "" : c3), m3 = "".concat(e5.orb.toFixed(1), "\xB0"), h3 = i2 === "transit" ? e5.applying ? "\u2197" : "\u2198" : e5.orb <= 1 ? "exact" : e5.orb <= 3 ? "tight" : "wide";
6836
6846
  return '<div class="aspect-row">\n <span class="aspect-dot" style="background:'.concat(p3, '"></span>\n <span class="aspect-sym" style="color:').concat(p3, '">').concat(f3, '</span>\n <span class="aspect-other">').concat(Z(d3), " ").concat(Z(X(u3)), '</span>\n <span class="aspect-meta">').concat(m3, " ").concat(h3, "</span>\n </div>");
6837
- }).join("") : '<div class="no-aspects">No cross-aspects within orb</div>', b2 = (l2 = E_[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "Unknown" : l2, x2 = U_ ? '<button class="ask-claude-btn" id="bi-ask-claude-planet-btn">\u2728 Ask Claude to interpret</button>' : "";
6847
+ }).join("") : '<div class="no-aspects">No cross-aspects within orb</div>', b2 = (l2 = E_[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "Unknown" : l2, x2 = K_ ? '<button class="ask-claude-btn" id="bi-ask-claude-planet-btn">\u2728 Ask Claude to interpret</button>' : "";
6838
6848
  f2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph">'.concat(Z(p2), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:6px;flex-wrap:wrap;">\n <strong>').concat(Z(X(t2.name)), "</strong>\n ").concat(t2.retrograde ? "<span style='color:#e05252'>\u211E</span>" : "", "\n ").concat(h2 ? '<span class="dignity-badge '.concat(h2.cssClass, '">').concat(h2.emoji, " ").concat(Z(h2.label), "</span>") : "", '\n <span class="wheel-badge ').concat(_2, '">').concat(Z(g2), '</span>\n </div>\n <div class="info-subtitle">').concat(Z(m2), " ").concat(Z(L_(t2.longitude))).concat(t2.house ? " \xB7 House ".concat(t2.house) : "", '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title">Cross-Aspects</div>\n <div class="aspects-list">').concat(y2, "</div>\n ").concat(x2, "\n "), f2.classList.add("open"), f2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (u2 = document.getElementById("bi-info-close-btn")) == null || u2.addEventListener("click", () => {
6839
- ov(), pv();
6849
+ lv(), gv();
6840
6850
  }), (d2 = document.getElementById("bi-ask-claude-planet-btn")) == null || d2.addEventListener("click", () => {
6841
6851
  var e5, r3;
6842
- if (!U_) return;
6852
+ if (!K_) return;
6843
6853
  let a3 = document.getElementById("bi-ask-claude-planet-btn");
6844
- !a3 || a3.disabled || (a3.disabled = true, a3.textContent = "\u23F3 Sending\u2026", a3.classList.add("sending"), U_({ type: "planet", data: { planet_name: t2.name, wheel: n2, longitude: t2.longitude, sign: b2, position: "".concat(Math.floor(t2.longitude % 30), "\xB0 ").concat(b2), house: (e5 = t2.house) == null ? null : e5, retrograde: (r3 = t2.retrograde) == null ? false : r3, mode: i2, cross_aspects: v2.map((e6) => ({ type: e6.type, partner: n2 === "inner" ? e6.planet2 : e6.planet1, orb: e6.orb, applying: e6.applying, orb_label: i2 === "transit" ? e6.applying ? "applying" : "separating" : e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide" })) } }).then(() => {
6854
+ !a3 || a3.disabled || (a3.disabled = true, a3.textContent = "\u23F3 Sending\u2026", a3.classList.add("sending"), K_({ type: "planet", data: { planet_name: t2.name, wheel: n2, longitude: t2.longitude, sign: b2, position: "".concat(Math.floor(t2.longitude % 30), "\xB0 ").concat(b2), house: (e5 = t2.house) == null ? null : e5, retrograde: (r3 = t2.retrograde) == null ? false : r3, mode: i2, cross_aspects: v2.map((e6) => ({ type: e6.type, partner: n2 === "inner" ? e6.planet2 : e6.planet1, orb: e6.orb, applying: e6.applying, orb_label: i2 === "transit" ? e6.applying ? "applying" : "separating" : e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide" })) } }).then(() => {
6845
6855
  a3.textContent = "\u2713 Sent to Claude", a3.classList.remove("sending"), a3.classList.add("sent"), setTimeout(() => {
6846
6856
  a3.textContent = "\u2728 Ask Claude to interpret", a3.classList.remove("sent"), a3.disabled = false;
6847
6857
  }, 2500);
@@ -6850,15 +6860,15 @@ function sv(e4, t2, n2, r2, i2, a2, o2) {
6850
6860
  }));
6851
6861
  });
6852
6862
  }
6853
- function cv(e4, t2, n2, r2, i2) {
6863
+ function dv(e4, t2, n2, r2, i2) {
6854
6864
  var a2, o2, s2, c2, l2, u2, d2, f2, p2;
6855
- let m2 = av(), h2 = (a2 = w_[t2.planet1.toLowerCase()]) == null ? "\u2605" : a2, g2 = (o2 = w_[t2.planet2.toLowerCase()]) == null ? "\u2605" : o2, _2 = (s2 = D_[(c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2]) == null ? t2.type : s2, v2 = O_((u2 = (d2 = t2.type) == null ? void 0 : d2.toLowerCase()) == null ? "" : u2), y2 = r2 ? "".concat(r2, "'s ").concat(X(t2.planet1)) : X(t2.planet1), b2 = n2 === "transit" ? "Tr. ".concat(X(t2.planet2)) : i2 ? "".concat(i2, "'s ").concat(X(t2.planet2)) : X(t2.planet2), x2 = n2 === "transit" ? t2.applying ? "\u2197 Applying" : "\u2198 Separating" : t2.orb <= 1 ? "Exact" : t2.orb <= 3 ? "Tight" : "Wide", S2 = U_ ? '<button class="ask-claude-btn" id="bi-ask-claude-asp-btn">\u2728 Ask Claude to interpret</button>' : "";
6865
+ let m2 = cv(), h2 = (a2 = w_[t2.planet1.toLowerCase()]) == null ? "\u2605" : a2, g2 = (o2 = w_[t2.planet2.toLowerCase()]) == null ? "\u2605" : o2, _2 = (s2 = D_[(c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2]) == null ? t2.type : s2, v2 = O_((u2 = (d2 = t2.type) == null ? void 0 : d2.toLowerCase()) == null ? "" : u2), y2 = r2 ? "".concat(r2, "'s ").concat(X(t2.planet1)) : X(t2.planet1), b2 = n2 === "transit" ? "Tr. ".concat(X(t2.planet2)) : i2 ? "".concat(i2, "'s ").concat(X(t2.planet2)) : X(t2.planet2), x2 = n2 === "transit" ? t2.applying ? "\u2197 Applying" : "\u2198 Separating" : t2.orb <= 1 ? "Exact" : t2.orb <= 3 ? "Tight" : "Wide", S2 = K_ ? '<button class="ask-claude-btn" id="bi-ask-claude-asp-btn">\u2728 Ask Claude to interpret</button>' : "";
6856
6866
  m2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(v2, '">').concat(Z(String(_2)), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:5px;flex-wrap:wrap;">\n <strong>').concat(Z(h2), " ").concat(Z(y2), '</strong>\n <span style="color:').concat(v2, '">').concat(Z(String(_2)), "</span>\n <strong>").concat(Z(g2), " ").concat(Z(b2), '</strong>\n </div>\n <div class="info-subtitle">').concat(t2.orb.toFixed(1), "\xB0 orb \xB7 ").concat(Z(x2), '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div style="display:flex;gap:6px;margin-bottom:10px;">\n <span class="wheel-badge inner">Inner \xB7 ').concat(Z(y2), '</span>\n <span class="wheel-badge outer">Outer \xB7 ').concat(Z(b2), "</span>\n </div>\n ").concat(S2, "\n "), m2.classList.add("open"), m2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (f2 = document.getElementById("bi-info-close-btn")) == null || f2.addEventListener("click", () => {
6857
- ov(), pv();
6867
+ lv(), gv();
6858
6868
  }), (p2 = document.getElementById("bi-ask-claude-asp-btn")) == null || p2.addEventListener("click", () => {
6859
- if (!U_) return;
6869
+ if (!K_) return;
6860
6870
  let e5 = document.getElementById("bi-ask-claude-asp-btn");
6861
- !e5 || e5.disabled || (e5.disabled = true, e5.textContent = "\u23F3 Sending\u2026", e5.classList.add("sending"), U_({ type: "cross_aspect", data: { planet1: t2.planet1, wheel1: t2.wheel1, planet2: t2.planet2, wheel2: t2.wheel2, aspect_type: t2.type, orb: t2.orb, applying: t2.applying, mode: n2 } }).then(() => {
6871
+ !e5 || e5.disabled || (e5.disabled = true, e5.textContent = "\u23F3 Sending\u2026", e5.classList.add("sending"), K_({ type: "cross_aspect", data: { planet1: t2.planet1, wheel1: t2.wheel1, planet2: t2.planet2, wheel2: t2.wheel2, aspect_type: t2.type, orb: t2.orb, applying: t2.applying, mode: n2 } }).then(() => {
6862
6872
  e5.textContent = "\u2713 Sent to Claude", e5.classList.remove("sending"), e5.classList.add("sent"), setTimeout(() => {
6863
6873
  e5.textContent = "\u2728 Ask Claude to interpret", e5.classList.remove("sent"), e5.disabled = false;
6864
6874
  }, 2500);
@@ -6867,20 +6877,20 @@ function cv(e4, t2, n2, r2, i2) {
6867
6877
  }));
6868
6878
  });
6869
6879
  }
6870
- function lv(e4, t2) {
6871
- Z_.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
6880
+ function fv(e4, t2) {
6881
+ ev.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
6872
6882
  let o2 = a2.split("|");
6873
6883
  (t2 === "inner" ? o2[0] === e4 : o2[2] === e4) ? (n2.style.stroke = r2, n2.style.strokeOpacity = "0.92", n2.style.strokeWidth = "1.8", n2.removeAttribute("stroke-dasharray"), n2.setAttribute("filter", "url(#aspect-glow)"), i2.forEach((e5) => e5.style.opacity = "1")) : (n2.style.strokeOpacity = "0.05", n2.style.strokeWidth = "0.5", n2.removeAttribute("filter"), i2.forEach((e5) => e5.style.opacity = "0.15"));
6874
- }), dv(e4, t2);
6884
+ }), mv(e4, t2);
6875
6885
  }
6876
- function uv(e4, t2) {
6877
- Z_.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
6886
+ function pv(e4, t2) {
6887
+ ev.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
6878
6888
  a2 === e4 ? (n2.style.stroke = t2, n2.style.strokeOpacity = "0.95", n2.style.strokeWidth = "2", n2.removeAttribute("stroke-dasharray"), n2.setAttribute("filter", "url(#aspect-glow)"), i2.forEach((e5) => e5.style.opacity = "1")) : (n2.style.strokeOpacity = "0.05", n2.style.strokeWidth = "0.5", n2.removeAttribute("filter"), i2.forEach((e5) => e5.style.opacity = "0.15"));
6879
6889
  });
6880
6890
  }
6881
- function dv(e4, t2) {
6891
+ function mv(e4, t2) {
6882
6892
  let n2 = e4.toLowerCase(), r2 = /* @__PURE__ */ new Set(), i2 = /* @__PURE__ */ new Set();
6883
- Z_.forEach((e5, a3) => {
6893
+ ev.forEach((e5, a3) => {
6884
6894
  var o2, s2;
6885
6895
  let c2 = a3.split("|"), l2 = ((o2 = c2[0]) == null ? "" : o2).toLowerCase(), u2 = ((s2 = c2[2]) == null ? "" : s2).toLowerCase();
6886
6896
  t2 === "inner" && l2 === n2 && i2.add(u2), t2 === "outer" && u2 === n2 && r2.add(l2);
@@ -6896,8 +6906,8 @@ function dv(e4, t2) {
6896
6906
  o2 === n2 && i3 === t2 ? e5.style.opacity = "1" : a2(o2, i3) ? e5.style.opacity = "0.55" : e5.style.opacity = "0.12";
6897
6907
  });
6898
6908
  }
6899
- function fv() {
6900
- Z_.forEach(({ vis: e4, symbolEls: t2 }) => {
6909
+ function hv() {
6910
+ ev.forEach(({ vis: e4, symbolEls: t2 }) => {
6901
6911
  e4.style.strokeOpacity = "0.05", e4.style.strokeWidth = "0.5", e4.removeAttribute("filter"), t2.forEach((e5) => e5.style.opacity = "0.15");
6902
6912
  }), Q == null || Q.querySelectorAll(".planet-glyph-group").forEach((e4) => {
6903
6913
  e4.style.opacity = "0.3";
@@ -6905,44 +6915,44 @@ function fv() {
6905
6915
  e4.classList.add("dim");
6906
6916
  });
6907
6917
  }
6908
- function pv() {
6909
- Z_.forEach(({ vis: e4, color: t2, orb: n2, symbolEls: r2 }) => {
6918
+ function gv() {
6919
+ ev.forEach(({ vis: e4, color: t2, orb: n2, symbolEls: r2 }) => {
6910
6920
  let i2 = k_(n2 == null ? 4 : n2);
6911
6921
  e4.style.stroke = t2, e4.style.strokeOpacity = i2.opacity, e4.style.strokeWidth = i2.width, e4.removeAttribute("filter"), i2.dash ? e4.setAttribute("stroke-dasharray", i2.dash) : e4.removeAttribute("stroke-dasharray"), r2.forEach((e5) => e5.style.opacity = "");
6912
6922
  }), Q == null || Q.querySelectorAll(".planet-glyph-group").forEach((e4) => {
6913
6923
  e4.style.opacity = "";
6914
- }), Q == null || Q.querySelectorAll(".planet-hit").forEach((e4) => e4.classList.remove("dim")), Sv();
6924
+ }), Q == null || Q.querySelectorAll(".planet-hit").forEach((e4) => e4.classList.remove("dim")), Tv();
6915
6925
  }
6916
- function mv(e4) {
6917
- Z_.forEach(({ vis: t2, symbolEls: n2 }) => {
6926
+ function _v(e4) {
6927
+ ev.forEach(({ vis: t2, symbolEls: n2 }) => {
6918
6928
  t2.style.display = e4 ? "" : "none", n2.forEach((t3) => t3.style.display = e4 ? "" : "none");
6919
6929
  }), Q == null || Q.querySelectorAll(".aspect-hit").forEach((t2) => {
6920
6930
  t2.style.display = e4 ? "" : "none";
6921
6931
  });
6922
6932
  }
6923
- function hv(e4, t2, n2) {
6933
+ function vv(e4, t2, n2) {
6924
6934
  return "".concat(e4, "|inner|").concat(t2, "|outer|").concat(n2);
6925
6935
  }
6926
- function gv(e4, t2, n2, r2, i2) {
6936
+ function yv(e4, t2, n2, r2, i2) {
6927
6937
  return t2 === "inner" && r2 === "outer" ? "".concat(e4, "|inner|").concat(n2, "|outer|").concat(i2) : r2 === "inner" && t2 === "outer" ? "".concat(n2, "|inner|").concat(e4, "|outer|").concat(i2) : [e4, n2].sort().join("|") + "|".concat(i2);
6928
6938
  }
6929
- function _v(e4, t2) {
6939
+ function bv(e4, t2) {
6930
6940
  return e4.filter((e5) => {
6931
6941
  var n2;
6932
6942
  return ((n2 = e5.type) == null ? "" : n2).toLowerCase() === t2;
6933
6943
  });
6934
6944
  }
6935
- function vv(e4) {
6945
+ function xv(e4) {
6936
6946
  let t2 = [];
6937
6947
  if (!e4.length) return t2;
6938
- let n2 = _v(e4, "trine"), r2 = _v(e4, "square"), i2 = _v(e4, "opposition"), a2 = _v(e4, "conjunction"), o2 = /* @__PURE__ */ new Set();
6948
+ let n2 = bv(e4, "trine"), r2 = bv(e4, "square"), i2 = bv(e4, "opposition"), a2 = bv(e4, "conjunction"), o2 = /* @__PURE__ */ new Set();
6939
6949
  for (let e5 = 0; e5 < n2.length; e5++) for (let r3 = e5 + 1; r3 < n2.length; r3++) {
6940
6950
  let i3 = n2[e5], a3 = n2[r3];
6941
6951
  if (i3.planet1 !== a3.planet1) continue;
6942
6952
  let s3 = i3.planet1, c3 = i3.planet2, l2 = a3.planet2;
6943
6953
  if (c3 === l2) continue;
6944
6954
  let u2 = [s3, c3, l2].sort().join("|");
6945
- o2.has(u2) || (o2.add(u2), t2.push({ name: "Cross Trine", description: "".concat(X(s3), " trines ").concat(X(c3), " & ").concat(X(l2)), planets: [{ name: s3, wheel: "inner" }, { name: c3, wheel: "outer" }, { name: l2, wheel: "outer" }], aspectKeys: [hv(s3, c3, "trine"), hv(s3, l2, "trine")] }));
6955
+ o2.has(u2) || (o2.add(u2), t2.push({ name: "Cross Trine", description: "".concat(X(s3), " trines ").concat(X(c3), " & ").concat(X(l2)), planets: [{ name: s3, wheel: "inner" }, { name: c3, wheel: "outer" }, { name: l2, wheel: "outer" }], aspectKeys: [vv(s3, c3, "trine"), vv(s3, l2, "trine")] }));
6946
6956
  }
6947
6957
  let s2 = /* @__PURE__ */ new Set();
6948
6958
  for (let e5 of i2) {
@@ -6957,7 +6967,7 @@ function vv(e4) {
6957
6967
  if (s2.has(c3)) continue;
6958
6968
  let l2;
6959
6969
  if (l2 = o3 === "outer" ? e6 : r2.find((e7) => e7.planet1 === a3 && e7.planet2 === i3), l2) {
6960
- s2.add(c3), t2.push({ name: "Cross T-Square", description: "Apex: ".concat(X(a3), " (").concat(o3, ")"), planets: [{ name: n3, wheel: "inner" }, { name: i3, wheel: "outer" }, { name: a3, wheel: o3 }], aspectKeys: [hv(n3, i3, "opposition"), gv(n3, "inner", a3, o3, "square"), gv(a3, o3, i3, "outer", "square")] });
6970
+ s2.add(c3), t2.push({ name: "Cross T-Square", description: "Apex: ".concat(X(a3), " (").concat(o3, ")"), planets: [{ name: n3, wheel: "inner" }, { name: i3, wheel: "outer" }, { name: a3, wheel: o3 }], aspectKeys: [vv(n3, i3, "opposition"), yv(n3, "inner", a3, o3, "square"), yv(a3, o3, i3, "outer", "square")] });
6961
6971
  break;
6962
6972
  }
6963
6973
  }
@@ -6973,13 +6983,13 @@ function vv(e4) {
6973
6983
  for (let [r3, i3] of e5) {
6974
6984
  if (i3.length < 2) continue;
6975
6985
  let e6 = "".concat(r3, "|").concat([...i3].sort().join("|"));
6976
- n3.has(e6) || (n3.add(e6), t2.push({ name: "Cross Stellium", description: "".concat(X(r3), " conjunct ").concat(i3.map(X).join(" & "), " (cross-wheel)"), planets: [{ name: r3, wheel: "inner" }, ...i3.map((e7) => ({ name: e7, wheel: "outer" }))], aspectKeys: i3.map((e7) => hv(r3, e7, "conjunction")) }));
6986
+ n3.has(e6) || (n3.add(e6), t2.push({ name: "Cross Stellium", description: "".concat(X(r3), " conjunct ").concat(i3.map(X).join(" & "), " (cross-wheel)"), planets: [{ name: r3, wheel: "inner" }, ...i3.map((e7) => ({ name: e7, wheel: "outer" }))], aspectKeys: i3.map((e7) => vv(r3, e7, "conjunction")) }));
6977
6987
  }
6978
6988
  }
6979
6989
  return t2;
6980
6990
  }
6981
- var yv = { "Cross Trine": "rgba( 82,168,224, 0.14)", "Cross T-Square": "rgba(224,138, 82, 0.14)", "Cross Stellium": "rgba(154,127,212, 0.14)" }, bv = { "Cross Trine": "rgba( 82,168,224, 0.70)", "Cross T-Square": "rgba(224,138, 82, 0.70)", "Cross Stellium": "rgba(154,127,212, 0.70)" };
6982
- function xv(e4, t2, n2, r2) {
6991
+ var Sv = { "Cross Trine": "rgba( 82,168,224, 0.14)", "Cross T-Square": "rgba(224,138, 82, 0.14)", "Cross Stellium": "rgba(154,127,212, 0.14)" }, Cv = { "Cross Trine": "rgba( 82,168,224, 0.70)", "Cross T-Square": "rgba(224,138, 82, 0.70)", "Cross Stellium": "rgba(154,127,212, 0.70)" };
6992
+ function wv(e4, t2, n2, r2) {
6983
6993
  var i2, a2;
6984
6994
  if (!Q) return null;
6985
6995
  let o2 = /* @__PURE__ */ new Map();
@@ -6992,7 +7002,7 @@ function xv(e4, t2, n2, r2) {
6992
7002
  a3 != null && c2.push(J(a3, i3, r2));
6993
7003
  }
6994
7004
  if (c2.length < 2) return null;
6995
- let l2 = (i2 = yv[e4.name]) == null ? "rgba(128,128,128,0.12)" : i2, u2 = (a2 = bv[e4.name]) == null ? "rgba(128,128,128,0.60)" : a2, d2;
7005
+ let l2 = (i2 = Sv[e4.name]) == null ? "rgba(128,128,128,0.12)" : i2, u2 = (a2 = Cv[e4.name]) == null ? "rgba(128,128,128,0.60)" : a2, d2;
6996
7006
  if (c2.length === 2) {
6997
7007
  let e5 = Y("line");
6998
7008
  e5.setAttribute("x1", c2[0].x.toFixed(1)), e5.setAttribute("y1", c2[0].y.toFixed(1)), e5.setAttribute("x2", c2[1].x.toFixed(1)), e5.setAttribute("y2", c2[1].y.toFixed(1)), e5.setAttribute("stroke", u2), e5.setAttribute("stroke-width", "2"), e5.setAttribute("fill", "none"), d2 = e5;
@@ -7004,12 +7014,12 @@ function xv(e4, t2, n2, r2) {
7004
7014
  let f2 = Q.querySelector(".aspect-hit");
7005
7015
  return f2 ? Q.insertBefore(d2, f2) : Q.appendChild(d2), d2;
7006
7016
  }
7007
- function Sv() {
7017
+ function Tv() {
7008
7018
  Q == null || Q.querySelectorAll(".pattern-overlay").forEach((e4) => e4.remove());
7009
7019
  }
7010
- function Cv(e4) {
7020
+ function Ev(e4) {
7011
7021
  let t2 = new Set(e4.aspectKeys);
7012
- Z_.forEach(({ vis: e5, color: n3, symbolEls: r2 }, i2) => {
7022
+ ev.forEach(({ vis: e5, color: n3, symbolEls: r2 }, i2) => {
7013
7023
  t2.has(i2) ? (e5.style.stroke = n3, e5.style.strokeOpacity = "0.92", e5.style.strokeWidth = "1.8", e5.removeAttribute("stroke-dasharray"), e5.setAttribute("filter", "url(#aspect-glow)"), r2.forEach((e6) => e6.style.opacity = "1")) : (e5.style.strokeOpacity = "0.05", e5.style.strokeWidth = "0.5", e5.removeAttribute("filter"), r2.forEach((e6) => e6.style.opacity = "0.15"));
7014
7024
  });
7015
7025
  let n2 = new Set(e4.planets.map((e5) => "".concat(e5.name.toLowerCase(), "|").concat(e5.wheel)));
@@ -7023,13 +7033,13 @@ function Cv(e4) {
7023
7033
  e5.classList.toggle("dim", !n2.has(i2));
7024
7034
  });
7025
7035
  }
7026
- function wv(e4, t2, n2, r2, i2, a2) {
7036
+ function Dv(e4, t2, n2, r2, i2, a2) {
7027
7037
  var o2, s2, c2, l2, u2, d2, f2, p2, m2, h2, g2, _2;
7028
- U_ = i2 == null ? null : i2;
7038
+ K_ = i2 == null ? null : i2;
7029
7039
  let v2 = (o2 = t2.mode) == null ? "synastry" : o2, y2 = (s2 = t2._birth_params_inner) == null ? void 0 : s2.location, b2 = (c2 = t2._birth_params_outer) == null ? void 0 : c2.location, x2 = e4.querySelector("#pan-zoom-controls");
7030
- e4.innerHTML = "", x2 && e4.appendChild(x2), Z_.clear(), ov();
7031
- let S2 = R_(t2.inner), ee2 = R_(t2.outer), C2 = (l2 = t2.inner_houses) == null ? [] : l2, te2 = (u2 = t2.cross_aspects) == null ? [] : u2;
7032
- te2.length === 0 && S2.length > 0 && ee2.length > 0 && (te2 = B_(S2, ee2));
7040
+ e4.innerHTML = "", x2 && e4.appendChild(x2), ev.clear(), lv();
7041
+ let S2 = V_(t2.inner), ee2 = V_(t2.outer), C2 = (l2 = t2.inner_houses) == null ? [] : l2, te2 = (u2 = t2.cross_aspects) == null ? [] : u2;
7042
+ te2.length === 0 && S2.length > 0 && ee2.length > 0 && (te2 = U_(S2, ee2));
7033
7043
  let w2 = (d2 = (f2 = (p2 = C2[0]) == null ? void 0 : p2.cusp_lon) == null ? t2.ascendant : f2) == null ? 0 : d2, ne2 = window.matchMedia("(prefers-color-scheme: dark)").matches;
7034
7044
  if (!ne2) try {
7035
7045
  let e5 = getComputedStyle(document.body).backgroundColor.match(/\d+/g);
@@ -7058,13 +7068,13 @@ function wv(e4, t2, n2, r2, i2, a2) {
7058
7068
  ue2.setAttribute("cx", "310"), ue2.setAttribute("cy", "310"), ue2.setAttribute("r", String(b_)), ue2.setAttribute("fill", "var(--outer-ring, #fdf5e4)"), ue2.setAttribute("stroke", "var(--outer-stroke, #d4ac60)"), ue2.setAttribute("stroke-width", "0.8"), ue2.setAttribute("pointer-events", "none"), E2.appendChild(ue2);
7059
7069
  let de2 = Y("circle");
7060
7070
  de2.setAttribute("cx", "310"), de2.setAttribute("cy", "310"), de2.setAttribute("r", String(x_)), de2.style.fill = "var(--bg, #faf9f5)", de2.setAttribute("stroke", "var(--outer-stroke, #d4ac60)"), de2.setAttribute("stroke-width", "0.8"), de2.setAttribute("pointer-events", "none"), E2.appendChild(de2);
7061
- for (let e5 = 0; e5 < 12; e5++) F_(E2, w2, e5, x_, b_, Tv(P_[e5]), 0.16);
7071
+ for (let e5 = 0; e5 < 12; e5++) F_(E2, w2, e5, x_, b_, Ov(P_[e5]), 0.16);
7062
7072
  let fe2 = ne2 ? "rgba(200,155,65,0.32)" : "rgba(180,140,60,0.28)", pe2 = ne2 ? "rgba(200,155,65,0.62)" : "rgba(180,140,60,0.55)";
7063
7073
  for (let e5 = 0; e5 < 12; e5++) {
7064
7074
  let t3 = e5 * 30, { x: n3, y: r3 } = J(t3, x_, w2), { x: i3, y: a3 } = J(t3, b_, w2), o3 = Y("line");
7065
7075
  o3.setAttribute("x1", n3.toFixed(1)), o3.setAttribute("y1", r3.toFixed(1)), o3.setAttribute("x2", i3.toFixed(1)), o3.setAttribute("y2", a3.toFixed(1)), o3.setAttribute("stroke", "var(--outer-stroke, #d4ac60)"), o3.setAttribute("stroke-width", "0.5"), o3.setAttribute("pointer-events", "none"), E2.appendChild(o3);
7066
7076
  let { x: s3, y: c3 } = J(t3 + 15, 536 / 2, w2), l3 = Y("text");
7067
- l3.setAttribute("x", s3.toFixed(1)), l3.setAttribute("y", c3.toFixed(1)), l3.setAttribute("text-anchor", "middle"), l3.setAttribute("dominant-baseline", "central"), l3.setAttribute("font-size", "12"), l3.setAttribute("fill", Tv(P_[e5])), l3.setAttribute("pointer-events", "none"), l3.style.fontFamily = "serif", l3.textContent = T_[e5], E2.appendChild(l3);
7077
+ l3.setAttribute("x", s3.toFixed(1)), l3.setAttribute("y", c3.toFixed(1)), l3.setAttribute("text-anchor", "middle"), l3.setAttribute("dominant-baseline", "central"), l3.setAttribute("font-size", "12"), l3.setAttribute("fill", Ov(P_[e5])), l3.setAttribute("pointer-events", "none"), l3.style.fontFamily = "serif", l3.textContent = T_[e5], E2.appendChild(l3);
7068
7078
  for (let e6 = 1; e6 < 30; e6++) {
7069
7079
  let n4 = t3 + e6, r4 = e6 % 5 == 0, i4 = r4 ? b_ - 8 : b_ - 3.5, { x: a4, y: o4 } = J(n4, b_, w2), { x: s4, y: c4 } = J(n4, i4, w2), l4 = Y("line");
7070
7080
  l4.setAttribute("x1", a4.toFixed(1)), l4.setAttribute("y1", o4.toFixed(1)), l4.setAttribute("x2", s4.toFixed(1)), l4.setAttribute("y2", c4.toFixed(1)), l4.setAttribute("stroke", r4 ? pe2 : fe2), l4.setAttribute("stroke-width", r4 ? "0.8" : "0.5"), l4.setAttribute("pointer-events", "none"), E2.appendChild(l4);
@@ -7072,8 +7082,8 @@ function wv(e4, t2, n2, r2, i2, a2) {
7072
7082
  let { x: u3, y: d3 } = J(t3, b_, w2), { x: f3, y: p3 } = J(t3 + 30, b_, w2), { x: m3, y: h3 } = J(t3, x_, w2), { x: g3, y: _3 } = J(t3 + 30, x_, w2), x3 = Y("path");
7073
7083
  x3.setAttribute("d", ["M ".concat(u3.toFixed(1), " ").concat(d3.toFixed(1)), "A ".concat(b_, " ").concat(b_, " 0 0 0 ").concat(f3.toFixed(1), " ").concat(p3.toFixed(1)), "L ".concat(g3.toFixed(1), " ").concat(_3.toFixed(1)), "A ".concat(x_, " ").concat(x_, " 0 0 1 ").concat(m3.toFixed(1), " ").concat(h3.toFixed(1)), "Z"].join(" ")), x3.setAttribute("fill", "transparent"), x3.setAttribute("class", "hit-region sign-hit"), x3.style.pointerEvents = "all", x3.style.cursor = "pointer";
7074
7084
  let C3 = "".concat(T_[e5], " ").concat(E_[e5]), te3 = "".concat(X(M_[e5]), " \xB7 ").concat(X(N_[e5]));
7075
- Ev(x3, "".concat(E_[e5], " \u2014 click for sign info")), x3.addEventListener("mouseenter", (e6) => K_(e6.clientX, e6.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mousemove", (e6) => K_(e6.clientX, e6.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mouseleave", q_), x3.addEventListener("click", (t4) => {
7076
- q_(), V_ == null || V_("".concat(C3)), iv(t4, e5, v2, y2, b2, S2, ee2);
7085
+ kv(x3, "".concat(E_[e5], " \u2014 click for sign info")), x3.addEventListener("mouseenter", (e6) => Y_(e6.clientX, e6.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mousemove", (e6) => Y_(e6.clientX, e6.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mouseleave", X_), x3.addEventListener("click", (t4) => {
7086
+ X_(), W_ == null || W_("".concat(C3)), sv(t4, e5, v2, y2, b2, S2, ee2);
7077
7087
  }), ce2.appendChild(x3);
7078
7088
  }
7079
7089
  let me2 = Y("circle");
@@ -7113,27 +7123,27 @@ function wv(e4, t2, n2, r2, i2, a2) {
7113
7123
  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", "10"), f3.setAttribute("fill", r3 ? ne2 ? "#a090d8" : "#7060b8" : ne2 ? "#8878a0" : "#787080"), f3.setAttribute("font-weight", r3 ? "700" : "500"), f3.setAttribute("pointer-events", "none"), f3.textContent = String(t3.number), ae2.appendChild(f3);
7114
7124
  let p3 = Y("circle");
7115
7125
  p3.setAttribute("cx", u3.toFixed(1)), p3.setAttribute("cy", d3.toFixed(1)), p3.setAttribute("r", "14"), p3.setAttribute("fill", "transparent"), p3.setAttribute("class", "hit-region house-hit"), p3.style.pointerEvents = "all", p3.style.cursor = "pointer";
7116
- let m3 = "House ".concat(t3.number), h3 = "".concat(tv[t3.number] ? tv[t3.number] + " \xB7 " : "").concat(L_(t3.cusp_lon));
7117
- Ev(p3, "".concat(m3, " \u2014 click for interpretation")), p3.addEventListener("mouseenter", (e6) => K_(e6.clientX, e6.clientY, m3, h3, "Click for interpretation")), p3.addEventListener("mousemove", (e6) => K_(e6.clientX, e6.clientY, m3, h3, "Click for interpretation")), p3.addEventListener("mouseleave", q_), p3.addEventListener("click", (e6) => {
7118
- q_(), V_ == null || V_("".concat(m3, " \xB7 ").concat(L_(t3.cusp_lon))), rv(e6, t3, n3, v2, y2, b2, S2, ee2);
7126
+ let m3 = "House ".concat(t3.number), h3 = "".concat(iv[t3.number] ? iv[t3.number] + " \xB7 " : "").concat(L_(t3.cusp_lon));
7127
+ kv(p3, "".concat(m3, " \u2014 click for interpretation")), p3.addEventListener("mouseenter", (e6) => Y_(e6.clientX, e6.clientY, m3, h3, "Click for interpretation")), p3.addEventListener("mousemove", (e6) => Y_(e6.clientX, e6.clientY, m3, h3, "Click for interpretation")), p3.addEventListener("mouseleave", X_), p3.addEventListener("click", (e6) => {
7128
+ X_(), W_ == null || W_("".concat(m3, " \xB7 ").concat(L_(t3.cusp_lon))), ov(e6, t3, n3, v2, y2, b2, S2, ee2);
7119
7129
  }), ce2.appendChild(p3);
7120
7130
  }
7121
7131
  let Se2 = C2.find((e5) => e5.number === 1), O2 = C2.find((e5) => e5.number === 4), Ce2 = C2.find((e5) => e5.number === 7), we2 = C2.find((e5) => e5.number === 10), Te2 = [{ lon: (m2 = Se2 == null ? void 0 : Se2.cusp_lon) == null ? w2 : m2, label: "ASC" }, { lon: (h2 = Ce2 == null ? void 0 : Ce2.cusp_lon) == null ? (w2 + 180) % 360 : h2, label: "DSC" }, { lon: (g2 = we2 == null ? void 0 : we2.cusp_lon) == null ? (w2 + 270) % 360 : g2, label: "MC" }, { lon: (_2 = O2 == null ? void 0 : O2.cusp_lon) == null ? (w2 + 90) % 360 : _2, label: "IC" }];
7122
7132
  for (let e5 of Te2) {
7123
7133
  var Ee2;
7124
- let t3 = $_[e5.label], { x: n3, y: r3 } = J(e5.lon, b_ - 8, w2), i3 = Y("text");
7134
+ let t3 = nv[e5.label], { x: n3, y: r3 } = J(e5.lon, b_ - 8, w2), i3 = Y("text");
7125
7135
  i3.setAttribute("x", n3.toFixed(1)), i3.setAttribute("y", r3.toFixed(1)), i3.setAttribute("text-anchor", "middle"), i3.setAttribute("dominant-baseline", "central"), i3.setAttribute("font-size", "12"), i3.setAttribute("font-weight", "700"), i3.setAttribute("fill", ne2 ? "#a090d8" : "#7060b8"), i3.setAttribute("pointer-events", "none"), i3.style.transition = "opacity 150ms ease", i3.textContent = e5.label, ae2.appendChild(i3);
7126
7136
  let a3 = Y("circle");
7127
- a3.setAttribute("cx", n3.toFixed(1)), a3.setAttribute("cy", r3.toFixed(1)), a3.setAttribute("r", "14"), a3.setAttribute("fill", "transparent"), a3.setAttribute("class", "hit-region angle-hit"), a3.style.pointerEvents = "all", a3.style.cursor = "pointer", Ev(a3, "".concat((Ee2 = t3 == null ? void 0 : t3.title) == null ? e5.label : Ee2, " \u2014 click for interpretation"));
7137
+ a3.setAttribute("cx", n3.toFixed(1)), a3.setAttribute("cy", r3.toFixed(1)), a3.setAttribute("r", "14"), a3.setAttribute("fill", "transparent"), a3.setAttribute("class", "hit-region angle-hit"), a3.style.pointerEvents = "all", a3.style.cursor = "pointer", kv(a3, "".concat((Ee2 = t3 == null ? void 0 : t3.title) == null ? e5.label : Ee2, " \u2014 click for interpretation"));
7128
7138
  let o3 = L_(e5.lon), s3 = "".concat(t3 != null && t3.keyword ? t3.keyword + " \xB7 " : "").concat(o3);
7129
7139
  a3.addEventListener("mouseenter", (n4) => {
7130
7140
  var r4;
7131
- K_(n4.clientX, n4.clientY, "".concat(e5.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4), s3, "Click for interpretation"), i3.style.opacity = "0.6";
7141
+ Y_(n4.clientX, n4.clientY, "".concat(e5.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4), s3, "Click for interpretation"), i3.style.opacity = "0.6";
7132
7142
  }), a3.addEventListener("mouseleave", () => {
7133
- q_(), i3.style.opacity = "";
7143
+ X_(), i3.style.opacity = "";
7134
7144
  }), a3.addEventListener("click", (n4) => {
7135
7145
  var r4;
7136
- q_(), fv(), V_ == null || V_("".concat(e5.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4, " \xB7 ").concat(o3)), ev(n4, e5.label, e5.lon, v2, y2);
7146
+ X_(), hv(), W_ == null || W_("".concat(e5.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4, " \xB7 ").concat(o3)), rv(n4, e5.label, e5.lon, v2, y2);
7137
7147
  }), ce2.appendChild(a3);
7138
7148
  }
7139
7149
  for (let e5 of te2) {
@@ -7154,20 +7164,20 @@ function wv(e4, t2, n2, r2, i2, a2) {
7154
7164
  }
7155
7165
  }
7156
7166
  let h3 = Y("line");
7157
- h3.setAttribute("x1", o3.toFixed(1)), h3.setAttribute("y1", s3.toFixed(1)), h3.setAttribute("x2", c3.toFixed(1)), h3.setAttribute("y2", l3.toFixed(1)), h3.setAttribute("stroke", "transparent"), h3.setAttribute("stroke-width", "20"), h3.setAttribute("fill", "none"), h3.setAttribute("class", "hit-region aspect-hit"), h3.style.pointerEvents = "all", Ev(h3, "Aspect: ".concat(e5.type || "Aspect", " between inner ").concat(e5.planet1, " and outer ").concat(e5.planet2));
7158
- let g3 = (ke2 = w_[t3.name.toLowerCase()]) == null ? t3.name : ke2, _3 = (Ae2 = w_[n3.name.toLowerCase()]) == null ? n3.name : Ae2, x3 = (je2 = (Me2 = D_[(Ne2 = (Pe2 = e5.type) == null ? void 0 : Pe2.toLowerCase()) == null ? "" : Ne2]) == null ? e5.type : Me2) == null ? "" : je2, C3 = v2 === "transit" ? e5.applying ? " (applying)" : " (separating)" : e5.orb <= 1 ? " (exact)" : e5.orb <= 3 ? " (tight)" : " (wide)", te3 = (Fe2 = Y_[(Ie2 = (Le2 = e5.type) == null ? void 0 : Le2.toLowerCase()) == null ? "" : Ie2]) == null ? "" : Fe2, ne3 = "".concat(te3 ? te3 + " \xB7 " : "").concat(g3, " ").concat(x3, " ").concat(_3, " \xB7 ").concat(e5.orb.toFixed(1), "\xB0 orb").concat(C3);
7167
+ h3.setAttribute("x1", o3.toFixed(1)), h3.setAttribute("y1", s3.toFixed(1)), h3.setAttribute("x2", c3.toFixed(1)), h3.setAttribute("y2", l3.toFixed(1)), h3.setAttribute("stroke", "transparent"), h3.setAttribute("stroke-width", "20"), h3.setAttribute("fill", "none"), h3.setAttribute("class", "hit-region aspect-hit"), h3.style.pointerEvents = "all", kv(h3, "Aspect: ".concat(e5.type || "Aspect", " between inner ").concat(e5.planet1, " and outer ").concat(e5.planet2));
7168
+ let g3 = (ke2 = w_[t3.name.toLowerCase()]) == null ? t3.name : ke2, _3 = (Ae2 = w_[n3.name.toLowerCase()]) == null ? n3.name : Ae2, x3 = (je2 = (Me2 = D_[(Ne2 = (Pe2 = e5.type) == null ? void 0 : Pe2.toLowerCase()) == null ? "" : Ne2]) == null ? e5.type : Me2) == null ? "" : je2, C3 = v2 === "transit" ? e5.applying ? " (applying)" : " (separating)" : e5.orb <= 1 ? " (exact)" : e5.orb <= 3 ? " (tight)" : " (wide)", te3 = (Fe2 = Q_[(Ie2 = (Le2 = e5.type) == null ? void 0 : Le2.toLowerCase()) == null ? "" : Ie2]) == null ? "" : Fe2, ne3 = "".concat(te3 ? te3 + " \xB7 " : "").concat(g3, " ").concat(x3, " ").concat(_3, " \xB7 ").concat(e5.orb.toFixed(1), "\xB0 orb").concat(C3);
7159
7169
  h3.addEventListener("mouseenter", (t4) => {
7160
7170
  var n4;
7161
- return K_(t4.clientX, t4.clientY, X((n4 = e5.type) == null ? "Cross-Aspect" : n4), ne3, "Click for interpretation");
7171
+ return Y_(t4.clientX, t4.clientY, X((n4 = e5.type) == null ? "Cross-Aspect" : n4), ne3, "Click for interpretation");
7162
7172
  }), h3.addEventListener("mousemove", (t4) => {
7163
7173
  var n4;
7164
- return K_(t4.clientX, t4.clientY, X((n4 = e5.type) == null ? "Cross-Aspect" : n4), ne3, "Click for interpretation");
7165
- }), h3.addEventListener("mouseleave", q_), h3.addEventListener("click", (t4) => {
7174
+ return Y_(t4.clientX, t4.clientY, X((n4 = e5.type) == null ? "Cross-Aspect" : n4), ne3, "Click for interpretation");
7175
+ }), h3.addEventListener("mouseleave", X_), h3.addEventListener("click", (t4) => {
7166
7176
  var n4, a4, o4, s4, c4, l4;
7167
- q_(), uv(Q_(e5), i3), cv(t4, e5, v2, y2, b2);
7177
+ X_(), pv(tv(e5), i3), dv(t4, e5, v2, y2, b2);
7168
7178
  let u4 = (n4 = w_[e5.planet1.toLowerCase()]) == null ? e5.planet1 : n4, d4 = (a4 = w_[e5.planet2.toLowerCase()]) == null ? e5.planet2 : a4, f4 = (o4 = (s4 = D_[(c4 = (l4 = e5.type) == null ? void 0 : l4.toLowerCase()) == null ? "" : c4]) == null ? e5.type : s4) == null ? "" : o4, p4 = y2 ? "".concat(y2, "'s ").concat(u4) : "".concat(u4), m4 = v2 === "transit" ? "Tr. ".concat(d4) : b2 ? "".concat(b2, "'s ").concat(d4) : d4;
7169
- V_ == null || V_("".concat(p4, " ").concat(f4, " ").concat(m4, " \xB7 ").concat(e5.orb.toFixed(1), "\xB0")), r2(e5);
7170
- }), Z_.set(Q_(e5), { vis: u3, color: i3, aspectType: ((Re2 = e5.type) == null ? void 0 : Re2.toLowerCase()) || "unknown", orb: e5.orb, symbolEls: m3 }), ce2.appendChild(h3);
7179
+ W_ == null || W_("".concat(p4, " ").concat(f4, " ").concat(m4, " \xB7 ").concat(e5.orb.toFixed(1), "\xB0")), r2(e5);
7180
+ }), ev.set(tv(e5), { vis: u3, color: i3, aspectType: ((Re2 = e5.type) == null ? void 0 : Re2.toLowerCase()) || "unknown", orb: e5.orb, symbolEls: m3 }), ce2.appendChild(h3);
7171
7181
  }
7172
7182
  let Ve2 = o_(ee2.map((e5) => ({ name: e5.name.toLowerCase(), longitude: e5.longitude })), 7), He2 = Y("g");
7173
7183
  He2.setAttribute("class", "outer-planet-group"), se2.appendChild(He2);
@@ -7193,13 +7203,13 @@ function wv(e4, t2, n2, r2, i2, a2) {
7193
7203
  n3.setAttribute("cx", e6.toFixed(1)), n3.setAttribute("cy", t4.toFixed(1)), n3.setAttribute("r", "2.5"), n3.setAttribute("fill", g3.positive ? "oklch(72% 0.12 80)" : "oklch(55% 0.18 20 / 0.6)"), n3.setAttribute("pointer-events", "none"), s3.appendChild(n3);
7194
7204
  }
7195
7205
  let _3 = Y("circle");
7196
- _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(C_)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "outer", _3.style.pointerEvents = "all", Ev(_3, "Outer Planet: ".concat(e5.name));
7197
- let x3 = "".concat(v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "").concat(t3, " ").concat(X(e5.name)), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Ge2 = J_[e5.name.toLowerCase()]) == null ? "" : Ge2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(L_(e5.longitude)).concat(e5.house ? " \xB7 H".concat(e5.house) : "").concat(e5.retrograde ? " \u211E" : "").concat(S3);
7198
- _3.addEventListener("mouseenter", (e6) => K_(e6.clientX, e6.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e6) => K_(e6.clientX, e6.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", q_), _3.addEventListener("click", (t4) => {
7206
+ _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(C_)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "outer", _3.style.pointerEvents = "all", kv(_3, "Outer Planet: ".concat(e5.name));
7207
+ let x3 = "".concat(v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "").concat(t3, " ").concat(X(e5.name)), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Ge2 = Z_[e5.name.toLowerCase()]) == null ? "" : Ge2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(L_(e5.longitude)).concat(e5.house ? " \xB7 H".concat(e5.house) : "").concat(e5.retrograde ? " \u211E" : "").concat(S3);
7208
+ _3.addEventListener("mouseenter", (e6) => Y_(e6.clientX, e6.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e6) => Y_(e6.clientX, e6.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", X_), _3.addEventListener("click", (t4) => {
7199
7209
  var r4, i4;
7200
- q_(), lv(e5.name, "outer"), sv(t4, e5, "outer", te2, v2, y2, b2);
7210
+ X_(), fv(e5.name, "outer"), uv(t4, e5, "outer", te2, v2, y2, b2);
7201
7211
  let a4 = (r4 = w_[e5.name.toLowerCase()]) == null ? "\u2605" : r4, o4 = Math.floor((e5.longitude % 360 + 360) % 360 / 30), s4 = v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "";
7202
- V_ == null || V_("".concat(s4).concat(a4, " ").concat(X(e5.name), " \xB7 ").concat((i4 = E_[o4]) == null ? "" : i4)), n2(e5, "outer", te2);
7212
+ W_ == null || W_("".concat(s4).concat(a4, " ").concat(X(e5.name), " \xB7 ").concat((i4 = E_[o4]) == null ? "" : i4)), n2(e5, "outer", te2);
7203
7213
  }), s3.appendChild(_3);
7204
7214
  }
7205
7215
  let Ke2 = o_(S2.map((e5) => ({ name: e5.name.toLowerCase(), longitude: e5.longitude })), 8), qe2 = Y("g");
@@ -7226,38 +7236,48 @@ function wv(e4, t2, n2, r2, i2, a2) {
7226
7236
  n3.setAttribute("cx", e6.toFixed(1)), n3.setAttribute("cy", t4.toFixed(1)), n3.setAttribute("r", "2.5"), n3.setAttribute("fill", g3.positive ? "oklch(72% 0.12 80)" : "oklch(55% 0.18 20 / 0.6)"), n3.setAttribute("pointer-events", "none"), s3.appendChild(n3);
7227
7237
  }
7228
7238
  let _3 = Y("circle");
7229
- _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(C_)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "inner", _3.style.pointerEvents = "all", Ev(_3, "Inner Planet: ".concat(e5.name));
7230
- let x3 = y2 ? "".concat(y2, "'s ").concat(t3, " ").concat(X(e5.name)) : "".concat(t3, " ").concat(X(e5.name), " (natal)"), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Xe2 = J_[e5.name.toLowerCase()]) == null ? "" : Xe2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(L_(e5.longitude)).concat(e5.house ? " \xB7 H".concat(e5.house) : "").concat(e5.retrograde ? " \u211E" : "").concat(S3);
7231
- _3.addEventListener("mouseenter", (e6) => K_(e6.clientX, e6.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e6) => K_(e6.clientX, e6.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", q_), _3.addEventListener("click", (t4) => {
7239
+ _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(C_)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "inner", _3.style.pointerEvents = "all", kv(_3, "Inner Planet: ".concat(e5.name));
7240
+ let x3 = y2 ? "".concat(y2, "'s ").concat(t3, " ").concat(X(e5.name)) : "".concat(t3, " ").concat(X(e5.name), " (natal)"), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Xe2 = Z_[e5.name.toLowerCase()]) == null ? "" : Xe2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(L_(e5.longitude)).concat(e5.house ? " \xB7 H".concat(e5.house) : "").concat(e5.retrograde ? " \u211E" : "").concat(S3);
7241
+ _3.addEventListener("mouseenter", (e6) => Y_(e6.clientX, e6.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e6) => Y_(e6.clientX, e6.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", X_), _3.addEventListener("click", (t4) => {
7232
7242
  var r4, i4, a4;
7233
- q_(), lv(e5.name, "inner"), sv(t4, e5, "inner", te2, v2, y2, b2);
7243
+ X_(), fv(e5.name, "inner"), uv(t4, e5, "inner", te2, v2, y2, b2);
7234
7244
  let o4 = (r4 = w_[e5.name.toLowerCase()]) == null ? "\u2605" : r4, s4 = Math.floor((e5.longitude % 360 + 360) % 360 / 30), c4 = y2 ? "".concat(y2, "'s ").concat(o4, " ").concat(X(e5.name), " \xB7 ").concat((i4 = E_[s4]) == null ? "" : i4) : "".concat(o4, " ").concat(X(e5.name), " \xB7 ").concat((a4 = E_[s4]) == null ? "" : a4, " (natal)");
7235
- V_ == null || V_(c4), n2(e5, "inner", te2);
7245
+ W_ == null || W_(c4), n2(e5, "inner", te2);
7236
7246
  }), s3.appendChild(_3);
7237
7247
  }
7238
7248
  let Ze2 = "__biWheelClickOutside__", Qe2 = document[Ze2];
7239
7249
  Qe2 && document.removeEventListener("click", Qe2, false);
7240
7250
  let $e2 = (e5) => {
7241
7251
  let t3 = e5.target;
7242
- !t3.closest(".hit-region") && !t3.closest("#bi-info-drawer") && (pv(), ov());
7252
+ !t3.closest(".hit-region") && !t3.closest("#bi-info-drawer") && (gv(), lv());
7243
7253
  };
7244
7254
  document[Ze2] = $e2, document.addEventListener("click", $e2, false);
7245
7255
  let et2 = (e5) => {
7246
- e5.key === "Escape" && (pv(), ov());
7256
+ e5.key === "Escape" && (gv(), lv());
7247
7257
  };
7248
7258
  document.removeEventListener("keydown", window.__biWheelEscHandler, false), window.__biWheelEscHandler = et2, document.addEventListener("keydown", et2, false);
7249
7259
  }
7250
- function Tv(e4) {
7260
+ function Ov(e4) {
7251
7261
  let t2 = parseInt(e4.slice(1, 3), 16), n2 = parseInt(e4.slice(3, 5), 16), r2 = parseInt(e4.slice(5, 7), 16), i2 = 0.6;
7252
7262
  return "rgb(".concat(Math.round(t2 * (1 - i2) + 208 * i2), ",").concat(Math.round(n2 * (1 - i2) + 144 * i2), ",").concat(Math.round(r2 * (1 - i2) + 32 * i2), ")");
7253
7263
  }
7254
- function Ev(e4, t2) {
7264
+ function kv(e4, t2) {
7255
7265
  e4 && (e4.setAttribute("tabindex", "0"), e4.setAttribute("role", "button"), e4.setAttribute("aria-label", t2), e4.addEventListener("keydown", (t3) => {
7256
7266
  let n2 = t3;
7257
7267
  (n2.key === "Enter" || n2.key === " ") && (n2.preventDefault(), e4.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true })));
7258
7268
  }));
7259
7269
  }
7260
- var Dv = class {
7270
+ function Av(e4) {
7271
+ return e4.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
7272
+ }
7273
+ function jv(e4) {
7274
+ return e4.replace(/_/g, " ").replace(/\b\w/g, (e5) => e5.toUpperCase());
7275
+ }
7276
+ function Mv(e4) {
7277
+ let t2 = e4.filter((e5) => e5.items.length > 0).map((e5) => '<div class="legend-group"><span class="legend-group-title">'.concat(Av(e5.title), "</span>") + e5.items.map((e6) => '<span class="legend-item"><span class="legend-glyph">'.concat(Av(e6.glyph), "</span>").concat(Av(e6.label), "</span>")).join("") + "</div>").join("");
7278
+ return t2 ? '<details class="glyph-legend"><summary><span class="legend-spark">\u2726</span> Legend</summary><div class="legend-body">'.concat(t2, "</div></details>") : "";
7279
+ }
7280
+ var Nv = class {
7261
7281
  constructor(e4) {
7262
7282
  var t2, n2, r2, i2, a2, s2;
7263
7283
  o(this, "config", void 0), o(this, "params", void 0), o(this, "dateInput", void 0), o(this, "timeInput", void 0), o(this, "refreshBtn", void 0), o(this, "locInput", void 0), o(this, "locDropdown", void 0), o(this, "summaryBar", void 0), o(this, "searchTimeout", null), o(this, "searchVersion", 0), o(this, "isSearching", false), 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();
@@ -7380,30 +7400,20 @@ var Dv = class {
7380
7400
  escHtml(e4) {
7381
7401
  return e4.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
7382
7402
  }
7383
- }, Ov = "oe_mcp_first_run_";
7384
- function kv(e4) {
7385
- return "".concat(Ov).concat(e4);
7403
+ }, Pv = /* @__PURE__ */ new Set();
7404
+ function Fv(e4) {
7405
+ return Pv.has(e4);
7386
7406
  }
7387
- function Av(e4) {
7388
- try {
7389
- return localStorage.getItem(kv(e4)) === "1";
7390
- } catch (e5) {
7391
- return true;
7392
- }
7393
- }
7394
- function jv(e4) {
7395
- try {
7396
- localStorage.setItem(kv(e4), "1");
7397
- } catch (e5) {
7398
- }
7407
+ function Iv(e4) {
7408
+ Pv.add(e4);
7399
7409
  }
7400
- var Mv = { "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." } }, Nv = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: oklch(0% 0 0 / 0.55);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: oe-fade-in 0.4s ease both;\n font-family: system-ui, sans-serif;\n }\n\n .oe-welcome-modal {\n background: oklch(11% 0.010 265);\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px oklch(0% 0 0 / 0.55), inset 0 1px 0 oklch(100% 0 0 / 0.06);\n animation: oe-modal-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n @keyframes oe-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes oe-modal-in {\n from { opacity: 0; transform: scale(0.95) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .oe-welcome-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n }\n\n .oe-welcome-icon {\n font-size: 28px;\n color: var(--gold, oklch(72% 0.12 80));\n line-height: 1;\n text-shadow: 0 0 10px var(--gold-glow, oklch(72% 0.12 80 / 0.30));\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--text, oklch(92% 0.006 265));\n margin: 0;\n letter-spacing: 0.02em;\n }\n\n .oe-welcome-text {\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--text-secondary, oklch(68% 0.008 265));\n margin: 0;\n }\n\n .oe-welcome-hints {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin: 8px 0 12px 0;\n padding: 0;\n list-style: none;\n }\n\n .oe-welcome-hints li {\n font-size: 13.5px;\n line-height: 1.4;\n color: var(--text-secondary, oklch(68% 0.008 265));\n display: flex;\n align-items: flex-start;\n gap: 10px;\n opacity: 0;\n animation: oe-fade-in 0.4s ease forwards;\n }\n\n /* Stagger the hints */\n .oe-welcome-hints li:nth-child(1) { animation-delay: 0.15s; }\n .oe-welcome-hints li:nth-child(2) { animation-delay: 0.25s; }\n .oe-welcome-hints li:nth-child(3) { animation-delay: 0.35s; }\n .oe-welcome-hints li:nth-child(4) { animation-delay: 0.45s; }\n\n .oe-welcome-hints li::before {\n content: "\u2726";\n color: var(--gold-dim, oklch(52% 0.06 80));\n font-size: 12px;\n padding-top: 2px;\n }\n\n .oe-welcome-hints strong {\n color: var(--text, oklch(92% 0.006 265));\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: var(--gold-subtle, oklch(72% 0.12 80 / 0.10));\n color: var(--gold, oklch(72% 0.12 80));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease, border-color 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: oklch(72% 0.12 80 / 0.18);\n border-color: oklch(72% 0.12 80 / 0.40);\n }\n\n .oe-welcome-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n\n .oe-welcome-backdrop.is-dismissing {\n animation: oe-fade-out 0.3s ease forwards;\n }\n\n .oe-welcome-backdrop.is-dismissing .oe-welcome-modal {\n animation: oe-modal-out 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes oe-fade-out {\n to { opacity: 0; }\n }\n\n @keyframes oe-modal-out {\n to { opacity: 0; transform: scale(0.95) translateY(10px); }\n }\n';
7401
- function Pv() {
7410
+ var Lv = { "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." } }, Rv = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: oklch(0% 0 0 / 0.55);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: oe-fade-in 0.4s ease both;\n font-family: system-ui, sans-serif;\n }\n\n .oe-welcome-modal {\n background: oklch(11% 0.010 265);\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px oklch(0% 0 0 / 0.55), inset 0 1px 0 oklch(100% 0 0 / 0.06);\n animation: oe-modal-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n @keyframes oe-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes oe-modal-in {\n from { opacity: 0; transform: scale(0.95) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .oe-welcome-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n }\n\n .oe-welcome-icon {\n font-size: 28px;\n color: var(--gold, oklch(72% 0.12 80));\n line-height: 1;\n text-shadow: 0 0 10px var(--gold-glow, oklch(72% 0.12 80 / 0.30));\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--text, oklch(92% 0.006 265));\n margin: 0;\n letter-spacing: 0.02em;\n }\n\n .oe-welcome-text {\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--text-secondary, oklch(68% 0.008 265));\n margin: 0;\n }\n\n .oe-welcome-hints {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin: 8px 0 12px 0;\n padding: 0;\n list-style: none;\n }\n\n .oe-welcome-hints li {\n font-size: 13.5px;\n line-height: 1.4;\n color: var(--text-secondary, oklch(68% 0.008 265));\n display: flex;\n align-items: flex-start;\n gap: 10px;\n opacity: 0;\n animation: oe-fade-in 0.4s ease forwards;\n }\n\n /* Stagger the hints */\n .oe-welcome-hints li:nth-child(1) { animation-delay: 0.15s; }\n .oe-welcome-hints li:nth-child(2) { animation-delay: 0.25s; }\n .oe-welcome-hints li:nth-child(3) { animation-delay: 0.35s; }\n .oe-welcome-hints li:nth-child(4) { animation-delay: 0.45s; }\n\n .oe-welcome-hints li::before {\n content: "\u2726";\n color: var(--gold-dim, oklch(52% 0.06 80));\n font-size: 12px;\n padding-top: 2px;\n }\n\n .oe-welcome-hints strong {\n color: var(--text, oklch(92% 0.006 265));\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: var(--gold-subtle, oklch(72% 0.12 80 / 0.10));\n color: var(--gold, oklch(72% 0.12 80));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease, border-color 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: oklch(72% 0.12 80 / 0.18);\n border-color: oklch(72% 0.12 80 / 0.40);\n }\n\n .oe-welcome-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n\n .oe-welcome-backdrop.is-dismissing {\n animation: oe-fade-out 0.3s ease forwards;\n }\n\n .oe-welcome-backdrop.is-dismissing .oe-welcome-modal {\n animation: oe-modal-out 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes oe-fade-out {\n to { opacity: 0; }\n }\n\n @keyframes oe-modal-out {\n to { opacity: 0; transform: scale(0.95) translateY(10px); }\n }\n';
7411
+ function zv() {
7402
7412
  if (document.getElementById("oe-first-run-styles")) return;
7403
7413
  let e4 = document.createElement("style");
7404
- e4.id = "oe-first-run-styles", e4.textContent = Nv, document.head.appendChild(e4);
7414
+ e4.id = "oe-first-run-styles", e4.textContent = Rv, document.head.appendChild(e4);
7405
7415
  }
7406
- function Fv(e4, t2) {
7416
+ function Bv(e4, t2) {
7407
7417
  let n2 = document.activeElement, r2 = document.createElement("div");
7408
7418
  r2.className = "oe-welcome-backdrop";
7409
7419
  let i2 = document.createElement("div");
@@ -7413,7 +7423,7 @@ function Fv(e4, t2) {
7413
7423
  let o2 = i2.querySelector(".oe-welcome-button"), s2 = () => {
7414
7424
  r2.classList.add("is-dismissing"), r2.addEventListener("animationend", () => {
7415
7425
  r2.remove(), n2 == null || n2.focus();
7416
- }, { once: true }), jv(t2);
7426
+ }, { once: true }), Iv(t2);
7417
7427
  };
7418
7428
  return o2.addEventListener("click", s2), r2.addEventListener("click", (e5) => {
7419
7429
  e5.target === r2 && s2();
@@ -7421,14 +7431,27 @@ function Fv(e4, t2) {
7421
7431
  e5.key === "Escape" && (e5.preventDefault(), s2()), e5.key === "Tab" && (e5.preventDefault(), o2.focus());
7422
7432
  }), requestAnimationFrame(() => o2.focus()), r2;
7423
7433
  }
7424
- function Iv(e4, t2) {
7425
- if (Av(e4)) return;
7426
- let n2 = Mv[e4];
7427
- Pv();
7428
- let r2 = Fv(n2, e4);
7434
+ function Vv(e4, t2) {
7435
+ if (Fv(e4)) return;
7436
+ let n2 = Lv[e4];
7437
+ zv();
7438
+ let r2 = Bv(n2, e4);
7429
7439
  document.body.appendChild(r2);
7430
7440
  }
7431
- function Lv(e4, t2, n2 = []) {
7441
+ function Hv(e4) {
7442
+ var t2;
7443
+ if (!e4) return null;
7444
+ if (e4.structuredContent != null && typeof e4.structuredContent == "object") return e4.structuredContent;
7445
+ for (let n2 of (t2 = e4.content) == null ? [] : t2) {
7446
+ let e5 = n2 == null ? void 0 : n2.text;
7447
+ if (typeof e5 == "string" && e5.length > 0) try {
7448
+ return JSON.parse(e5);
7449
+ } catch (e6) {
7450
+ }
7451
+ }
7452
+ return null;
7453
+ }
7454
+ function Uv(e4, t2, n2 = []) {
7432
7455
  var r2, i2;
7433
7456
  if (!t2 || t2.querySelector("#btn-fullscreen")) return;
7434
7457
  let a2 = document.createElement("button");
@@ -7511,14 +7534,14 @@ function Lv(e4, t2, n2 = []) {
7511
7534
  }, 4e3);
7512
7535
  }
7513
7536
  }
7514
- function Rv(e4, t2) {
7537
+ function Wv(e4, t2) {
7515
7538
  e4.ontoolcancelled = (e5) => {
7516
7539
  var n2, r2, i2;
7517
7540
  let a2 = (n2 = e5.reason) == null ? "Tool call was cancelled" : n2;
7518
- console.warn("[AppChrome] Tool cancelled:", a2), (r2 = t2.statusFn) == null || r2.call(t2, null), !t2.loadingEl.hidden && t2.loadingEl.getAttribute("hidden") === null && (t2.loadingEl.setAttribute("hidden", ""), t2.contentEl.removeAttribute("hidden")), (i2 = t2.paramControls) == null || i2.setBusy(false), zv(a2);
7541
+ console.warn("[AppChrome] Tool cancelled:", a2), (r2 = t2.statusFn) == null || r2.call(t2, null), !t2.loadingEl.hidden && t2.loadingEl.getAttribute("hidden") === null && (t2.loadingEl.setAttribute("hidden", ""), t2.contentEl.removeAttribute("hidden")), (i2 = t2.paramControls) == null || i2.setBusy(false), Gv(a2);
7519
7542
  };
7520
7543
  }
7521
- function zv(e4) {
7544
+ function Gv(e4) {
7522
7545
  var t2;
7523
7546
  (t2 = document.getElementById("cancel-toast")) == null || t2.remove();
7524
7547
  let n2 = document.createElement("div");
@@ -7526,7 +7549,7 @@ function zv(e4) {
7526
7549
  n2.classList.remove("visible"), setTimeout(() => n2.remove(), 300);
7527
7550
  }, 3e3);
7528
7551
  }
7529
- function Bv(e4) {
7552
+ function Kv(e4) {
7530
7553
  var t2;
7531
7554
  function n2(e5) {
7532
7555
  if (!e5) return;
@@ -7539,130 +7562,149 @@ function Bv(e4) {
7539
7562
  n2(e5);
7540
7563
  });
7541
7564
  }
7542
- var Vv = document.getElementById("chart-container"), Hv = document.getElementById("loading-state"), Uv = document.getElementById("mode-badge"), Wv = document.getElementById("chart-status"), Gv = document.getElementById("aspect-filter"), Kv = document.getElementById("chart-provenance"), qv = document.getElementById("bi-patterns-strip"), Jv = document.getElementById("param-controls-container"), Yv = new i_({ name: "Bi-Wheel Chart Explorer", version: "1.0.0" }), $ = null, Xv = null, Zv = false, Qv = false, $v = "placidus";
7543
- function ey(e4) {
7544
- if (Wv) {
7565
+ var qv = document.getElementById("chart-container"), Jv = document.getElementById("loading-state"), Yv = document.getElementById("mode-badge"), Xv = document.getElementById("chart-status"), Zv = document.getElementById("aspect-filter"), Qv = document.getElementById("chart-provenance"), $v = document.getElementById("bi-patterns-strip"), ey = document.getElementById("param-controls-container"), ty = new i_({ name: "Bi-Wheel Chart Explorer", version: "1.0.0" }), $ = null, ny = null, ry = false, iy = false, ay = "placidus", oy = "true";
7566
+ function sy(e4) {
7567
+ if (Xv) {
7545
7568
  if (!e4) {
7546
- Wv.classList.remove("visible");
7569
+ Xv.classList.remove("visible");
7547
7570
  return;
7548
7571
  }
7549
- Wv.textContent = "\xB7 ".concat(e4), Wv.classList.add("visible");
7572
+ Xv.textContent = "\xB7 ".concat(e4), Xv.classList.add("visible");
7550
7573
  }
7551
7574
  }
7552
- H_(ey);
7553
- function ty() {
7554
- Hv.hidden = false, Vv.hidden = true, Uv.hidden = true, Kv && (Kv.hidden = true), qv && (qv.hidden = true, qv.innerHTML = "");
7575
+ G_(sy);
7576
+ function cy() {
7577
+ Jv.hidden = false, qv.hidden = true, Yv.hidden = true, Qv && (Qv.hidden = true), $v && ($v.hidden = true, $v.innerHTML = "");
7555
7578
  }
7556
- function ny() {
7557
- Hv.hidden = true, Vv.hidden = false, Vv.classList.remove("refreshing"), Uv.hidden = false, Kv && (Kv.hidden = false);
7579
+ function ly() {
7580
+ Jv.hidden = true, qv.hidden = false, qv.classList.remove("refreshing"), Yv.hidden = false, Qv && (Qv.hidden = false);
7558
7581
  }
7559
- function ry() {
7560
- if (!$ || Vv.hidden) {
7561
- ty();
7582
+ function uy() {
7583
+ if (!$ || qv.hidden) {
7584
+ cy();
7562
7585
  return;
7563
7586
  }
7564
- Vv.classList.add("refreshing");
7587
+ qv.classList.add("refreshing");
7565
7588
  }
7566
- function iy() {
7567
- Vv.classList.remove("refreshing"), Vv.classList.remove("chart-rendered"), Vv.offsetWidth, Vv.classList.add("chart-rendered");
7589
+ function dy() {
7590
+ qv.classList.remove("refreshing"), qv.classList.remove("chart-rendered"), qv.offsetWidth, qv.classList.add("chart-rendered");
7568
7591
  }
7569
- function ay(e4, t2) {
7570
- Hv.hidden = true, Kv && (Kv.hidden = true);
7592
+ function fy(e4, t2) {
7593
+ Jv.hidden = true, Qv && (Qv.hidden = true);
7571
7594
  let n2 = t2 ? '<button class="error-retry-btn" id="error-retry-btn">\u21BA Try again</button>' : "";
7572
- if (Vv.innerHTML = '\n <div class="error-state">\n <div class="error-icon">\u26A0\uFE0F</div>\n <p class="error-msg">'.concat(oy(e4), "</p>\n ").concat(n2, "\n </div>"), t2) {
7595
+ if (qv.innerHTML = '\n <div class="error-state">\n <div class="error-icon">\u26A0\uFE0F</div>\n <p class="error-msg">'.concat(py(e4), "</p>\n ").concat(n2, "\n </div>"), t2) {
7573
7596
  var r2;
7574
7597
  (r2 = document.getElementById("error-retry-btn")) == null || r2.addEventListener("click", t2);
7575
7598
  }
7576
- Vv.hidden = false;
7599
+ qv.hidden = false;
7577
7600
  }
7578
- function oy(e4) {
7601
+ function py(e4) {
7579
7602
  return e4.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
7580
7603
  }
7581
- async function sy(e4) {
7604
+ async function my(e4) {
7582
7605
  try {
7583
- (await Yv.sendMessage({ role: "user", content: [{ type: "text", text: e4 }] })).isError && console.error("[BiWheel] Host rejected sendMessage");
7606
+ (await ty.sendMessage({ role: "user", content: [{ type: "text", text: e4 }] })).isError && console.error("[BiWheel] Host rejected sendMessage");
7584
7607
  } catch (e5) {
7585
7608
  console.error("[BiWheel] sendMessage failed:", e5);
7586
7609
  }
7587
7610
  }
7588
- function cy(e4) {
7589
- var t2;
7590
- for (let n2 of (t2 = e4.content) == null ? [] : t2) {
7591
- if (n2.type !== "text" || !n2.text) continue;
7592
- let e5 = n2.text.trim();
7593
- if (e5.startsWith("{")) try {
7594
- let t3 = JSON.parse(e5);
7595
- if ("inner" in t3 && "outer" in t3) return t3;
7596
- } catch (e6) {
7597
- }
7598
- }
7599
- return null;
7600
- }
7601
- var ly = [{ label: "Tight", mult: 0.55 }, { label: "Standard", mult: 1 }, { label: "Wide", mult: 1.6 }], uy = true, dy = 1;
7602
- function fy() {
7603
- var e4, t2;
7604
- if (!Gv) return;
7605
- let n2 = (t2 = { synastry: "Synastry \u2192 Natal", transit: "Transit \u2192 Natal", progressed: "Progressions \u2192 Natal", solar_return: "Solar Return \u2192 Natal", lunar_return: "Lunar Return \u2192 Natal", solar_arc: "Solar Arc \u2192 Natal" }[(e4 = $ == null ? void 0 : $.mode) == null ? "synastry" : e4]) == null ? "Cross-Wheel" : t2;
7606
- uy = true, Gv.innerHTML = '\n <div class="asp-panel">\n <div class="asp-section">\n <span class="asp-section-label">Aspects</span>\n <button class="aspect-toggle-btn active" id="aspect-vis-toggle"\n title="Toggle all aspect lines &amp; symbols">\n <span class="toggle-icon">\u2295</span> '.concat(n2, '\n </button>\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Orb</span>\n ').concat(ly.map((e5) => '<button class="orb-preset-btn'.concat(e5.mult === dy ? " active" : "", '" data-mult="').concat(e5.mult, '" title="').concat(e5.label, ' orbs">').concat(e5.label, "</button>")).join(""), '\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Houses</span>\n ').concat([{ key: "placidus", label: "Placidus" }, { key: "whole_sign", label: "Whole Sign" }, { key: "equal", label: "Equal" }, { key: "koch", label: "Koch" }, { key: "regiomontanus", label: "Regio." }].map((e5) => '<button class="orb-preset-btn house-btn'.concat(e5.key === $v ? " active" : "", '" data-hs="').concat(e5.key, '" title="').concat(e5.label, ' houses">').concat(e5.label, "</button>")).join(""), "\n </div>\n </div>\n "), Gv.removeAttribute("hidden");
7607
- let r2 = document.getElementById("aspect-vis-toggle");
7608
- r2 == null || r2.addEventListener("click", () => {
7609
- uy = !uy, mv(uy), r2.classList.toggle("active", uy), r2.querySelector(".toggle-icon").textContent = uy ? "\u2295" : "\u2296";
7610
- }), Gv.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e5) => {
7611
+ function hy(e4) {
7612
+ let t2 = Hv(e4);
7613
+ return t2 && "inner" in t2 && "outer" in t2 ? t2 : null;
7614
+ }
7615
+ var gy = [{ label: "Tight", mult: 0.55 }, { label: "Standard", mult: 1 }, { label: "Wide", mult: 1.6 }], _y = true, vy = 1;
7616
+ function yy() {
7617
+ var e4, t2, n2;
7618
+ if (!Zv) return;
7619
+ let r2 = (t2 = { synastry: "Synastry \u2192 Natal", transit: "Transit \u2192 Natal", progressed: "Progressions \u2192 Natal", solar_return: "Solar Return \u2192 Natal", lunar_return: "Lunar Return \u2192 Natal", solar_arc: "Solar Arc \u2192 Natal" }[(e4 = $ == null ? void 0 : $.mode) == null ? "synastry" : e4]) == null ? "Cross-Wheel" : t2, i2 = [{ key: "placidus", label: "Placidus" }, { key: "whole_sign", label: "Whole Sign" }, { key: "equal", label: "Equal" }, { key: "koch", label: "Koch" }, { key: "regiomontanus", label: "Regio." }], a2 = (() => {
7620
+ var e5, t3;
7621
+ let n3 = /* @__PURE__ */ new Set();
7622
+ for (let r3 of [...(e5 = $ == null ? void 0 : $.inner) == null ? [] : e5, ...(t3 = $ == null ? void 0 : $.outer) == null ? [] : t3]) r3 && typeof r3 == "object" && "name" in r3 && n3.add(String(r3.name).toLowerCase());
7623
+ return n3.has("north_node") && n3.has("true_node");
7624
+ })();
7625
+ z_(oy);
7626
+ let o2 = a2 ? '\n <div class="asp-section">\n <span class="asp-section-label">Nodes</span>\n <button class="orb-preset-btn node-btn'.concat(oy === "mean" ? " active" : "", '" data-node="mean" title="Mean lunar node (averaged orbit)">Mean</button>\n <button class="orb-preset-btn node-btn').concat(oy === "true" ? " active" : "", '" data-node="true" title="True (osculating) lunar node">True</button>\n </div>') : "";
7627
+ _y = true, Zv.innerHTML = '\n <div class="asp-panel">\n <div class="asp-section">\n <span class="asp-section-label">Aspects</span>\n <button class="aspect-toggle-btn active" id="aspect-vis-toggle"\n title="Toggle all aspect lines &amp; symbols">\n <span class="toggle-icon">\u2295</span> '.concat(r2, '\n </button>\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Orb</span>\n ').concat(gy.map((e5) => '<button class="orb-preset-btn'.concat(e5.mult === vy ? " active" : "", '" data-mult="').concat(e5.mult, '" title="').concat(e5.label, ' orbs">').concat(e5.label, "</button>")).join(""), '\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Houses</span>\n ').concat(i2.map((e5) => '<button class="orb-preset-btn house-btn'.concat(e5.key === ay ? " active" : "", '" data-hs="').concat(e5.key, '" title="').concat(e5.label, ' houses">').concat(e5.label, "</button>")).join(""), "\n </div>").concat(o2, "\n </div>\n ");
7628
+ let s2 = [...V_($ == null ? void 0 : $.inner), ...V_($ == null ? void 0 : $.outer)], c2 = /* @__PURE__ */ new Set(), l2 = [];
7629
+ for (let e5 of s2) {
7630
+ let t3 = e5.name.toLowerCase();
7631
+ if (c2.has(t3)) continue;
7632
+ c2.add(t3);
7633
+ let n3 = w_[t3];
7634
+ n3 && l2.push({ glyph: n3, label: jv(e5.name) });
7635
+ }
7636
+ let u2 = [...new Set(((n2 = $ == null ? void 0 : $.cross_aspects) == null ? [] : n2).map((e5) => {
7637
+ var t3;
7638
+ return ((t3 = e5.type) == null ? "" : t3).toLowerCase();
7639
+ }).filter(Boolean))].map((e5) => {
7640
+ var t3;
7641
+ return { glyph: (t3 = D_[e5]) == null ? "" : t3, label: jv(e5) };
7642
+ }).filter((e5) => e5.glyph);
7643
+ Zv.insertAdjacentHTML("beforeend", Mv([{ title: "Bodies", items: l2 }, { title: "Aspects", items: u2 }])), Zv.removeAttribute("hidden");
7644
+ let d2 = document.getElementById("aspect-vis-toggle");
7645
+ d2 == null || d2.addEventListener("click", () => {
7646
+ _y = !_y, _v(_y), d2.classList.toggle("active", _y), d2.querySelector(".toggle-icon").textContent = _y ? "\u2295" : "\u2296";
7647
+ }), Zv.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e5) => {
7611
7648
  e5.addEventListener("click", () => {
7612
7649
  var t3;
7613
7650
  let n3 = parseFloat((t3 = e5.dataset.mult) == null ? "1" : t3);
7614
- n3 !== dy && (dy = n3, Gv.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e6) => e6.classList.toggle("active", e6.dataset.mult === String(n3))), $ && py($, n3));
7651
+ n3 !== vy && (vy = n3, Zv.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e6) => e6.classList.toggle("active", e6.dataset.mult === String(n3))), $ && by($, n3));
7615
7652
  });
7616
- }), Gv.querySelectorAll(".house-btn").forEach((e5) => {
7653
+ }), Zv.querySelectorAll(".house-btn").forEach((e5) => {
7617
7654
  e5.addEventListener("click", () => {
7618
7655
  var t3;
7619
7656
  let n3 = (t3 = e5.dataset.hs) == null ? "placidus" : t3;
7620
- n3 === $v || !$ || ($v = n3, Gv.querySelectorAll(".house-btn").forEach((e6) => e6.classList.toggle("active", e6.dataset.hs === n3)), jy(n3));
7657
+ n3 === ay || !$ || (ay = n3, Zv.querySelectorAll(".house-btn").forEach((e6) => e6.classList.toggle("active", e6.dataset.hs === n3)), Ry(n3));
7658
+ });
7659
+ }), Zv.querySelectorAll(".node-btn").forEach((e5) => {
7660
+ e5.addEventListener("click", () => {
7661
+ let t3 = e5.dataset.node === "mean" ? "mean" : "true";
7662
+ t3 === oy || !$ || (oy = t3, z_(t3), Zv.querySelectorAll(".node-btn").forEach((e6) => e6.classList.toggle("active", e6.dataset.node === t3)), by($, vy));
7621
7663
  });
7622
7664
  });
7623
7665
  }
7624
- function py(e4, t2) {
7666
+ function by(e4, t2) {
7625
7667
  var n2, r2, i2, a2;
7626
- let o2 = R_(e4.inner), s2 = R_(e4.outer), c2 = B_(o2, s2, t2), l2 = { ...e4, cross_aspects: c2 };
7627
- wv(Vv, l2, My, Ny, Sy, Ey()), uy || mv(false);
7668
+ let o2 = V_(e4.inner), s2 = V_(e4.outer), c2 = U_(o2, s2, t2), l2 = { ...e4, cross_aspects: c2 };
7669
+ Dv(qv, l2, zy, By, ky, Ny()), _y || _v(false);
7628
7670
  let u2 = (r2 = (i2 = (a2 = ((n2 = l2.inner_houses) == null ? [] : n2)[0]) == null ? void 0 : a2.cusp_lon) == null ? l2.ascendant : i2) == null ? 0 : r2;
7629
- Ay(vv(c2), o2, s2, u2);
7671
+ Ly(xv(c2), o2, s2, u2);
7630
7672
  }
7631
- var my = null;
7632
- function hy(e4) {
7633
- my = e4, e4 ? Vv.setAttribute("data-focus", e4) : Vv.removeAttribute("data-focus"), Uv.querySelectorAll(".mode-badge-name").forEach((t2) => {
7673
+ var xy = null;
7674
+ function Sy(e4) {
7675
+ xy = e4, e4 ? qv.setAttribute("data-focus", e4) : qv.removeAttribute("data-focus"), Yv.querySelectorAll(".mode-badge-name").forEach((t2) => {
7634
7676
  let n2 = t2.dataset.focus;
7635
7677
  t2.classList.toggle("focused", n2 === e4);
7636
- }), $ && xy($, e4);
7678
+ }), $ && Oy($, e4);
7637
7679
  }
7638
- function gy(e4) {
7680
+ function Cy(e4) {
7639
7681
  var t2, n2, r2, i2, a2, o2, s2;
7640
7682
  let c2 = (t2 = e4.mode) == null ? "synastry" : t2, l2 = (n2 = (r2 = e4._birth_params_inner) == null ? void 0 : r2.location) == null ? "Person 1" : n2, u2 = (i2 = (a2 = e4._birth_params_outer) == null ? void 0 : a2.location) == null ? c2 === "transit" ? "Transits" : "Person 2" : i2;
7641
- my = null, Vv.removeAttribute("data-focus");
7683
+ xy = null, qv.removeAttribute("data-focus");
7642
7684
  let d2 = "";
7643
7685
  if (c2 === "transit" && (o2 = e4._birth_params_outer) != null && o2.datetime) try {
7644
7686
  let t3 = new Date(e4._birth_params_outer.datetime);
7645
- isNaN(t3.getTime()) || (d2 = '<span class="mode-badge-date">'.concat(oy(t3.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" })), "</span>"));
7687
+ isNaN(t3.getTime()) || (d2 = '<span class="mode-badge-date">'.concat(py(t3.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" })), "</span>"));
7646
7688
  } catch (e5) {
7647
7689
  }
7648
- Uv.innerHTML = '\n <button class="mode-badge-name inner-name" data-focus="inner" title="Click to focus inner (natal) wheel">\n <span class="mode-badge-dot-inner"></span>'.concat(oy(l2), '\n </button>\n <button class="mode-badge-swap" title="Toggle focus">\u21C4</button>\n <button class="mode-badge-name outer-name" data-focus="outer" title="Click to focus outer (').concat(c2, ') wheel">\n <span class="mode-badge-dot-outer"></span>').concat(oy(u2), "\n </button>\n ").concat(d2), Uv.querySelectorAll(".mode-badge-name").forEach((e5) => {
7690
+ Yv.innerHTML = '\n <button class="mode-badge-name inner-name" data-focus="inner" title="Click to focus inner (natal) wheel">\n <span class="mode-badge-dot-inner"></span>'.concat(py(l2), '\n </button>\n <button class="mode-badge-swap" title="Toggle focus">\u21C4</button>\n <button class="mode-badge-name outer-name" data-focus="outer" title="Click to focus outer (').concat(c2, ') wheel">\n <span class="mode-badge-dot-outer"></span>').concat(py(u2), "\n </button>\n ").concat(d2), Yv.querySelectorAll(".mode-badge-name").forEach((e5) => {
7649
7691
  e5.addEventListener("click", () => {
7650
7692
  let t3 = e5.dataset.focus;
7651
- hy(my === t3 ? null : t3);
7693
+ Sy(xy === t3 ? null : t3);
7652
7694
  });
7653
- }), (s2 = Uv.querySelector(".mode-badge-swap")) == null || s2.addEventListener("click", () => {
7654
- hy(my === "inner" ? "outer" : "inner");
7695
+ }), (s2 = Yv.querySelector(".mode-badge-swap")) == null || s2.addEventListener("click", () => {
7696
+ Sy(xy === "inner" ? "outer" : "inner");
7655
7697
  });
7656
7698
  }
7657
- var _y = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], vy = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", asc: "AC", mc: "MC" };
7658
- function yy(e4, t2) {
7699
+ var wy = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], Ty = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", asc: "AC", mc: "MC" };
7700
+ function Ey(e4, t2) {
7659
7701
  var n2, r2;
7660
7702
  let i2 = e4.find((e5) => e5.name.toLowerCase() === t2);
7661
7703
  if (!i2) return "\u2014";
7662
7704
  let a2 = Math.floor((i2.longitude % 360 + 360) % 360 / 30), o2 = Math.floor(i2.longitude % 30);
7663
- return "".concat((n2 = vy[t2]) == null ? t2 : n2, " ").concat(o2, "\xB0 ").concat((r2 = _y[a2]) == null ? "" : r2);
7705
+ return "".concat((n2 = Ty[t2]) == null ? t2 : n2, " ").concat(o2, "\xB0 ").concat((r2 = wy[a2]) == null ? "" : r2);
7664
7706
  }
7665
- function by(e4) {
7707
+ function Dy(e4) {
7666
7708
  try {
7667
7709
  let t2 = new Date(e4);
7668
7710
  return isNaN(t2.getTime()) ? e4 : t2.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" }) + " \xB7 " + t2.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit", hour12: true });
@@ -7670,22 +7712,22 @@ function by(e4) {
7670
7712
  return e4;
7671
7713
  }
7672
7714
  }
7673
- function xy(e4, t2) {
7715
+ function Oy(e4, t2) {
7674
7716
  var n2, r2, i2, a2, o2;
7675
- if (!Kv) return;
7676
- let s2 = t2 == null ? "inner" : t2, c2 = s2 === "inner" ? e4.inner : e4.outer, l2 = s2 === "inner" ? e4._birth_params_inner : e4._birth_params_outer, u2 = (n2 = e4.mode) == null ? "synastry" : n2, d2 = (r2 = l2 == null ? void 0 : l2.location) == null ? s2 === "inner" ? "Inner chart" : u2 === "transit" ? "Transits" : "Outer chart" : r2, f2 = l2 != null && l2.datetime ? by(l2.datetime) : null, p2 = (i2 = l2 == null ? void 0 : l2.timezone) == null ? null : i2, m2 = s2 === "inner" ? e4.inner_houses : (a2 = e4.outer_houses) == null ? [] : a2, h2 = (o2 = e4.house_system) == null ? m2.length > 0 ? "Placidus" : null : o2, g2 = yy(c2, "sun"), _2 = yy(c2, "moon"), v2 = yy(c2, "asc");
7717
+ if (!Qv) return;
7718
+ let s2 = t2 == null ? "inner" : t2, c2 = s2 === "inner" ? e4.inner : e4.outer, l2 = s2 === "inner" ? e4._birth_params_inner : e4._birth_params_outer, u2 = (n2 = e4.mode) == null ? "synastry" : n2, d2 = (r2 = l2 == null ? void 0 : l2.location) == null ? s2 === "inner" ? "Inner chart" : u2 === "transit" ? "Transits" : "Outer chart" : r2, f2 = l2 != null && l2.datetime ? Dy(l2.datetime) : null, p2 = (i2 = l2 == null ? void 0 : l2.timezone) == null ? null : i2, m2 = s2 === "inner" ? e4.inner_houses : (a2 = e4.outer_houses) == null ? [] : a2, h2 = (o2 = e4.house_system) == null ? m2.length > 0 ? "Placidus" : null : o2, g2 = Ey(c2, "sun"), _2 = Ey(c2, "moon"), v2 = Ey(c2, "asc");
7677
7719
  if (v2 === "AC \u2014" && m2.length > 0) {
7678
7720
  let e5 = m2.find((e6) => e6.number === 1);
7679
7721
  if (e5) {
7680
7722
  var y2;
7681
7723
  let t3 = Math.floor((e5.cusp_lon % 360 + 360) % 360 / 30);
7682
- v2 = "AC ".concat(Math.floor(e5.cusp_lon % 30), "\xB0 ").concat((y2 = _y[t3]) == null ? "" : y2);
7724
+ v2 = "AC ".concat(Math.floor(e5.cusp_lon % 30), "\xB0 ").concat((y2 = wy[t3]) == null ? "" : y2);
7683
7725
  }
7684
7726
  }
7685
7727
  let b2 = s2 === "outer" && u2 === "transit" ? "Transit" : s2 === "outer" ? "Synastry" : "Natal";
7686
- Kv.innerHTML = '\n <div class="prov-name">'.concat(oy(d2), '\n <span class="prov-mode-tag">').concat(oy(b2), '</span>\n </div>\n <div class="prov-trio">\n <span class="prov-planet">').concat(oy(g2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(oy(_2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(oy(v2), "</span>\n </div>\n ").concat(f2 ? '<div class="prov-meta">'.concat(oy(f2)).concat(p2 ? ' <span class="prov-tz">'.concat(oy(p2), "</span>") : "", "</div>") : "", "\n ").concat(h2 ? '<div class="prov-meta">'.concat(oy(h2), " houses</div>") : "", "\n "), Kv.hidden = false;
7728
+ Qv.innerHTML = '\n <div class="prov-name">'.concat(py(d2), '\n <span class="prov-mode-tag">').concat(py(b2), '</span>\n </div>\n <div class="prov-trio">\n <span class="prov-planet">').concat(py(g2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(py(_2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(py(v2), "</span>\n </div>\n ").concat(f2 ? '<div class="prov-meta">'.concat(py(f2)).concat(p2 ? ' <span class="prov-tz">'.concat(py(p2), "</span>") : "", "</div>") : "", "\n ").concat(h2 ? '<div class="prov-meta">'.concat(py(h2), " houses</div>") : "", "\n "), Qv.hidden = false;
7687
7729
  }
7688
- async function Sy(e4) {
7730
+ async function ky(e4) {
7689
7731
  var t2;
7690
7732
  let n2 = (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2, r2 = "";
7691
7733
  if (e4.type === "planet") {
@@ -7711,31 +7753,31 @@ async function Sy(e4) {
7711
7753
  let t3 = e4.data, i3 = (m2 = t3.planets) == null ? [] : m2, a3 = n2 === "transit" ? "natal" : "inner", o3 = n2 === "transit" ? "transit" : "outer", s3 = i3.length > 0 ? i3.map((e5) => "".concat(e5.name, " (").concat(e5.wheel === "inner" ? a3 : o3, ")")).join(", ") : "the involved planets";
7712
7754
  r2 = "Interpret the ".concat(String(t3.name), " forming in this ").concat(n2, " bi-wheel involving ").concat(s3, ". ") + (t3.description ? "".concat(String(t3.description), ". ") : "") + "This is a cross-chart pattern \u2014 it spans both wheels, so the meaning lives in the interaction between the ".concat(a3, " foundation and the ").concat(o3, " activation. Give a rich interpretation covering: (1) the core dynamic this pattern creates, (2) how the ").concat(a3, " planets set the stage, (3) what the ").concat(o3, " planets activate or challenge, (4) the psychological theme and practical expression").concat(n2 === "transit" ? ", and (5) timing \u2014 what to do with this energy now" : "", ".");
7713
7755
  }
7714
- r2 && await sy(r2);
7756
+ r2 && await my(r2);
7715
7757
  }
7716
- async function Cy() {
7758
+ async function Ay() {
7717
7759
  var e4, t2, n2, r2, i2, a2, o2, s2;
7718
7760
  if (!$) return;
7719
7761
  let c2 = $, l2 = (e4 = c2.mode) == null ? "synastry" : e4, u2 = String((t2 = (n2 = c2._birth_params_inner) == null ? void 0 : n2.location) == null ? "Person 1" : t2), d2 = l2 === "transit" ? "transits (".concat(String((r2 = (i2 = c2._birth_params_outer) == null ? void 0 : i2.location) == null ? "today" : r2), ")") : String((a2 = (o2 = c2._birth_params_outer) == null ? void 0 : o2.location) == null ? "Person 2" : a2), f2 = ((s2 = c2.cross_aspects) == null ? [] : s2).slice(0, 8).map((e5) => " \u2022 ".concat(e5.planet1, " ").concat(e5.type, " ").concat(e5.planet2, " (").concat(e5.orb.toFixed(1), "\xB0").concat(e5.applying === void 0 ? "" : ", ".concat(e5.applying ? "applying" : "separating"), ")")).join("\n") || " \u2022 No cross-aspects within orb";
7720
- await sy(l2 === "transit" ? "Please interpret this transit chart for ".concat(u2, ".\n\nKey transit cross-aspects:\n").concat(f2, "\n\nCover: (1) The most significant active transits and their themes, (2) Timing \u2014 what's applying vs separating, (3) Practical guidance \u2014 what to focus on now, (4) The overall energetic signature of this moment in time.") : "Please interpret this synastry bi-wheel between ".concat(u2, " and ").concat(d2, ".\n\nTop cross-wheel aspects:\n").concat(f2, "\n\nCover: (1) The core relational dynamic and overall compatibility theme, (2) The most significant planet-to-planet contacts and their meaning, (3) Areas of natural ease vs creative tension, (4) How each person experiences the other energetically."));
7762
+ await my(l2 === "transit" ? "Please interpret this transit chart for ".concat(u2, ".\n\nKey transit cross-aspects:\n").concat(f2, "\n\nCover: (1) The most significant active transits and their themes, (2) Timing \u2014 what's applying vs separating, (3) Practical guidance \u2014 what to focus on now, (4) The overall energetic signature of this moment in time.") : "Please interpret this synastry bi-wheel between ".concat(u2, " and ").concat(d2, ".\n\nTop cross-wheel aspects:\n").concat(f2, "\n\nCover: (1) The core relational dynamic and overall compatibility theme, (2) The most significant planet-to-planet contacts and their meaning, (3) Areas of natural ease vs creative tension, (4) How each person experiences the other energetically."));
7721
7763
  }
7722
- async function wy() {
7764
+ async function jy() {
7723
7765
  var e4, t2, n2, r2, i2, a2;
7724
7766
  if (!$) return;
7725
7767
  let o2 = $, s2 = (e4 = o2.mode) == null ? "synastry" : e4, c2 = String((t2 = (n2 = o2._birth_params_inner) == null ? void 0 : n2.location) == null ? "Person 1" : t2), l2 = s2 === "transit" ? "today's transits" : String((r2 = (i2 = o2._birth_params_outer) == null ? void 0 : i2.location) == null ? "Person 2" : r2), u2 = ((a2 = o2.cross_aspects) == null ? [] : a2).slice(0, 6).map((e5) => "".concat(e5.planet1, " ").concat(e5.type, " ").concat(e5.planet2, " (").concat(e5.orb.toFixed(1), "\xB0)")).join(", ") || "none detected";
7726
- await sy(s2 === "transit" ? "I'm exploring a transit chart for ".concat(c2, ". The active cross-aspects include: ").concat(u2, ".\n\nBased on these transits, please suggest 3-4 specific, insightful questions I could ask to understand this moment \u2014 such as what each transit means for different life areas, timing, or how to work with the energy consciously. Present each as a tappable question I can ask you.") : "I'm exploring a synastry chart between ".concat(c2, " and ").concat(l2, ". The key cross-wheel contacts include: ").concat(u2, ".\n\nBased on these connections, please suggest 3-4 specific, insightful questions I could ask to understand this relationship dynamic \u2014 such as what specific aspects mean, areas of natural ease or tension, or how these two charts interact. Present each as a tappable question I can ask you."));
7768
+ await my(s2 === "transit" ? "I'm exploring a transit chart for ".concat(c2, ". The active cross-aspects include: ").concat(u2, ".\n\nBased on these transits, please suggest 3-4 specific, insightful questions I could ask to understand this moment \u2014 such as what each transit means for different life areas, timing, or how to work with the energy consciously. Present each as a tappable question I can ask you.") : "I'm exploring a synastry chart between ".concat(c2, " and ").concat(l2, ". The key cross-wheel contacts include: ").concat(u2, ".\n\nBased on these connections, please suggest 3-4 specific, insightful questions I could ask to understand this relationship dynamic \u2014 such as what specific aspects mean, areas of natural ease or tension, or how these two charts interact. Present each as a tappable question I can ask you."));
7727
7769
  }
7728
- async function Ty(e4) {
7729
- if (Zv) try {
7770
+ async function My(e4) {
7771
+ if (ry) try {
7730
7772
  var t2;
7731
- await Yv.updateModelContext({ content: [{ type: "text", text: "User selected ".concat(e4.type, ": ").concat(JSON.stringify(e4.data, null, 2), "\nMode: ").concat((t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2) }] });
7773
+ await ty.updateModelContext({ content: [{ type: "text", text: "User selected ".concat(e4.type, ": ").concat(JSON.stringify(e4.data, null, 2), "\nMode: ").concat((t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2) }] });
7732
7774
  } catch (e5) {
7733
7775
  }
7734
7776
  }
7735
- function Ey() {
7736
- if (Qv) return async (e4) => {
7777
+ function Ny() {
7778
+ if (iy) return async (e4) => {
7737
7779
  var t2;
7738
- let n2 = await Yv.createSamplingMessage({ maxTokens: 150, systemPrompt: "You are an expert astrologer interpreting a ".concat(($ == null ? void 0 : $.mode) === "synastry" ? "synastry (relationship)" : "".concat((t2 = $ == null ? void 0 : $.mode) == null ? "transit" : t2, " (planetary weather)"), " chart. Give a focused, mode-appropriate interpretation. Insightful and concise."), messages: [{ role: "user", content: { type: "text", text: e4 } }] });
7780
+ let n2 = await ty.createSamplingMessage({ maxTokens: 150, systemPrompt: "You are an expert astrologer interpreting a ".concat(($ == null ? void 0 : $.mode) === "synastry" ? "synastry (relationship)" : "".concat((t2 = $ == null ? void 0 : $.mode) == null ? "transit" : t2, " (planetary weather)"), " chart. Give a focused, mode-appropriate interpretation. Insightful and concise."), messages: [{ role: "user", content: { type: "text", text: e4 } }] });
7739
7781
  if (n2.isError) {
7740
7782
  var r2, i2;
7741
7783
  throw Error((r2 = (i2 = n2.error) == null ? void 0 : i2.message) == null ? "Sampling failed" : r2);
@@ -7745,130 +7787,130 @@ function Ey() {
7745
7787
  throw Error("Unexpected sampling response format");
7746
7788
  };
7747
7789
  }
7748
- function Dy(e4) {
7790
+ function Py(e4) {
7749
7791
  var t2, n2, r2, i2, a2, o2, s2;
7750
- $ = e4, clearTimeout(Py), gy(e4), wv(Vv, e4, My, Ny, Sy, Ey()), fy(), xy(e4, my);
7751
- let c2 = R_(e4.inner), l2 = R_(e4.outer), u2 = (n2 = (r2 = (i2 = ((t2 = e4.inner_houses) == null ? [] : t2)[0]) == null ? void 0 : i2.cusp_lon) == null ? e4.ascendant : r2) == null ? 0 : n2;
7752
- Ay(vv((a2 = e4.cross_aspects) == null ? [] : a2), c2, l2, u2), e4.house_system && ($v = e4.house_system);
7792
+ $ = e4, clearTimeout(Vy), Cy(e4), Dv(qv, e4, zy, By, ky, Ny()), yy(), Oy(e4, xy);
7793
+ let c2 = V_(e4.inner), l2 = V_(e4.outer), u2 = (n2 = (r2 = (i2 = ((t2 = e4.inner_houses) == null ? [] : t2)[0]) == null ? void 0 : i2.cusp_lon) == null ? e4.ascendant : r2) == null ? 0 : n2;
7794
+ Ly(xv((a2 = e4.cross_aspects) == null ? [] : a2), c2, l2, u2), e4.house_system && (ay = e4.house_system);
7753
7795
  let d2 = document.getElementById("bi-action-bar");
7754
7796
  if (!d2) {
7755
7797
  d2 = document.createElement("div"), d2.id = "bi-action-bar", d2.className = "hd-action-bar";
7756
7798
  let e5 = document.querySelector("#fs-bottom-bar [data-column='right']");
7757
7799
  if (e5) e5.appendChild(d2);
7758
7800
  else {
7759
- let e6 = document.getElementById("app"), t3 = Uv.parentElement === e6 ? Uv : null;
7801
+ let e6 = document.getElementById("app"), t3 = Yv.parentElement === e6 ? Yv : null;
7760
7802
  e6 == null || e6.insertBefore(d2, t3);
7761
7803
  }
7762
7804
  }
7763
- d2.innerHTML = '\n <button class="action-btn action-btn--primary" id="bi-interpret-btn">\u2728 Interpret this chart</button>\n <button class="action-btn" id="bi-questions-btn">\u{1F52E} What should I ask?</button>\n ', (o2 = d2.querySelector("#bi-interpret-btn")) == null || o2.addEventListener("click", () => void Cy()), (s2 = d2.querySelector("#bi-questions-btn")) == null || s2.addEventListener("click", () => void wy()), ny(), iy(), Iv("bi-wheel", Vv);
7805
+ d2.innerHTML = '\n <button class="action-btn action-btn--primary" id="bi-interpret-btn">\u2728 Interpret this chart</button>\n <button class="action-btn" id="bi-questions-btn">\u{1F52E} What should I ask?</button>\n ', (o2 = d2.querySelector("#bi-interpret-btn")) == null || o2.addEventListener("click", () => void Ay()), (s2 = d2.querySelector("#bi-questions-btn")) == null || s2.addEventListener("click", () => void jy()), ly(), dy(), Vv("bi-wheel", qv);
7764
7806
  }
7765
- var Oy = null, ky = { "Cross Trine": "#52a8e0", "Cross T-Square": "#e08a52", "Cross Stellium": "#9a7fd4" };
7766
- function Ay(e4, t2, n2, r2) {
7767
- if (!qv) return;
7807
+ var Fy = null, Iy = { "Cross Trine": "#52a8e0", "Cross T-Square": "#e08a52", "Cross Stellium": "#9a7fd4" };
7808
+ function Ly(e4, t2, n2, r2) {
7809
+ if (!$v) return;
7768
7810
  if (e4.length === 0) {
7769
- qv.hidden = true, qv.innerHTML = "";
7811
+ $v.hidden = true, $v.innerHTML = "";
7770
7812
  return;
7771
7813
  }
7772
- Oy = null, qv.innerHTML = '\n <span class="patterns-label">Cross-Patterns:</span>\n '.concat(e4.map((e5, t3) => {
7814
+ Fy = null, $v.innerHTML = '\n <span class="patterns-label">Cross-Patterns:</span>\n '.concat(e4.map((e5, t3) => {
7773
7815
  var n3;
7774
- let r3 = (n3 = ky[e5.name]) == null ? "#888" : n3;
7816
+ let r3 = (n3 = Iy[e5.name]) == null ? "#888" : n3;
7775
7817
  return '<button class="pattern-pill"\n data-idx="'.concat(t3, '"\n data-color="').concat(r3, '"\n style="color:').concat(r3, ";border-color:").concat(r3, '"\n title="').concat(e5.description, '">\n ').concat(e5.name, '\n <span class="pattern-pill-detail">').concat(e5.description, "</span>\n </button>");
7776
- }).join(""), "\n "), qv.removeAttribute("hidden");
7818
+ }).join(""), "\n "), $v.removeAttribute("hidden");
7777
7819
  let i2 = document.createElement("button");
7778
- i2.className = "pattern-ask-claude-btn", i2.textContent = "\u2728 Ask Claude", i2.style.display = "none", qv.appendChild(i2), i2.addEventListener("click", () => {
7820
+ i2.className = "pattern-ask-claude-btn", i2.textContent = "\u2728 Ask Claude", i2.style.display = "none", $v.appendChild(i2), i2.addEventListener("click", () => {
7779
7821
  var t3;
7780
- let n3 = Oy;
7822
+ let n3 = Fy;
7781
7823
  if (n3 === null) return;
7782
7824
  let r3 = e4[n3];
7783
- r3 && (i2.disabled = true, i2.textContent = "\u23F3 Sending\u2026", Sy({ type: "pattern", data: { name: r3.name, planets: r3.planets, description: (t3 = r3.description) == null ? "" : t3 } }).then(() => {
7825
+ r3 && (i2.disabled = true, i2.textContent = "\u23F3 Sending\u2026", ky({ type: "pattern", data: { name: r3.name, planets: r3.planets, description: (t3 = r3.description) == null ? "" : t3 } }).then(() => {
7784
7826
  i2.textContent = "\u2713 Sent", setTimeout(() => {
7785
7827
  i2.textContent = "\u2728 Ask Claude", i2.disabled = false;
7786
7828
  }, 2500);
7787
7829
  }).catch(() => {
7788
7830
  i2.textContent = "\u26A0 Failed", i2.disabled = false;
7789
7831
  }));
7790
- }), qv.querySelectorAll(".pattern-pill").forEach((a2) => {
7832
+ }), $v.querySelectorAll(".pattern-pill").forEach((a2) => {
7791
7833
  a2.addEventListener("click", () => {
7792
7834
  var o2, s2;
7793
7835
  let c2 = parseInt((o2 = a2.dataset.idx) == null ? "-1" : o2, 10), l2 = e4[c2];
7794
7836
  if (!l2) return;
7795
7837
  let u2 = (s2 = a2.dataset.color) == null ? "#888" : s2;
7796
- if (Oy === c2) {
7797
- Oy = null, a2.classList.remove("active"), a2.style.background = "transparent", a2.style.color = u2, a2.style.borderColor = u2, pv(), Sv(), i2.style.display = "none";
7838
+ if (Fy === c2) {
7839
+ Fy = null, a2.classList.remove("active"), a2.style.background = "transparent", a2.style.color = u2, a2.style.borderColor = u2, gv(), Tv(), i2.style.display = "none";
7798
7840
  return;
7799
7841
  }
7800
- Oy = c2, qv.querySelectorAll(".pattern-pill").forEach((e5) => {
7842
+ Fy = c2, $v.querySelectorAll(".pattern-pill").forEach((e5) => {
7801
7843
  var t3;
7802
7844
  e5.classList.remove("active");
7803
7845
  let n3 = (t3 = e5.dataset.color) == null ? "#888" : t3;
7804
7846
  e5.style.color = n3, e5.style.borderColor = n3, e5.style.background = "transparent";
7805
- }), a2.classList.add("active"), a2.style.background = u2, a2.style.color = "#fff", a2.style.borderColor = u2, Cv(l2), Sv(), xv(l2, t2, n2, r2), i2.style.display = "", i2.textContent = "\u2728 Ask Claude", i2.disabled = false;
7847
+ }), a2.classList.add("active"), a2.style.background = u2, a2.style.color = "#fff", a2.style.borderColor = u2, Ev(l2), Tv(), wv(l2, t2, n2, r2), i2.style.display = "", i2.textContent = "\u2728 Ask Claude", i2.disabled = false;
7806
7848
  });
7807
7849
  });
7808
7850
  }
7809
- async function jy(e4) {
7851
+ async function Ry(e4) {
7810
7852
  if (!$) return;
7811
7853
  let t2 = $;
7812
- ry();
7854
+ uy();
7813
7855
  try {
7814
7856
  var n2, r2, i2, a2, o2, s2, c2, l2, u2, d2;
7815
- let f2 = new Promise((e5, t3) => setTimeout(() => t3(Error("House system recalculate timed out")), 3e4)), p2 = cy(await Promise.race([Yv.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n2 = t2._birth_params_inner) == null ? void 0 : n2.datetime, person1_latitude: (r2 = t2._birth_params_inner) == null ? void 0 : r2.latitude, person1_longitude: (i2 = t2._birth_params_inner) == null ? void 0 : i2.longitude, person1_timezone: (a2 = t2._birth_params_inner) == null ? void 0 : a2.timezone, person1_name: (o2 = t2._birth_params_inner) == null ? void 0 : o2.location, person2_datetime: (s2 = t2._birth_params_outer) == null ? void 0 : s2.datetime, person2_latitude: (c2 = t2._birth_params_outer) == null ? void 0 : c2.latitude, person2_longitude: (l2 = t2._birth_params_outer) == null ? void 0 : l2.longitude, person2_timezone: (u2 = t2._birth_params_outer) == null ? void 0 : u2.timezone, person2_name: (d2 = t2._birth_params_outer) == null ? void 0 : d2.location, house_system: e4 } }), f2]));
7816
- p2 ? Dy(p2) : $ && ny();
7857
+ let f2 = new Promise((e5, t3) => setTimeout(() => t3(Error("House system recalculate timed out")), 3e4)), p2 = hy(await Promise.race([ty.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n2 = t2._birth_params_inner) == null ? void 0 : n2.datetime, person1_latitude: (r2 = t2._birth_params_inner) == null ? void 0 : r2.latitude, person1_longitude: (i2 = t2._birth_params_inner) == null ? void 0 : i2.longitude, person1_timezone: (a2 = t2._birth_params_inner) == null ? void 0 : a2.timezone, person1_name: (o2 = t2._birth_params_inner) == null ? void 0 : o2.location, person2_datetime: (s2 = t2._birth_params_outer) == null ? void 0 : s2.datetime, person2_latitude: (c2 = t2._birth_params_outer) == null ? void 0 : c2.latitude, person2_longitude: (l2 = t2._birth_params_outer) == null ? void 0 : l2.longitude, person2_timezone: (u2 = t2._birth_params_outer) == null ? void 0 : u2.timezone, person2_name: (d2 = t2._birth_params_outer) == null ? void 0 : d2.location, house_system: e4 } }), f2]));
7858
+ p2 ? Py(p2) : $ && ly();
7817
7859
  } catch (e5) {
7818
- console.error("[BiWheel] House system recalculate failed:", e5), $ && ny();
7860
+ console.error("[BiWheel] House system recalculate failed:", e5), $ && ly();
7819
7861
  }
7820
7862
  }
7821
- function My(e4, t2, n2) {
7863
+ function zy(e4, t2, n2) {
7822
7864
  var r2, i2, a2, o2, s2;
7823
7865
  let c2 = Math.floor((e4.longitude % 360 + 360) % 360 / 30), l2 = (r2 = (i2 = e4.sign) == null ? ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"][c2] : i2) == null ? "Unknown" : r2;
7824
- Ty({ type: "planet", data: { planet_name: e4.name, wheel: t2, longitude: e4.longitude, sign: l2, position: "".concat(Math.floor(e4.longitude % 30), "\xB0 ").concat(l2), house: (a2 = e4.house) == null ? null : a2, retrograde: (o2 = e4.retrograde) == null ? false : o2, mode: (s2 = $ == null ? void 0 : $.mode) == null ? "synastry" : s2, cross_aspects: n2.filter((n3) => t2 === "inner" && n3.planet1 === e4.name || t2 === "outer" && n3.planet2 === e4.name).slice(0, 5).map((e5) => ({ type: e5.type, partner: t2 === "inner" ? e5.planet2 : e5.planet1, orb: e5.orb, applying: e5.applying, orb_label: e5.orb <= 1 ? "exact" : e5.orb <= 3 ? "tight" : "wide" })) } });
7866
+ My({ type: "planet", data: { planet_name: e4.name, wheel: t2, longitude: e4.longitude, sign: l2, position: "".concat(Math.floor(e4.longitude % 30), "\xB0 ").concat(l2), house: (a2 = e4.house) == null ? null : a2, retrograde: (o2 = e4.retrograde) == null ? false : o2, mode: (s2 = $ == null ? void 0 : $.mode) == null ? "synastry" : s2, cross_aspects: n2.filter((n3) => t2 === "inner" && n3.planet1 === e4.name || t2 === "outer" && n3.planet2 === e4.name).slice(0, 5).map((e5) => ({ type: e5.type, partner: t2 === "inner" ? e5.planet2 : e5.planet1, orb: e5.orb, applying: e5.applying, orb_label: e5.orb <= 1 ? "exact" : e5.orb <= 3 ? "tight" : "wide" })) } });
7825
7867
  }
7826
- function Ny(e4) {
7868
+ function By(e4) {
7827
7869
  var t2;
7828
7870
  let n2 = $ == null ? void 0 : $.inner.find((t3) => t3.name === e4.planet1), r2 = $ == null ? void 0 : $.outer.find((t3) => t3.name === e4.planet2), i2 = n2 ? Math.floor((n2.longitude % 360 + 360) % 360 / 30) : NaN, a2 = r2 ? Math.floor((r2.longitude % 360 + 360) % 360 / 30) : NaN, o2 = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"];
7829
- Ty({ type: "cross_aspect", data: { planet1: e4.planet1, wheel1: e4.wheel1, planet2: e4.planet2, wheel2: e4.wheel2, aspect_type: e4.type, orb: e4.orb, applying: e4.applying, planet1_sign: isNaN(i2) ? null : o2[i2], planet2_sign: isNaN(a2) ? null : o2[a2], mode: (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2 } });
7871
+ My({ type: "cross_aspect", data: { planet1: e4.planet1, wheel1: e4.wheel1, planet2: e4.planet2, wheel2: e4.wheel2, aspect_type: e4.type, orb: e4.orb, applying: e4.applying, planet1_sign: isNaN(i2) ? null : o2[i2], planet2_sign: isNaN(a2) ? null : o2[a2], mode: (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2 } });
7830
7872
  }
7831
- Yv.ontoolresult = (e4) => {
7832
- clearTimeout(Py);
7833
- let t2 = cy(e4);
7873
+ ty.ontoolresult = (e4) => {
7874
+ clearTimeout(Vy);
7875
+ let t2 = hy(e4);
7834
7876
  if (!t2) {
7835
- ay("Ask your AI assistant to generate a bi-wheel chart to get started.");
7877
+ fy("Ask your AI assistant to generate a bi-wheel chart to get started.");
7836
7878
  return;
7837
7879
  }
7838
- if (!Xv) {
7880
+ if (!ny) {
7839
7881
  var n2, r2, i2, a2;
7840
7882
  let e5 = (n2 = t2._birth_params_outer) == null ? {} : n2, o2 = (r2 = e5.datetime) == null ? "" : r2, s2 = (i2 = e5.location) == null ? "" : i2, c2 = (a2 = e5.timezone) == null ? "" : a2, l2 = e5.latitude, u2 = e5.longitude, d2 = "", f2 = "12:00";
7841
7883
  if (o2 && o2.includes("T")) {
7842
7884
  let e6 = o2.split("T");
7843
7885
  d2 = e6[0], f2 = e6[1].substring(0, 5);
7844
7886
  }
7845
- Xv = new Dv({ app: Yv, container: Jv, initialParams: { date: d2, time: f2, locationName: s2, timezone: c2, latitude: typeof l2 == "number" ? l2 : null, longitude: typeof u2 == "number" ? u2 : null }, showStepControls: t2.mode === "transit", onRefresh: async (e6) => {
7846
- Xv == null || Xv.setBusy(true), ry(), Jv.setAttribute("hidden", "");
7887
+ ny = new Nv({ app: ty, container: ey, initialParams: { date: d2, time: f2, locationName: s2, timezone: c2, latitude: typeof l2 == "number" ? l2 : null, longitude: typeof u2 == "number" ? u2 : null }, showStepControls: t2.mode === "transit", onRefresh: async (e6) => {
7888
+ ny == null || ny.setBusy(true), uy(), ey.setAttribute("hidden", "");
7847
7889
  try {
7848
7890
  var n3, r3, i3, a3, o3;
7849
- let s3 = "".concat(e6.date, "T").concat(e6.time, ":00"), c3 = new Promise((e7, t3) => setTimeout(() => t3(Error("Bi-wheel recalculate timed out after 30s")), 3e4)), l3 = cy(await Promise.race([Yv.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n3 = t2._birth_params_inner) == null ? void 0 : n3.datetime, person1_latitude: (r3 = t2._birth_params_inner) == null ? void 0 : r3.latitude, person1_longitude: (i3 = t2._birth_params_inner) == null ? void 0 : i3.longitude, person1_timezone: (a3 = t2._birth_params_inner) == null ? void 0 : a3.timezone, person1_name: (o3 = t2._birth_params_inner) == null ? void 0 : o3.location, person2_datetime: "".concat(s3).concat(e6.timezone ? "" : "Z"), person2_latitude: e6.latitude, person2_longitude: e6.longitude, person2_timezone: e6.timezone, person2_name: e6.locationName } }), c3]));
7850
- l3 ? Dy(l3) : $ && ny();
7891
+ let s3 = "".concat(e6.date, "T").concat(e6.time, ":00"), c3 = new Promise((e7, t3) => setTimeout(() => t3(Error("Bi-wheel recalculate timed out after 30s")), 3e4)), l3 = hy(await Promise.race([ty.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n3 = t2._birth_params_inner) == null ? void 0 : n3.datetime, person1_latitude: (r3 = t2._birth_params_inner) == null ? void 0 : r3.latitude, person1_longitude: (i3 = t2._birth_params_inner) == null ? void 0 : i3.longitude, person1_timezone: (a3 = t2._birth_params_inner) == null ? void 0 : a3.timezone, person1_name: (o3 = t2._birth_params_inner) == null ? void 0 : o3.location, person2_datetime: "".concat(s3).concat(e6.timezone ? "" : "Z"), person2_latitude: e6.latitude, person2_longitude: e6.longitude, person2_timezone: e6.timezone, person2_name: e6.locationName } }), c3]));
7892
+ l3 ? Py(l3) : $ && ly();
7851
7893
  } catch (e7) {
7852
- console.error("[BiWheel] Recalculate failed or timed out:", e7), $ && ny();
7894
+ console.error("[BiWheel] Recalculate failed or timed out:", e7), $ && ly();
7853
7895
  } finally {
7854
- Xv == null || Xv.setBusy(false), Jv.removeAttribute("hidden");
7896
+ ny == null || ny.setBusy(false), ey.removeAttribute("hidden");
7855
7897
  }
7856
7898
  } });
7857
7899
  }
7858
- Dy(t2), Jv.removeAttribute("hidden");
7900
+ Py(t2), ey.removeAttribute("hidden");
7859
7901
  };
7860
- var Py = setTimeout(() => {
7861
- Vv.hidden && ay("Chart data is taking longer than expected.", () => {
7862
- ty(), Py = setTimeout(() => {
7863
- Vv.hidden && ay("Still no response from the server. Please close and re-open the chart.");
7864
- }, 3e4), Yv.sendMessage({ role: "user", content: [{ type: "text", text: "Please regenerate the bi-wheel chart." }] });
7902
+ var Vy = setTimeout(() => {
7903
+ qv.hidden && fy("Chart data is taking longer than expected.", () => {
7904
+ cy(), Vy = setTimeout(() => {
7905
+ qv.hidden && fy("Still no response from the server. Please close and re-open the chart.");
7906
+ }, 3e4), ty.sendMessage({ role: "user", content: [{ type: "text", text: "Please regenerate the bi-wheel chart." }] });
7865
7907
  });
7866
7908
  }, 3e4);
7867
- ty(), Rv(Yv, { loadingEl: Hv, contentEl: Vv, statusFn: ey, paramControls: Xv }), (async () => {
7909
+ cy(), Wv(ty, { loadingEl: Jv, contentEl: qv, statusFn: sy, paramControls: ny }), (async () => {
7868
7910
  try {
7869
- await Yv.connect();
7870
- let e4 = Yv.getHostCapabilities();
7871
- Zv = !!(e4 != null && e4.modelContext), Qv = !!(e4 != null && e4.sampling), Lv(Yv, document.getElementById("pan-zoom-controls"), ["mode-badge", "aspect-filter", "param-controls-container", "chart-provenance", "bi-patterns-strip", "bi-action-bar"]), Bv(Yv);
7911
+ await ty.connect();
7912
+ let e4 = ty.getHostCapabilities();
7913
+ ry = !!(e4 != null && e4.modelContext), iy = !!(e4 != null && e4.sampling), Uv(ty, document.getElementById("pan-zoom-controls"), ["mode-badge", "aspect-filter", "param-controls-container", "chart-provenance", "bi-patterns-strip", "bi-action-bar"]), Kv(ty);
7872
7914
  } catch (e4) {
7873
7915
  console.error("[BiWheel] connect() failed:", e4);
7874
7916
  }