@openephemeris/mcp-server 4.18.0 → 4.20.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/index.js +8 -110
  3. package/dist/server-sse.js +7 -114
  4. package/dist/tools/apps/bazi-app.d.ts +1 -1
  5. package/dist/tools/apps/bazi-app.js +3 -2
  6. package/dist/tools/apps/bi-wheel-app.d.ts +1 -1
  7. package/dist/tools/apps/bi-wheel-app.js +3 -2
  8. package/dist/tools/apps/bodygraph-app.d.ts +7 -4
  9. package/dist/tools/apps/bodygraph-app.js +13 -5
  10. package/dist/tools/apps/chart-wheel-app.d.ts +1 -1
  11. package/dist/tools/apps/chart-wheel-app.js +3 -2
  12. package/dist/tools/apps/moon-phase-app.d.ts +1 -1
  13. package/dist/tools/apps/moon-phase-app.js +3 -2
  14. package/dist/tools/apps/transit-timeline-app.d.ts +1 -1
  15. package/dist/tools/apps/transit-timeline-app.js +3 -2
  16. package/dist/tools/apps/ui-resource.d.ts +43 -0
  17. package/dist/tools/apps/ui-resource.js +66 -0
  18. package/dist/tools/apps/ui-resources.d.ts +22 -0
  19. package/dist/tools/apps/ui-resources.js +105 -0
  20. package/dist/tools/apps/vedic-chart-app.d.ts +1 -1
  21. package/dist/tools/apps/vedic-chart-app.js +3 -2
  22. package/dist/tools/specialized/comparative.js +25 -23
  23. package/dist/tools/specialized/hd_cycles.js +22 -23
  24. package/dist/tools/specialized/progressed.js +5 -2
  25. package/dist/tools/specialized/relocation.js +5 -2
  26. package/dist/tools/visual.d.ts +15 -0
  27. package/dist/tools/visual.js +22 -0
  28. package/dist/ui/bazi.html +893 -856
  29. package/dist/ui/bi-wheel.html +555 -518
  30. package/dist/ui/bodygraph.html +433 -337
  31. package/dist/ui/chart-wheel.html +632 -595
  32. package/dist/ui/moon-phase.html +190 -155
  33. package/dist/ui/transit-timeline.html +865 -830
  34. package/dist/ui/vedic-chart.html +252 -215
  35. package/package.json +2 -1
@@ -1,7 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
3
  <head>
4
- <meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; font-src data:; connect-src 'none'" />
4
+ <meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; font-src data: https:; connect-src 'none'" />
5
5
  <meta charset="UTF-8" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <meta name="color-scheme" content="dark light" />
@@ -10,7 +10,7 @@
10
10
  <title>Bi-Wheel Explorer</title>
11
11
 
12
12
 
13
- <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:#bcb1ff;--xasp-opposition:#ff6e75;--xasp-trine:#43d5dc;--xasp-square:#ff8d65;--xasp-sextile:#56d298}@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 .730448 .687159 1.02381);--xasp-opposition:color(display-p3 .953229 .451236 .461586);--xasp-trine:color(display-p3 .442105 .822774 .854824);--xasp-square:color(display-p3 .972792 .553829 .385666);--xasp-sextile:color(display-p3 .475575 .814902 .613781)}}@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% -.109598 -6.65552);--text:lab(90.6942% -.142366 -2.26941);--text-secondary:lab(51.2352% -.205308 -3.76425);--gold:lab(67.5798% 11.9379 52.333);--gold-dim:lab(44.394% 5.21132 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.4334);--inner-tick:lab(49.7428% 19.7831 -40.5854);--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.96195 9.88836);--xasp-conjunction:lab(75.2424% 20.1278 -44.273);--xasp-opposition:lab(65.5258% 60.8412 27.879);--xasp-trine:lab(77.9637% -37.6085 -15.4651);--xasp-square:lab(70.8541% 47.9866 48.6079);--xasp-sextile:lab(76.3335% -46.3634 18.2498)}}*,: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:focus-visible{outline:2px solid var(--gold);outline-offset:2px;fill:var(--gold-subtle)}.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.4334/.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.4334/.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.5397 -28.3166);background:rgba(47,181,216,.1);background:color(display-p3 .359655 .701622 .832954/.1);background:lab(68.1219% -27.5397 -28.3166/.1)}.tally-item.water{color:#7792ee;color:color(display-p3 .487398 .569622 .908946);color:lab(61.5869% 9.51824 -50.2978);background:rgba(119,146,238,.1);background:color(display-p3 .487398 .569622 .908946/.1);background:lab(61.5869% 9.51824 -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.5397 -28.3166)}.tally-bar-fill.water{background:#7792ee;background:color(display-p3 .487398 .569622 .908946);background:lab(61.5869% 9.51824 -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)}:root[data-theme=light]{--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[data-theme=light]{--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[data-theme=light]{--bg:lab(96.5376% .34079 2.2589);--surface:lab(100% 0 0);--surface-2:lab(94.2232% .459701 3.01524);--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% -.210062 -4.49808);--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.22041 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.5493);--inner-stroke:lab(61.7097% 15.1373 -34.1532);--inner-glyph:lab(24.6169% 28.6686 -46.7313);--inner-tick:lab(38.0413% 20.9664 -40.377);--outer-ring:lab(95.394% .703841 4.5323);--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)}}:root[data-theme=light],:root[data-theme=light] body{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background-image:none}:root[data-theme=light] .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)}:root[data-theme=light] .tooltip-title{color:var(--text)}:root[data-theme=light] .tooltip-detail{color:var(--text-secondary)}:root[data-theme=light] .tooltip-hint{color:var(--gold-dim)}:root[data-theme=light] .chart-status{color:var(--gold);background:rgba(247,245,241,.92);background:color(display-p3 .967616 .959866 .945308/.92);background:lab(96.5376% .34079 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)}:root[data-theme=light] .chart-provenance{background:var(--surface)}:root[data-theme=light] .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)}:root[data-theme=light] .pan-btn{background:var(--surface)}:root[data-theme=light] .pan-btn:hover{background:var(--surface-2)}:root[data-theme=light] #fs-bottom-bar{background:#f7f5f1;background:color(display-p3 .967616 .959866 .945308);background:lab(96.5376% .34079 2.2589);border-top-color:#caced4;border-top-color:color(display-p3 .796183 .806346 .830691);border-top-color:lab(82.5562% -.22167 -3.77336)}:root[data-theme=light] #fs-bottom-bar [data-column=left],:root[data-theme=light] #fs-bottom-bar [data-column=right]{background:#f1eeea;background:color(display-p3 .941472 .933762 .919279);background:lab(94.2176% .341028 2.25905)}:root[data-theme=light] #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)}:root[data-theme=light] #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)}:root[data-theme=light] #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)}:root[data-theme=light] .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:5px}.pan-btn{background:color-mix(in oklab, var(--surface-2) 72%, transparent);-webkit-backdrop-filter:blur(6px);width:32px;min-width:32px;height:32px;min-height:32px;font-size:15px}.pan-btn.reset{width:32px;padding:0;font-size:0}.pan-btn.reset:before{content:"⟲";font-size:15px}.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,.loc-item--active{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-cost-hint{color:var(--text-secondary);white-space:nowrap;letter-spacing:.02em;font-size:10px}.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}.param-extra-toggle{color:var(--text-secondary);white-space:nowrap;letter-spacing:.02em;cursor:pointer;align-items:center;gap:5px;font-size:10px;display:flex}.param-extra-toggle input[type=checkbox]{width:13px;height:13px;accent-color:var(--gold,oklch(72% .12 80));cursor:pointer}.param-extra-toggle input[type=checkbox]:disabled{cursor:not-allowed}.param-extra-toggle input[type=checkbox]:disabled~span{opacity:.5}:root[data-theme=light] .param-group input[type=date],:root[data-theme=light] .param-group input[type=time],:root[data-theme=light] .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% .167638 1.12768)}:root[data-theme=light] .loc-suggestions{border-color:var(--border-strong);background:#fdfcf9;background:color(display-p3 .990365 .986474 .97916);background:lab(98.849% .167638 1.12768)}:root[data-theme=light] .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)}:root[data-theme=light] .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}
13
+ <style>:root{--bg:#010102;--surface:#030408;--surface-2:#080b11;--border:#13161d;--border-strong:#242933;--text:#e2e4e9;--text-secondary:#a1a5ab;--muted:#84868b;--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;--oe-shadow-md:0 8px 40px rgba(0,0,0,.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 28px rgba(204,156,66,.15), 0 0 0 1px rgba(204,156,66,.2);--font-ui:var(--font-sans,system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif);--font-code:var(--font-mono,ui-monospace, "SFMono-Regular", "Cascadia Mono", Menlo, Consolas, monospace);--oe-page-bg:var(--color-background-primary,var(--bg));--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@supports (color:color(display-p3 0 0 0)){:root{--bg:color(display-p3 .00306656 .00431968 .00888397);--surface:color(display-p3 .013072 .016989 .0298495);--surface-2:color(display-p3 .0345774 .0431759 .0653236);--border:color(display-p3 .0763929 .0859556 .109705);--border-strong:color(display-p3 .144788 .159634 .196542);--text:color(display-p3 .889546 .895785 .910689);--text-secondary:color(display-p3 .635245 .644982 .668335);--muted:color(display-p3 .518127 .525635 .543633);--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);--oe-shadow-md:0 8px 40px color(display-p3 0 0 0/.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 28px color(display-p3 .76996 .617341 .321369/.15), 0 0 0 1px color(display-p3 .76996 .617341 .321369/.2)}}@supports (color:lab(0% 0 0)){:root{--bg:lab(.302122% .0219196 -.522962);--surface:lab(1.18159% .0276566 -1.4848);--surface-2:lab(3.00584% .0228807 -3.15676);--border:lab(7.15581% -.0557452 -5.11242);--border-strong:lab(16.3712% -.0768155 -7.37782);--text:lab(90.6942% -.142366 -2.26941);--text-secondary:lab(67.4758% -.215352 -3.76978);--muted:lab(55.8848% -.174642 -3.01716);--gold:lab(67.5798% 11.9379 52.333);--gold-dim:lab(44.394% 5.21132 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);--oe-shadow-md:0 8px 40px lab(0% 0 0/.65), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 28px lab(67.5798% 11.9379 52.333/.15), 0 0 0 1px lab(67.5798% 11.9379 52.333/.2)}}:root[data-theme=light]{--bg:#f4f5f8;--surface:#fbfcfe;--surface-2:#eceef3;--border:#d5d7dd;--border-strong:#babec6;--text:#181b1f;--text-secondary:#4a4d54;--muted:#606369;--gold:#8a6000;--gold-dim:#967c4f;--gold-glow:rgba(141,95,0,.25);--gold-subtle:rgba(141,95,0,.07);--success:#007145;--error:#b1002b;--oe-shadow-md:0 4px 24px rgba(0,0,0,.12), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 16px rgba(141,95,0,.18), 0 0 0 1px rgba(141,95,0,.22);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@supports (color:color(display-p3 0 0 0)){:root[data-theme=light]{--bg:color(display-p3 .956515 .960735 .970805);--surface:color(display-p3 .98376 .986943 .994535);--surface-2:color(display-p3 .928401 .934691 .949715);--border:color(display-p3 .836244 .844458 .864107);--border-strong:color(display-p3 .731542 .743532 .772301);--text:color(display-p3 .096883 .103987 .12134);--text-secondary:color(display-p3 .291758 .301882 .326359);--muted:color(display-p3 .379924 .388781 .410092);--gold:color(display-p3 .524671 .380491 .0387678);--gold-dim:color(display-p3 .572756 .489268 .332751);--gold-glow:color(display-p3 .542549 .371783 -.107551/.25);--gold-subtle:color(display-p3 .542549 .371783 -.107551/.07);--success:color(display-p3 -.0793084 .456092 .255685);--error:color(display-p3 .642198 .101724 .18242);--oe-shadow-md:0 4px 24px color(display-p3 0 0 0/.12), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 16px color(display-p3 .542549 .371783 -.107551/.18), 0 0 0 1px color(display-p3 .542549 .371783 -.107551/.22)}}@supports (color:lab(0% 0 0)){:root[data-theme=light]{--bg:lab(96.503% -.0977516 -1.51461);--surface:lab(98.8273% -.0742674 -1.13657);--surface-2:lab(94.1743% -.142753 -2.26963);--border:lab(86.0453% -.183702 -3.02233);--border-strong:lab(76.7468% -.254452 -4.52154);--text:lab(9.4703% -.119448 -3.722);--text-secondary:lab(32.6639% -.205323 -4.4957);--muted:lab(41.9548% -.197023 -3.7598);--gold:lab(44.2758% 13.6718 62.9124);--gold-dim:lab(53.685% 6.10271 28.558);--gold-glow:lab(44.1995% 17.0662 84.3373/.25);--gold-subtle:lab(44.1995% 17.0662 84.3373/.07);--success:lab(41.7514% -55.3249 21.5039);--error:lab(37.5238% 64.2774 32.6097);--oe-shadow-md:0 4px 24px lab(0% 0 0/.12), 0 0 0 1px var(--border-strong);--shadow-gold:0 0 16px lab(44.1995% 17.0662 84.3373/.18), 0 0 0 1px lab(44.1995% 17.0662 84.3373/.22)}}:root{--safe-top:0px;--safe-right:0px;--safe-bottom:0px;--safe-left:0px;--oe-host-h:var(--host-height,var(--host-max-height,640px));--oe-chart-max:clamp(260px, calc(var(--oe-host-h) * .72), 560px);--oe-chart-max-lg:clamp(280px, calc(var(--oe-host-h) * .8), 720px);--oe-drawer-max:clamp(160px, calc(var(--oe-host-h) * .4), 360px);--oe-scroll-max:clamp(240px, calc(var(--oe-host-h) * .7), 560px)}html,body{font-family:var(--font-ui)}body{background-color:var(--oe-page-bg)}.oe-pannable{touch-action:pan-y}body.is-fullscreen .oe-pannable{touch-action:none}.pan-zoom-controls [hidden],.pan-btn[hidden]{display:none!important}.fs-hint-banner{top:calc(12px + var(--safe-top));z-index:9999;border-radius:var(--radius-pill);border:1px solid color-mix(in oklab, var(--gold) 35%, transparent);background:color-mix(in oklab, var(--surface-2) 92%, transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);max-width:calc(100% - 32px);color:var(--text);font:600 11px/1.4 var(--font-ui);letter-spacing:.04em;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;opacity:0;padding:6px 16px;transition:opacity .3s;position:fixed;left:50%;overflow:hidden;transform:translate(-50%)}.fs-hint-banner.visible{opacity:1}@media (prefers-reduced-motion:reduce){.fs-hint-banner{transition:none}}body.is-fullscreen{height:100vh;height:100dvh;overflow:hidden}body.is-fullscreen #app{width:100%;max-width:none;height:100%;min-height:0;padding:var(--safe-top) var(--safe-right) var(--safe-bottom) var(--safe-left);flex-direction:column;gap:0;margin:0;display:flex;overflow:hidden}body.is-fullscreen #app:has(>#fs-bottom-bar){padding-bottom:0}body.is-fullscreen #app .oe-stage{aspect-ratio:auto;width:100%;max-width:none;height:auto;min-height:0;max-height:none;box-shadow:none;background:0 0;border:0;border-radius:0;flex:auto;justify-content:center;align-items:center;margin:0;padding:16px 24px 8px;display:flex;overflow:hidden}body.is-fullscreen #app .oe-stage>svg{width:auto;max-width:100%;height:100%;max-height:100%}body.is-fullscreen #app .oe-stage--doc{width:100%;max-width:880px;padding:20px 24px calc(16px + var(--safe-bottom));flex-direction:column;justify-content:flex-start;align-items:stretch;margin:0 auto;display:flex;overflow-y:auto}body.is-fullscreen #app #loading-state{flex:1;height:auto;min-height:0}body.is-fullscreen #app .pan-zoom-controls{top:calc(54px + var(--safe-top));right:calc(12px + var(--safe-right));bottom:auto}body .oe-info-button{top:calc(12px + var(--safe-top));right:calc(12px + var(--safe-right))}#app #fs-bottom-bar{height:clamp(170px, calc(var(--oe-host-h) * .3), 280px);padding-bottom:var(--safe-bottom);border-top:1px solid var(--border);background:var(--surface);flex-shrink:0;grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(200px,260px) minmax(0,1fr) minmax(200px,260px);display:grid}:root[data-safe-bottom] #app #fs-bottom-bar{height:calc(clamp(170px, calc(var(--oe-host-h) * .3), 280px) + var(--safe-bottom));grid-template-columns:minmax(0,1fr) minmax(0,1fr)}:root[data-safe-bottom] #fs-bottom-bar [data-column=center]{display:none}#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;min-height:0;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=right]{border-left:1px solid var(--border)}#fs-bottom-bar [data-column=center]{pointer-events:none}#fs-bottom-bar [data-column]>*+*{border-top:1px solid var(--border);margin-top:4px;padding-top:8px}#fs-bottom-bar [class$=-action-bar],#fs-bottom-bar [class*=-action-bar\ ]{flex-direction:column;padding:8px 0 0}#fs-bottom-bar .action-btn{justify-content:center;width:100%}@media (max-width:640px){#app #fs-bottom-bar,:root[data-safe-bottom] #app #fs-bottom-bar{height:auto;max-height:42%;display:block;overflow-y:auto}#fs-bottom-bar [data-column=center]{display:none}#fs-bottom-bar [data-column=left],#fs-bottom-bar [data-column=right]{border:0;min-height:auto;overflow:visible}#fs-bottom-bar [data-column=right]{border-top:1px solid var(--border)}body.is-fullscreen #app .oe-stage{padding:8px}}body.is-pip{overflow:hidden}body.is-pip #app{gap:6px;padding:6px 8px}body.is-pip .oe-pip-hide,body.is-pip #param-controls-container,body.is-pip #chart-status,body.is-pip .oe-info-button{display:none!important}body.is-pip #app .pan-zoom-controls{top:6px;right:6px}:root{--on-gold:#0d0802;--shadow:0 4px 20px rgba(0,0,0,.45);--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:#bcb1ff;--xasp-opposition:#ff6e75;--xasp-trine:#43d5dc;--xasp-square:#ff8d65;--xasp-sextile:#56d298}@supports (color:color(display-p3 0 0 0)){:root{--on-gold:color(display-p3 .0492866 .0328715 .0111297);--shadow:0 4px 20px color(display-p3 0 0 0/.45);--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 .730448 .687159 1.02381);--xasp-opposition:color(display-p3 .953229 .451236 .461586);--xasp-trine:color(display-p3 .442105 .822774 .854824);--xasp-square:color(display-p3 .972792 .553829 .385666);--xasp-sextile:color(display-p3 .475575 .814902 .613781)}}@supports (color:lab(0% 0 0)){:root{--on-gold:lab(2.4863% .883393 2.81807);--shadow:0 4px 20px lab(0% 0 0/.45);--inner-glyph:lab(65.7597% 22.6847 -47.4334);--inner-tick:lab(49.7428% 19.7831 -40.5854);--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.96195 9.88836);--xasp-conjunction:lab(75.2424% 20.1278 -44.273);--xasp-opposition:lab(65.5258% 60.8412 27.879);--xasp-trine:lab(77.9637% -37.6085 -15.4651);--xasp-square:lab(70.8541% 47.9866 48.6079);--xasp-sextile:lab(76.3335% -46.3634 18.2498)}}*,: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(--oe-page-bg);color:var(--text);font-family:var(--font-ui);-webkit-user-select:none;-moz-user-select:none;user-select:none;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{width:min(100%, var(--oe-chart-max));aspect-ratio:1;justify-content:center;align-items:center;margin-left:auto;margin-right:auto;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;overflow:hidden}#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:focus-visible{outline:2px solid var(--gold);outline-offset:2px;fill:var(--gold-subtle)}.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(--oe-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{max-height:var(--oe-drawer-max);opacity:1;pointer-events:all;scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent;flex-shrink:0;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);font-size:11px;font-weight:400;font-family:var(--font-code);margin-top:2px}.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.4334/.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.4334/.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-size:11px;font-family:var(--font-code)}.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);font-family:var(--font-ui);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-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}@media (min-width:680px){body:not(.is-fullscreen):not(.is-pip) #chart-container{overflow:visible}body:not(.is-fullscreen):not(.is-pip) #chart-container>.pan-zoom-controls{right:-60px}}.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(--oe-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 #bi-info-drawer{display:none}#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}.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(--oe-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);font-family:var(--font-ui);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-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.5397 -28.3166);background:rgba(47,181,216,.1);background:color(display-p3 .359655 .701622 .832954/.1);background:lab(68.1219% -27.5397 -28.3166/.1)}.tally-item.water{color:#7792ee;color:color(display-p3 .487398 .569622 .908946);color:lab(61.5869% 9.51824 -50.2978);background:rgba(119,146,238,.1);background:color(display-p3 .487398 .569622 .908946/.1);background:lab(61.5869% 9.51824 -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.5397 -28.3166)}.tally-bar-fill.water{background:#7792ee;background:color(display-p3 .487398 .569622 .908946);background:lab(61.5869% 9.51824 -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)}:root[data-theme=light]{--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);--oe-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[data-theme=light]{--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);--oe-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[data-theme=light]{--bg:lab(96.5376% .34079 2.2589);--surface:lab(100% 0 0);--surface-2:lab(94.2232% .459701 3.01524);--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% -.210062 -4.49808);--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.22041 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);--oe-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.5493);--inner-stroke:lab(61.7097% 15.1373 -34.1532);--inner-glyph:lab(24.6169% 28.6686 -46.7313);--inner-tick:lab(38.0413% 20.9664 -40.377);--outer-ring:lab(95.394% .703841 4.5323);--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)}}:root[data-theme=light],:root[data-theme=light] body{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background-image:none}:root[data-theme=light] .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)}:root[data-theme=light] .tooltip-title{color:var(--text)}:root[data-theme=light] .tooltip-detail{color:var(--text-secondary)}:root[data-theme=light] .tooltip-hint{color:var(--gold-dim)}:root[data-theme=light] .chart-status{color:var(--gold);background:rgba(247,245,241,.92);background:color(display-p3 .967616 .959866 .945308/.92);background:lab(96.5376% .34079 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)}:root[data-theme=light] .chart-provenance{background:var(--surface)}:root[data-theme=light] .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)}:root[data-theme=light] .pan-btn{background:var(--surface)}:root[data-theme=light] .pan-btn:hover{background:var(--surface-2)}:root[data-theme=light] .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:5px}.pan-btn{background:color-mix(in oklab, var(--surface-2) 72%, transparent);-webkit-backdrop-filter:blur(6px);width:32px;min-width:32px;height:32px;min-height:32px;font-size:15px}.pan-btn.reset{width:32px;padding:0;font-size:0}.pan-btn.reset:before{content:"⟲";font-size:15px}.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,.loc-item--active{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-cost-hint{color:var(--text-secondary);white-space:nowrap;letter-spacing:.02em;font-size:10px}.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}.param-extra-toggle{color:var(--text-secondary);white-space:nowrap;letter-spacing:.02em;cursor:pointer;align-items:center;gap:5px;font-size:10px;display:flex}.param-extra-toggle input[type=checkbox]{width:13px;height:13px;accent-color:var(--gold,oklch(72% .12 80));cursor:pointer}.param-extra-toggle input[type=checkbox]:disabled{cursor:not-allowed}.param-extra-toggle input[type=checkbox]:disabled~span{opacity:.5}:root[data-theme=light] .param-group input[type=date],:root[data-theme=light] .param-group input[type=time],:root[data-theme=light] .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% .167638 1.12768)}:root[data-theme=light] .loc-suggestions{border-color:var(--border-strong);background:#fdfcf9;background:color(display-p3 .990365 .986474 .97916);background:lab(98.849% .167638 1.12768)}:root[data-theme=light] .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)}:root[data-theme=light] .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-family:var(--font-code,ui-monospace, "Cascadia Mono", Menlo, Consolas, monospace);font-variant-numeric:tabular-nums;color:var(--text-secondary);align-items:baseline;gap:4px;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}
14
14
  /*$vite$:1*/</style>
15
15
  </head>
16
16
  <body>
@@ -20,7 +20,7 @@
20
20
  <p>Aligning two skies…</p>
21
21
  </div>
22
22
  <div id="chart-status" class="chart-status" aria-live="polite"></div>
23
- <div id="chart-container" hidden>
23
+ <div id="chart-container" class="oe-stage" hidden>
24
24
  <div id="pan-zoom-controls" class="pan-zoom-controls" hidden>
25
25
  <button id="btn-zoom-in" class="pan-btn" aria-label="Zoom in">+</button>
26
26
  <button id="btn-zoom-out" class="pan-btn" aria-label="Zoom out">-</button>
@@ -6329,7 +6329,15 @@ async function n_(e5, t2, n2 = "") {
6329
6329
  }
6330
6330
  return r2.value;
6331
6331
  }
6332
- var r_ = class e3 extends Og {
6332
+ function r_(e5, t2 = document.documentElement) {
6333
+ for (let [n2, r2] of Object.entries(e5)) r2 !== void 0 && t2.style.setProperty(n2, r2);
6334
+ }
6335
+ function i_(e5) {
6336
+ if (document.getElementById("__mcp-host-fonts")) return;
6337
+ let t2 = document.createElement("style");
6338
+ t2.id = "__mcp-host-fonts", t2.textContent = e5, document.head.appendChild(t2);
6339
+ }
6340
+ var a_ = class e3 extends Og {
6333
6341
  _assertInitialized(e5) {
6334
6342
  var t2;
6335
6343
  if (this._initializedSent) return;
@@ -6561,66 +6569,68 @@ var r_ = class e3 extends Og {
6561
6569
  }
6562
6570
  }
6563
6571
  };
6564
- o(r_, "ONE_SHOT_EVENTS", /* @__PURE__ */ new Set(["toolinput", "toolinputpartial", "toolresult", "toolcancelled"]));
6565
- function i_(e5, t2) {
6572
+ o(a_, "ONE_SHOT_EVENTS", /* @__PURE__ */ new Set(["toolinput", "toolinputpartial", "toolresult", "toolcancelled"]));
6573
+ function o_(e5, t2) {
6566
6574
  var n2, r2, i2, a2, o2, s2;
6567
6575
  let c2 = document.getElementById(t2), l2 = c2 == null ? void 0 : c2.querySelector("#btn-zoom-in"), u2 = c2 == null ? void 0 : c2.querySelector("#btn-zoom-out"), d2 = c2 == null ? void 0 : c2.querySelector("#btn-reset-view");
6568
6576
  c2 && (c2.hidden = false);
6569
6577
  let f2 = (n2 = (r2 = e5.getAttribute("viewBox")) == null ? void 0 : r2.split(/[\s,]+/).map(Number)) == null ? [0, 0, 500, 500] : n2, p2 = (i2 = f2[0]) == null ? 0 : i2, m2 = (a2 = f2[1]) == null ? 0 : a2, h2 = (o2 = f2[2]) == null ? 500 : o2, g2 = (s2 = f2[3]) == null ? 500 : s2, _2 = h2 / 5, v2 = h2 * 2, y2 = p2, b2 = m2, x2 = h2, S2 = g2;
6570
- e5.style.touchAction = "none";
6571
- let ee2 = () => e5.setAttribute("viewBox", "".concat(y2, " ").concat(b2, " ").concat(x2, " ").concat(S2)), C2 = (e6, t3, n3) => {
6578
+ e5.classList.add("oe-pannable");
6579
+ let ee2 = () => document.body.classList.contains("is-fullscreen"), C2 = () => e5.setAttribute("viewBox", "".concat(y2, " ").concat(b2, " ").concat(x2, " ").concat(S2)), te2 = (e6, t3, n3) => {
6572
6580
  t3 === void 0 && (t3 = y2 + x2 / 2), n3 === void 0 && (n3 = b2 + S2 / 2);
6573
6581
  let r3 = x2 * e6;
6574
- r3 < _2 && (r3 = _2), r3 > v2 && (r3 = v2), r3 !== x2 && (e6 = r3 / x2, y2 = t3 - (t3 - y2) * e6, b2 = n3 - (n3 - b2) * e6, x2 = r3, S2 *= e6, ee2());
6582
+ r3 < _2 && (r3 = _2), r3 > v2 && (r3 = v2), r3 !== x2 && (e6 = r3 / x2, y2 = t3 - (t3 - y2) * e6, b2 = n3 - (n3 - b2) * e6, x2 = r3, S2 *= e6, C2());
6575
6583
  };
6576
- l2 == null || l2.addEventListener("click", () => C2(0.8)), u2 == null || u2.addEventListener("click", () => C2(1.25)), d2 == null || d2.addEventListener("click", () => {
6577
- y2 = p2, b2 = m2, x2 = h2, S2 = g2, ee2();
6584
+ l2 == null || l2.addEventListener("click", () => te2(0.8)), u2 == null || u2.addEventListener("click", () => te2(1.25)), d2 == null || d2.addEventListener("click", () => {
6585
+ y2 = p2, b2 = m2, x2 = h2, S2 = g2, C2();
6578
6586
  });
6579
- let te2 = (t3, n3) => {
6587
+ let w2 = (t3, n3) => {
6580
6588
  let r3 = e5.getBoundingClientRect();
6581
6589
  return { x: y2 + (t3 - r3.left) / r3.width * x2, y: b2 + (n3 - r3.top) / r3.height * S2 };
6582
6590
  };
6583
6591
  e5.addEventListener("wheel", (e6) => {
6592
+ if (!ee2() && !e6.ctrlKey && !e6.metaKey) return;
6584
6593
  e6.preventDefault();
6585
- let t3 = Math.exp((e6.deltaY < 0 ? -1 : 1) * 0.1), n3 = te2(e6.clientX, e6.clientY);
6586
- C2(t3, n3.x, n3.y);
6594
+ let t3 = Math.exp((e6.deltaY < 0 ? -1 : 1) * 0.1), n3 = w2(e6.clientX, e6.clientY);
6595
+ te2(t3, n3.x, n3.y);
6587
6596
  }, { passive: false });
6588
- let w2 = /* @__PURE__ */ new Map(), T2 = null, E2 = () => {
6589
- let [e6, t3] = [...w2.values()];
6597
+ let T2 = /* @__PURE__ */ new Map(), E2 = null, ne2 = () => {
6598
+ let [e6, t3] = [...T2.values()];
6590
6599
  return { dist: Math.hypot(e6.x - t3.x, e6.y - t3.y), midX: (e6.x + t3.x) / 2, midY: (e6.y + t3.y) / 2 };
6591
- }, ne2 = (t3, n3) => {
6600
+ }, re2 = (t3, n3) => {
6592
6601
  let r3 = e5.getBoundingClientRect();
6593
- y2 -= t3 / r3.width * x2, b2 -= n3 / r3.height * S2, ee2();
6602
+ y2 -= t3 / r3.width * x2, b2 -= n3 / r3.height * S2, C2();
6594
6603
  };
6595
6604
  e5.addEventListener("pointerdown", (t3) => {
6605
+ if (t3.pointerType === "touch" && !ee2()) return;
6596
6606
  let n3 = t3.target, r3 = !!(n3.closest && (n3.closest('[class*="-hit"]') || n3.closest('[class*="-activation"]') || n3.closest(".variable-arrow") || n3.closest("button")));
6597
- w2.set(t3.pointerId, { x: t3.clientX, y: t3.clientY, interactive: r3 }), r3 || (e5.setPointerCapture(t3.pointerId), e5.style.cursor = "grabbing"), w2.size === 2 && (T2 = E2());
6607
+ T2.set(t3.pointerId, { x: t3.clientX, y: t3.clientY, interactive: r3 }), r3 || (e5.setPointerCapture(t3.pointerId), e5.style.cursor = "grabbing"), T2.size === 2 && (E2 = ne2());
6598
6608
  }), e5.addEventListener("pointermove", (e6) => {
6599
- let t3 = w2.get(e6.pointerId);
6600
- if (t3) if (w2.set(e6.pointerId, { x: e6.clientX, y: e6.clientY, interactive: t3.interactive }), w2.size >= 2 && T2) {
6601
- let e7 = E2();
6602
- if (T2.dist > 0 && e7.dist > 0) {
6603
- let t4 = te2(e7.midX, e7.midY);
6604
- C2(T2.dist / e7.dist, t4.x, t4.y);
6605
- }
6606
- ne2(e7.midX - T2.midX, e7.midY - T2.midY), T2 = e7;
6607
- } else w2.size === 1 && !t3.interactive && ne2(e6.clientX - t3.x, e6.clientY - t3.y);
6609
+ let t3 = T2.get(e6.pointerId);
6610
+ if (t3) if (T2.set(e6.pointerId, { x: e6.clientX, y: e6.clientY, interactive: t3.interactive }), T2.size >= 2 && E2) {
6611
+ let e7 = ne2();
6612
+ if (E2.dist > 0 && e7.dist > 0) {
6613
+ let t4 = w2(e7.midX, e7.midY);
6614
+ te2(E2.dist / e7.dist, t4.x, t4.y);
6615
+ }
6616
+ re2(e7.midX - E2.midX, e7.midY - E2.midY), E2 = e7;
6617
+ } else T2.size === 1 && !t3.interactive && re2(e6.clientX - t3.x, e6.clientY - t3.y);
6608
6618
  });
6609
- let re2 = (t3) => {
6610
- w2.delete(t3.pointerId) && (e5.hasPointerCapture(t3.pointerId) && e5.releasePointerCapture(t3.pointerId), T2 = w2.size >= 2 ? E2() : null, w2.size === 0 && (e5.style.cursor = "default"));
6619
+ let D2 = (t3) => {
6620
+ T2.delete(t3.pointerId) && (e5.hasPointerCapture(t3.pointerId) && e5.releasePointerCapture(t3.pointerId), E2 = T2.size >= 2 ? ne2() : null, T2.size === 0 && (e5.style.cursor = "default"));
6611
6621
  };
6612
- e5.addEventListener("pointerup", re2), e5.addEventListener("pointercancel", re2);
6622
+ e5.addEventListener("pointerup", D2), e5.addEventListener("pointercancel", D2);
6613
6623
  }
6614
- var a_ = '"Segoe UI Symbol", "Noto Sans Symbols", "Noto Sans Symbols2", "Apple Symbols", "DejaVu Sans", serif', o_ = { background: "#1b1b1d", foreground: "#f7f3f0", dim: "#6f7580", fire: "#d9506f", earth: "#22a67a", air: "#dcb238", water: "#3f93c2", points: "#2f89ab", others: "#d69a3a", house: "#7a8695", transit: "#c19bf2", fireTint: "rgba(217,80,111,0.20)", earthTint: "rgba(34,166,122,0.20)", airTint: "rgba(220,178,56,0.20)", waterTint: "rgba(63,147,194,0.20)", zodiacFillOpacity: 0.34, houseFillOpacity: 0.1, houseStrokeOpacity: 0.45 }, s_ = { background: "#fffdf1", foreground: "#0b1220", dim: "#6b5c4a", fire: "#c9456f", earth: "#1f9968", air: "#c9a23c", water: "#1f7fa3", points: "#1f6f96", others: "#c9903f", house: "#6f8496", transit: "#7b3fb5", fireTint: "rgba(201,69,111,0.34)", earthTint: "rgba(31,153,104,0.34)", airTint: "rgba(201,162,60,0.38)", waterTint: "rgba(31,127,163,0.34)", zodiacFillOpacity: 0.48, houseFillOpacity: 0.2, houseStrokeOpacity: 0.95 };
6615
- function c_(e5) {
6616
- return e5 ? o_ : s_;
6624
+ var s_ = '"Segoe UI Symbol", "Noto Sans Symbols", "Noto Sans Symbols2", "Apple Symbols", "DejaVu Sans", serif', c_ = { background: "#1b1b1d", foreground: "#f7f3f0", dim: "#6f7580", fire: "#d9506f", earth: "#22a67a", air: "#dcb238", water: "#3f93c2", points: "#2f89ab", others: "#d69a3a", house: "#7a8695", transit: "#c19bf2", fireTint: "rgba(217,80,111,0.20)", earthTint: "rgba(34,166,122,0.20)", airTint: "rgba(220,178,56,0.20)", waterTint: "rgba(63,147,194,0.20)", zodiacFillOpacity: 0.34, houseFillOpacity: 0.1, houseStrokeOpacity: 0.45 }, l_ = { background: "#fffdf1", foreground: "#0b1220", dim: "#6b5c4a", fire: "#c9456f", earth: "#1f9968", air: "#c9a23c", water: "#1f7fa3", points: "#1f6f96", others: "#c9903f", house: "#6f8496", transit: "#7b3fb5", fireTint: "rgba(201,69,111,0.34)", earthTint: "rgba(31,153,104,0.34)", airTint: "rgba(201,162,60,0.38)", waterTint: "rgba(31,127,163,0.34)", zodiacFillOpacity: 0.48, houseFillOpacity: 0.2, houseStrokeOpacity: 0.95 };
6625
+ function u_(e5) {
6626
+ return e5 ? c_ : l_;
6617
6627
  }
6618
- function l_(e5, t2) {
6619
- let n2 = c_(t2);
6628
+ function d_(e5, t2) {
6629
+ let n2 = u_(t2);
6620
6630
  return [n2.fire, n2.earth, n2.air, n2.water][(e5 % 12 + 12) % 12 % 4];
6621
6631
  }
6622
- function u_(e5, t2) {
6623
- let n2 = c_(t2);
6632
+ function f_(e5, t2) {
6633
+ let n2 = u_(t2);
6624
6634
  switch (e5.toLowerCase()) {
6625
6635
  case "conjunction":
6626
6636
  return n2.others;
@@ -6635,72 +6645,72 @@ function u_(e5, t2) {
6635
6645
  return n2.house;
6636
6646
  }
6637
6647
  }
6638
- function d_(e5) {
6639
- let t2 = c_(e5);
6648
+ function p_(e5) {
6649
+ let t2 = u_(e5);
6640
6650
  return { ring: { stroke: t2.dim, opacity: 0.85 }, cuspIntermediate: { stroke: t2.dim, opacity: 0.85 }, cuspAngular: { stroke: t2.foreground, opacity: 0.75 }, tickMajor: { stroke: t2.foreground, opacity: 0.73 }, tickMinor: { stroke: t2.foreground, opacity: 0.48 }, cuspDash: (e6) => "".concat((e6 * 1.5).toFixed(2), " ").concat((e6 * 3).toFixed(2)), center: e5 ? t2.background : "#efeae1" };
6641
6651
  }
6642
- var f_;
6643
- function p_() {
6644
- return f_ ? f_ === "dark" : window.matchMedia("(prefers-color-scheme: dark)").matches;
6652
+ var m_;
6653
+ function h_() {
6654
+ return m_ ? m_ === "dark" : window.matchMedia("(prefers-color-scheme: dark)").matches;
6645
6655
  }
6646
- function m_(e5 = p_()) {
6656
+ function g_(e5 = h_()) {
6647
6657
  let t2 = e5 ? "dark" : "light";
6648
6658
  return document.documentElement.setAttribute("data-theme", t2), t2;
6649
6659
  }
6650
- function h_(e5) {
6651
- m_();
6660
+ function __(e5) {
6661
+ g_();
6652
6662
  try {
6653
6663
  window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (t2) => {
6654
- f_ || e5 == null || e5(m_(t2.matches));
6664
+ m_ || e5 == null || e5(g_(t2.matches));
6655
6665
  });
6656
6666
  } catch (e6) {
6657
6667
  }
6658
6668
  }
6659
- function g_(e5, t2) {
6669
+ function v_(e5, t2) {
6660
6670
  var n2, r2;
6661
6671
  let i2 = (e6) => {
6662
6672
  let n3 = e6 == null ? void 0 : e6.theme;
6663
6673
  if (n3 !== "light" && n3 !== "dark") return;
6664
- f_ = n3;
6665
- let r3 = document.documentElement.getAttribute("data-theme"), i3 = m_(n3 === "dark");
6674
+ m_ = n3;
6675
+ let r3 = document.documentElement.getAttribute("data-theme"), i3 = g_(n3 === "dark");
6666
6676
  i3 !== r3 && (t2 == null || t2(i3));
6667
6677
  };
6668
6678
  (n2 = e5.addEventListener) == null || n2.call(e5, "hostcontextchanged", i2), i2((r2 = e5.getHostContext) == null ? void 0 : r2.call(e5));
6669
6679
  }
6670
- function __(e5, t2) {
6680
+ function y_(e5, t2) {
6671
6681
  if (e5.length <= 1) {
6672
6682
  let t3 = /* @__PURE__ */ new Map();
6673
6683
  for (let n3 of e5) t3.set(n3.name, n3.longitude);
6674
6684
  return t3;
6675
6685
  }
6676
6686
  let n2 = [...e5].sort((e6, t3) => e6.longitude - t3.longitude), r2 = [], i2 = [];
6677
- for (let e6 of n2) r2.push(e6.longitude), i2.push(v_(e6.longitude, i2, t2));
6678
- b_(i2, r2, t2);
6687
+ for (let e6 of n2) r2.push(e6.longitude), i2.push(b_(e6.longitude, i2, t2));
6688
+ S_(i2, r2, t2);
6679
6689
  let a2 = /* @__PURE__ */ new Map();
6680
- for (let e6 = 0; e6 < n2.length; e6++) a2.set(n2[e6].name, S_(i2[e6]));
6690
+ for (let e6 = 0; e6 < n2.length; e6++) a2.set(n2[e6].name, w_(i2[e6]));
6681
6691
  return a2;
6682
6692
  }
6683
- function v_(e5, t2, n2) {
6693
+ function b_(e5, t2, n2) {
6684
6694
  if (t2.length === 0) return e5;
6685
6695
  let r2 = Math.max(0.55, n2 / 4), i2 = Math.max(8, Math.min(40, n2 * 5)), a2 = Math.floor(i2 / r2);
6686
- if (y_(e5, t2, n2)) return e5;
6696
+ if (x_(e5, t2, n2)) return e5;
6687
6697
  for (let i3 = 1; i3 <= a2; i3++) {
6688
6698
  let a3 = i3 * r2;
6689
- if (y_(e5 + a3, t2, n2)) return e5 + a3;
6690
- if (y_(e5 - a3, t2, n2)) return e5 - a3;
6699
+ if (x_(e5 + a3, t2, n2)) return e5 + a3;
6700
+ if (x_(e5 - a3, t2, n2)) return e5 - a3;
6691
6701
  }
6692
6702
  return e5;
6693
6703
  }
6694
- function y_(e5, t2, n2) {
6695
- for (let r2 of t2) if (x_(e5, r2) < n2) return false;
6704
+ function x_(e5, t2, n2) {
6705
+ for (let r2 of t2) if (C_(e5, r2) < n2) return false;
6696
6706
  return true;
6697
6707
  }
6698
- function b_(e5, t2, n2) {
6708
+ function S_(e5, t2, n2) {
6699
6709
  let r2 = e5.length;
6700
6710
  if (!(r2 <= 1)) for (let t3 = 0; t3 < 80; t3++) {
6701
6711
  let t4 = true;
6702
6712
  for (let i2 = 0; i2 < r2; i2++) for (let a2 = i2 + 1; a2 < r2; a2++) {
6703
- let r3 = n2 - x_(e5[i2], e5[a2]);
6713
+ let r3 = n2 - C_(e5[i2], e5[a2]);
6704
6714
  if (r3 > 0.01) {
6705
6715
  t4 = false;
6706
6716
  let n3 = r3 * 0.65 / 2, o2 = e5[a2] - e5[i2];
@@ -6712,81 +6722,81 @@ function b_(e5, t2, n2) {
6712
6722
  if (t4) break;
6713
6723
  }
6714
6724
  }
6715
- function x_(e5, t2) {
6725
+ function C_(e5, t2) {
6716
6726
  let n2 = ((t2 - e5) % 360 + 540) % 360 - 180;
6717
6727
  return Math.abs(n2);
6718
6728
  }
6719
- function S_(e5) {
6729
+ function w_(e5) {
6720
6730
  return (e5 % 360 + 360) % 360;
6721
6731
  }
6722
- var C_ = "north node (mean)", w_ = "north node (true)", T_ = "south node (mean)", E_ = "south node (true)", D_ = [C_, w_, T_, E_], O_ = { [C_]: C_, north_node_mean: C_, "north node": C_, north_node: C_, "mean node": C_, mean_node: C_, [w_]: w_, north_node_true: w_, "true node": w_, true_node: w_, [T_]: T_, south_node_mean: T_, "south node": T_, south_node: T_, [E_]: E_, south_node_true: E_, "true south node": E_, true_south_node: E_ };
6723
- function k_(e5) {
6732
+ var T_ = "north node (mean)", E_ = "north node (true)", D_ = "south node (mean)", O_ = "south node (true)", k_ = [T_, E_, D_, O_], A_ = { [T_]: T_, north_node_mean: T_, "north node": T_, north_node: T_, "mean node": T_, mean_node: T_, [E_]: E_, north_node_true: E_, "true node": E_, true_node: E_, [D_]: D_, south_node_mean: D_, "south node": D_, south_node: D_, [O_]: O_, south_node_true: O_, "true south node": O_, true_south_node: O_ };
6733
+ function j_(e5) {
6724
6734
  var t2;
6725
- return (t2 = O_[e5.trim().toLowerCase()]) == null ? null : t2;
6735
+ return (t2 = A_[e5.trim().toLowerCase()]) == null ? null : t2;
6726
6736
  }
6727
- var A_ = { [C_]: "\u260A\uFE0E", [w_]: "\u260A\uFE0E", [T_]: "\u260B\uFE0E", [E_]: "\u260B\uFE0E" }, j_ = { [C_]: "soul direction", [w_]: "soul direction", [T_]: "past-life gifts", [E_]: "past-life gifts" };
6728
- function M_(e5) {
6737
+ var M_ = { [T_]: "\u260A\uFE0E", [E_]: "\u260A\uFE0E", [D_]: "\u260B\uFE0E", [O_]: "\u260B\uFE0E" }, N_ = { [T_]: "soul direction", [E_]: "soul direction", [D_]: "past-life gifts", [O_]: "past-life gifts" };
6738
+ function P_(e5) {
6729
6739
  let t2 = /* @__PURE__ */ new Set();
6730
6740
  for (let n2 of e5) {
6731
- let e6 = k_(n2);
6741
+ let e6 = j_(n2);
6732
6742
  e6 && t2.add(e6);
6733
6743
  }
6734
6744
  return t2.has("north node (mean)") && t2.has("north node (true)") || t2.has("south node (mean)") && t2.has("south node (true)");
6735
6745
  }
6736
- function N_(e5, t2) {
6737
- let n2 = new Set(e5.map((e6) => k_(e6.name)).filter(Boolean)), r2 = /* @__PURE__ */ new Set(), i2 = [[C_, w_], [T_, E_]];
6746
+ function F_(e5, t2) {
6747
+ let n2 = new Set(e5.map((e6) => j_(e6.name)).filter(Boolean)), r2 = /* @__PURE__ */ new Set(), i2 = [[T_, E_], [D_, O_]];
6738
6748
  for (let [e6, a2] of i2) n2.has(e6) && n2.has(a2) && r2.add(t2 === "true" ? e6 : a2);
6739
6749
  return r2.size === 0 ? e5 : e5.filter((e6) => {
6740
6750
  var t3;
6741
- return !r2.has((t3 = k_(e6.name)) == null ? "" : t3);
6751
+ return !r2.has((t3 = j_(e6.name)) == null ? "" : t3);
6742
6752
  });
6743
6753
  }
6744
- var P_ = "lilith (mean)", F_ = "lilith (true)", I_ = "lilith (interpolated)", L_ = [P_, F_, I_], R_ = { [P_]: P_, lilith: P_, mean_lilith: P_, lilith_mean: P_, "mean apogee": P_, "black moon lilith": P_, [F_]: F_, lilith_true: F_, true_lilith: F_, "osculating apogee": F_, [I_]: I_, lilith_interpolated: I_, lilith_natural: I_, "interpolated apogee": I_ };
6745
- function z_(e5) {
6754
+ var I_ = "lilith (mean)", L_ = "lilith (true)", R_ = "lilith (interpolated)", z_ = [I_, L_, R_], B_ = { [I_]: I_, lilith: I_, mean_lilith: I_, lilith_mean: I_, "mean apogee": I_, "black moon lilith": I_, [L_]: L_, lilith_true: L_, true_lilith: L_, "osculating apogee": L_, [R_]: R_, lilith_interpolated: R_, lilith_natural: R_, "interpolated apogee": R_ };
6755
+ function V_(e5) {
6746
6756
  var t2;
6747
- return (t2 = R_[e5.trim().toLowerCase()]) == null ? null : t2;
6757
+ return (t2 = B_[e5.trim().toLowerCase()]) == null ? null : t2;
6748
6758
  }
6749
- var B_ = { [P_]: "\u26B8\uFE0E", [F_]: "\u26B8\uFE0E", [I_]: "\u26B8\uFE0E" }, V_ = { [P_]: "primal feminine & shadow", [F_]: "primal feminine & shadow", [I_]: "primal feminine & shadow" };
6750
- function H_(e5) {
6759
+ var H_ = { [I_]: "\u26B8\uFE0E", [L_]: "\u26B8\uFE0E", [R_]: "\u26B8\uFE0E" }, U_ = { [I_]: "primal feminine & shadow", [L_]: "primal feminine & shadow", [R_]: "primal feminine & shadow" };
6760
+ function W_(e5) {
6751
6761
  var t2, n2;
6752
- return (t2 = (n2 = k_(e5)) == null ? z_(e5) : n2) == null ? e5 : t2;
6762
+ return (t2 = (n2 = j_(e5)) == null ? V_(e5) : n2) == null ? e5 : t2;
6753
6763
  }
6754
- var U_ = 310, W_ = 310, G_ = 240, K_ = 204, q_ = 190, J_ = 152, Y_ = 118, X_ = 112, Z_ = 290, Q_ = 246, $_ = 264, ev = 16;
6764
+ var G_ = 310, K_ = 310, q_ = 240, J_ = 204, Y_ = 190, X_ = 152, Z_ = 118, Q_ = 112, $_ = 290, ev = 246, tv = 264, nv = 16;
6755
6765
  function Y(e5, t2, n2) {
6756
6766
  let r2 = -(e5 - n2 + 180) * Math.PI / 180;
6757
- return { x: U_ + t2 * Math.cos(r2), y: W_ + t2 * Math.sin(r2) };
6767
+ return { x: G_ + t2 * Math.cos(r2), y: K_ + t2 * Math.sin(r2) };
6758
6768
  }
6759
6769
  function X(e5) {
6760
6770
  return document.createElementNS("http://www.w3.org/2000/svg", e5);
6761
6771
  }
6762
- var tv = { sun: "\u2609\uFE0E", moon: "\u263D\uFE0E", mercury: "\u263F\uFE0E", venus: "\u2640\uFE0E", mars: "\u2642\uFE0E", jupiter: "\u2643\uFE0E", saturn: "\u2644\uFE0E", uranus: "\u2645\uFE0E", neptune: "\u2646\uFE0E", pluto: "\u2647\uFE0E", "north node": "\u260A\uFE0E", "south node": "\u260B\uFE0E", chiron: "\u26B7\uFE0E", "true node": "\u260A\uFE0E", north_node: "\u260A\uFE0E", south_node: "\u260B\uFE0E", true_node: "\u260A\uFE0E", ...A_, ...B_, asc: "AC", mc: "MC" }, nv = ["\u2648", "\u2649", "\u264A", "\u264B", "\u264C", "\u264D", "\u264E", "\u264F", "\u2650", "\u2651", "\u2652", "\u2653"].map((e5) => e5 + "\uFE0E"), rv = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], iv = { conjunction: "\u260C", opposition: "\u260D", trine: "\u25B3", square: "\u25A1", sextile: "\u26B9" };
6763
- function av(e5) {
6772
+ var rv = { sun: "\u2609\uFE0E", moon: "\u263D\uFE0E", mercury: "\u263F\uFE0E", venus: "\u2640\uFE0E", mars: "\u2642\uFE0E", jupiter: "\u2643\uFE0E", saturn: "\u2644\uFE0E", uranus: "\u2645\uFE0E", neptune: "\u2646\uFE0E", pluto: "\u2647\uFE0E", "north node": "\u260A\uFE0E", "south node": "\u260B\uFE0E", chiron: "\u26B7\uFE0E", "true node": "\u260A\uFE0E", north_node: "\u260A\uFE0E", south_node: "\u260B\uFE0E", true_node: "\u260A\uFE0E", ...M_, ...H_, asc: "AC", mc: "MC" }, iv = ["\u2648", "\u2649", "\u264A", "\u264B", "\u264C", "\u264D", "\u264E", "\u264F", "\u2650", "\u2651", "\u2652", "\u2653"].map((e5) => e5 + "\uFE0E"), av = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], ov = { conjunction: "\u260C", opposition: "\u260D", trine: "\u25B3", square: "\u25A1", sextile: "\u26B9" };
6773
+ function sv(e5) {
6764
6774
  let t2 = e5.toLowerCase();
6765
- return getComputedStyle(document.documentElement).getPropertyValue("--xasp-".concat(t2)).trim() || u_(t2, dv());
6775
+ return getComputedStyle(document.documentElement).getPropertyValue("--xasp-".concat(t2)).trim() || f_(t2, pv());
6766
6776
  }
6767
- function ov(e5) {
6777
+ function cv(e5) {
6768
6778
  return e5 <= 1 ? { dash: "", width: "1.8", opacity: "0.95" } : e5 <= 3 ? { dash: "5,4", width: "1.4", opacity: "0.75" } : { dash: "3,5", width: "1.0", opacity: "0.50" };
6769
6779
  }
6770
- var sv = { sun: { domicile: [4], exaltation: [0], detriment: [10], fall: [6] }, moon: { domicile: [3], exaltation: [1], detriment: [9], fall: [7] }, mercury: { domicile: [2, 5], exaltation: [5], detriment: [8, 11], fall: [11] }, venus: { domicile: [1, 6], exaltation: [11], detriment: [7, 0], fall: [5] }, mars: { domicile: [0, 7], exaltation: [9], detriment: [6, 1], fall: [3] }, jupiter: { domicile: [8, 11], exaltation: [3], detriment: [2, 5], fall: [9] }, saturn: { domicile: [9, 10], exaltation: [6], detriment: [3, 4], fall: [0] } };
6771
- function cv(e5, t2) {
6772
- let n2 = sv[e5.toLowerCase()];
6780
+ var lv = { sun: { domicile: [4], exaltation: [0], detriment: [10], fall: [6] }, moon: { domicile: [3], exaltation: [1], detriment: [9], fall: [7] }, mercury: { domicile: [2, 5], exaltation: [5], detriment: [8, 11], fall: [11] }, venus: { domicile: [1, 6], exaltation: [11], detriment: [7, 0], fall: [5] }, mars: { domicile: [0, 7], exaltation: [9], detriment: [6, 1], fall: [3] }, jupiter: { domicile: [8, 11], exaltation: [3], detriment: [2, 5], fall: [9] }, saturn: { domicile: [9, 10], exaltation: [6], detriment: [3, 4], fall: [0] } };
6781
+ function uv(e5, t2) {
6782
+ let n2 = lv[e5.toLowerCase()];
6773
6783
  if (!n2) return null;
6774
6784
  let r2 = Math.floor((t2 % 360 + 360) % 360 / 30);
6775
6785
  return n2.domicile.includes(r2) ? { label: "Domicile", emoji: "\u{1F3DB}", cssClass: "dignity-domicile", positive: true } : n2.exaltation.includes(r2) ? { label: "Exaltation", emoji: "\u2B06", cssClass: "dignity-exaltation", positive: true } : n2.detriment.includes(r2) ? { label: "Detriment", emoji: "\u2B07", cssClass: "dignity-detriment", positive: false } : n2.fall.includes(r2) ? { label: "Fall", emoji: "\u{1F53B}", cssClass: "dignity-fall", positive: false } : null;
6776
6786
  }
6777
- var lv = ["fire", "earth", "air", "water", "fire", "earth", "air", "water", "fire", "earth", "air", "water"], uv = ["cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable"], dv = p_, fv = (e5) => l_(e5, dv());
6778
- function pv(e5, t2, n2, r2, i2) {
6787
+ var dv = ["fire", "earth", "air", "water", "fire", "earth", "air", "water", "fire", "earth", "air", "water"], fv = ["cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable"], pv = h_, mv = (e5) => d_(e5, pv());
6788
+ function hv(e5, t2, n2, r2, i2) {
6779
6789
  let a2 = +(((t2 - e5) % 360 + 360) % 360 > 180), o2 = Y(e5, n2, i2), s2 = Y(e5, r2, i2), c2 = Y(t2, r2, i2), l2 = Y(t2, n2, i2);
6780
6790
  return ["M ".concat(o2.x.toFixed(2), " ").concat(o2.y.toFixed(2)), "L ".concat(s2.x.toFixed(2), " ").concat(s2.y.toFixed(2)), "A ".concat(r2, " ").concat(r2, " 0 ").concat(a2, " 0 ").concat(c2.x.toFixed(2), " ").concat(c2.y.toFixed(2)), "L ".concat(l2.x.toFixed(2), " ").concat(l2.y.toFixed(2)), "A ".concat(n2, " ").concat(n2, " 0 ").concat(a2, " 1 ").concat(o2.x.toFixed(2), " ").concat(o2.y.toFixed(2)), "Z"].join(" ");
6781
6791
  }
6782
- function mv(e5, t2, n2, r2, i2, a2, o2) {
6792
+ function gv(e5, t2, n2, r2, i2, a2, o2) {
6783
6793
  let s2 = n2 * 30, c2 = s2 + 30, l2 = Y(s2, r2, t2), u2 = Y(s2, i2, t2), d2 = Y(c2, i2, t2), f2 = Y(c2, r2, t2), p2 = ["M ".concat(l2.x.toFixed(2), " ").concat(l2.y.toFixed(2)), "L ".concat(u2.x.toFixed(2), " ").concat(u2.y.toFixed(2)), "A ".concat(i2, " ").concat(i2, " 0 0 0 ").concat(d2.x.toFixed(2), " ").concat(d2.y.toFixed(2)), "L ".concat(f2.x.toFixed(2), " ").concat(f2.y.toFixed(2)), "A ".concat(r2, " ").concat(r2, " 0 0 1 ").concat(l2.x.toFixed(2), " ").concat(l2.y.toFixed(2)), "Z"].join(" "), m2 = X("path");
6784
6794
  m2.setAttribute("d", p2), m2.setAttribute("fill", a2), m2.setAttribute("fill-opacity", String(o2)), m2.setAttribute("pointer-events", "none"), e5.appendChild(m2);
6785
6795
  }
6786
- var hv = /* @__PURE__ */ new Set(["sun", "moon", "mercury", "venus", "mars", "jupiter", "saturn", "uranus", "neptune", "pluto", "chiron", "north node", "south node", "true node", "north_node", "south_node", "true_node", "asc", "mc", ...D_, ...L_]);
6787
- function gv(e5) {
6796
+ var _v = /* @__PURE__ */ new Set(["sun", "moon", "mercury", "venus", "mars", "jupiter", "saturn", "uranus", "neptune", "pluto", "chiron", "north node", "south node", "true node", "north_node", "south_node", "true_node", "asc", "mc", ...k_, ...z_]);
6797
+ function vv(e5) {
6788
6798
  let t2 = (e5 % 360 + 360) % 360, n2 = Math.floor(t2 / 30), r2 = Math.floor(t2 % 30);
6789
- return "".concat(r2, "\xB0").concat(Math.floor((t2 % 30 - r2) * 60).toString().padStart(2, "0"), "\u2032 ").concat(rv[n2]);
6799
+ return "".concat(r2, "\xB0").concat(Math.floor((t2 % 30 - r2) * 60).toString().padStart(2, "0"), "\u2032 ").concat(av[n2]);
6790
6800
  }
6791
6801
  function Z(e5) {
6792
6802
  return e5.replace(/\b\w/g, (e6) => e6.toUpperCase());
@@ -6794,29 +6804,29 @@ function Z(e5) {
6794
6804
  function Q(e5) {
6795
6805
  return String(e5).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
6796
6806
  }
6797
- var _v = "true";
6798
- function vv(e5) {
6799
- _v = e5;
6807
+ var yv = "true";
6808
+ function bv(e5) {
6809
+ yv = e5;
6800
6810
  }
6801
- function yv(e5) {
6802
- return N_(e5.map((e6) => {
6803
- let t2 = H_(e6.name);
6811
+ function xv(e5) {
6812
+ return F_(e5.map((e6) => {
6813
+ let t2 = W_(e6.name);
6804
6814
  return t2 === e6.name ? e6 : { ...e6, name: t2 };
6805
- }), _v);
6815
+ }), yv);
6806
6816
  }
6807
- function bv(e5) {
6808
- return Array.isArray(e5) ? yv(e5.filter((e6) => e6 && typeof e6.longitude == "number" && isFinite(e6.longitude))) : e5 && typeof e5 == "object" ? yv(Object.entries(e5).filter(([e6]) => hv.has(e6.toLowerCase())).map(([e6, t2]) => {
6817
+ function Sv(e5) {
6818
+ return Array.isArray(e5) ? xv(e5.filter((e6) => e6 && typeof e6.longitude == "number" && isFinite(e6.longitude))) : e5 && typeof e5 == "object" ? xv(Object.entries(e5).filter(([e6]) => _v.has(e6.toLowerCase())).map(([e6, t2]) => {
6809
6819
  var n2, r2, i2, a2, o2, s2;
6810
6820
  return { name: e6.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 };
6811
6821
  })) : [];
6812
6822
  }
6813
- var xv = [{ 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 }];
6814
- function Sv(e5, t2, n2 = 1) {
6823
+ var Cv = [{ 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 }];
6824
+ function wv(e5, t2, n2 = 1) {
6815
6825
  let r2 = [];
6816
6826
  for (let o2 of e5) for (let e6 of t2) {
6817
6827
  let t3 = Math.abs(o2.longitude - e6.longitude) % 360;
6818
6828
  t3 > 180 && (t3 = 360 - t3);
6819
- for (let s2 of xv) {
6829
+ for (let s2 of Cv) {
6820
6830
  let c2 = s2.orb * n2, l2 = Math.abs(t3 - s2.angle);
6821
6831
  if (l2 <= c2) {
6822
6832
  var i2, a2;
@@ -6828,39 +6838,39 @@ function Sv(e5, t2, n2 = 1) {
6828
6838
  }
6829
6839
  return r2.sort((e6, t3) => e6.orb - t3.orb).slice(0, 40);
6830
6840
  }
6831
- var Cv = null;
6832
- function wv(e5) {
6833
- Cv = e5;
6841
+ var Tv = null;
6842
+ function Ev(e5) {
6843
+ Tv = e5;
6834
6844
  }
6835
- var Tv = null, Ev = null;
6836
- function Dv() {
6837
- return Ev || (Ev = document.getElementById("tooltip")), Ev;
6845
+ var Dv = null, Ov = null;
6846
+ function kv() {
6847
+ return Ov || (Ov = document.getElementById("tooltip")), Ov;
6838
6848
  }
6839
- function Ov(e5, t2, n2, r2, i2) {
6840
- let a2 = Dv();
6849
+ function Av(e5, t2, n2, r2, i2) {
6850
+ let a2 = kv();
6841
6851
  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 ");
6842
6852
  let o2 = a2.getBoundingClientRect(), s2 = o2.width || 240, c2 = o2.height || 80, l2 = e5 + 14, u2 = t2 + 10;
6843
6853
  l2 + s2 > window.innerWidth && (l2 = e5 - 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");
6844
6854
  }
6845
- function kv() {
6846
- Dv().classList.remove("visible");
6855
+ function jv() {
6856
+ kv().classList.remove("visible");
6847
6857
  }
6848
- var Av = { 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", ...j_, ...V_ }, jv = { conjunction: "fusion & amplification", opposition: "polarity & integration", trine: "ease & natural flow", square: "tension & growth", sextile: "opportunity & cooperation", quincunx: "adjustment & recalibration", semisquare: "friction & minor tension" }, Mv = null, Nv = null, Pv = /* @__PURE__ */ new Map();
6849
- function Fv(e5) {
6858
+ var Mv = { 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", ...N_, ...U_ }, Nv = { conjunction: "fusion & amplification", opposition: "polarity & integration", trine: "ease & natural flow", square: "tension & growth", sextile: "opportunity & cooperation", quincunx: "adjustment & recalibration", semisquare: "friction & minor tension" }, Pv = null, Fv = null, Iv = /* @__PURE__ */ new Map();
6859
+ function Lv(e5) {
6850
6860
  return "".concat(e5.planet1, "|inner|").concat(e5.planet2, "|outer|").concat(e5.type);
6851
6861
  }
6852
- var Iv = { 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"] } };
6853
- function Lv(e5, t2, n2, r2, i2) {
6862
+ var Rv = { 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"] } };
6863
+ function zv(e5, t2, n2, r2, i2) {
6854
6864
  var a2, o2;
6855
- let s2 = Hv(), c2 = Iv[t2];
6865
+ let s2 = Wv(), c2 = Rv[t2];
6856
6866
  if (!c2) return;
6857
- let l2 = gv(n2), u2 = Math.floor((n2 % 360 + 360) % 360 / 30), d2 = lv[u2], f2 = uv[u2], p2 = nv[u2], m2 = fv(u2), h2 = i2 ? "".concat(i2, " \xB7 Natal") : "Inner \xB7 Natal", g2 = Tv ? '<button class="ask-claude-btn" id="bi-ask-claude-angle-btn">\u2728 Interpret this</button>' : "";
6867
+ let l2 = vv(n2), u2 = Math.floor((n2 % 360 + 360) % 360 / 30), d2 = dv[u2], f2 = fv[u2], p2 = iv[u2], m2 = mv(u2), h2 = i2 ? "".concat(i2, " \xB7 Natal") : "Inner \xB7 Natal", g2 = Dv ? '<button class="ask-claude-btn" id="bi-ask-claude-angle-btn">\u2728 Interpret this</button>' : "";
6858
6868
  s2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:#7060b8;font-family:system-ui;font-weight:700;font-size:14px">'.concat(Q(c2.symbol), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:6px;flex-wrap:wrap;">\n <strong>').concat(Q(c2.title), '</strong>\n <span class="wheel-badge inner">').concat(Q(h2), '</span>\n </div>\n <div class="info-subtitle">').concat(Q(p2), " ").concat(Q(l2), '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div style="font-size:11px;color:var(--text-secondary,#888);margin:6px 0 4px">\n <span style="color:').concat(m2, ';margin-right:4px">').concat(Q(p2), "</span>\n <em>").concat(Q(d2), " \xB7 ").concat(Q(f2), '</em>\n </div>\n <div style="font-size:12px;line-height:1.55;margin-bottom:8px">').concat(Q(c2.meaning), '</div>\n <div class="aspects-title">').concat(Q(c2.keyword), '</div>\n <div class="aspects-list">\n ').concat(c2.themes.map((e6) => '<div class="aspect-row"><span class="aspect-other">'.concat(Q(e6), "</span></div>")).join(""), "\n </div>\n ").concat(g2, "\n "), s2.classList.add("open"), s2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (a2 = document.getElementById("bi-info-close-btn")) == null || a2.addEventListener("click", () => {
6859
- Uv(), Xv();
6869
+ Gv(), Qv();
6860
6870
  }), (o2 = document.getElementById("bi-ask-claude-angle-btn")) == null || o2.addEventListener("click", () => {
6861
- if (!Tv) return;
6871
+ if (!Dv) return;
6862
6872
  let e6 = document.getElementById("bi-ask-claude-angle-btn");
6863
- !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), Tv({ type: "angle_interpretation", data: { angle: c2.title, longitude: n2, sign: rv[u2], position: l2, element: d2, modality: f2, mode: r2 } }).then(() => {
6873
+ !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), Dv({ type: "angle_interpretation", data: { angle: c2.title, longitude: n2, sign: av[u2], position: l2, element: d2, modality: f2, mode: r2 } }).then(() => {
6864
6874
  e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6865
6875
  e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
6866
6876
  }, 2500);
@@ -6869,32 +6879,32 @@ function Lv(e5, t2, n2, r2, i2) {
6869
6879
  }));
6870
6880
  });
6871
6881
  }
6872
- var Rv = { 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" };
6873
- function zv(e5, t2, n2) {
6882
+ var Bv = { 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" };
6883
+ function Vv(e5, t2, n2) {
6874
6884
  let r2 = (n2 - t2 + 360) % 360;
6875
6885
  return e5.filter((e6) => {
6876
6886
  let n3 = (e6.longitude - t2 + 360) % 360;
6877
6887
  return n3 >= 0 && n3 < r2;
6878
6888
  });
6879
6889
  }
6880
- function Bv(e5, t2, n2, r2, i2, a2, o2, s2) {
6890
+ function Hv(e5, t2, n2, r2, i2, a2, o2, s2) {
6881
6891
  var c2, l2, u2, d2, f2;
6882
- let p2 = Hv(), m2 = Math.floor((t2.cusp_lon % 360 + 360) % 360 / 30), h2 = (c2 = (l2 = t2.sign) == null ? rv[m2] : l2) == null ? "" : c2, g2 = (u2 = nv[m2]) == null ? "" : u2, _2 = zv(o2, t2.cusp_lon, n2.cusp_lon), v2 = zv(s2, t2.cusp_lon, n2.cusp_lon), y2 = i2 || "Natal", b2 = r2 === "synastry" ? a2 == null ? "Synastry" : a2 : "Transit", x2 = (e6, t3) => e6.length === 0 ? '<div class="no-aspects">\u2014</div>' : e6.map((e7) => {
6883
- let n3 = gv(e7.longitude), r3 = e7.retrograde ? " \u211E" : "";
6892
+ let p2 = Wv(), m2 = Math.floor((t2.cusp_lon % 360 + 360) % 360 / 30), h2 = (c2 = (l2 = t2.sign) == null ? av[m2] : l2) == null ? "" : c2, g2 = (u2 = iv[m2]) == null ? "" : u2, _2 = Vv(o2, t2.cusp_lon, n2.cusp_lon), v2 = Vv(s2, t2.cusp_lon, n2.cusp_lon), y2 = i2 || "Natal", b2 = r2 === "synastry" ? a2 == null ? "Synastry" : a2 : "Transit", x2 = (e6, t3) => e6.length === 0 ? '<div class="no-aspects">\u2014</div>' : e6.map((e7) => {
6893
+ let n3 = vv(e7.longitude), r3 = e7.retrograde ? " \u211E" : "";
6884
6894
  return '<div class="aspect-row">\n <span class="wheel-badge '.concat(t3, '" style="font-size:9px">').concat(Q(t3 === "inner" ? y2 : b2), '</span>\n <span class="aspect-other">').concat(Q(Z(e7.name))).concat(r3, '</span>\n <span class="aspect-meta">').concat(Q(n3), "</span>\n </div>");
6885
- }).join(""), S2 = Tv ? '<button class="ask-claude-btn" id="bi-ask-claude-house-btn">\u2728 Interpret this</button>' : "";
6895
+ }).join(""), S2 = Dv ? '<button class="ask-claude-btn" id="bi-ask-claude-house-btn">\u2728 Interpret this</button>' : "";
6886
6896
  p2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:#7060b8;font-family:system-ui;font-weight:700;font-size:14px">'.concat(t2.number, '</span>\n <div class="info-title">\n <div><strong>House ').concat(t2.number, '</strong></div>\n <div class="info-subtitle">').concat(Q(g2), " ").concat(Q(h2), " on cusp").concat(t2.ruler ? " \xB7 ruled by ".concat(Q(Z(t2.ruler))) : "", '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title" style="margin-top:6px">').concat(Q(y2), ' planets</div>\n <div class="aspects-list">').concat(x2(_2, "inner"), '</div>\n <div class="aspects-title" style="margin-top:8px">').concat(Q(b2), ' planets currently here</div>\n <div class="aspects-list">').concat(x2(v2, "outer"), "</div>\n ").concat(S2, "\n "), p2.classList.add("open"), p2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (d2 = document.getElementById("bi-info-close-btn")) == null || d2.addEventListener("click", () => {
6887
- Uv(), Xv();
6897
+ Gv(), Qv();
6888
6898
  }), (f2 = document.getElementById("bi-ask-claude-house-btn")) == null || f2.addEventListener("click", () => {
6889
6899
  var e6;
6890
- if (!Tv) return;
6900
+ if (!Dv) return;
6891
6901
  let n3 = document.getElementById("bi-ask-claude-house-btn");
6892
- !n3 || n3.disabled || (n3.disabled = true, n3.textContent = "\u23F3 Sending\u2026", n3.classList.add("sending"), Tv({ type: "house", data: { house_number: t2.number, cusp_sign: h2, cusp_longitude: t2.cusp_lon, ruler: (e6 = t2.ruler) == null ? null : e6, mode: r2, inner_label: y2, outer_label: b2, inner_planets: _2.map((e7) => {
6902
+ !n3 || n3.disabled || (n3.disabled = true, n3.textContent = "\u23F3 Sending\u2026", n3.classList.add("sending"), Dv({ type: "house", data: { house_number: t2.number, cusp_sign: h2, cusp_longitude: t2.cusp_lon, ruler: (e6 = t2.ruler) == null ? null : e6, mode: r2, inner_label: y2, outer_label: b2, inner_planets: _2.map((e7) => {
6893
6903
  var t3;
6894
- return { name: e7.name, position: gv(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6904
+ return { name: e7.name, position: vv(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6895
6905
  }), outer_planets: v2.map((e7) => {
6896
6906
  var t3;
6897
- return { name: e7.name, position: gv(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6907
+ return { name: e7.name, position: vv(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6898
6908
  }) } }).then(() => {
6899
6909
  n3.textContent = "\u2713 Sent", n3.classList.remove("sending"), n3.classList.add("sent"), setTimeout(() => {
6900
6910
  n3.textContent = "\u2728 Interpret this", n3.classList.remove("sent"), n3.disabled = false;
@@ -6904,23 +6914,23 @@ function Bv(e5, t2, n2, r2, i2, a2, o2, s2) {
6904
6914
  }));
6905
6915
  });
6906
6916
  }
6907
- function Vv(e5, t2, n2, r2, i2, a2, o2) {
6917
+ function Uv(e5, t2, n2, r2, i2, a2, o2) {
6908
6918
  var s2, c2;
6909
- let l2 = Hv(), u2 = rv[t2], d2 = nv[t2], f2 = lv[t2], p2 = uv[t2], m2 = (e6) => Math.floor((e6.longitude % 360 + 360) % 360 / 30) === t2, h2 = a2.filter(m2), g2 = o2.filter(m2), _2 = r2 || "Natal", v2 = n2 === "synastry" ? i2 == null ? "Synastry" : i2 : "Transit", y2 = (e6, t3) => e6.length === 0 ? '<div class="no-aspects">\u2014</div>' : e6.map((e7) => {
6910
- let n3 = gv(e7.longitude), r3 = e7.retrograde ? " \u211E" : "";
6919
+ let l2 = Wv(), u2 = av[t2], d2 = iv[t2], f2 = dv[t2], p2 = fv[t2], m2 = (e6) => Math.floor((e6.longitude % 360 + 360) % 360 / 30) === t2, h2 = a2.filter(m2), g2 = o2.filter(m2), _2 = r2 || "Natal", v2 = n2 === "synastry" ? i2 == null ? "Synastry" : i2 : "Transit", y2 = (e6, t3) => e6.length === 0 ? '<div class="no-aspects">\u2014</div>' : e6.map((e7) => {
6920
+ let n3 = vv(e7.longitude), r3 = e7.retrograde ? " \u211E" : "";
6911
6921
  return '<div class="aspect-row">\n <span class="wheel-badge '.concat(t3, '" style="font-size:9px">').concat(Q(t3 === "inner" ? _2 : v2), '</span>\n <span class="aspect-other">').concat(Q(Z(e7.name))).concat(r3, '</span>\n <span class="aspect-meta">').concat(Q(n3), "</span>\n </div>");
6912
- }).join(""), b2 = Tv ? '<button class="ask-claude-btn" id="bi-ask-claude-sign-btn">\u2728 Interpret this</button>' : "";
6913
- l2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(fv(t2), ';font-family:serif;font-weight:700;font-size:16px">').concat(Q(d2), '</span>\n <div class="info-title">\n <div><strong>').concat(Q(u2), '</strong></div>\n <div class="info-subtitle"><em>').concat(Q(Z(f2)), " \xB7 ").concat(Q(Z(p2)), '</em></div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title" style="margin-top:6px">').concat(Q(_2), " planets in ").concat(Q(u2), '</div>\n <div class="aspects-list">').concat(y2(h2, "inner"), '</div>\n <div class="aspects-title" style="margin-top:8px">').concat(Q(v2), " planets currently in ").concat(Q(u2), '</div>\n <div class="aspects-list">').concat(y2(g2, "outer"), "</div>\n ").concat(b2, "\n "), l2.classList.add("open"), l2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (s2 = document.getElementById("bi-info-close-btn")) == null || s2.addEventListener("click", () => {
6914
- Uv(), Xv();
6922
+ }).join(""), b2 = Dv ? '<button class="ask-claude-btn" id="bi-ask-claude-sign-btn">\u2728 Interpret this</button>' : "";
6923
+ l2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(mv(t2), ';font-family:serif;font-weight:700;font-size:16px">').concat(Q(d2), '</span>\n <div class="info-title">\n <div><strong>').concat(Q(u2), '</strong></div>\n <div class="info-subtitle"><em>').concat(Q(Z(f2)), " \xB7 ").concat(Q(Z(p2)), '</em></div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div class="aspects-title" style="margin-top:6px">').concat(Q(_2), " planets in ").concat(Q(u2), '</div>\n <div class="aspects-list">').concat(y2(h2, "inner"), '</div>\n <div class="aspects-title" style="margin-top:8px">').concat(Q(v2), " planets currently in ").concat(Q(u2), '</div>\n <div class="aspects-list">').concat(y2(g2, "outer"), "</div>\n ").concat(b2, "\n "), l2.classList.add("open"), l2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (s2 = document.getElementById("bi-info-close-btn")) == null || s2.addEventListener("click", () => {
6924
+ Gv(), Qv();
6915
6925
  }), (c2 = document.getElementById("bi-ask-claude-sign-btn")) == null || c2.addEventListener("click", () => {
6916
- if (!Tv) return;
6926
+ if (!Dv) return;
6917
6927
  let e6 = document.getElementById("bi-ask-claude-sign-btn");
6918
- !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), Tv({ type: "sign", data: { sign: u2, element: Z(f2), modality: Z(p2), mode: n2, inner_label: _2, outer_label: v2, inner_planets: h2.map((e7) => {
6928
+ !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), Dv({ type: "sign", data: { sign: u2, element: Z(f2), modality: Z(p2), mode: n2, inner_label: _2, outer_label: v2, inner_planets: h2.map((e7) => {
6919
6929
  var t3;
6920
- return { name: e7.name, position: gv(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6930
+ return { name: e7.name, position: vv(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6921
6931
  }), outer_planets: g2.map((e7) => {
6922
6932
  var t3;
6923
- return { name: e7.name, position: gv(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6933
+ return { name: e7.name, position: vv(e7.longitude), retrograde: (t3 = e7.retrograde) == null ? false : t3 };
6924
6934
  }) } }).then(() => {
6925
6935
  e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6926
6936
  e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
@@ -6930,7 +6940,7 @@ function Vv(e5, t2, n2, r2, i2, a2, o2) {
6930
6940
  }));
6931
6941
  });
6932
6942
  }
6933
- function Hv() {
6943
+ function Wv() {
6934
6944
  if (document.body.classList.contains("is-fullscreen")) {
6935
6945
  let e6 = document.querySelector("#fs-bottom-bar [data-column='right']");
6936
6946
  if (e6) {
@@ -6938,36 +6948,36 @@ function Hv() {
6938
6948
  return t3 || (t3 = document.createElement("div"), t3.className = "info-drawer info-drawer--fs", e6.appendChild(t3)), t3;
6939
6949
  }
6940
6950
  }
6941
- if (Mv && Mv.isConnected) return Mv;
6942
- Mv = document.createElement("div"), Mv.id = "bi-info-drawer", Mv.className = "info-drawer";
6951
+ if (Pv && Pv.isConnected) return Pv;
6952
+ Pv = document.createElement("div"), Pv.id = "bi-info-drawer", Pv.className = "info-drawer";
6943
6953
  let e5 = document.getElementById("chart-container");
6944
- if (e5 != null && e5.parentElement) e5.parentElement.insertBefore(Mv, e5.nextSibling);
6954
+ if (e5 != null && e5.parentElement) e5.parentElement.insertBefore(Pv, e5.nextSibling);
6945
6955
  else {
6946
6956
  var t2;
6947
- (t2 = document.getElementById("app")) == null || t2.appendChild(Mv);
6957
+ (t2 = document.getElementById("app")) == null || t2.appendChild(Pv);
6948
6958
  }
6949
- return Mv;
6959
+ return Pv;
6950
6960
  }
6951
- function Uv() {
6961
+ function Gv() {
6952
6962
  var e5;
6953
- Mv == null || Mv.classList.remove("open"), (e5 = document.querySelector("#fs-bottom-bar [data-column='right'] .info-drawer--fs")) == null || e5.classList.remove("open"), Cv == null || Cv(null);
6963
+ Pv == null || Pv.classList.remove("open"), (e5 = document.querySelector("#fs-bottom-bar [data-column='right'] .info-drawer--fs")) == null || e5.classList.remove("open"), Tv == null || Tv(null);
6954
6964
  }
6955
- function Wv(e5, t2, n2, r2, i2, a2, o2) {
6965
+ function Kv(e5, t2, n2, r2, i2, a2, o2) {
6956
6966
  var s2, c2, l2, u2, d2;
6957
- let f2 = Hv(), p2 = (s2 = tv[t2.name.toLowerCase()]) == null ? "\u2605" : s2, m2 = (c2 = nv[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "" : c2, h2 = cv(t2.name, t2.longitude), g2;
6967
+ let f2 = Wv(), p2 = (s2 = rv[t2.name.toLowerCase()]) == null ? "\u2605" : s2, m2 = (c2 = iv[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "" : c2, h2 = uv(t2.name, t2.longitude), g2;
6958
6968
  g2 = n2 === "inner" ? a2 ? "".concat(a2, " \xB7 Natal") : "Inner \xB7 Natal" : i2 === "transit" ? "Outer \xB7 Transit" : o2 ? "".concat(o2, " \xB7 Synastry") : "Outer \xB7 Synastry";
6959
6969
  let _2 = n2, v2 = r2.filter((e6) => n2 === "inner" && e6.planet1 === t2.name || n2 === "outer" && e6.planet2 === t2.name).sort((e6, t3) => e6.orb - t3.orb), y2 = v2.length ? v2.map((e6) => {
6960
6970
  var t3, r3, a3, o3, s3, c3, l3;
6961
- let u3 = n2 === "inner" ? e6.planet2 : e6.planet1, d3 = (t3 = tv[u3.toLowerCase()]) == null ? u3 : t3, f3 = (r3 = (a3 = iv[(o3 = (s3 = e6.type) == null ? void 0 : s3.toLowerCase()) == null ? "" : o3]) == null ? e6.type : a3) == null ? "\u2014" : r3, p3 = av((c3 = (l3 = e6.type) == null ? void 0 : l3.toLowerCase()) == null ? "" : c3), m3 = "".concat(e6.orb.toFixed(1), "\xB0"), h3 = i2 === "transit" ? e6.applying ? "\u2197" : "\u2198" : e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide";
6971
+ let u3 = n2 === "inner" ? e6.planet2 : e6.planet1, d3 = (t3 = rv[u3.toLowerCase()]) == null ? u3 : t3, f3 = (r3 = (a3 = ov[(o3 = (s3 = e6.type) == null ? void 0 : s3.toLowerCase()) == null ? "" : o3]) == null ? e6.type : a3) == null ? "\u2014" : r3, p3 = sv((c3 = (l3 = e6.type) == null ? void 0 : l3.toLowerCase()) == null ? "" : c3), m3 = "".concat(e6.orb.toFixed(1), "\xB0"), h3 = i2 === "transit" ? e6.applying ? "\u2197" : "\u2198" : e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide";
6962
6972
  return '<div class="aspect-row">\n <span class="aspect-dot" style="background:'.concat(p3, '"></span>\n <span class="aspect-sym" style="color:').concat(p3, '">').concat(f3, '</span>\n <span class="aspect-other">').concat(Q(d3), " ").concat(Q(Z(u3)), '</span>\n <span class="aspect-meta">').concat(m3, " ").concat(h3, "</span>\n </div>");
6963
- }).join("") : '<div class="no-aspects">No cross-aspects within orb</div>', b2 = (l2 = rv[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "Unknown" : l2, x2 = Tv ? '<button class="ask-claude-btn" id="bi-ask-claude-planet-btn">\u2728 Interpret this</button>' : "";
6964
- f2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph">'.concat(Q(p2), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:6px;flex-wrap:wrap;">\n <strong>').concat(Q(Z(t2.name)), "</strong>\n ").concat(t2.retrograde ? "<span style='color:#e05252'>\u211E</span>" : "", "\n ").concat(h2 ? '<span class="dignity-badge '.concat(h2.cssClass, '">').concat(h2.emoji, " ").concat(Q(h2.label), "</span>") : "", '\n <span class="wheel-badge ').concat(_2, '">').concat(Q(g2), '</span>\n </div>\n <div class="info-subtitle">').concat(Q(m2), " ").concat(Q(gv(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", () => {
6965
- Uv(), Xv();
6973
+ }).join("") : '<div class="no-aspects">No cross-aspects within orb</div>', b2 = (l2 = av[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "Unknown" : l2, x2 = Dv ? '<button class="ask-claude-btn" id="bi-ask-claude-planet-btn">\u2728 Interpret this</button>' : "";
6974
+ f2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph">'.concat(Q(p2), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:6px;flex-wrap:wrap;">\n <strong>').concat(Q(Z(t2.name)), "</strong>\n ").concat(t2.retrograde ? "<span style='color:#e05252'>\u211E</span>" : "", "\n ").concat(h2 ? '<span class="dignity-badge '.concat(h2.cssClass, '">').concat(h2.emoji, " ").concat(Q(h2.label), "</span>") : "", '\n <span class="wheel-badge ').concat(_2, '">').concat(Q(g2), '</span>\n </div>\n <div class="info-subtitle">').concat(Q(m2), " ").concat(Q(vv(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", () => {
6975
+ Gv(), Qv();
6966
6976
  }), (d2 = document.getElementById("bi-ask-claude-planet-btn")) == null || d2.addEventListener("click", () => {
6967
6977
  var e6, r3;
6968
- if (!Tv) return;
6978
+ if (!Dv) return;
6969
6979
  let a3 = document.getElementById("bi-ask-claude-planet-btn");
6970
- !a3 || a3.disabled || (a3.disabled = true, a3.textContent = "\u23F3 Sending\u2026", a3.classList.add("sending"), Tv({ type: "planet", data: { planet_name: t2.name, wheel: n2, longitude: t2.longitude, sign: b2, position: "".concat(Math.floor(t2.longitude % 30), "\xB0 ").concat(b2), house: (e6 = t2.house) == null ? null : e6, retrograde: (r3 = t2.retrograde) == null ? false : r3, mode: i2, cross_aspects: v2.map((e7) => ({ type: e7.type, partner: n2 === "inner" ? e7.planet2 : e7.planet1, orb: e7.orb, applying: e7.applying, orb_label: i2 === "transit" ? e7.applying ? "applying" : "separating" : e7.orb <= 1 ? "exact" : e7.orb <= 3 ? "tight" : "wide" })) } }).then(() => {
6980
+ !a3 || a3.disabled || (a3.disabled = true, a3.textContent = "\u23F3 Sending\u2026", a3.classList.add("sending"), Dv({ type: "planet", data: { planet_name: t2.name, wheel: n2, longitude: t2.longitude, sign: b2, position: "".concat(Math.floor(t2.longitude % 30), "\xB0 ").concat(b2), house: (e6 = t2.house) == null ? null : e6, retrograde: (r3 = t2.retrograde) == null ? false : r3, mode: i2, cross_aspects: v2.map((e7) => ({ type: e7.type, partner: n2 === "inner" ? e7.planet2 : e7.planet1, orb: e7.orb, applying: e7.applying, orb_label: i2 === "transit" ? e7.applying ? "applying" : "separating" : e7.orb <= 1 ? "exact" : e7.orb <= 3 ? "tight" : "wide" })) } }).then(() => {
6971
6981
  a3.textContent = "\u2713 Sent", a3.classList.remove("sending"), a3.classList.add("sent"), setTimeout(() => {
6972
6982
  a3.textContent = "\u2728 Interpret this", a3.classList.remove("sent"), a3.disabled = false;
6973
6983
  }, 2500);
@@ -6976,15 +6986,15 @@ function Wv(e5, t2, n2, r2, i2, a2, o2) {
6976
6986
  }));
6977
6987
  });
6978
6988
  }
6979
- function Gv(e5, t2, n2, r2, i2) {
6989
+ function qv(e5, t2, n2, r2, i2) {
6980
6990
  var a2, o2, s2, c2, l2, u2, d2, f2, p2;
6981
- let m2 = Hv(), h2 = (a2 = tv[t2.planet1.toLowerCase()]) == null ? "\u2605" : a2, g2 = (o2 = tv[t2.planet2.toLowerCase()]) == null ? "\u2605" : o2, _2 = (s2 = iv[(c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2]) == null ? t2.type : s2, v2 = av((u2 = (d2 = t2.type) == null ? void 0 : d2.toLowerCase()) == null ? "" : u2), y2 = r2 ? "".concat(r2, "'s ").concat(Z(t2.planet1)) : Z(t2.planet1), b2 = n2 === "transit" ? "Tr. ".concat(Z(t2.planet2)) : i2 ? "".concat(i2, "'s ").concat(Z(t2.planet2)) : Z(t2.planet2), x2 = n2 === "transit" ? t2.applying ? "\u2197 Applying" : "\u2198 Separating" : t2.orb <= 1 ? "Exact" : t2.orb <= 3 ? "Tight" : "Wide", S2 = Tv ? '<button class="ask-claude-btn" id="bi-ask-claude-asp-btn">\u2728 Interpret this</button>' : "";
6991
+ let m2 = Wv(), h2 = (a2 = rv[t2.planet1.toLowerCase()]) == null ? "\u2605" : a2, g2 = (o2 = rv[t2.planet2.toLowerCase()]) == null ? "\u2605" : o2, _2 = (s2 = ov[(c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2]) == null ? t2.type : s2, v2 = sv((u2 = (d2 = t2.type) == null ? void 0 : d2.toLowerCase()) == null ? "" : u2), y2 = r2 ? "".concat(r2, "'s ").concat(Z(t2.planet1)) : Z(t2.planet1), b2 = n2 === "transit" ? "Tr. ".concat(Z(t2.planet2)) : i2 ? "".concat(i2, "'s ").concat(Z(t2.planet2)) : Z(t2.planet2), x2 = n2 === "transit" ? t2.applying ? "\u2197 Applying" : "\u2198 Separating" : t2.orb <= 1 ? "Exact" : t2.orb <= 3 ? "Tight" : "Wide", S2 = Dv ? '<button class="ask-claude-btn" id="bi-ask-claude-asp-btn">\u2728 Interpret this</button>' : "";
6982
6992
  m2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(v2, '">').concat(Q(String(_2)), '</span>\n <div class="info-title">\n <div style="display:flex;align-items:center;gap:5px;flex-wrap:wrap;">\n <strong>').concat(Q(h2), " ").concat(Q(y2), '</strong>\n <span style="color:').concat(v2, '">').concat(Q(String(_2)), "</span>\n <strong>").concat(Q(g2), " ").concat(Q(b2), '</strong>\n </div>\n <div class="info-subtitle">').concat(t2.orb.toFixed(1), "\xB0 orb \xB7 ").concat(Q(x2), '</div>\n </div>\n <button class="info-close" id="bi-info-close-btn">\u2715</button>\n </div>\n <div style="display:flex;gap:6px;margin-bottom:10px;">\n <span class="wheel-badge inner">Inner \xB7 ').concat(Q(y2), '</span>\n <span class="wheel-badge outer">Outer \xB7 ').concat(Q(b2), "</span>\n </div>\n ").concat(S2, "\n "), m2.classList.add("open"), m2.scrollIntoView({ behavior: "smooth", block: "nearest" }), (f2 = document.getElementById("bi-info-close-btn")) == null || f2.addEventListener("click", () => {
6983
- Uv(), Xv();
6993
+ Gv(), Qv();
6984
6994
  }), (p2 = document.getElementById("bi-ask-claude-asp-btn")) == null || p2.addEventListener("click", () => {
6985
- if (!Tv) return;
6995
+ if (!Dv) return;
6986
6996
  let e6 = document.getElementById("bi-ask-claude-asp-btn");
6987
- !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), Tv({ 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(() => {
6997
+ !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), Dv({ 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(() => {
6988
6998
  e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6989
6999
  e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
6990
7000
  }, 2500);
@@ -6993,82 +7003,82 @@ function Gv(e5, t2, n2, r2, i2) {
6993
7003
  }));
6994
7004
  });
6995
7005
  }
6996
- function Kv(e5, t2) {
6997
- Pv.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
7006
+ function Jv(e5, t2) {
7007
+ Iv.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
6998
7008
  let o2 = a2.split("|");
6999
7009
  (t2 === "inner" ? o2[0] === e5 : o2[2] === e5) ? (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((e6) => e6.style.opacity = "1")) : (n2.style.strokeOpacity = "0.05", n2.style.strokeWidth = "0.5", n2.removeAttribute("filter"), i2.forEach((e6) => e6.style.opacity = "0.15"));
7000
- }), Jv(e5, t2);
7010
+ }), Xv(e5, t2);
7001
7011
  }
7002
- function qv(e5, t2) {
7003
- Pv.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
7012
+ function Yv(e5, t2) {
7013
+ Iv.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
7004
7014
  a2 === e5 ? (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((e6) => e6.style.opacity = "1")) : (n2.style.strokeOpacity = "0.05", n2.style.strokeWidth = "0.5", n2.removeAttribute("filter"), i2.forEach((e6) => e6.style.opacity = "0.15"));
7005
7015
  });
7006
7016
  }
7007
- function Jv(e5, t2) {
7017
+ function Xv(e5, t2) {
7008
7018
  let n2 = e5.toLowerCase(), r2 = /* @__PURE__ */ new Set(), i2 = /* @__PURE__ */ new Set();
7009
- Pv.forEach((e6, a3) => {
7019
+ Iv.forEach((e6, a3) => {
7010
7020
  var o2, s2;
7011
7021
  let c2 = a3.split("|"), l2 = ((o2 = c2[0]) == null ? "" : o2).toLowerCase(), u2 = ((s2 = c2[2]) == null ? "" : s2).toLowerCase();
7012
7022
  t2 === "inner" && l2 === n2 && i2.add(u2), t2 === "outer" && u2 === n2 && r2.add(l2);
7013
7023
  });
7014
7024
  let a2 = (e6, t3) => t3 === "inner" && r2.has(e6) || t3 === "outer" && i2.has(e6);
7015
- Nv == null || Nv.querySelectorAll(".planet-hit").forEach((e6) => {
7025
+ Fv == null || Fv.querySelectorAll(".planet-hit").forEach((e6) => {
7016
7026
  var r3;
7017
7027
  let i3 = e6.dataset.wheel, o2 = (r3 = e6.dataset.planet) == null ? "" : r3, s2 = o2 === n2 && i3 === t2, c2 = !s2 && a2(o2, i3);
7018
7028
  e6.classList.toggle("dim", !s2 && !c2);
7019
- }), Nv == null || Nv.querySelectorAll(".planet-glyph-group").forEach((e6) => {
7029
+ }), Fv == null || Fv.querySelectorAll(".planet-glyph-group").forEach((e6) => {
7020
7030
  var r3;
7021
7031
  let i3 = e6.dataset.wheel, o2 = (r3 = e6.dataset.planet) == null ? "" : r3;
7022
7032
  o2 === n2 && i3 === t2 ? e6.style.opacity = "1" : a2(o2, i3) ? e6.style.opacity = "0.55" : e6.style.opacity = "0.12";
7023
7033
  });
7024
7034
  }
7025
- function Yv() {
7026
- Pv.forEach(({ vis: e5, symbolEls: t2 }) => {
7035
+ function Zv() {
7036
+ Iv.forEach(({ vis: e5, symbolEls: t2 }) => {
7027
7037
  e5.style.strokeOpacity = "0.05", e5.style.strokeWidth = "0.5", e5.removeAttribute("filter"), t2.forEach((e6) => e6.style.opacity = "0.15");
7028
- }), Nv == null || Nv.querySelectorAll(".planet-glyph-group").forEach((e5) => {
7038
+ }), Fv == null || Fv.querySelectorAll(".planet-glyph-group").forEach((e5) => {
7029
7039
  e5.style.opacity = "0.3";
7030
- }), Nv == null || Nv.querySelectorAll(".planet-hit").forEach((e5) => {
7040
+ }), Fv == null || Fv.querySelectorAll(".planet-hit").forEach((e5) => {
7031
7041
  e5.classList.add("dim");
7032
7042
  });
7033
7043
  }
7034
- function Xv() {
7035
- Pv.forEach(({ vis: e5, color: t2, orb: n2, symbolEls: r2 }) => {
7036
- let i2 = ov(n2 == null ? 4 : n2);
7044
+ function Qv() {
7045
+ Iv.forEach(({ vis: e5, color: t2, orb: n2, symbolEls: r2 }) => {
7046
+ let i2 = cv(n2 == null ? 4 : n2);
7037
7047
  e5.style.stroke = t2, e5.style.strokeOpacity = i2.opacity, e5.style.strokeWidth = i2.width, e5.removeAttribute("filter"), i2.dash ? e5.setAttribute("stroke-dasharray", i2.dash) : e5.removeAttribute("stroke-dasharray"), r2.forEach((e6) => e6.style.opacity = "");
7038
- }), Nv == null || Nv.querySelectorAll(".planet-glyph-group").forEach((e5) => {
7048
+ }), Fv == null || Fv.querySelectorAll(".planet-glyph-group").forEach((e5) => {
7039
7049
  e5.style.opacity = "";
7040
- }), Nv == null || Nv.querySelectorAll(".planet-hit").forEach((e5) => e5.classList.remove("dim")), ay();
7050
+ }), Fv == null || Fv.querySelectorAll(".planet-hit").forEach((e5) => e5.classList.remove("dim")), sy();
7041
7051
  }
7042
- function Zv(e5) {
7043
- Pv.forEach(({ vis: t2, symbolEls: n2 }) => {
7052
+ function $v(e5) {
7053
+ Iv.forEach(({ vis: t2, symbolEls: n2 }) => {
7044
7054
  t2.style.display = e5 ? "" : "none", n2.forEach((t3) => t3.style.display = e5 ? "" : "none");
7045
- }), Nv == null || Nv.querySelectorAll(".aspect-hit").forEach((t2) => {
7055
+ }), Fv == null || Fv.querySelectorAll(".aspect-hit").forEach((t2) => {
7046
7056
  t2.style.display = e5 ? "" : "none";
7047
7057
  });
7048
7058
  }
7049
- function Qv(e5, t2, n2) {
7059
+ function ey(e5, t2, n2) {
7050
7060
  return "".concat(e5, "|inner|").concat(t2, "|outer|").concat(n2);
7051
7061
  }
7052
- function $v(e5, t2, n2, r2, i2) {
7062
+ function ty(e5, t2, n2, r2, i2) {
7053
7063
  return t2 === "inner" && r2 === "outer" ? "".concat(e5, "|inner|").concat(n2, "|outer|").concat(i2) : r2 === "inner" && t2 === "outer" ? "".concat(n2, "|inner|").concat(e5, "|outer|").concat(i2) : [e5, n2].sort().join("|") + "|".concat(i2);
7054
7064
  }
7055
- function ey(e5, t2) {
7065
+ function ny(e5, t2) {
7056
7066
  return e5.filter((e6) => {
7057
7067
  var n2;
7058
7068
  return ((n2 = e6.type) == null ? "" : n2).toLowerCase() === t2;
7059
7069
  });
7060
7070
  }
7061
- function ty(e5) {
7071
+ function ry(e5) {
7062
7072
  let t2 = [];
7063
7073
  if (!e5.length) return t2;
7064
- let n2 = ey(e5, "trine"), r2 = ey(e5, "square"), i2 = ey(e5, "opposition"), a2 = ey(e5, "conjunction"), o2 = /* @__PURE__ */ new Set();
7074
+ let n2 = ny(e5, "trine"), r2 = ny(e5, "square"), i2 = ny(e5, "opposition"), a2 = ny(e5, "conjunction"), o2 = /* @__PURE__ */ new Set();
7065
7075
  for (let e6 = 0; e6 < n2.length; e6++) for (let r3 = e6 + 1; r3 < n2.length; r3++) {
7066
7076
  let i3 = n2[e6], a3 = n2[r3];
7067
7077
  if (i3.planet1 !== a3.planet1) continue;
7068
7078
  let s3 = i3.planet1, c3 = i3.planet2, l2 = a3.planet2;
7069
7079
  if (c3 === l2) continue;
7070
7080
  let u2 = [s3, c3, l2].sort().join("|");
7071
- o2.has(u2) || (o2.add(u2), t2.push({ name: "Cross Trine", description: "".concat(Z(s3), " trines ").concat(Z(c3), " & ").concat(Z(l2)), planets: [{ name: s3, wheel: "inner" }, { name: c3, wheel: "outer" }, { name: l2, wheel: "outer" }], aspectKeys: [Qv(s3, c3, "trine"), Qv(s3, l2, "trine")] }));
7081
+ o2.has(u2) || (o2.add(u2), t2.push({ name: "Cross Trine", description: "".concat(Z(s3), " trines ").concat(Z(c3), " & ").concat(Z(l2)), planets: [{ name: s3, wheel: "inner" }, { name: c3, wheel: "outer" }, { name: l2, wheel: "outer" }], aspectKeys: [ey(s3, c3, "trine"), ey(s3, l2, "trine")] }));
7072
7082
  }
7073
7083
  let s2 = /* @__PURE__ */ new Set();
7074
7084
  for (let e6 of i2) {
@@ -7083,7 +7093,7 @@ function ty(e5) {
7083
7093
  if (s2.has(c3)) continue;
7084
7094
  let l2;
7085
7095
  if (l2 = o3 === "outer" ? e7 : r2.find((e8) => e8.planet1 === a3 && e8.planet2 === i3), l2) {
7086
- s2.add(c3), t2.push({ name: "Cross T-Square", description: "Apex: ".concat(Z(a3), " (").concat(o3, ")"), planets: [{ name: n3, wheel: "inner" }, { name: i3, wheel: "outer" }, { name: a3, wheel: o3 }], aspectKeys: [Qv(n3, i3, "opposition"), $v(n3, "inner", a3, o3, "square"), $v(a3, o3, i3, "outer", "square")] });
7096
+ s2.add(c3), t2.push({ name: "Cross T-Square", description: "Apex: ".concat(Z(a3), " (").concat(o3, ")"), planets: [{ name: n3, wheel: "inner" }, { name: i3, wheel: "outer" }, { name: a3, wheel: o3 }], aspectKeys: [ey(n3, i3, "opposition"), ty(n3, "inner", a3, o3, "square"), ty(a3, o3, i3, "outer", "square")] });
7087
7097
  break;
7088
7098
  }
7089
7099
  }
@@ -7099,26 +7109,26 @@ function ty(e5) {
7099
7109
  for (let [r3, i3] of e6) {
7100
7110
  if (i3.length < 2) continue;
7101
7111
  let e7 = "".concat(r3, "|").concat([...i3].sort().join("|"));
7102
- n3.has(e7) || (n3.add(e7), t2.push({ name: "Cross Stellium", description: "".concat(Z(r3), " conjunct ").concat(i3.map(Z).join(" & "), " (cross-wheel)"), planets: [{ name: r3, wheel: "inner" }, ...i3.map((e8) => ({ name: e8, wheel: "outer" }))], aspectKeys: i3.map((e8) => Qv(r3, e8, "conjunction")) }));
7112
+ n3.has(e7) || (n3.add(e7), t2.push({ name: "Cross Stellium", description: "".concat(Z(r3), " conjunct ").concat(i3.map(Z).join(" & "), " (cross-wheel)"), planets: [{ name: r3, wheel: "inner" }, ...i3.map((e8) => ({ name: e8, wheel: "outer" }))], aspectKeys: i3.map((e8) => ey(r3, e8, "conjunction")) }));
7103
7113
  }
7104
7114
  }
7105
7115
  return t2;
7106
7116
  }
7107
- var ny = { "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)" }, ry = { "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)" };
7108
- function iy(e5, t2, n2, r2) {
7117
+ var iy = { "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)" }, ay = { "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)" };
7118
+ function oy(e5, t2, n2, r2) {
7109
7119
  var i2, a2;
7110
- if (!Nv) return null;
7120
+ if (!Fv) return null;
7111
7121
  let o2 = /* @__PURE__ */ new Map();
7112
7122
  for (let e6 of t2) o2.set(e6.name.toLowerCase(), e6.longitude);
7113
7123
  let s2 = /* @__PURE__ */ new Map();
7114
7124
  for (let e6 of n2) s2.set(e6.name.toLowerCase(), e6.longitude);
7115
7125
  let c2 = [];
7116
7126
  for (let { name: t3, wheel: n3 } of e5.planets) {
7117
- let e6 = n3 === "inner" ? o2 : s2, i3 = n3 === "inner" ? X_ : $_, a3 = e6.get(t3.toLowerCase());
7127
+ let e6 = n3 === "inner" ? o2 : s2, i3 = n3 === "inner" ? Q_ : tv, a3 = e6.get(t3.toLowerCase());
7118
7128
  a3 != null && c2.push(Y(a3, i3, r2));
7119
7129
  }
7120
7130
  if (c2.length < 2) return null;
7121
- let l2 = (i2 = ny[e5.name]) == null ? "rgba(128,128,128,0.12)" : i2, u2 = (a2 = ry[e5.name]) == null ? "rgba(128,128,128,0.60)" : a2, d2;
7131
+ let l2 = (i2 = iy[e5.name]) == null ? "rgba(128,128,128,0.12)" : i2, u2 = (a2 = ay[e5.name]) == null ? "rgba(128,128,128,0.60)" : a2, d2;
7122
7132
  if (c2.length === 2) {
7123
7133
  let e6 = X("line");
7124
7134
  e6.setAttribute("x1", c2[0].x.toFixed(1)), e6.setAttribute("y1", c2[0].y.toFixed(1)), e6.setAttribute("x2", c2[1].x.toFixed(1)), e6.setAttribute("y2", c2[1].y.toFixed(1)), e6.setAttribute("stroke", u2), e6.setAttribute("stroke-width", "2"), e6.setAttribute("fill", "none"), d2 = e6;
@@ -7127,39 +7137,39 @@ function iy(e5, t2, n2, r2) {
7127
7137
  t3.setAttribute("points", e6.map((e7) => "".concat(e7.x.toFixed(1), ",").concat(e7.y.toFixed(1))).join(" ")), t3.setAttribute("fill", l2), t3.setAttribute("stroke", u2), t3.setAttribute("stroke-width", "1.5"), t3.setAttribute("stroke-linejoin", "round"), d2 = t3;
7128
7138
  }
7129
7139
  d2.setAttribute("pointer-events", "none"), d2.setAttribute("class", "pattern-overlay");
7130
- let f2 = Nv.querySelector(".aspect-hit");
7131
- return f2 ? Nv.insertBefore(d2, f2) : Nv.appendChild(d2), d2;
7140
+ let f2 = Fv.querySelector(".aspect-hit");
7141
+ return f2 ? Fv.insertBefore(d2, f2) : Fv.appendChild(d2), d2;
7132
7142
  }
7133
- function ay() {
7134
- Nv == null || Nv.querySelectorAll(".pattern-overlay").forEach((e5) => e5.remove());
7143
+ function sy() {
7144
+ Fv == null || Fv.querySelectorAll(".pattern-overlay").forEach((e5) => e5.remove());
7135
7145
  }
7136
- function oy(e5) {
7146
+ function cy(e5) {
7137
7147
  let t2 = new Set(e5.aspectKeys);
7138
- Pv.forEach(({ vis: e6, color: n3, symbolEls: r2 }, i2) => {
7148
+ Iv.forEach(({ vis: e6, color: n3, symbolEls: r2 }, i2) => {
7139
7149
  t2.has(i2) ? (e6.style.stroke = n3, e6.style.strokeOpacity = "0.92", e6.style.strokeWidth = "1.8", e6.removeAttribute("stroke-dasharray"), e6.setAttribute("filter", "url(#aspect-glow)"), r2.forEach((e7) => e7.style.opacity = "1")) : (e6.style.strokeOpacity = "0.05", e6.style.strokeWidth = "0.5", e6.removeAttribute("filter"), r2.forEach((e7) => e7.style.opacity = "0.15"));
7140
7150
  });
7141
7151
  let n2 = new Set(e5.planets.map((e6) => "".concat(e6.name.toLowerCase(), "|").concat(e6.wheel)));
7142
- Nv == null || Nv.querySelectorAll(".planet-glyph-group").forEach((e6) => {
7152
+ Fv == null || Fv.querySelectorAll(".planet-glyph-group").forEach((e6) => {
7143
7153
  var t3, r2;
7144
7154
  let i2 = "".concat((t3 = e6.dataset.planet) == null ? "" : t3, "|").concat((r2 = e6.dataset.wheel) == null ? "" : r2);
7145
7155
  e6.style.opacity = n2.has(i2) ? "1" : "0.12";
7146
- }), Nv == null || Nv.querySelectorAll(".planet-hit").forEach((e6) => {
7156
+ }), Fv == null || Fv.querySelectorAll(".planet-hit").forEach((e6) => {
7147
7157
  var t3, r2;
7148
7158
  let i2 = "".concat((t3 = e6.dataset.planet) == null ? "" : t3, "|").concat((r2 = e6.dataset.wheel) == null ? "" : r2);
7149
7159
  e6.classList.toggle("dim", !n2.has(i2));
7150
7160
  });
7151
7161
  }
7152
- function sy(e5, t2, n2, r2, i2, a2) {
7162
+ function ly(e5, t2, n2, r2, i2, a2) {
7153
7163
  var o2, s2, c2, l2, u2, d2, f2, p2, m2, h2, g2, _2;
7154
- Tv = i2 == null ? null : i2;
7164
+ Dv = i2 == null ? null : i2;
7155
7165
  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 = e5.querySelector("#pan-zoom-controls");
7156
- e5.innerHTML = "", x2 && e5.appendChild(x2), Pv.clear(), Uv();
7157
- let S2 = bv(t2.inner), ee2 = bv(t2.outer), C2 = (l2 = t2.inner_houses) == null ? [] : l2, te2 = (u2 = t2.cross_aspects) == null ? [] : u2;
7158
- te2.length === 0 && S2.length > 0 && ee2.length > 0 && (te2 = Sv(S2, ee2));
7159
- let w2 = (d2 = (f2 = (p2 = C2[0]) == null ? void 0 : p2.cusp_lon) == null ? t2.ascendant : f2) == null ? 0 : d2, T2 = dv(), E2 = X("svg");
7160
- E2.setAttribute("viewBox", "0 0 620 620"), E2.setAttribute("width", "100%"), E2.setAttribute("height", "100%"), E2.style.display = "block", e5.appendChild(E2), Nv = E2;
7166
+ e5.innerHTML = "", x2 && e5.appendChild(x2), Iv.clear(), Gv();
7167
+ let S2 = Sv(t2.inner), ee2 = Sv(t2.outer), C2 = (l2 = t2.inner_houses) == null ? [] : l2, te2 = (u2 = t2.cross_aspects) == null ? [] : u2;
7168
+ te2.length === 0 && S2.length > 0 && ee2.length > 0 && (te2 = wv(S2, ee2));
7169
+ let w2 = (d2 = (f2 = (p2 = C2[0]) == null ? void 0 : p2.cusp_lon) == null ? t2.ascendant : f2) == null ? 0 : d2, T2 = pv(), E2 = X("svg");
7170
+ E2.setAttribute("viewBox", "0 0 620 620"), E2.setAttribute("width", "100%"), E2.setAttribute("height", "100%"), E2.style.display = "block", e5.appendChild(E2), Fv = E2;
7161
7171
  let ne2 = X("defs");
7162
- ne2.innerHTML = '\n <filter id="aspect-glow" x="-50%" y="-50%" width="200%" height="200%">\n <feGaussianBlur in="SourceGraphic" stdDeviation="2.5" result="blur" />\n <feComposite in="SourceGraphic" in2="blur" operator="over" />\n </filter>\n ', E2.appendChild(ne2), i_(E2, "pan-zoom-controls");
7172
+ ne2.innerHTML = '\n <filter id="aspect-glow" x="-50%" y="-50%" width="200%" height="200%">\n <feGaussianBlur in="SourceGraphic" stdDeviation="2.5" result="blur" />\n <feComposite in="SourceGraphic" in2="blur" operator="over" />\n </filter>\n ', E2.appendChild(ne2), o_(E2, "pan-zoom-controls");
7163
7173
  let re2 = X("g");
7164
7174
  re2.setAttribute("class", "chart-layer"), re2.style.setProperty("--layer-index", "1"), E2.appendChild(re2);
7165
7175
  let D2 = X("g");
@@ -7174,110 +7184,110 @@ function sy(e5, t2, n2, r2, i2, a2) {
7174
7184
  E2.appendChild(se2);
7175
7185
  let ce2 = X("circle");
7176
7186
  ce2.setAttribute("cx", "310"), ce2.setAttribute("cy", "310"), ce2.setAttribute("r", "304"), ce2.style.fill = "var(--bg, #faf9f5)";
7177
- let le2 = d_(T2), ue2 = (e6, t3) => {
7187
+ let le2 = p_(T2), ue2 = (e6, t3) => {
7178
7188
  e6.setAttribute("stroke", le2.ring.stroke), e6.setAttribute("stroke-opacity", String(le2.ring.opacity)), e6.setAttribute("stroke-width", t3);
7179
7189
  };
7180
7190
  ue2(ce2, "0.5"), ce2.setAttribute("pointer-events", "none"), re2.appendChild(ce2);
7181
7191
  let de2 = X("circle");
7182
- de2.setAttribute("cx", "310"), de2.setAttribute("cy", "310"), de2.setAttribute("r", String(Z_)), de2.setAttribute("fill", "var(--outer-ring, #fdf5e4)"), ue2(de2, "0.8"), de2.setAttribute("pointer-events", "none"), D2.appendChild(de2);
7192
+ de2.setAttribute("cx", "310"), de2.setAttribute("cy", "310"), de2.setAttribute("r", String($_)), de2.setAttribute("fill", "var(--outer-ring, #fdf5e4)"), ue2(de2, "0.8"), de2.setAttribute("pointer-events", "none"), D2.appendChild(de2);
7183
7193
  let fe2 = X("circle");
7184
- fe2.setAttribute("cx", "310"), fe2.setAttribute("cy", "310"), fe2.setAttribute("r", String(Q_)), fe2.style.fill = "var(--bg, #faf9f5)", ue2(fe2, "0.8"), fe2.setAttribute("pointer-events", "none"), D2.appendChild(fe2);
7185
- for (let e6 = 0; e6 < 12; e6++) mv(D2, w2, e6, Q_, Z_, cy(l_(e6, T2)), 0.16);
7194
+ fe2.setAttribute("cx", "310"), fe2.setAttribute("cy", "310"), fe2.setAttribute("r", String(ev)), fe2.style.fill = "var(--bg, #faf9f5)", ue2(fe2, "0.8"), fe2.setAttribute("pointer-events", "none"), D2.appendChild(fe2);
7195
+ for (let e6 = 0; e6 < 12; e6++) gv(D2, w2, e6, ev, $_, uy(d_(e6, T2)), 0.16);
7186
7196
  for (let e6 = 0; e6 < 12; e6++) {
7187
- let t3 = e6 * 30, { x: n3, y: r3 } = Y(t3, Q_, w2), { x: i3, y: a3 } = Y(t3, Z_, w2), o3 = X("line");
7197
+ let t3 = e6 * 30, { x: n3, y: r3 } = Y(t3, ev, w2), { x: i3, y: a3 } = Y(t3, $_, w2), o3 = X("line");
7188
7198
  o3.setAttribute("x1", n3.toFixed(1)), o3.setAttribute("y1", r3.toFixed(1)), o3.setAttribute("x2", i3.toFixed(1)), o3.setAttribute("y2", a3.toFixed(1)), ue2(o3, "0.5"), o3.setAttribute("pointer-events", "none"), D2.appendChild(o3);
7189
7199
  let { x: s3, y: c3 } = Y(t3 + 15, 536 / 2, w2), l3 = X("text");
7190
- 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", cy(l_(e6, T2))), l3.setAttribute("pointer-events", "none"), l3.style.fontFamily = a_, l3.textContent = nv[e6], D2.appendChild(l3);
7200
+ 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", uy(d_(e6, T2))), l3.setAttribute("pointer-events", "none"), l3.style.fontFamily = s_, l3.textContent = iv[e6], D2.appendChild(l3);
7191
7201
  for (let e7 = 1; e7 < 30; e7++) {
7192
- let n4 = t3 + e7, r4 = e7 % 5 == 0, i4 = r4 ? Z_ - 8 : Z_ - 3.5, { x: a4, y: o4 } = Y(n4, Z_, w2), { x: s4, y: c4 } = Y(n4, i4, w2), l4 = X("line");
7202
+ let n4 = t3 + e7, r4 = e7 % 5 == 0, i4 = r4 ? $_ - 8 : $_ - 3.5, { x: a4, y: o4 } = Y(n4, $_, w2), { x: s4, y: c4 } = Y(n4, i4, w2), l4 = X("line");
7193
7203
  l4.setAttribute("x1", a4.toFixed(1)), l4.setAttribute("y1", o4.toFixed(1)), l4.setAttribute("x2", s4.toFixed(1)), l4.setAttribute("y2", c4.toFixed(1));
7194
7204
  let u4 = r4 ? le2.tickMajor : le2.tickMinor;
7195
7205
  l4.setAttribute("stroke", u4.stroke), l4.setAttribute("stroke-opacity", String(u4.opacity)), l4.setAttribute("stroke-width", r4 ? "0.8" : "0.5"), l4.setAttribute("pointer-events", "none"), D2.appendChild(l4);
7196
7206
  }
7197
- let { x: u3, y: d3 } = Y(t3, Z_, w2), { x: f3, y: p3 } = Y(t3 + 30, Z_, w2), { x: m3, y: h3 } = Y(t3, Q_, w2), { x: g3, y: _3 } = Y(t3 + 30, Q_, w2), x3 = X("path");
7198
- x3.setAttribute("d", ["M ".concat(u3.toFixed(1), " ").concat(d3.toFixed(1)), "A ".concat(Z_, " ").concat(Z_, " 0 0 0 ").concat(f3.toFixed(1), " ").concat(p3.toFixed(1)), "L ".concat(g3.toFixed(1), " ").concat(_3.toFixed(1)), "A ".concat(Q_, " ").concat(Q_, " 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";
7199
- let C3 = "".concat(nv[e6], " ").concat(rv[e6]), te3 = "".concat(Z(lv[e6]), " \xB7 ").concat(Z(uv[e6]));
7200
- ly(x3, "".concat(rv[e6], " \u2014 click for sign info")), x3.addEventListener("mouseenter", (e7) => Ov(e7.clientX, e7.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mousemove", (e7) => Ov(e7.clientX, e7.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mouseleave", kv), x3.addEventListener("click", (t4) => {
7201
- kv(), Cv == null || Cv("".concat(C3)), Vv(t4, e6, v2, y2, b2, S2, ee2);
7207
+ let { x: u3, y: d3 } = Y(t3, $_, w2), { x: f3, y: p3 } = Y(t3 + 30, $_, w2), { x: m3, y: h3 } = Y(t3, ev, w2), { x: g3, y: _3 } = Y(t3 + 30, ev, w2), x3 = X("path");
7208
+ x3.setAttribute("d", ["M ".concat(u3.toFixed(1), " ").concat(d3.toFixed(1)), "A ".concat($_, " ").concat($_, " 0 0 0 ").concat(f3.toFixed(1), " ").concat(p3.toFixed(1)), "L ".concat(g3.toFixed(1), " ").concat(_3.toFixed(1)), "A ".concat(ev, " ").concat(ev, " 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";
7209
+ let C3 = "".concat(iv[e6], " ").concat(av[e6]), te3 = "".concat(Z(dv[e6]), " \xB7 ").concat(Z(fv[e6]));
7210
+ dy(x3, "".concat(av[e6], " \u2014 click for sign info")), x3.addEventListener("mouseenter", (e7) => Av(e7.clientX, e7.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mousemove", (e7) => Av(e7.clientX, e7.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mouseleave", jv), x3.addEventListener("click", (t4) => {
7211
+ jv(), Tv == null || Tv("".concat(C3)), Uv(t4, e6, v2, y2, b2, S2, ee2);
7202
7212
  }), se2.appendChild(x3);
7203
7213
  }
7204
7214
  let pe2 = X("circle");
7205
- pe2.setAttribute("cx", "310"), pe2.setAttribute("cy", "310"), pe2.setAttribute("r", String(G_)), pe2.setAttribute("fill", "var(--inner-ring, #f2ede6)"), ue2(pe2, "0.6"), pe2.setAttribute("pointer-events", "none"), D2.appendChild(pe2);
7215
+ pe2.setAttribute("cx", "310"), pe2.setAttribute("cy", "310"), pe2.setAttribute("r", String(q_)), pe2.setAttribute("fill", "var(--inner-ring, #f2ede6)"), ue2(pe2, "0.6"), pe2.setAttribute("pointer-events", "none"), D2.appendChild(pe2);
7206
7216
  let me2 = X("circle");
7207
- me2.setAttribute("cx", "310"), me2.setAttribute("cy", "310"), me2.setAttribute("r", String(K_)), me2.style.fill = "var(--bg, #faf9f5)", ue2(me2, "0.6"), me2.setAttribute("pointer-events", "none"), D2.appendChild(me2);
7208
- for (let e6 = 0; e6 < 12; e6++) mv(D2, w2, e6, K_, G_, l_(e6, T2), c_(T2).zodiacFillOpacity);
7217
+ me2.setAttribute("cx", "310"), me2.setAttribute("cy", "310"), me2.setAttribute("r", String(J_)), me2.style.fill = "var(--bg, #faf9f5)", ue2(me2, "0.6"), me2.setAttribute("pointer-events", "none"), D2.appendChild(me2);
7218
+ for (let e6 = 0; e6 < 12; e6++) gv(D2, w2, e6, J_, q_, d_(e6, T2), u_(T2).zodiacFillOpacity);
7209
7219
  for (let e6 = 0; e6 < 12; e6++) {
7210
- let t3 = e6 * 30, { x: n3, y: r3 } = Y(t3, K_, w2), { x: i3, y: a3 } = Y(t3, G_, w2), o3 = X("line");
7220
+ let t3 = e6 * 30, { x: n3, y: r3 } = Y(t3, J_, w2), { x: i3, y: a3 } = Y(t3, q_, w2), o3 = X("line");
7211
7221
  o3.setAttribute("x1", n3.toFixed(1)), o3.setAttribute("y1", r3.toFixed(1)), o3.setAttribute("x2", i3.toFixed(1)), o3.setAttribute("y2", a3.toFixed(1)), ue2(o3, "0.5"), o3.setAttribute("pointer-events", "none"), D2.appendChild(o3);
7212
7222
  let { x: s3, y: c3 } = Y(t3 + 15, 444 / 2, w2), l3 = X("text");
7213
- 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", "13"), l3.setAttribute("fill", l_(e6, T2)), l3.setAttribute("pointer-events", "none"), l3.style.fontFamily = a_, l3.textContent = nv[e6], D2.appendChild(l3);
7223
+ 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", "13"), l3.setAttribute("fill", d_(e6, T2)), l3.setAttribute("pointer-events", "none"), l3.style.fontFamily = s_, l3.textContent = iv[e6], D2.appendChild(l3);
7214
7224
  for (let e7 = 1; e7 < 30; e7++) {
7215
- let n4 = t3 + e7, r4 = e7 % 5 == 0, i4 = r4 ? G_ - 7 : G_ - 3, { x: a4, y: o4 } = Y(n4, G_, w2), { x: s4, y: c4 } = Y(n4, i4, w2), l4 = X("line");
7225
+ let n4 = t3 + e7, r4 = e7 % 5 == 0, i4 = r4 ? q_ - 7 : q_ - 3, { x: a4, y: o4 } = Y(n4, q_, w2), { x: s4, y: c4 } = Y(n4, i4, w2), l4 = X("line");
7216
7226
  l4.setAttribute("x1", a4.toFixed(1)), l4.setAttribute("y1", o4.toFixed(1)), l4.setAttribute("x2", s4.toFixed(1)), l4.setAttribute("y2", c4.toFixed(1));
7217
7227
  let u3 = r4 ? le2.tickMajor : le2.tickMinor;
7218
7228
  l4.setAttribute("stroke", u3.stroke), l4.setAttribute("stroke-opacity", String(u3.opacity)), l4.setAttribute("stroke-width", r4 ? "0.8" : "0.5"), l4.setAttribute("pointer-events", "none"), D2.appendChild(l4);
7219
7229
  }
7220
7230
  }
7221
7231
  let he2 = X("g");
7222
- he2.setAttribute("pointer-events", "none"), he2.setAttribute("opacity", T2 ? "0.18" : "0.10"), he2.setAttribute("transform", "translate(".concat(U_, ", ").concat(W_, ")"));
7232
+ he2.setAttribute("pointer-events", "none"), he2.setAttribute("opacity", T2 ? "0.18" : "0.10"), he2.setAttribute("transform", "translate(".concat(G_, ", ").concat(K_, ")"));
7223
7233
  let ge2 = X("circle");
7224
7234
  ge2.setAttribute("cx", "0"), ge2.setAttribute("cy", "0"), ge2.setAttribute("r", "46"), ge2.setAttribute("fill", "none"), ge2.setAttribute("stroke", "var(--gold, #c8a84b)"), ge2.setAttribute("stroke-width", "2"), he2.appendChild(ge2);
7225
7235
  let _e2 = X("circle");
7226
7236
  _e2.setAttribute("cx", "0"), _e2.setAttribute("cy", "0"), _e2.setAttribute("r", "36"), _e2.setAttribute("fill", "none"), _e2.setAttribute("stroke", "var(--gold, #c8a84b)"), _e2.setAttribute("stroke-width", "0.7"), he2.appendChild(_e2);
7227
7237
  let ve2 = X("text");
7228
- ve2.setAttribute("x", "0"), ve2.setAttribute("y", "1"), ve2.setAttribute("text-anchor", "middle"), ve2.setAttribute("dominant-baseline", "central"), ve2.setAttribute("font-size", "18"), ve2.setAttribute("font-weight", "600"), ve2.setAttribute("letter-spacing", "3"), ve2.setAttribute("fill", "var(--gold, #c8a84b)"), ve2.style.fontFamily = "'Geist', system-ui, sans-serif", ve2.textContent = "OE", he2.appendChild(ve2);
7238
+ ve2.setAttribute("x", "0"), ve2.setAttribute("y", "1"), ve2.setAttribute("text-anchor", "middle"), ve2.setAttribute("dominant-baseline", "central"), ve2.setAttribute("font-size", "18"), ve2.setAttribute("font-weight", "600"), ve2.setAttribute("letter-spacing", "3"), ve2.setAttribute("fill", "var(--gold, #c8a84b)"), ve2.style.fontFamily = "var(--font-ui)", ve2.textContent = "OE", he2.appendChild(ve2);
7229
7239
  for (let e6 of [0, 90, 180, 270]) {
7230
7240
  let t3 = e6 * Math.PI / 180, n3 = Math.cos(t3) * 38, r3 = Math.sin(t3) * 38, i3 = Math.cos(t3) * 46, a3 = Math.sin(t3) * 46, o3 = X("line");
7231
7241
  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(--gold, #c8a84b)"), o3.setAttribute("stroke-width", "1.5"), he2.appendChild(o3);
7232
7242
  }
7233
7243
  re2.appendChild(he2);
7234
7244
  let ye2 = X("circle");
7235
- ye2.setAttribute("cx", "310"), ye2.setAttribute("cy", "310"), ye2.setAttribute("r", String(K_)), ye2.style.fill = "var(--surface, #f2f1ea)", ye2.setAttribute("pointer-events", "none"), ie2.appendChild(ye2);
7245
+ ye2.setAttribute("cx", "310"), ye2.setAttribute("cy", "310"), ye2.setAttribute("r", String(J_)), ye2.style.fill = "var(--surface, #f2f1ea)", ye2.setAttribute("pointer-events", "none"), ie2.appendChild(ye2);
7236
7246
  let be2 = X("circle");
7237
- if (be2.setAttribute("cx", "310"), be2.setAttribute("cy", "310"), be2.setAttribute("r", String(Y_)), be2.style.fill = le2.center, ue2(be2, "0.8"), be2.setAttribute("pointer-events", "none"), ie2.appendChild(be2), C2.length > 0) for (let e6 = 0; e6 < C2.length; e6++) {
7247
+ if (be2.setAttribute("cx", "310"), be2.setAttribute("cy", "310"), be2.setAttribute("r", String(Z_)), be2.style.fill = le2.center, ue2(be2, "0.8"), be2.setAttribute("pointer-events", "none"), ie2.appendChild(be2), C2.length > 0) for (let e6 = 0; e6 < C2.length; e6++) {
7238
7248
  let t3 = C2[e6], n3 = C2[(e6 + 1) % C2.length], r3 = [1, 4, 7, 10].includes(t3.number), i3 = X("path");
7239
- i3.setAttribute("d", pv(t3.cusp_lon, n3.cusp_lon, Y_, K_, w2)), i3.setAttribute("fill", l_(Math.floor((t3.cusp_lon % 360 + 360) % 360 / 30), T2)), i3.setAttribute("fill-opacity", String(c_(T2).houseFillOpacity)), i3.setAttribute("pointer-events", "none"), ie2.appendChild(i3);
7240
- let { x: a3, y: o3 } = Y(t3.cusp_lon, Y_, w2), { x: s3, y: c3 } = Y(t3.cusp_lon, K_, w2), l3 = X("line");
7249
+ i3.setAttribute("d", hv(t3.cusp_lon, n3.cusp_lon, Z_, J_, w2)), i3.setAttribute("fill", d_(Math.floor((t3.cusp_lon % 360 + 360) % 360 / 30), T2)), i3.setAttribute("fill-opacity", String(u_(T2).houseFillOpacity)), i3.setAttribute("pointer-events", "none"), ie2.appendChild(i3);
7250
+ let { x: a3, y: o3 } = Y(t3.cusp_lon, Z_, w2), { x: s3, y: c3 } = Y(t3.cusp_lon, J_, w2), l3 = X("line");
7241
7251
  l3.setAttribute("x1", a3.toFixed(1)), l3.setAttribute("y1", o3.toFixed(1)), l3.setAttribute("x2", s3.toFixed(1)), l3.setAttribute("y2", c3.toFixed(1));
7242
7252
  let u3 = r3 ? le2.cuspAngular : le2.cuspIntermediate;
7243
7253
  l3.setAttribute("stroke", u3.stroke), l3.setAttribute("stroke-opacity", String(u3.opacity)), l3.setAttribute("stroke-width", r3 ? "1.8" : "0.9"), r3 || l3.setAttribute("stroke-dasharray", le2.cuspDash(0.9)), l3.setAttribute("pointer-events", "none"), ie2.appendChild(l3);
7244
- let d3 = (n3.cusp_lon - t3.cusp_lon + 360) % 360, { x: f3, y: p3 } = Y(t3.cusp_lon + d3 / 2, J_, w2), m3 = X("text");
7245
- m3.setAttribute("x", f3.toFixed(1)), m3.setAttribute("y", p3.toFixed(1)), m3.setAttribute("text-anchor", "middle"), m3.setAttribute("dominant-baseline", "central"), m3.setAttribute("font-size", "12"), m3.setAttribute("fill", c_(T2).foreground), m3.setAttribute("opacity", "0.9"), m3.setAttribute("font-weight", r3 ? "700" : "600"), m3.setAttribute("pointer-events", "none"), m3.textContent = String(t3.number), ie2.appendChild(m3);
7254
+ let d3 = (n3.cusp_lon - t3.cusp_lon + 360) % 360, { x: f3, y: p3 } = Y(t3.cusp_lon + d3 / 2, X_, w2), m3 = X("text");
7255
+ m3.setAttribute("x", f3.toFixed(1)), m3.setAttribute("y", p3.toFixed(1)), m3.setAttribute("text-anchor", "middle"), m3.setAttribute("dominant-baseline", "central"), m3.setAttribute("font-size", "12"), m3.setAttribute("fill", u_(T2).foreground), m3.setAttribute("opacity", "0.9"), m3.setAttribute("font-weight", r3 ? "700" : "600"), m3.setAttribute("pointer-events", "none"), m3.textContent = String(t3.number), ie2.appendChild(m3);
7246
7256
  let h3 = X("circle");
7247
7257
  h3.setAttribute("cx", f3.toFixed(1)), h3.setAttribute("cy", p3.toFixed(1)), h3.setAttribute("r", "14"), h3.setAttribute("fill", "transparent"), h3.setAttribute("class", "hit-region house-hit"), h3.style.pointerEvents = "all", h3.style.cursor = "pointer";
7248
- let g3 = "House ".concat(t3.number), _3 = "".concat(Rv[t3.number] ? Rv[t3.number] + " \xB7 " : "").concat(gv(t3.cusp_lon));
7249
- ly(h3, "".concat(g3, " \u2014 click for interpretation")), h3.addEventListener("mouseenter", (e7) => Ov(e7.clientX, e7.clientY, g3, _3, "Click for interpretation")), h3.addEventListener("mousemove", (e7) => Ov(e7.clientX, e7.clientY, g3, _3, "Click for interpretation")), h3.addEventListener("mouseleave", kv), h3.addEventListener("click", (e7) => {
7250
- kv(), Cv == null || Cv("".concat(g3, " \xB7 ").concat(gv(t3.cusp_lon))), Bv(e7, t3, n3, v2, y2, b2, S2, ee2);
7258
+ let g3 = "House ".concat(t3.number), _3 = "".concat(Bv[t3.number] ? Bv[t3.number] + " \xB7 " : "").concat(vv(t3.cusp_lon));
7259
+ dy(h3, "".concat(g3, " \u2014 click for interpretation")), h3.addEventListener("mouseenter", (e7) => Av(e7.clientX, e7.clientY, g3, _3, "Click for interpretation")), h3.addEventListener("mousemove", (e7) => Av(e7.clientX, e7.clientY, g3, _3, "Click for interpretation")), h3.addEventListener("mouseleave", jv), h3.addEventListener("click", (e7) => {
7260
+ jv(), Tv == null || Tv("".concat(g3, " \xB7 ").concat(vv(t3.cusp_lon))), Hv(e7, t3, n3, v2, y2, b2, S2, ee2);
7251
7261
  }), se2.appendChild(h3);
7252
7262
  }
7253
7263
  let O2 = C2.find((e6) => e6.number === 1), xe2 = C2.find((e6) => e6.number === 4), k2 = C2.find((e6) => e6.number === 7), Se2 = C2.find((e6) => e6.number === 10), Ce2 = [{ lon: (m2 = O2 == null ? void 0 : O2.cusp_lon) == null ? w2 : m2, label: "ASC" }, { lon: (h2 = k2 == null ? void 0 : k2.cusp_lon) == null ? (w2 + 180) % 360 : h2, label: "DSC" }, { lon: (g2 = Se2 == null ? void 0 : Se2.cusp_lon) == null ? (w2 + 270) % 360 : g2, label: "MC" }, { lon: (_2 = xe2 == null ? void 0 : xe2.cusp_lon) == null ? (w2 + 90) % 360 : _2, label: "IC" }];
7254
7264
  for (let e6 of Ce2) {
7255
7265
  var we2;
7256
- let t3 = Iv[e6.label], { x: n3, y: r3 } = Y(e6.lon, Z_ - 8, w2), i3 = X("text");
7257
- 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", c_(T2).foreground), i3.setAttribute("pointer-events", "none"), i3.style.transition = "opacity 150ms ease", i3.textContent = e6.label, ie2.appendChild(i3);
7266
+ let t3 = Rv[e6.label], { x: n3, y: r3 } = Y(e6.lon, $_ - 8, w2), i3 = X("text");
7267
+ 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", u_(T2).foreground), i3.setAttribute("pointer-events", "none"), i3.style.transition = "opacity 150ms ease", i3.textContent = e6.label, ie2.appendChild(i3);
7258
7268
  let a3 = X("circle");
7259
- 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", ly(a3, "".concat((we2 = t3 == null ? void 0 : t3.title) == null ? e6.label : we2, " \u2014 click for interpretation"));
7260
- let o3 = gv(e6.lon), s3 = "".concat(t3 != null && t3.keyword ? t3.keyword + " \xB7 " : "").concat(o3);
7269
+ 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", dy(a3, "".concat((we2 = t3 == null ? void 0 : t3.title) == null ? e6.label : we2, " \u2014 click for interpretation"));
7270
+ let o3 = vv(e6.lon), s3 = "".concat(t3 != null && t3.keyword ? t3.keyword + " \xB7 " : "").concat(o3);
7261
7271
  a3.addEventListener("mouseenter", (n4) => {
7262
7272
  var r4;
7263
- Ov(n4.clientX, n4.clientY, "".concat(e6.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4), s3, "Click for interpretation"), i3.style.opacity = "0.6";
7273
+ Av(n4.clientX, n4.clientY, "".concat(e6.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4), s3, "Click for interpretation"), i3.style.opacity = "0.6";
7264
7274
  }), a3.addEventListener("mouseleave", () => {
7265
- kv(), i3.style.opacity = "";
7275
+ jv(), i3.style.opacity = "";
7266
7276
  }), a3.addEventListener("click", (n4) => {
7267
7277
  var r4;
7268
- kv(), Yv(), Cv == null || Cv("".concat(e6.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4, " \xB7 ").concat(o3)), Lv(n4, e6.label, e6.lon, v2, y2);
7278
+ jv(), Zv(), Tv == null || Tv("".concat(e6.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4, " \xB7 ").concat(o3)), zv(n4, e6.label, e6.lon, v2, y2);
7269
7279
  }), se2.appendChild(a3);
7270
7280
  }
7271
7281
  for (let e6 of te2) {
7272
7282
  var Te2, Ee2, De2, Oe2, ke2, Ae2, je2, Me2, Ne2, Pe2, Fe2, Ie2;
7273
7283
  let t3 = S2.find((t4) => t4.name.toLowerCase() === e6.planet1.toLowerCase()), n3 = ee2.find((t4) => t4.name.toLowerCase() === e6.planet2.toLowerCase());
7274
7284
  if (!t3 || !n3) continue;
7275
- let i3 = av((Te2 = (Ee2 = e6.type) == null ? void 0 : Ee2.toLowerCase()) == null ? "" : Te2), a3 = ov(e6.orb), { x: o3, y: s3 } = Y(t3.longitude, X_, w2), { x: c3, y: l3 } = Y(n3.longitude, Q_, w2), u3 = X("line");
7285
+ let i3 = sv((Te2 = (Ee2 = e6.type) == null ? void 0 : Ee2.toLowerCase()) == null ? "" : Te2), a3 = cv(e6.orb), { x: o3, y: s3 } = Y(t3.longitude, Q_, w2), { x: c3, y: l3 } = Y(n3.longitude, ev, w2), u3 = X("line");
7276
7286
  u3.setAttribute("x1", o3.toFixed(1)), u3.setAttribute("y1", s3.toFixed(1)), u3.setAttribute("x2", c3.toFixed(1)), u3.setAttribute("y2", l3.toFixed(1)), a3.dash && u3.setAttribute("stroke-dasharray", a3.dash), u3.setAttribute("stroke-linecap", "round"), u3.setAttribute("pointer-events", "none"), u3.style.stroke = i3, u3.style.strokeOpacity = a3.opacity, u3.style.strokeWidth = a3.width, ae2.appendChild(u3);
7277
7287
  let d3 = o3 + (c3 - o3) * 0.35, f3 = s3 + (l3 - s3) * 0.35, p3 = Math.hypot(c3 - o3, l3 - s3), m3 = [];
7278
7288
  if (p3 > 40) {
7279
7289
  var Le2, A2, Re2;
7280
- let t4 = (Le2 = iv[(A2 = (Re2 = e6.type) == null ? void 0 : Re2.toLowerCase()) == null ? "" : A2]) == null ? "" : Le2;
7290
+ let t4 = (Le2 = ov[(A2 = (Re2 = e6.type) == null ? void 0 : Re2.toLowerCase()) == null ? "" : A2]) == null ? "" : Le2;
7281
7291
  if (t4) {
7282
7292
  let e7 = X("circle");
7283
7293
  e7.setAttribute("cx", d3.toFixed(1)), e7.setAttribute("cy", f3.toFixed(1)), e7.setAttribute("r", "9"), e7.setAttribute("fill", le2.center), e7.setAttribute("stroke", i3), e7.setAttribute("stroke-opacity", "0.9"), e7.setAttribute("stroke-width", "1"), e7.setAttribute("pointer-events", "none"), e7.classList.add("aspect-symbol-group"), ae2.appendChild(e7), m3.push(e7);
@@ -7286,123 +7296,123 @@ function sy(e5, t2, n2, r2, i2, a2) {
7286
7296
  }
7287
7297
  }
7288
7298
  let h3 = X("line");
7289
- 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", ly(h3, "Aspect: ".concat(e6.type || "Aspect", " between inner ").concat(e6.planet1, " and outer ").concat(e6.planet2));
7290
- let g3 = (De2 = tv[t3.name.toLowerCase()]) == null ? t3.name : De2, _3 = (Oe2 = tv[n3.name.toLowerCase()]) == null ? n3.name : Oe2, x3 = (ke2 = (Ae2 = iv[(je2 = (Me2 = e6.type) == null ? void 0 : Me2.toLowerCase()) == null ? "" : je2]) == null ? e6.type : Ae2) == null ? "" : ke2, C3 = v2 === "transit" ? e6.applying ? " (applying)" : " (separating)" : e6.orb <= 1 ? " (exact)" : e6.orb <= 3 ? " (tight)" : " (wide)", te3 = (Ne2 = jv[(Pe2 = (Fe2 = e6.type) == null ? void 0 : Fe2.toLowerCase()) == null ? "" : Pe2]) == null ? "" : Ne2, T3 = "".concat(te3 ? te3 + " \xB7 " : "").concat(g3, " ").concat(x3, " ").concat(_3, " \xB7 ").concat(e6.orb.toFixed(1), "\xB0 orb").concat(C3);
7299
+ 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", dy(h3, "Aspect: ".concat(e6.type || "Aspect", " between inner ").concat(e6.planet1, " and outer ").concat(e6.planet2));
7300
+ let g3 = (De2 = rv[t3.name.toLowerCase()]) == null ? t3.name : De2, _3 = (Oe2 = rv[n3.name.toLowerCase()]) == null ? n3.name : Oe2, x3 = (ke2 = (Ae2 = ov[(je2 = (Me2 = e6.type) == null ? void 0 : Me2.toLowerCase()) == null ? "" : je2]) == null ? e6.type : Ae2) == null ? "" : ke2, C3 = v2 === "transit" ? e6.applying ? " (applying)" : " (separating)" : e6.orb <= 1 ? " (exact)" : e6.orb <= 3 ? " (tight)" : " (wide)", te3 = (Ne2 = Nv[(Pe2 = (Fe2 = e6.type) == null ? void 0 : Fe2.toLowerCase()) == null ? "" : Pe2]) == null ? "" : Ne2, T3 = "".concat(te3 ? te3 + " \xB7 " : "").concat(g3, " ").concat(x3, " ").concat(_3, " \xB7 ").concat(e6.orb.toFixed(1), "\xB0 orb").concat(C3);
7291
7301
  h3.addEventListener("mouseenter", (t4) => {
7292
7302
  var n4;
7293
- return Ov(t4.clientX, t4.clientY, Z((n4 = e6.type) == null ? "Cross-Aspect" : n4), T3, "Click for interpretation");
7303
+ return Av(t4.clientX, t4.clientY, Z((n4 = e6.type) == null ? "Cross-Aspect" : n4), T3, "Click for interpretation");
7294
7304
  }), h3.addEventListener("mousemove", (t4) => {
7295
7305
  var n4;
7296
- return Ov(t4.clientX, t4.clientY, Z((n4 = e6.type) == null ? "Cross-Aspect" : n4), T3, "Click for interpretation");
7297
- }), h3.addEventListener("mouseleave", kv), h3.addEventListener("click", (t4) => {
7306
+ return Av(t4.clientX, t4.clientY, Z((n4 = e6.type) == null ? "Cross-Aspect" : n4), T3, "Click for interpretation");
7307
+ }), h3.addEventListener("mouseleave", jv), h3.addEventListener("click", (t4) => {
7298
7308
  var n4, a4, o4, s4, c4, l4;
7299
- kv(), qv(Fv(e6), i3), Gv(t4, e6, v2, y2, b2);
7300
- let u4 = (n4 = tv[e6.planet1.toLowerCase()]) == null ? e6.planet1 : n4, d4 = (a4 = tv[e6.planet2.toLowerCase()]) == null ? e6.planet2 : a4, f4 = (o4 = (s4 = iv[(c4 = (l4 = e6.type) == null ? void 0 : l4.toLowerCase()) == null ? "" : c4]) == null ? e6.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;
7301
- Cv == null || Cv("".concat(p4, " ").concat(f4, " ").concat(m4, " \xB7 ").concat(e6.orb.toFixed(1), "\xB0")), r2(e6);
7302
- }), Pv.set(Fv(e6), { vis: u3, color: i3, aspectType: ((Ie2 = e6.type) == null ? void 0 : Ie2.toLowerCase()) || "unknown", orb: e6.orb, symbolEls: m3 }), se2.appendChild(h3);
7309
+ jv(), Yv(Lv(e6), i3), qv(t4, e6, v2, y2, b2);
7310
+ let u4 = (n4 = rv[e6.planet1.toLowerCase()]) == null ? e6.planet1 : n4, d4 = (a4 = rv[e6.planet2.toLowerCase()]) == null ? e6.planet2 : a4, f4 = (o4 = (s4 = ov[(c4 = (l4 = e6.type) == null ? void 0 : l4.toLowerCase()) == null ? "" : c4]) == null ? e6.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;
7311
+ Tv == null || Tv("".concat(p4, " ").concat(f4, " ").concat(m4, " \xB7 ").concat(e6.orb.toFixed(1), "\xB0")), r2(e6);
7312
+ }), Iv.set(Lv(e6), { vis: u3, color: i3, aspectType: ((Ie2 = e6.type) == null ? void 0 : Ie2.toLowerCase()) || "unknown", orb: e6.orb, symbolEls: m3 }), se2.appendChild(h3);
7303
7313
  }
7304
- let ze2 = __(ee2.map((e6) => ({ name: e6.name.toLowerCase(), longitude: e6.longitude })), 7), Be2 = X("g");
7314
+ let ze2 = y_(ee2.map((e6) => ({ name: e6.name.toLowerCase(), longitude: e6.longitude })), 7), Be2 = X("g");
7305
7315
  Be2.setAttribute("class", "outer-planet-group"), oe2.appendChild(Be2);
7306
7316
  for (let e6 of ee2) {
7307
7317
  var Ve2, He2, Ue2;
7308
- let t3 = (Ve2 = tv[e6.name.toLowerCase()]) == null ? "\u2605" : Ve2, r3 = e6.name.toLowerCase(), i3 = (He2 = ze2.get(r3)) == null ? e6.longitude : He2, { x: a3, y: o3 } = Y(i3, $_, w2), s3 = X("g");
7318
+ let t3 = (Ve2 = rv[e6.name.toLowerCase()]) == null ? "\u2605" : Ve2, r3 = e6.name.toLowerCase(), i3 = (He2 = ze2.get(r3)) == null ? e6.longitude : He2, { x: a3, y: o3 } = Y(i3, tv, w2), s3 = X("g");
7309
7319
  s3.setAttribute("class", "planet-glyph-group"), s3.dataset.planet = r3, s3.dataset.wheel = "outer", s3.style.transition = "opacity 200ms ease", Be2.appendChild(s3);
7310
7320
  let { x: c3, y: l3 } = Y(e6.longitude, 251, w2), u3 = X("circle");
7311
- if (u3.setAttribute("cx", c3.toFixed(1)), u3.setAttribute("cy", l3.toFixed(1)), u3.setAttribute("r", "2.5"), u3.setAttribute("fill", "var(--outer-tick, #c8860e)"), u3.setAttribute("opacity", "0.75"), u3.setAttribute("pointer-events", "none"), s3.appendChild(u3), x_(e6.longitude, i3) > 2) {
7321
+ if (u3.setAttribute("cx", c3.toFixed(1)), u3.setAttribute("cy", l3.toFixed(1)), u3.setAttribute("r", "2.5"), u3.setAttribute("fill", "var(--outer-tick, #c8860e)"), u3.setAttribute("opacity", "0.75"), u3.setAttribute("pointer-events", "none"), s3.appendChild(u3), C_(e6.longitude, i3) > 2) {
7312
7322
  let e7 = X("line");
7313
7323
  e7.setAttribute("x1", c3.toFixed(1)), e7.setAttribute("y1", l3.toFixed(1)), e7.setAttribute("x2", a3.toFixed(1)), e7.setAttribute("y2", o3.toFixed(1)), e7.setAttribute("stroke", "var(--outer-tick, #c8860e)"), e7.setAttribute("stroke-width", "0.7"), e7.setAttribute("stroke-opacity", "0.35"), e7.setAttribute("stroke-linecap", "round"), e7.setAttribute("pointer-events", "none"), s3.appendChild(e7);
7314
7324
  }
7315
7325
  let d3 = X("text");
7316
- d3.setAttribute("x", a3.toFixed(1)), d3.setAttribute("y", o3.toFixed(1)), d3.setAttribute("text-anchor", "middle"), d3.setAttribute("dominant-baseline", "central"), d3.setAttribute("font-size", "18"), d3.setAttribute("font-weight", "600"), d3.setAttribute("pointer-events", "none"), d3.style.fill = c_(T2).transit, d3.style.fontFamily = a_, d3.textContent = t3, s3.appendChild(d3);
7317
- let f3 = Math.floor((e6.longitude % 360 + 360) % 360 % 30), { x: p3, y: m3 } = Y(i3, $_ - 14, w2), h3 = X("text");
7326
+ d3.setAttribute("x", a3.toFixed(1)), d3.setAttribute("y", o3.toFixed(1)), d3.setAttribute("text-anchor", "middle"), d3.setAttribute("dominant-baseline", "central"), d3.setAttribute("font-size", "18"), d3.setAttribute("font-weight", "600"), d3.setAttribute("pointer-events", "none"), d3.style.fill = u_(T2).transit, d3.style.fontFamily = s_, d3.textContent = t3, s3.appendChild(d3);
7327
+ let f3 = Math.floor((e6.longitude % 360 + 360) % 360 % 30), { x: p3, y: m3 } = Y(i3, tv - 14, w2), h3 = X("text");
7318
7328
  if (h3.setAttribute("x", p3.toFixed(1)), h3.setAttribute("y", m3.toFixed(1)), h3.setAttribute("text-anchor", "middle"), h3.setAttribute("dominant-baseline", "central"), h3.setAttribute("font-size", "8.5"), h3.setAttribute("fill", "#b08030"), h3.setAttribute("pointer-events", "none"), h3.textContent = "".concat(f3, "\xB0"), s3.appendChild(h3), e6.retrograde) {
7319
7329
  let { x: e7, y: t4 } = Y(i3, 277, w2), n3 = X("text");
7320
7330
  n3.setAttribute("x", e7.toFixed(1)), n3.setAttribute("y", t4.toFixed(1)), n3.setAttribute("text-anchor", "middle"), n3.setAttribute("dominant-baseline", "central"), n3.setAttribute("font-size", "8"), n3.setAttribute("fill", "#e05252"), n3.setAttribute("pointer-events", "none"), n3.textContent = "\u211E", s3.appendChild(n3);
7321
7331
  }
7322
- let g3 = cv(e6.name, e6.longitude);
7332
+ let g3 = uv(e6.name, e6.longitude);
7323
7333
  if (g3) {
7324
7334
  let { x: e7, y: t4 } = Y(i3, 276, w2), n3 = X("circle");
7325
7335
  n3.setAttribute("cx", e7.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);
7326
7336
  }
7327
7337
  let _3 = X("circle");
7328
- _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(ev)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "outer", _3.style.pointerEvents = "all", ly(_3, "Outer Planet: ".concat(e6.name));
7329
- let x3 = "".concat(v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "").concat(t3, " ").concat(Z(e6.name)), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Ue2 = Av[e6.name.toLowerCase()]) == null ? "" : Ue2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(gv(e6.longitude)).concat(e6.house ? " \xB7 H".concat(e6.house) : "").concat(e6.retrograde ? " \u211E" : "").concat(S3);
7330
- _3.addEventListener("mouseenter", (e7) => Ov(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e7) => Ov(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", kv), _3.addEventListener("click", (t4) => {
7338
+ _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(nv)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "outer", _3.style.pointerEvents = "all", dy(_3, "Outer Planet: ".concat(e6.name));
7339
+ let x3 = "".concat(v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "").concat(t3, " ").concat(Z(e6.name)), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Ue2 = Mv[e6.name.toLowerCase()]) == null ? "" : Ue2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(vv(e6.longitude)).concat(e6.house ? " \xB7 H".concat(e6.house) : "").concat(e6.retrograde ? " \u211E" : "").concat(S3);
7340
+ _3.addEventListener("mouseenter", (e7) => Av(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e7) => Av(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", jv), _3.addEventListener("click", (t4) => {
7331
7341
  var r4, i4;
7332
- kv(), Kv(e6.name, "outer"), Wv(t4, e6, "outer", te2, v2, y2, b2);
7333
- let a4 = (r4 = tv[e6.name.toLowerCase()]) == null ? "\u2605" : r4, o4 = Math.floor((e6.longitude % 360 + 360) % 360 / 30), s4 = v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "";
7334
- Cv == null || Cv("".concat(s4).concat(a4, " ").concat(Z(e6.name), " \xB7 ").concat((i4 = rv[o4]) == null ? "" : i4)), n2(e6, "outer", te2);
7342
+ jv(), Jv(e6.name, "outer"), Kv(t4, e6, "outer", te2, v2, y2, b2);
7343
+ let a4 = (r4 = rv[e6.name.toLowerCase()]) == null ? "\u2605" : r4, o4 = Math.floor((e6.longitude % 360 + 360) % 360 / 30), s4 = v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "";
7344
+ Tv == null || Tv("".concat(s4).concat(a4, " ").concat(Z(e6.name), " \xB7 ").concat((i4 = av[o4]) == null ? "" : i4)), n2(e6, "outer", te2);
7335
7345
  }), s3.appendChild(_3);
7336
7346
  }
7337
- let We2 = __(S2.map((e6) => ({ name: e6.name.toLowerCase(), longitude: e6.longitude })), 8), Ge2 = X("g");
7347
+ let We2 = y_(S2.map((e6) => ({ name: e6.name.toLowerCase(), longitude: e6.longitude })), 8), Ge2 = X("g");
7338
7348
  Ge2.setAttribute("class", "inner-planet-group"), oe2.appendChild(Ge2);
7339
7349
  for (let e6 of S2) {
7340
7350
  var Ke2, qe2, Je2;
7341
- let t3 = (Ke2 = tv[e6.name.toLowerCase()]) == null ? "\u2605" : Ke2, r3 = e6.name.toLowerCase(), i3 = (qe2 = We2.get(r3)) == null ? e6.longitude : qe2, { x: a3, y: o3 } = Y(i3, q_, w2), s3 = X("g");
7351
+ let t3 = (Ke2 = rv[e6.name.toLowerCase()]) == null ? "\u2605" : Ke2, r3 = e6.name.toLowerCase(), i3 = (qe2 = We2.get(r3)) == null ? e6.longitude : qe2, { x: a3, y: o3 } = Y(i3, Y_, w2), s3 = X("g");
7342
7352
  s3.setAttribute("class", "planet-glyph-group"), s3.dataset.planet = r3, s3.dataset.wheel = "inner", s3.style.transition = "opacity 200ms ease", Ge2.appendChild(s3);
7343
- let { x: c3, y: l3 } = Y(e6.longitude, K_ - 5, w2), u3 = X("circle");
7344
- if (u3.setAttribute("cx", c3.toFixed(1)), u3.setAttribute("cy", l3.toFixed(1)), u3.setAttribute("r", "2.5"), u3.setAttribute("fill", "var(--inner-tick, #7060b8)"), u3.setAttribute("opacity", "0.65"), u3.setAttribute("pointer-events", "none"), s3.appendChild(u3), x_(e6.longitude, i3) > 2) {
7353
+ let { x: c3, y: l3 } = Y(e6.longitude, J_ - 5, w2), u3 = X("circle");
7354
+ if (u3.setAttribute("cx", c3.toFixed(1)), u3.setAttribute("cy", l3.toFixed(1)), u3.setAttribute("r", "2.5"), u3.setAttribute("fill", "var(--inner-tick, #7060b8)"), u3.setAttribute("opacity", "0.65"), u3.setAttribute("pointer-events", "none"), s3.appendChild(u3), C_(e6.longitude, i3) > 2) {
7345
7355
  let e7 = X("line");
7346
7356
  e7.setAttribute("x1", c3.toFixed(1)), e7.setAttribute("y1", l3.toFixed(1)), e7.setAttribute("x2", a3.toFixed(1)), e7.setAttribute("y2", o3.toFixed(1)), e7.setAttribute("stroke", "var(--inner-tick, #7060b8)"), e7.setAttribute("stroke-width", "0.7"), e7.setAttribute("stroke-opacity", "0.35"), e7.setAttribute("stroke-linecap", "round"), e7.setAttribute("pointer-events", "none"), s3.appendChild(e7);
7347
7357
  }
7348
7358
  let d3 = X("text");
7349
- d3.setAttribute("x", a3.toFixed(1)), d3.setAttribute("y", o3.toFixed(1)), d3.setAttribute("text-anchor", "middle"), d3.setAttribute("dominant-baseline", "central"), d3.setAttribute("font-size", "20"), d3.setAttribute("font-weight", "600"), d3.setAttribute("pointer-events", "none"), d3.style.fill = c_(T2).foreground, d3.style.fontFamily = a_, d3.textContent = t3, s3.appendChild(d3);
7350
- let f3 = Math.floor((e6.longitude % 360 + 360) % 360 % 30), { x: p3, y: m3 } = Y(i3, q_ - 17, w2), h3 = X("text");
7351
- if (h3.setAttribute("x", p3.toFixed(1)), h3.setAttribute("y", m3.toFixed(1)), h3.setAttribute("text-anchor", "middle"), h3.setAttribute("dominant-baseline", "central"), h3.setAttribute("font-size", "8.5"), h3.setAttribute("fill", c_(T2).foreground), h3.setAttribute("opacity", "0.8"), h3.setAttribute("pointer-events", "none"), h3.textContent = "".concat(f3, "\xB0"), s3.appendChild(h3), e6.retrograde) {
7359
+ d3.setAttribute("x", a3.toFixed(1)), d3.setAttribute("y", o3.toFixed(1)), d3.setAttribute("text-anchor", "middle"), d3.setAttribute("dominant-baseline", "central"), d3.setAttribute("font-size", "20"), d3.setAttribute("font-weight", "600"), d3.setAttribute("pointer-events", "none"), d3.style.fill = u_(T2).foreground, d3.style.fontFamily = s_, d3.textContent = t3, s3.appendChild(d3);
7360
+ let f3 = Math.floor((e6.longitude % 360 + 360) % 360 % 30), { x: p3, y: m3 } = Y(i3, Y_ - 17, w2), h3 = X("text");
7361
+ if (h3.setAttribute("x", p3.toFixed(1)), h3.setAttribute("y", m3.toFixed(1)), h3.setAttribute("text-anchor", "middle"), h3.setAttribute("dominant-baseline", "central"), h3.setAttribute("font-size", "8.5"), h3.setAttribute("fill", u_(T2).foreground), h3.setAttribute("opacity", "0.8"), h3.setAttribute("pointer-events", "none"), h3.textContent = "".concat(f3, "\xB0"), s3.appendChild(h3), e6.retrograde) {
7352
7362
  let { x: e7, y: t4 } = Y(i3, 204, w2), n3 = X("text");
7353
7363
  n3.setAttribute("x", e7.toFixed(1)), n3.setAttribute("y", t4.toFixed(1)), n3.setAttribute("text-anchor", "middle"), n3.setAttribute("dominant-baseline", "central"), n3.setAttribute("font-size", "8"), n3.setAttribute("fill", "#e05252"), n3.setAttribute("pointer-events", "none"), n3.textContent = "\u211E", s3.appendChild(n3);
7354
7364
  }
7355
- let g3 = cv(e6.name, e6.longitude);
7365
+ let g3 = uv(e6.name, e6.longitude);
7356
7366
  if (g3) {
7357
7367
  let { x: e7, y: t4 } = Y(i3, 202, w2), n3 = X("circle");
7358
7368
  n3.setAttribute("cx", e7.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);
7359
7369
  }
7360
7370
  let _3 = X("circle");
7361
- _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(ev)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "inner", _3.style.pointerEvents = "all", ly(_3, "Inner Planet: ".concat(e6.name));
7362
- let x3 = y2 ? "".concat(y2, "'s ").concat(t3, " ").concat(Z(e6.name)) : "".concat(t3, " ").concat(Z(e6.name), " (natal)"), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Je2 = Av[e6.name.toLowerCase()]) == null ? "" : Je2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(gv(e6.longitude)).concat(e6.house ? " \xB7 H".concat(e6.house) : "").concat(e6.retrograde ? " \u211E" : "").concat(S3);
7363
- _3.addEventListener("mouseenter", (e7) => Ov(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e7) => Ov(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", kv), _3.addEventListener("click", (t4) => {
7371
+ _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(nv)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "inner", _3.style.pointerEvents = "all", dy(_3, "Inner Planet: ".concat(e6.name));
7372
+ let x3 = y2 ? "".concat(y2, "'s ").concat(t3, " ").concat(Z(e6.name)) : "".concat(t3, " ").concat(Z(e6.name), " (natal)"), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Je2 = Mv[e6.name.toLowerCase()]) == null ? "" : Je2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(vv(e6.longitude)).concat(e6.house ? " \xB7 H".concat(e6.house) : "").concat(e6.retrograde ? " \u211E" : "").concat(S3);
7373
+ _3.addEventListener("mouseenter", (e7) => Av(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e7) => Av(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", jv), _3.addEventListener("click", (t4) => {
7364
7374
  var r4, i4, a4;
7365
- kv(), Kv(e6.name, "inner"), Wv(t4, e6, "inner", te2, v2, y2, b2);
7366
- let o4 = (r4 = tv[e6.name.toLowerCase()]) == null ? "\u2605" : r4, s4 = Math.floor((e6.longitude % 360 + 360) % 360 / 30), c4 = y2 ? "".concat(y2, "'s ").concat(o4, " ").concat(Z(e6.name), " \xB7 ").concat((i4 = rv[s4]) == null ? "" : i4) : "".concat(o4, " ").concat(Z(e6.name), " \xB7 ").concat((a4 = rv[s4]) == null ? "" : a4, " (natal)");
7367
- Cv == null || Cv(c4), n2(e6, "inner", te2);
7375
+ jv(), Jv(e6.name, "inner"), Kv(t4, e6, "inner", te2, v2, y2, b2);
7376
+ let o4 = (r4 = rv[e6.name.toLowerCase()]) == null ? "\u2605" : r4, s4 = Math.floor((e6.longitude % 360 + 360) % 360 / 30), c4 = y2 ? "".concat(y2, "'s ").concat(o4, " ").concat(Z(e6.name), " \xB7 ").concat((i4 = av[s4]) == null ? "" : i4) : "".concat(o4, " ").concat(Z(e6.name), " \xB7 ").concat((a4 = av[s4]) == null ? "" : a4, " (natal)");
7377
+ Tv == null || Tv(c4), n2(e6, "inner", te2);
7368
7378
  }), s3.appendChild(_3);
7369
7379
  }
7370
7380
  let Ye2 = "__biWheelClickOutside__", Xe2 = document[Ye2];
7371
7381
  Xe2 && document.removeEventListener("click", Xe2, false);
7372
7382
  let Ze2 = (e6) => {
7373
7383
  let t3 = e6.target;
7374
- !t3.closest(".hit-region") && !t3.closest("#bi-info-drawer") && (Xv(), Uv());
7384
+ !t3.closest(".hit-region") && !t3.closest("#bi-info-drawer") && (Qv(), Gv());
7375
7385
  };
7376
7386
  document[Ye2] = Ze2, document.addEventListener("click", Ze2, false);
7377
7387
  let Qe2 = (e6) => {
7378
- e6.key === "Escape" && (Xv(), Uv());
7388
+ e6.key === "Escape" && (Qv(), Gv());
7379
7389
  };
7380
7390
  document.removeEventListener("keydown", window.__biWheelEscHandler, false), window.__biWheelEscHandler = Qe2, document.addEventListener("keydown", Qe2, false);
7381
7391
  }
7382
- function cy(e5) {
7392
+ function uy(e5) {
7383
7393
  let t2 = parseInt(e5.slice(1, 3), 16), n2 = parseInt(e5.slice(3, 5), 16), r2 = parseInt(e5.slice(5, 7), 16), i2 = 0.6;
7384
7394
  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), ")");
7385
7395
  }
7386
- function ly(e5, t2) {
7396
+ function dy(e5, t2) {
7387
7397
  e5 && (e5.setAttribute("tabindex", "0"), e5.setAttribute("role", "button"), e5.setAttribute("aria-label", t2), e5.addEventListener("keydown", (t3) => {
7388
7398
  let n2 = t3;
7389
7399
  (n2.key === "Enter" || n2.key === " ") && (n2.preventDefault(), e5.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true })));
7390
7400
  }));
7391
7401
  }
7392
- function uy(e5) {
7402
+ function fy(e5) {
7393
7403
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
7394
7404
  }
7395
- function dy(e5) {
7405
+ function py(e5) {
7396
7406
  return e5.replace(/_/g, " ").replace(/\b\w/g, (e6) => e6.toUpperCase());
7397
7407
  }
7398
- function fy(e5) {
7399
- let t2 = e5.filter((e6) => e6.items.length > 0).map((e6) => '<div class="legend-group"><span class="legend-group-title">'.concat(uy(e6.title), "</span>") + e6.items.map((e7) => '<span class="legend-item"><span class="legend-glyph">'.concat(uy(e7.glyph), "</span>").concat(uy(e7.label), "</span>")).join("") + "</div>").join("");
7408
+ function my(e5) {
7409
+ let t2 = e5.filter((e6) => e6.items.length > 0).map((e6) => '<div class="legend-group"><span class="legend-group-title">'.concat(fy(e6.title), "</span>") + e6.items.map((e7) => '<span class="legend-item"><span class="legend-glyph">'.concat(fy(e7.glyph), "</span>").concat(fy(e7.label), "</span>")).join("") + "</div>").join("");
7400
7410
  return t2 ? '<details class="glyph-legend"><summary><span class="legend-spark">\u2726</span> Legend</summary><div class="legend-body">'.concat(t2, "</div></details>") : "";
7401
7411
  }
7402
- var py = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.\d+)?$/;
7403
- function my(e5, t2) {
7412
+ var hy = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.\d+)?$/;
7413
+ function gy(e5, t2) {
7404
7414
  if (!e5) return null;
7405
- let n2 = py.exec(e5.trim());
7415
+ let n2 = hy.exec(e5.trim());
7406
7416
  if (n2) {
7407
7417
  let [, e6, t3, r3, i2, a2, o2] = n2, s2 = new Date(Date.UTC(+e6, t3 - 1, +r3, +i2, +a2, o2 ? +o2 : 0));
7408
7418
  return isNaN(s2.getTime()) ? null : { date: s2, timeZone: "UTC" };
@@ -7410,17 +7420,17 @@ function my(e5, t2) {
7410
7420
  let r2 = new Date(e5);
7411
7421
  return isNaN(r2.getTime()) ? null : { date: r2, timeZone: t2 || "UTC" };
7412
7422
  }
7413
- function hy(e5) {
7423
+ function _y(e5) {
7414
7424
  var t2;
7415
7425
  if (!e5) return "";
7416
7426
  let n2 = [], r2 = (t2 = e5.location) == null ? void 0 : t2.trim();
7417
7427
  if (r2 ? n2.push(r2) : typeof e5.latitude == "number" && typeof e5.longitude == "number" && n2.push("".concat(e5.latitude.toFixed(2), ", ").concat(e5.longitude.toFixed(2))), e5.datetime) {
7418
- let t3 = /^\d{4}-\d{2}-\d{2}/.test(e5.datetime.trim()) ? my(e5.datetime, e5.timezone) : null;
7428
+ let t3 = /^\d{4}-\d{2}-\d{2}/.test(e5.datetime.trim()) ? gy(e5.datetime, e5.timezone) : null;
7419
7429
  t3 ? n2.push(t3.date.toLocaleString("en-US", { timeZone: t3.timeZone, day: "numeric", month: "short", year: "numeric", hour: "numeric", minute: "2-digit" })) : n2.push(e5.datetime);
7420
7430
  }
7421
7431
  return n2.join(" \xB7 ");
7422
7432
  }
7423
- var gy = class e4 {
7433
+ var vy = class e4 {
7424
7434
  constructor(t2) {
7425
7435
  var n2, r2, i2, a2, s2, c2;
7426
7436
  o(this, "config", void 0), o(this, "params", void 0), o(this, "dateInput", void 0), o(this, "timeInput", void 0), o(this, "refreshBtn", void 0), o(this, "locInput", void 0), o(this, "locDropdown", void 0), o(this, "summaryBar", void 0), o(this, "extraToggleInput", void 0), o(this, "searchTimeout", null), o(this, "searchVersion", 0), o(this, "isSearching", false), o(this, "suggestions", []), o(this, "activeIndex", -1), o(this, "selecting", false), o(this, "listboxId", "loc-listbox-".concat(e4.comboSeq++)), this.config = t2, this.params = { date: ((n2 = t2.initialParams) == null ? void 0 : n2.date) || this.getTodayDate(), time: ((r2 = t2.initialParams) == null ? void 0 : r2.time) || "12:00", latitude: ((i2 = t2.initialParams) == null ? void 0 : i2.latitude) || null, longitude: ((a2 = t2.initialParams) == null ? void 0 : a2.longitude) || null, timezone: ((s2 = t2.initialParams) == null ? void 0 : s2.timezone) || null, locationName: ((c2 = t2.initialParams) == null ? void 0 : c2.locationName) || null }, this.render();
@@ -7600,14 +7610,14 @@ var gy = class e4 {
7600
7610
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
7601
7611
  }
7602
7612
  };
7603
- o(gy, "comboSeq", 0);
7604
- var _y = { "chart-wheel": { stripIcon: "\u2726", stripTitle: "About the Natal Chart", stripHints: ["Click any <strong>planet</strong> for a deep placement reading", "Click any <strong>aspect line</strong> for its dynamic interpretation", "Click any <strong>house cusp</strong> for house themes", "Use the <strong>date controls</strong> to move through time"], modalText: "This wheel is an exact celestial snapshot of the sky at a given moment and place \u2014 every planet, house, and aspect line is clickable." }, "bi-wheel": { stripIcon: "\u2295", stripTitle: "About the Bi-Wheel", stripHints: ["Click any <strong>inner planet</strong> for natal placement depth", "Click any <strong>outer planet</strong> for transit or synastry meaning", "Click a <strong>cross-aspect line</strong> for inter-chart dynamics", "Use the <strong>date controls</strong> to advance transits"], modalText: "Two charts are layered here \u2014 the inner wheel is the natal chart; the outer ring shows the second chart (transits or another person's planets)." }, bodygraph: { stripIcon: "\u25C8", stripTitle: "About the Bodygraph", stripHints: ["Click any <strong>center</strong> (defined or undefined) for its meaning", "Click any <strong>channel</strong> to explore its life theme", "Click any <strong>gate number</strong> for its I Ching hexagram reading", "Click a <strong>planet row</strong> in the sidebar for its HD role"], modalText: "The bodygraph is a living map of the energy centres, channels, and gates that define a Human Design chart." }, "vedic-chart": { stripIcon: "\u{1F549}", stripTitle: "About the Jyotish Chart", stripHints: ["Click any <strong>rashi cell</strong> for its themes and any planets placed there", "The <strong>diagonal mark</strong> shows the Lagna (Ascendant) rashi", "Use the <strong>action bar</strong> for a full chart interpretation", "Click <strong>Moon &amp; Nakshatra</strong> for lunar mansion detail"], modalText: "This is a Vedic birth chart rendered as a South Indian Rashi grid \u2014 sidereal planetary placements by fixed sign." }, "transit-timeline": { stripIcon: "\u2604", stripTitle: "About the Transit Timeline", stripHints: ["Each entry is an <strong>exact transit hit</strong> \u2014 a transiting planet contacting a natal point", "Events are <strong>grouped by month</strong> in chronological order", "The <strong>\u211E marker</strong> flags a retrograde crossing", "Click any transit for a focused <strong>interpretation</strong>"], modalText: "This timeline lists upcoming transits to the natal chart \u2014 the exact dates outer-planet energies activate each placement." }, "moon-phase": { stripIcon: "\u263E", stripTitle: "About the Moon Phase Dial", stripHints: ["Click the <strong>Moon</strong> for its phase interpretation", "Click the <strong>Void-of-Course</strong> card when the Moon is VOC", "Use the <strong>date control</strong> to move the sky to any moment"], modalText: "The dial shows the Moon's live illumination, phase, sign, and void-of-course status for the selected moment." }, bazi: { stripIcon: "\u56DB", stripTitle: "About the BaZi Chart", stripHints: ["Click any <strong>pillar</strong> (Year, Month, Day, Hour) for its interpretation", "The <strong>Day Master</strong> is the core identity element", "The <strong>Wu Xing bar</strong> shows the Five Element balance"], modalText: "This BaZi (Four Pillars of Destiny) chart maps the Heavenly Stems and Earthly Branches present at a given moment of birth." } }, vy = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: oklch(0% 0 0 / 0.55);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: oe-fade-in 0.4s ease both;\n font-family: system-ui, sans-serif;\n }\n\n .oe-welcome-modal {\n /* Themed, not hardcoded: the title/text/hints below all resolve through\n var(--text\u2026), so a fixed dark surface here meant that once the light\n palette became reachable the modal rendered near-black text on a\n near-black card \u2014 1.09:1, effectively invisible. The fallback is the\n previous literal, and every app\'s dark --surface is oklch(11-12%), so\n dark rendering is unchanged. */\n background: var(--surface, oklch(11% 0.010 265));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px oklch(0% 0 0 / 0.55), inset 0 1px 0 oklch(100% 0 0 / 0.06);\n animation: oe-modal-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n @keyframes oe-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes oe-modal-in {\n from { opacity: 0; transform: scale(0.95) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .oe-welcome-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n }\n\n .oe-welcome-icon {\n font-size: 28px;\n color: var(--gold, oklch(72% 0.12 80));\n line-height: 1;\n text-shadow: 0 0 10px var(--gold-glow, oklch(72% 0.12 80 / 0.30));\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--text, oklch(92% 0.006 265));\n margin: 0;\n letter-spacing: 0.02em;\n }\n\n .oe-welcome-text {\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--text-secondary, oklch(68% 0.008 265));\n margin: 0;\n }\n\n .oe-welcome-hints {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin: 8px 0 12px 0;\n padding: 0;\n list-style: none;\n }\n\n .oe-welcome-hints li {\n font-size: 13.5px;\n line-height: 1.4;\n color: var(--text-secondary, oklch(68% 0.008 265));\n display: flex;\n align-items: flex-start;\n gap: 10px;\n opacity: 0;\n animation: oe-fade-in 0.4s ease forwards;\n }\n\n /* Stagger the hints */\n .oe-welcome-hints li:nth-child(1) { animation-delay: 0.15s; }\n .oe-welcome-hints li:nth-child(2) { animation-delay: 0.25s; }\n .oe-welcome-hints li:nth-child(3) { animation-delay: 0.35s; }\n .oe-welcome-hints li:nth-child(4) { animation-delay: 0.45s; }\n\n .oe-welcome-hints li::before {\n content: "\u2726";\n color: var(--gold-dim, oklch(52% 0.06 80));\n font-size: 12px;\n padding-top: 2px;\n }\n\n .oe-welcome-hints strong {\n color: var(--text, oklch(92% 0.006 265));\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: var(--gold-subtle, oklch(72% 0.12 80 / 0.10));\n color: var(--gold, oklch(72% 0.12 80));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease, border-color 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: oklch(72% 0.12 80 / 0.18);\n border-color: oklch(72% 0.12 80 / 0.40);\n }\n\n .oe-welcome-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n\n .oe-welcome-backdrop.is-dismissing {\n animation: oe-fade-out 0.3s ease forwards;\n }\n\n .oe-welcome-backdrop.is-dismissing .oe-welcome-modal {\n animation: oe-modal-out 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes oe-fade-out {\n to { opacity: 0; }\n }\n\n @keyframes oe-modal-out {\n to { opacity: 0; transform: scale(0.95) translateY(10px); }\n }\n';
7605
- function yy() {
7613
+ o(vy, "comboSeq", 0);
7614
+ var yy = { "chart-wheel": { stripIcon: "\u2726", stripTitle: "About the Natal Chart", stripHints: ["Click any <strong>planet</strong> for a deep placement reading", "Click any <strong>aspect line</strong> for its dynamic interpretation", "Click any <strong>house cusp</strong> for house themes", "Use the <strong>date controls</strong> to move through time"], modalText: "This wheel is an exact celestial snapshot of the sky at a given moment and place \u2014 every planet, house, and aspect line is clickable." }, "bi-wheel": { stripIcon: "\u2295", stripTitle: "About the Bi-Wheel", stripHints: ["Click any <strong>inner planet</strong> for natal placement depth", "Click any <strong>outer planet</strong> for transit or synastry meaning", "Click a <strong>cross-aspect line</strong> for inter-chart dynamics", "Use the <strong>date controls</strong> to advance transits"], modalText: "Two charts are layered here \u2014 the inner wheel is the natal chart; the outer ring shows the second chart (transits or another person's planets)." }, bodygraph: { stripIcon: "\u25C8", stripTitle: "About the Bodygraph", stripHints: ["Click any <strong>center</strong> (defined or undefined) for its meaning", "Click any <strong>channel</strong> to explore its life theme", "Click any <strong>gate number</strong> for its I Ching hexagram reading", "Click a <strong>planet row</strong> in the sidebar for its HD role"], modalText: "The bodygraph is a living map of the energy centres, channels, and gates that define a Human Design chart." }, "vedic-chart": { stripIcon: "\u{1F549}", stripTitle: "About the Jyotish Chart", stripHints: ["Click any <strong>rashi cell</strong> for its themes and any planets placed there", "The <strong>diagonal mark</strong> shows the Lagna (Ascendant) rashi", "Use the <strong>action bar</strong> for a full chart interpretation", "Click <strong>Moon &amp; Nakshatra</strong> for lunar mansion detail"], modalText: "This is a Vedic birth chart rendered as a South Indian Rashi grid \u2014 sidereal planetary placements by fixed sign." }, "transit-timeline": { stripIcon: "\u2604", stripTitle: "About the Transit Timeline", stripHints: ["Each entry is an <strong>exact transit hit</strong> \u2014 a transiting planet contacting a natal point", "Events are <strong>grouped by month</strong> in chronological order", "The <strong>\u211E marker</strong> flags a retrograde crossing", "Click any transit for a focused <strong>interpretation</strong>"], modalText: "This timeline lists upcoming transits to the natal chart \u2014 the exact dates outer-planet energies activate each placement." }, "moon-phase": { stripIcon: "\u263E", stripTitle: "About the Moon Phase Dial", stripHints: ["Click the <strong>Moon</strong> for its phase interpretation", "Click the <strong>Void-of-Course</strong> card when the Moon is VOC", "Use the <strong>date control</strong> to move the sky to any moment"], modalText: "The dial shows the Moon's live illumination, phase, sign, and void-of-course status for the selected moment." }, bazi: { stripIcon: "\u56DB", stripTitle: "About the BaZi Chart", stripHints: ["Click any <strong>pillar</strong> (Year, Month, Day, Hour) for its interpretation", "The <strong>Day Master</strong> is the core identity element", "The <strong>Wu Xing bar</strong> shows the Five Element balance"], modalText: "This BaZi (Four Pillars of Destiny) chart maps the Heavenly Stems and Earthly Branches present at a given moment of birth." } }, by = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: oklch(0% 0 0 / 0.55);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: oe-fade-in 0.4s ease both;\n font-family: system-ui, sans-serif;\n }\n\n .oe-welcome-modal {\n /* Themed, not hardcoded: the title/text/hints below all resolve through\n var(--text\u2026), so a fixed dark surface here meant that once the light\n palette became reachable the modal rendered near-black text on a\n near-black card \u2014 1.09:1, effectively invisible. The fallback is the\n previous literal, and every app\'s dark --surface is oklch(11-12%), so\n dark rendering is unchanged. */\n background: var(--surface, oklch(11% 0.010 265));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px oklch(0% 0 0 / 0.55), inset 0 1px 0 oklch(100% 0 0 / 0.06);\n animation: oe-modal-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n @keyframes oe-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes oe-modal-in {\n from { opacity: 0; transform: scale(0.95) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .oe-welcome-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n }\n\n .oe-welcome-icon {\n font-size: 28px;\n color: var(--gold, oklch(72% 0.12 80));\n line-height: 1;\n text-shadow: 0 0 10px var(--gold-glow, oklch(72% 0.12 80 / 0.30));\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--text, oklch(92% 0.006 265));\n margin: 0;\n letter-spacing: 0.02em;\n }\n\n .oe-welcome-text {\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--text-secondary, oklch(68% 0.008 265));\n margin: 0;\n }\n\n .oe-welcome-hints {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin: 8px 0 12px 0;\n padding: 0;\n list-style: none;\n }\n\n .oe-welcome-hints li {\n font-size: 13.5px;\n line-height: 1.4;\n color: var(--text-secondary, oklch(68% 0.008 265));\n display: flex;\n align-items: flex-start;\n gap: 10px;\n opacity: 0;\n animation: oe-fade-in 0.4s ease forwards;\n }\n\n /* Stagger the hints */\n .oe-welcome-hints li:nth-child(1) { animation-delay: 0.15s; }\n .oe-welcome-hints li:nth-child(2) { animation-delay: 0.25s; }\n .oe-welcome-hints li:nth-child(3) { animation-delay: 0.35s; }\n .oe-welcome-hints li:nth-child(4) { animation-delay: 0.45s; }\n\n .oe-welcome-hints li::before {\n content: "\u2726";\n color: var(--gold-dim, oklch(52% 0.06 80));\n font-size: 12px;\n padding-top: 2px;\n }\n\n .oe-welcome-hints strong {\n color: var(--text, oklch(92% 0.006 265));\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: var(--gold-subtle, oklch(72% 0.12 80 / 0.10));\n color: var(--gold, oklch(72% 0.12 80));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease, border-color 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: oklch(72% 0.12 80 / 0.18);\n border-color: oklch(72% 0.12 80 / 0.40);\n }\n\n .oe-welcome-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n\n .oe-welcome-backdrop.is-dismissing {\n animation: oe-fade-out 0.3s ease forwards;\n }\n\n .oe-welcome-backdrop.is-dismissing .oe-welcome-modal {\n animation: oe-modal-out 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes oe-fade-out {\n to { opacity: 0; }\n }\n\n @keyframes oe-modal-out {\n to { opacity: 0; transform: scale(0.95) translateY(10px); }\n }\n';
7615
+ function xy() {
7606
7616
  if (document.getElementById("oe-first-run-styles")) return;
7607
7617
  let e5 = document.createElement("style");
7608
- e5.id = "oe-first-run-styles", e5.textContent = vy, document.head.appendChild(e5);
7618
+ e5.id = "oe-first-run-styles", e5.textContent = by, document.head.appendChild(e5);
7609
7619
  }
7610
- function by(e5) {
7620
+ function Sy(e5) {
7611
7621
  let t2 = document.activeElement, n2 = document.createElement("div");
7612
7622
  n2.className = "oe-welcome-backdrop";
7613
7623
  let r2 = document.createElement("div");
@@ -7625,34 +7635,34 @@ function by(e5) {
7625
7635
  e6.key === "Escape" && (e6.preventDefault(), o2()), e6.key === "Tab" && (e6.preventDefault(), a2.focus());
7626
7636
  }), requestAnimationFrame(() => a2.focus()), n2;
7627
7637
  }
7628
- function xy(e5) {
7629
- yy();
7630
- let t2 = by(_y[e5]);
7638
+ function Cy(e5) {
7639
+ xy();
7640
+ let t2 = Sy(yy[e5]);
7631
7641
  document.body.appendChild(t2);
7632
7642
  }
7633
- var Sy = "\n .oe-info-button {\n position: fixed;\n top: 12px;\n right: 12px;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n background: var(--surface-2, oklch(16% 0.010 265));\n border: 1px solid var(--border-strong, oklch(30% 0.010 265));\n color: var(--text-secondary, oklch(68% 0.008 265));\n font: 600 14px/1 Georgia, serif;\n font-style: italic;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 9998;\n transition: all 150ms ease;\n }\n\n .oe-info-button:hover {\n background: var(--surface, oklch(11% 0.010 265));\n border-color: var(--gold-dim, oklch(52% 0.06 80));\n color: var(--gold, oklch(72% 0.12 80));\n }\n\n .oe-info-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n";
7634
- function Cy() {
7643
+ var wy = "\n .oe-info-button {\n position: fixed;\n top: 12px;\n right: 12px;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n background: var(--surface-2, oklch(16% 0.010 265));\n border: 1px solid var(--border-strong, oklch(30% 0.010 265));\n color: var(--text-secondary, oklch(68% 0.008 265));\n font: 600 14px/1 Georgia, serif;\n font-style: italic;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 9998;\n transition: all 150ms ease;\n }\n\n .oe-info-button:hover {\n background: var(--surface, oklch(11% 0.010 265));\n border-color: var(--gold-dim, oklch(52% 0.06 80));\n color: var(--gold, oklch(72% 0.12 80));\n }\n\n .oe-info-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n";
7644
+ function Ty() {
7635
7645
  if (document.getElementById("oe-info-button-styles")) return;
7636
7646
  let e5 = document.createElement("style");
7637
- e5.id = "oe-info-button-styles", e5.textContent = Sy, document.head.appendChild(e5);
7647
+ e5.id = "oe-info-button-styles", e5.textContent = wy, document.head.appendChild(e5);
7638
7648
  }
7639
- function wy(e5) {
7649
+ function Ey(e5) {
7640
7650
  if (document.getElementById("oe-info-button")) return;
7641
- Cy();
7651
+ Ty();
7642
7652
  let t2 = document.createElement("button");
7643
- t2.id = "oe-info-button", t2.className = "oe-info-button", t2.setAttribute("aria-label", "About this chart"), t2.title = "About this chart", t2.textContent = "i", t2.addEventListener("click", () => xy(e5)), document.body.appendChild(t2);
7653
+ t2.id = "oe-info-button", t2.className = "oe-info-button", t2.setAttribute("aria-label", "About this chart"), t2.title = "About this chart", t2.textContent = "i", t2.addEventListener("click", () => Cy(e5)), document.body.appendChild(t2);
7644
7654
  }
7645
- function Ty(e5) {
7655
+ function Dy(e5) {
7646
7656
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
7647
7657
  }
7648
- function Ey(e5) {
7649
- let { container: t2, message: n2, onRetry: r2, retryLabel: i2 = "\u21BA Try again" } = e5, a2 = r2 ? '<button class="error-retry-btn" type="button">'.concat(Ty(i2), "</button>") : "";
7650
- if (t2.innerHTML = '<div class="error-state" role="alert"><div class="error-icon" aria-hidden="true">\u26A0\uFE0F</div><p class="error-msg">'.concat(Ty(n2), "</p>") + a2 + "</div>", t2.removeAttribute("hidden"), r2) {
7658
+ function Oy(e5) {
7659
+ let { container: t2, message: n2, onRetry: r2, retryLabel: i2 = "\u21BA Try again" } = e5, a2 = r2 ? '<button class="error-retry-btn" type="button">'.concat(Dy(i2), "</button>") : "";
7660
+ if (t2.innerHTML = '<div class="error-state" role="alert"><div class="error-icon" aria-hidden="true">\u26A0\uFE0F</div><p class="error-msg">'.concat(Dy(n2), "</p>") + a2 + "</div>", t2.removeAttribute("hidden"), r2) {
7651
7661
  var o2;
7652
7662
  (o2 = t2.querySelector(".error-retry-btn")) == null || o2.addEventListener("click", r2);
7653
7663
  }
7654
7664
  }
7655
- function Dy(e5) {
7665
+ function ky(e5) {
7656
7666
  var t2;
7657
7667
  if (!e5) return null;
7658
7668
  if (e5.structuredContent != null && typeof e5.structuredContent == "object") return e5.structuredContent;
@@ -7665,12 +7675,25 @@ function Dy(e5) {
7665
7675
  }
7666
7676
  return null;
7667
7677
  }
7668
- function Oy(e5, t2, n2 = []) {
7669
- var r2, i2;
7678
+ var Ay = ["inline", "fullscreen"];
7679
+ function jy(e5) {
7680
+ var t2;
7681
+ return (t2 = e5.getHostContext) == null ? void 0 : t2.call(e5);
7682
+ }
7683
+ function My(e5) {
7684
+ var t2;
7685
+ let n2 = (t2 = jy(e5)) == null ? void 0 : t2.availableDisplayModes;
7686
+ return Array.isArray(n2) ? n2 : [];
7687
+ }
7688
+ var Ny = '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">\n <polyline points="5,1 1,1 1,5"/>\n <polyline points="11,1 15,1 15,5"/>\n <polyline points="5,15 1,15 1,11"/>\n <polyline points="11,15 15,15 15,11"/>\n </svg>', Py = '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">\n <polyline points="1,5 5,5 5,1"/>\n <polyline points="15,5 11,5 11,1"/>\n <polyline points="1,11 5,11 5,15"/>\n <polyline points="15,11 11,11 11,15"/>\n </svg>', Fy = '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round" aria-hidden="true">\n <rect x="1" y="2.5" width="14" height="11" rx="1.5"/>\n <rect x="8" y="8" width="5.5" height="4" rx="0.8" fill="currentColor" stroke="none"/>\n </svg>', Iy = '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">\n <rect x="1" y="2.5" width="14" height="11" rx="1.5"/>\n <polyline points="6,6 10,10"/>\n <polyline points="6,9.5 6,6 9.5,6"/>\n </svg>';
7689
+ function Ly(e5, t2, n2 = [], r2 = {}) {
7690
+ var i2;
7670
7691
  if (!t2 || t2.querySelector("#btn-fullscreen")) return;
7671
7692
  let a2 = document.createElement("button");
7672
- a2.id = "btn-fullscreen", a2.className = "pan-btn pan-btn--fullscreen", a2.setAttribute("aria-label", "Toggle fullscreen"), a2.innerHTML = '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\n <polyline points="5,1 1,1 1,5"/>\n <polyline points="11,1 15,1 15,5"/>\n <polyline points="5,15 1,15 1,11"/>\n <polyline points="11,15 15,15 15,11"/>\n </svg>';
7673
- let o2 = a2.innerHTML, s2 = ["param-controls", "aspect-filter", "controls-panel", "mode-badge"];
7693
+ a2.id = "btn-fullscreen", a2.type = "button", a2.className = "pan-btn pan-btn--fullscreen", a2.innerHTML = Ny, a2.hidden = true;
7694
+ let o2 = null;
7695
+ r2.pip && (o2 = document.createElement("button"), o2.id = "btn-pip", o2.type = "button", o2.className = "pan-btn pan-btn--pip", o2.innerHTML = Fy, o2.hidden = true);
7696
+ let s2 = ["param-controls", "aspect-filter", "controls-panel", "mode-badge"];
7674
7697
  function c2() {
7675
7698
  if (document.getElementById("fs-bottom-bar") || !n2.length) return;
7676
7699
  let e6 = document.getElementById("app");
@@ -7703,59 +7726,59 @@ function Oy(e5, t2, n2 = []) {
7703
7726
  }
7704
7727
  e6.remove();
7705
7728
  }
7706
- function u2(e6) {
7707
- let t3 = e6 === "fullscreen", n3 = document.body.classList.contains("is-fullscreen");
7708
- document.body.classList.toggle("is-fullscreen", t3), a2.innerHTML = t3 ? '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\n <polyline points="1,5 5,5 5,1"/>\n <polyline points="15,5 11,5 11,1"/>\n <polyline points="1,11 5,11 5,15"/>\n <polyline points="15,11 11,11 11,15"/>\n </svg>' : o2, a2.setAttribute("aria-label", t3 ? "Exit fullscreen (Esc)" : "Toggle fullscreen"), a2.title = t3 ? "Press Esc or click to exit fullscreen" : "Enter fullscreen", t3 && !n3 && (c2(), f2()), !t3 && n3 && l2();
7729
+ let u2 = "inline";
7730
+ function d2(t3) {
7731
+ let n3 = u2 === "fullscreen", r3 = t3 === "fullscreen";
7732
+ u2 = t3, document.body.classList.toggle("is-fullscreen", r3), document.body.classList.toggle("is-pip", t3 === "pip"), document.documentElement.setAttribute("data-display-mode", t3), a2.innerHTML = r3 ? Py : Ny;
7733
+ let i3 = r3 ? "Exit fullscreen" : "Enter fullscreen";
7734
+ if (a2.setAttribute("aria-label", i3), a2.title = r3 ? "Exit fullscreen (Esc)" : i3, o2) {
7735
+ let e6 = t3 === "pip";
7736
+ o2.innerHTML = e6 ? Iy : Fy;
7737
+ let n4 = e6 ? "Return to the conversation" : "Pop out (picture-in-picture)";
7738
+ o2.setAttribute("aria-label", n4), o2.title = n4;
7739
+ }
7740
+ r3 && !n3 && (c2(), Ry(e5)), !r3 && n3 && l2();
7741
+ }
7742
+ function f2() {
7743
+ var n3, r3;
7744
+ let i3 = My(e5);
7745
+ a2.hidden = !i3.includes("fullscreen"), o2 && (o2.hidden = !i3.includes("pip")), (!a2.hidden || o2 && !o2.hidden) && (t2.hidden = false);
7746
+ let s3 = (n3 = (r3 = jy(e5)) == null ? void 0 : r3.displayMode) == null ? "inline" : n3;
7747
+ s3 !== u2 && d2(s3);
7709
7748
  }
7710
- a2.addEventListener("click", async () => {
7711
- try {
7712
- var t3, n3, r3, i3;
7713
- let a3 = (t3 = e5.getHostContext) == null ? void 0 : t3.call(e5), o3 = (n3 = a3 == null ? void 0 : a3.displayMode) == null ? "inline" : n3, s3 = (r3 = a3 == null ? void 0 : a3.availableDisplayModes) == null ? [] : r3, c3 = o3 === "inline" ? "fullscreen" : "inline";
7714
- if (s3.length > 0 && !s3.includes(c3)) {
7715
- console.warn('[AppChrome] Display mode "'.concat(c3, '" not available. Available: ').concat(s3.join(", ")));
7716
- return;
7717
- }
7718
- let l3 = await e5.requestDisplayMode({ mode: c3 });
7719
- u2((i3 = l3 == null ? void 0 : l3.mode) == null ? "inline" : i3);
7749
+ async function p2(t3) {
7750
+ if (!(t3 !== "inline" && !My(e5).includes(t3))) try {
7751
+ var n3;
7752
+ let r3 = await e5.requestDisplayMode({ mode: t3 });
7753
+ d2((n3 = r3 == null ? void 0 : r3.mode) == null ? u2 : n3);
7720
7754
  } catch (e6) {
7721
7755
  console.warn("[AppChrome] requestDisplayMode failed:", e6);
7722
7756
  }
7723
- }), document.addEventListener("keydown", async (t3) => {
7724
- if (t3.key === "Escape" && document.body.classList.contains("is-fullscreen")) {
7725
- t3.preventDefault();
7726
- try {
7727
- var n3;
7728
- let t4 = await e5.requestDisplayMode({ mode: "inline" });
7729
- u2((n3 = t4 == null ? void 0 : t4.mode) == null ? "inline" : n3);
7730
- } catch (e6) {
7731
- console.warn("[AppChrome] Escape fullscreen failed:", e6);
7732
- }
7733
- }
7734
- }), (r2 = e5.addEventListener) == null || r2.call(e5, "hostcontextchanged", (e6) => {
7735
- var t3;
7736
- u2((t3 = e6 == null ? void 0 : e6.displayMode) == null ? "inline" : t3);
7737
- });
7738
- let d2 = (i2 = e5.getHostContext) == null ? void 0 : i2.call(e5);
7739
- d2 != null && d2.displayMode && u2(d2.displayMode), t2.insertBefore(a2, t2.firstChild), t2.removeAttribute("hidden");
7740
- function f2() {
7741
- let e6 = document.getElementById("fs-hint-banner");
7742
- e6 && e6.remove();
7743
- let t3 = document.createElement("div");
7744
- t3.id = "fs-hint-banner", Object.assign(t3.style, { position: "fixed", top: "12px", left: "50%", transform: "translateX(-50%)", background: "oklch(14% 0.012 265 / 0.90)", backdropFilter: "blur(12px)", WebkitBackdropFilter: "blur(12px)", border: "1px solid oklch(72% 0.12 80 / 0.3)", borderRadius: "20px", padding: "6px 16px", fontSize: "11px", fontWeight: "600", color: "oklch(80% 0.08 80)", letterSpacing: "0.04em", zIndex: "9999", pointerEvents: "none", opacity: "0", transition: "opacity 300ms ease", whiteSpace: "nowrap" }), t3.textContent = "Esc \u2014 exit fullscreen & return to chat", document.body.appendChild(t3), requestAnimationFrame(() => {
7745
- t3.style.opacity = "1";
7746
- }), setTimeout(() => {
7747
- t3.style.opacity = "0", setTimeout(() => t3.remove(), 350);
7748
- }, 4e3);
7749
7757
  }
7758
+ a2.addEventListener("click", () => {
7759
+ p2(u2 === "fullscreen" ? "inline" : "fullscreen");
7760
+ }), o2 == null || o2.addEventListener("click", () => {
7761
+ p2(u2 === "pip" ? "inline" : "pip");
7762
+ }), document.addEventListener("keydown", (e6) => {
7763
+ e6.key !== "Escape" || u2 !== "fullscreen" || (e6.preventDefault(), p2("inline"));
7764
+ }), (i2 = e5.addEventListener) == null || i2.call(e5, "hostcontextchanged", f2), o2 && t2.insertBefore(o2, t2.firstChild), t2.insertBefore(a2, t2.firstChild), d2("inline"), f2();
7765
+ }
7766
+ function Ry(e5) {
7767
+ var t2, n2;
7768
+ (t2 = document.getElementById("fs-hint-banner")) == null || t2.remove();
7769
+ let r2 = (n2 = jy(e5)) == null ? void 0 : n2.deviceCapabilities, i2 = !!(r2 != null && r2.touch) && (r2 == null ? void 0 : r2.hover) === false, a2 = document.createElement("div");
7770
+ a2.id = "fs-hint-banner", a2.className = "fs-hint-banner", a2.setAttribute("role", "status"), a2.textContent = i2 ? "Tap the collapse button to return to the chat" : "Esc \u2014 exit fullscreen & return to chat", document.body.appendChild(a2), requestAnimationFrame(() => a2.classList.add("visible")), setTimeout(() => {
7771
+ a2.classList.remove("visible"), setTimeout(() => a2.remove(), 350);
7772
+ }, 4e3);
7750
7773
  }
7751
- function ky(e5, t2) {
7774
+ function zy(e5, t2) {
7752
7775
  e5.ontoolcancelled = (e6) => {
7753
7776
  var n2, r2, i2;
7754
7777
  let a2 = (n2 = e6.reason) == null ? "Tool call was cancelled" : n2;
7755
- console.warn("[AppChrome] Tool cancelled:", a2), (r2 = t2.statusFn) == null || r2.call(t2, null), !t2.loadingEl.hidden && t2.loadingEl.getAttribute("hidden") === null && (t2.loadingEl.setAttribute("hidden", ""), t2.contentEl.removeAttribute("hidden")), (i2 = t2.paramControls) == null || (i2 = i2.call(t2)) == null || i2.setBusy(false), Ay(a2);
7778
+ console.warn("[AppChrome] Tool cancelled:", a2), (r2 = t2.statusFn) == null || r2.call(t2, null), !t2.loadingEl.hidden && t2.loadingEl.getAttribute("hidden") === null && (t2.loadingEl.setAttribute("hidden", ""), t2.contentEl.removeAttribute("hidden")), (i2 = t2.paramControls) == null || (i2 = i2.call(t2)) == null || i2.setBusy(false), By(a2);
7756
7779
  };
7757
7780
  }
7758
- function Ay(e5) {
7781
+ function By(e5) {
7759
7782
  var t2;
7760
7783
  (t2 = document.getElementById("cancel-toast")) == null || t2.remove();
7761
7784
  let n2 = document.createElement("div");
@@ -7763,162 +7786,176 @@ function Ay(e5) {
7763
7786
  n2.classList.remove("visible"), setTimeout(() => n2.remove(), 300);
7764
7787
  }, 3e3);
7765
7788
  }
7766
- function jy(e5) {
7789
+ function Vy(e5) {
7767
7790
  var t2;
7768
- function n2(e6) {
7769
- if (!e6) return;
7770
- let t3 = e6.containerDimensions;
7771
- if (!t3) return;
7772
- let n3 = document.documentElement;
7773
- t3.width && n3.style.setProperty("--host-width", "".concat(t3.width, "px")), t3.maxWidth && n3.style.setProperty("--host-max-width", "".concat(t3.maxWidth, "px")), t3.height && n3.style.setProperty("--host-height", "".concat(t3.height, "px")), t3.maxHeight && n3.style.setProperty("--host-max-height", "".concat(t3.maxHeight, "px"));
7774
- }
7775
- n2((t2 = e5.getHostContext) == null ? void 0 : t2.call(e5)), e5.addEventListener("hostcontextchanged", (e6) => {
7776
- n2(e6);
7777
- });
7778
- }
7779
- var My = document.getElementById("chart-container"), Ny = document.getElementById("loading-state"), Py = document.getElementById("mode-badge"), Fy = document.getElementById("chart-status"), Iy = document.getElementById("aspect-filter"), Ly = document.getElementById("chart-provenance"), Ry = document.getElementById("bi-patterns-strip"), zy = document.getElementById("param-controls-container"), By = new r_({ name: "Bi-Wheel Chart Explorer", version: "1.0.0" }), $ = null, Vy = null, Hy = false, Uy = false, Wy = "placidus";
7780
- h_(() => {
7781
- $ && yb($);
7791
+ let n2 = document.documentElement, r2 = (e6, t3) => {
7792
+ typeof t3 == "number" && Number.isFinite(t3) && t3 > 0 ? n2.style.setProperty(e6, "".concat(t3, "px")) : n2.style.removeProperty(e6);
7793
+ }, i2 = (e6, t3) => {
7794
+ t3 === void 0 ? n2.removeAttribute(e6) : n2.setAttribute(e6, t3 ? "true" : "false");
7795
+ };
7796
+ function a2() {
7797
+ var t3, a3, o2;
7798
+ let s2 = jy(e5);
7799
+ if (!s2) return;
7800
+ let c2 = (t3 = s2.containerDimensions) == null ? {} : t3;
7801
+ r2("--host-width", c2.width), r2("--host-max-width", c2.maxWidth), r2("--host-height", c2.height), r2("--host-max-height", c2.maxHeight);
7802
+ let l2 = (a3 = s2.safeAreaInsets) == null ? {} : a3;
7803
+ for (let e6 of ["top", "right", "bottom", "left"]) {
7804
+ let t4 = l2[e6];
7805
+ n2.style.setProperty("--safe-".concat(e6), typeof t4 == "number" && t4 > 0 ? "".concat(t4, "px") : "0px");
7806
+ }
7807
+ let u2 = l2.bottom;
7808
+ n2.toggleAttribute("data-safe-bottom", typeof u2 == "number" && u2 > 0), typeof s2.platform == "string" && n2.setAttribute("data-platform", s2.platform);
7809
+ let d2 = s2.deviceCapabilities;
7810
+ i2("data-touch", d2 == null ? void 0 : d2.touch), i2("data-hover", d2 == null ? void 0 : d2.hover);
7811
+ let f2 = s2.styles;
7812
+ f2 != null && f2.variables && r_(f2.variables, n2), !(f2 == null || (o2 = f2.css) == null) && o2.fonts && i_(f2.css.fonts);
7813
+ }
7814
+ a2(), (t2 = e5.addEventListener) == null || t2.call(e5, "hostcontextchanged", a2);
7815
+ }
7816
+ var Hy = document.getElementById("chart-container"), Uy = document.getElementById("loading-state"), Wy = document.getElementById("mode-badge"), Gy = document.getElementById("chart-status"), Ky = document.getElementById("aspect-filter"), qy = document.getElementById("chart-provenance"), Jy = document.getElementById("bi-patterns-strip"), Yy = document.getElementById("param-controls-container"), Xy = new a_({ name: "Bi-Wheel Chart Explorer", version: "1.0.0" }, { availableDisplayModes: Ay }), $ = null, Zy = null, Qy = false, $y = false, eb = "placidus";
7817
+ __(() => {
7818
+ $ && kb($);
7782
7819
  });
7783
- var Gy = "true";
7784
- function Ky(e5) {
7785
- if (Fy) {
7820
+ var tb = "true";
7821
+ function nb(e5) {
7822
+ if (Gy) {
7786
7823
  if (!e5) {
7787
- Fy.classList.remove("visible");
7824
+ Gy.classList.remove("visible");
7788
7825
  return;
7789
7826
  }
7790
- Fy.textContent = "\xB7 ".concat(e5), Fy.classList.add("visible");
7827
+ Gy.textContent = "\xB7 ".concat(e5), Gy.classList.add("visible");
7791
7828
  }
7792
7829
  }
7793
- wv(Ky);
7794
- function qy() {
7795
- Ny.hidden = false, My.hidden = true, Py.hidden = true, Ly && (Ly.hidden = true), Ry && (Ry.hidden = true, Ry.innerHTML = "");
7830
+ Ev(nb);
7831
+ function rb() {
7832
+ Uy.hidden = false, Hy.hidden = true, Wy.hidden = true, qy && (qy.hidden = true), Jy && (Jy.hidden = true, Jy.innerHTML = "");
7796
7833
  }
7797
- function Jy() {
7798
- Ny.hidden = true, My.hidden = false, My.classList.remove("refreshing"), Py.hidden = false, Ly && (Ly.hidden = false);
7834
+ function ib() {
7835
+ Uy.hidden = true, Hy.hidden = false, Hy.classList.remove("refreshing"), Wy.hidden = false, qy && (qy.hidden = false);
7799
7836
  }
7800
- function Yy() {
7801
- if (!$ || My.hidden) {
7802
- qy();
7837
+ function ab() {
7838
+ if (!$ || Hy.hidden) {
7839
+ rb();
7803
7840
  return;
7804
7841
  }
7805
- My.classList.add("refreshing");
7842
+ Hy.classList.add("refreshing");
7806
7843
  }
7807
- function Xy() {
7808
- My.classList.remove("refreshing"), My.classList.remove("chart-rendered"), My.offsetWidth, My.classList.add("chart-rendered");
7844
+ function ob() {
7845
+ Hy.classList.remove("refreshing"), Hy.classList.remove("chart-rendered"), Hy.offsetWidth, Hy.classList.add("chart-rendered");
7809
7846
  }
7810
- function Zy(e5, t2) {
7811
- Ny.hidden = true, Ly && (Ly.hidden = true), Ey({ container: My, message: e5, onRetry: t2 });
7847
+ function sb(e5, t2) {
7848
+ Uy.hidden = true, qy && (qy.hidden = true), Oy({ container: Hy, message: e5, onRetry: t2 });
7812
7849
  }
7813
- function Qy(e5) {
7850
+ function cb(e5) {
7814
7851
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
7815
7852
  }
7816
- async function $y(e5) {
7853
+ async function lb(e5) {
7817
7854
  try {
7818
- (await By.sendMessage({ role: "user", content: [{ type: "text", text: e5 }] })).isError && console.error("[BiWheel] Host rejected sendMessage");
7855
+ (await Xy.sendMessage({ role: "user", content: [{ type: "text", text: e5 }] })).isError && console.error("[BiWheel] Host rejected sendMessage");
7819
7856
  } catch (e6) {
7820
7857
  console.error("[BiWheel] sendMessage failed:", e6);
7821
7858
  }
7822
7859
  }
7823
- function eb(e5) {
7824
- let t2 = Dy(e5);
7860
+ function ub(e5) {
7861
+ let t2 = ky(e5);
7825
7862
  return t2 && "inner" in t2 && "outer" in t2 ? t2 : null;
7826
7863
  }
7827
- var tb = [{ label: "Tight", mult: 0.55 }, { label: "Standard", mult: 1 }, { label: "Wide", mult: 1.6 }], nb = true, rb = 1;
7828
- function ib() {
7864
+ var db = [{ label: "Tight", mult: 0.55 }, { label: "Standard", mult: 1 }, { label: "Wide", mult: 1.6 }], fb = true, pb = 1;
7865
+ function mb() {
7829
7866
  var e5, t2, n2;
7830
- if (!Iy) return;
7867
+ if (!Ky) return;
7831
7868
  let r2 = (t2 = { synastry: "Synastry \u2192 Natal", transit: "Transit \u2192 Natal", progressed: "Progressions \u2192 Natal", solar_return: "Solar Return \u2192 Natal", lunar_return: "Lunar Return \u2192 Natal", solar_arc: "Solar Arc \u2192 Natal" }[(e5 = $ == null ? void 0 : $.mode) == null ? "synastry" : e5]) == null ? "Cross-Wheel" : t2, i2 = [{ key: "placidus", label: "Placidus" }, { key: "whole_sign", label: "Whole Sign" }, { key: "equal", label: "Equal" }, { key: "koch", label: "Koch" }, { key: "regiomontanus", label: "Regio." }], a2 = (() => {
7832
7869
  var e6, t3;
7833
7870
  let n3 = /* @__PURE__ */ new Set();
7834
7871
  for (let r3 of [...(e6 = $ == null ? void 0 : $.inner) == null ? [] : e6, ...(t3 = $ == null ? void 0 : $.outer) == null ? [] : t3]) r3 && typeof r3 == "object" && "name" in r3 && n3.add(String(r3.name).toLowerCase());
7835
- return M_(n3);
7872
+ return P_(n3);
7836
7873
  })();
7837
- vv(Gy);
7838
- 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(Gy === "mean" ? " active" : "", '" data-node="mean" title="Mean lunar node (averaged orbit)">Mean</button>\n <button class="orb-preset-btn node-btn').concat(Gy === "true" ? " active" : "", '" data-node="true" title="True (osculating) lunar node">True</button>\n </div>') : "";
7839
- nb = true, Iy.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(tb.map((e6) => '<button class="orb-preset-btn'.concat(e6.mult === rb ? " active" : "", '" data-mult="').concat(e6.mult, '" title="').concat(e6.label, ' orbs">').concat(e6.label, "</button>")).join(""), '\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Houses</span>\n ').concat(i2.map((e6) => '<button class="orb-preset-btn house-btn'.concat(e6.key === Wy ? " active" : "", '" data-hs="').concat(e6.key, '" title="').concat(e6.label, ' houses">').concat(e6.label, "</button>")).join(""), "\n </div>").concat(o2, "\n </div>\n ");
7840
- let s2 = [...bv($ == null ? void 0 : $.inner), ...bv($ == null ? void 0 : $.outer)], c2 = /* @__PURE__ */ new Set(), l2 = [];
7874
+ bv(tb);
7875
+ 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(tb === "mean" ? " active" : "", '" data-node="mean" title="Mean lunar node (averaged orbit)">Mean</button>\n <button class="orb-preset-btn node-btn').concat(tb === "true" ? " active" : "", '" data-node="true" title="True (osculating) lunar node">True</button>\n </div>') : "";
7876
+ fb = true, Ky.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(db.map((e6) => '<button class="orb-preset-btn'.concat(e6.mult === pb ? " active" : "", '" data-mult="').concat(e6.mult, '" title="').concat(e6.label, ' orbs">').concat(e6.label, "</button>")).join(""), '\n </div>\n <div class="asp-section">\n <span class="asp-section-label">Houses</span>\n ').concat(i2.map((e6) => '<button class="orb-preset-btn house-btn'.concat(e6.key === eb ? " active" : "", '" data-hs="').concat(e6.key, '" title="').concat(e6.label, ' houses">').concat(e6.label, "</button>")).join(""), "\n </div>").concat(o2, "\n </div>\n ");
7877
+ let s2 = [...Sv($ == null ? void 0 : $.inner), ...Sv($ == null ? void 0 : $.outer)], c2 = /* @__PURE__ */ new Set(), l2 = [];
7841
7878
  for (let e6 of s2) {
7842
7879
  let t3 = e6.name.toLowerCase();
7843
7880
  if (c2.has(t3)) continue;
7844
7881
  c2.add(t3);
7845
- let n3 = tv[t3];
7846
- n3 && l2.push({ glyph: n3, label: dy(e6.name) });
7882
+ let n3 = rv[t3];
7883
+ n3 && l2.push({ glyph: n3, label: py(e6.name) });
7847
7884
  }
7848
7885
  let u2 = [...new Set(((n2 = $ == null ? void 0 : $.cross_aspects) == null ? [] : n2).map((e6) => {
7849
7886
  var t3;
7850
7887
  return ((t3 = e6.type) == null ? "" : t3).toLowerCase();
7851
7888
  }).filter(Boolean))].map((e6) => {
7852
7889
  var t3;
7853
- return { glyph: (t3 = iv[e6]) == null ? "" : t3, label: dy(e6) };
7890
+ return { glyph: (t3 = ov[e6]) == null ? "" : t3, label: py(e6) };
7854
7891
  }).filter((e6) => e6.glyph);
7855
- Iy.insertAdjacentHTML("beforeend", fy([{ title: "Bodies", items: l2 }, { title: "Aspects", items: u2 }])), Iy.removeAttribute("hidden");
7892
+ Ky.insertAdjacentHTML("beforeend", my([{ title: "Bodies", items: l2 }, { title: "Aspects", items: u2 }])), Ky.removeAttribute("hidden");
7856
7893
  let d2 = document.getElementById("aspect-vis-toggle");
7857
7894
  d2 == null || d2.addEventListener("click", () => {
7858
- nb = !nb, Zv(nb), d2.classList.toggle("active", nb), d2.querySelector(".toggle-icon").textContent = nb ? "\u2295" : "\u2296";
7859
- }), Iy.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e6) => {
7895
+ fb = !fb, $v(fb), d2.classList.toggle("active", fb), d2.querySelector(".toggle-icon").textContent = fb ? "\u2295" : "\u2296";
7896
+ }), Ky.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e6) => {
7860
7897
  e6.addEventListener("click", () => {
7861
7898
  var t3;
7862
7899
  let n3 = parseFloat((t3 = e6.dataset.mult) == null ? "1" : t3);
7863
- n3 !== rb && (rb = n3, Iy.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e7) => e7.classList.toggle("active", e7.dataset.mult === String(n3))), $ && ab($, n3));
7900
+ n3 !== pb && (pb = n3, Ky.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e7) => e7.classList.toggle("active", e7.dataset.mult === String(n3))), $ && hb($, n3));
7864
7901
  });
7865
- }), Iy.querySelectorAll(".house-btn").forEach((e6) => {
7902
+ }), Ky.querySelectorAll(".house-btn").forEach((e6) => {
7866
7903
  e6.addEventListener("click", () => {
7867
7904
  var t3;
7868
7905
  let n3 = (t3 = e6.dataset.hs) == null ? "placidus" : t3;
7869
- n3 === Wy || !$ || (Wy = n3, Iy.querySelectorAll(".house-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.hs === n3)), Cb(n3));
7906
+ n3 === eb || !$ || (eb = n3, Ky.querySelectorAll(".house-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.hs === n3)), Nb(n3));
7870
7907
  });
7871
- }), Iy.querySelectorAll(".node-btn").forEach((e6) => {
7908
+ }), Ky.querySelectorAll(".node-btn").forEach((e6) => {
7872
7909
  e6.addEventListener("click", () => {
7873
7910
  let t3 = e6.dataset.node === "mean" ? "mean" : "true";
7874
- t3 === Gy || !$ || (Gy = t3, vv(t3), Iy.querySelectorAll(".node-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.node === t3)), ab($, rb));
7911
+ t3 === tb || !$ || (tb = t3, bv(t3), Ky.querySelectorAll(".node-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.node === t3)), hb($, pb));
7875
7912
  });
7876
7913
  });
7877
7914
  }
7878
- function ab(e5, t2) {
7915
+ function hb(e5, t2) {
7879
7916
  var n2, r2, i2, a2;
7880
- let o2 = bv(e5.inner), s2 = bv(e5.outer), c2 = Sv(o2, s2, t2), l2 = { ...e5, cross_aspects: c2 };
7881
- sy(My, l2, wb, Tb, mb, vb()), nb || Zv(false);
7917
+ let o2 = Sv(e5.inner), s2 = Sv(e5.outer), c2 = wv(o2, s2, t2), l2 = { ...e5, cross_aspects: c2 };
7918
+ ly(Hy, l2, Pb, Fb, wb, Ob()), fb || $v(false);
7882
7919
  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;
7883
- Sb(ty(c2), o2, s2, u2);
7920
+ Mb(ry(c2), o2, s2, u2);
7884
7921
  }
7885
- var ob = null;
7886
- function sb(e5) {
7887
- ob = e5, e5 ? My.setAttribute("data-focus", e5) : My.removeAttribute("data-focus"), Py.querySelectorAll(".mode-badge-name").forEach((t2) => {
7922
+ var gb = null;
7923
+ function _b(e5) {
7924
+ gb = e5, e5 ? Hy.setAttribute("data-focus", e5) : Hy.removeAttribute("data-focus"), Wy.querySelectorAll(".mode-badge-name").forEach((t2) => {
7888
7925
  let n2 = t2.dataset.focus;
7889
7926
  t2.classList.toggle("focused", n2 === e5);
7890
- }), $ && pb($, e5);
7927
+ }), $ && Cb($, e5);
7891
7928
  }
7892
- function cb(e5) {
7929
+ function vb(e5) {
7893
7930
  var t2, n2, r2, i2, a2, o2, s2;
7894
7931
  let c2 = (t2 = e5.mode) == null ? "synastry" : t2, l2 = (n2 = (r2 = e5._birth_params_inner) == null ? void 0 : r2.location) == null ? "Person 1" : n2, u2 = (i2 = (a2 = e5._birth_params_outer) == null ? void 0 : a2.location) == null ? c2 === "transit" ? "Transits" : "Person 2" : i2;
7895
- ob = null, My.removeAttribute("data-focus");
7932
+ gb = null, Hy.removeAttribute("data-focus");
7896
7933
  let d2 = "";
7897
7934
  if (c2 === "transit" && (o2 = e5._birth_params_outer) != null && o2.datetime) try {
7898
- let t3 = my(e5._birth_params_outer.datetime, e5._birth_params_outer.timezone);
7899
- t3 && (d2 = '<span class="mode-badge-date">'.concat(Qy(t3.date.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", timeZone: t3.timeZone })), "</span>"));
7935
+ let t3 = gy(e5._birth_params_outer.datetime, e5._birth_params_outer.timezone);
7936
+ t3 && (d2 = '<span class="mode-badge-date">'.concat(cb(t3.date.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", timeZone: t3.timeZone })), "</span>"));
7900
7937
  } catch (e6) {
7901
7938
  }
7902
- Py.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(Qy(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(Qy(u2), "\n </button>\n ").concat(d2), Py.querySelectorAll(".mode-badge-name").forEach((e6) => {
7939
+ Wy.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(cb(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(cb(u2), "\n </button>\n ").concat(d2), Wy.querySelectorAll(".mode-badge-name").forEach((e6) => {
7903
7940
  e6.addEventListener("click", () => {
7904
7941
  let t3 = e6.dataset.focus;
7905
- sb(ob === t3 ? null : t3);
7942
+ _b(gb === t3 ? null : t3);
7906
7943
  });
7907
- }), (s2 = Py.querySelector(".mode-badge-swap")) == null || s2.addEventListener("click", () => {
7908
- sb(ob === "inner" ? "outer" : "inner");
7944
+ }), (s2 = Wy.querySelector(".mode-badge-swap")) == null || s2.addEventListener("click", () => {
7945
+ _b(gb === "inner" ? "outer" : "inner");
7909
7946
  });
7910
7947
  }
7911
- var lb = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], ub = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", asc: "AC", mc: "MC" };
7912
- function db(e5, t2) {
7948
+ var yb = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], bb = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", asc: "AC", mc: "MC" };
7949
+ function xb(e5, t2) {
7913
7950
  var n2, r2;
7914
7951
  let i2 = e5.find((e6) => e6.name.toLowerCase() === t2);
7915
7952
  if (!i2) return "\u2014";
7916
7953
  let a2 = Math.floor((i2.longitude % 360 + 360) % 360 / 30), o2 = Math.floor(i2.longitude % 30);
7917
- return "".concat((n2 = ub[t2]) == null ? t2 : n2, " ").concat(o2, "\xB0 ").concat((r2 = lb[a2]) == null ? "" : r2);
7954
+ return "".concat((n2 = bb[t2]) == null ? t2 : n2, " ").concat(o2, "\xB0 ").concat((r2 = yb[a2]) == null ? "" : r2);
7918
7955
  }
7919
- function fb(e5, t2) {
7956
+ function Sb(e5, t2) {
7920
7957
  try {
7921
- let n2 = my(e5, t2);
7958
+ let n2 = gy(e5, t2);
7922
7959
  if (!n2) return e5;
7923
7960
  let { date: r2, timeZone: i2 } = n2;
7924
7961
  return r2.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", timeZone: i2 }) + " \xB7 " + r2.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit", hour12: true, timeZone: i2 });
@@ -7926,22 +7963,22 @@ function fb(e5, t2) {
7926
7963
  return e5;
7927
7964
  }
7928
7965
  }
7929
- function pb(e5, t2) {
7966
+ function Cb(e5, t2) {
7930
7967
  var n2, r2, i2, a2, o2;
7931
- if (!Ly) return;
7932
- let s2 = t2 == null ? "inner" : t2, c2 = s2 === "inner" ? e5.inner : e5.outer, l2 = s2 === "inner" ? e5._birth_params_inner : e5._birth_params_outer, u2 = (n2 = e5.mode) == null ? "synastry" : n2, d2 = (r2 = l2 == null ? void 0 : l2.location) == null ? s2 === "inner" ? "Inner chart" : u2 === "transit" ? "Transits" : "Outer chart" : r2, f2 = (i2 = l2 == null ? void 0 : l2.timezone) == null ? null : i2, p2 = l2 != null && l2.datetime ? fb(l2.datetime, f2) : null, m2 = s2 === "inner" ? e5.inner_houses : (a2 = e5.outer_houses) == null ? [] : a2, h2 = (o2 = e5.house_system) == null ? m2.length > 0 ? "Placidus" : null : o2, g2 = db(c2, "sun"), _2 = db(c2, "moon"), v2 = db(c2, "asc");
7968
+ if (!qy) return;
7969
+ let s2 = t2 == null ? "inner" : t2, c2 = s2 === "inner" ? e5.inner : e5.outer, l2 = s2 === "inner" ? e5._birth_params_inner : e5._birth_params_outer, u2 = (n2 = e5.mode) == null ? "synastry" : n2, d2 = (r2 = l2 == null ? void 0 : l2.location) == null ? s2 === "inner" ? "Inner chart" : u2 === "transit" ? "Transits" : "Outer chart" : r2, f2 = (i2 = l2 == null ? void 0 : l2.timezone) == null ? null : i2, p2 = l2 != null && l2.datetime ? Sb(l2.datetime, f2) : null, m2 = s2 === "inner" ? e5.inner_houses : (a2 = e5.outer_houses) == null ? [] : a2, h2 = (o2 = e5.house_system) == null ? m2.length > 0 ? "Placidus" : null : o2, g2 = xb(c2, "sun"), _2 = xb(c2, "moon"), v2 = xb(c2, "asc");
7933
7970
  if (v2 === "AC \u2014" && m2.length > 0) {
7934
7971
  let e6 = m2.find((e7) => e7.number === 1);
7935
7972
  if (e6) {
7936
7973
  var y2;
7937
7974
  let t3 = Math.floor((e6.cusp_lon % 360 + 360) % 360 / 30);
7938
- v2 = "AC ".concat(Math.floor(e6.cusp_lon % 30), "\xB0 ").concat((y2 = lb[t3]) == null ? "" : y2);
7975
+ v2 = "AC ".concat(Math.floor(e6.cusp_lon % 30), "\xB0 ").concat((y2 = yb[t3]) == null ? "" : y2);
7939
7976
  }
7940
7977
  }
7941
7978
  let b2 = s2 === "outer" && u2 === "transit" ? "Transit" : s2 === "outer" ? "Synastry" : "Natal";
7942
- Ly.innerHTML = '\n <div class="prov-name">'.concat(Qy(d2), '\n <span class="prov-mode-tag">').concat(Qy(b2), '</span>\n </div>\n <div class="prov-trio">\n <span class="prov-planet">').concat(Qy(g2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(Qy(_2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(Qy(v2), "</span>\n </div>\n ").concat(p2 ? '<div class="prov-meta">'.concat(Qy(p2)).concat(f2 ? ' <span class="prov-tz">'.concat(Qy(f2), "</span>") : "", "</div>") : "", "\n ").concat(h2 ? '<div class="prov-meta">'.concat(Qy(h2), " houses</div>") : "", "\n "), Ly.hidden = false;
7979
+ qy.innerHTML = '\n <div class="prov-name">'.concat(cb(d2), '\n <span class="prov-mode-tag">').concat(cb(b2), '</span>\n </div>\n <div class="prov-trio">\n <span class="prov-planet">').concat(cb(g2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(cb(_2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(cb(v2), "</span>\n </div>\n ").concat(p2 ? '<div class="prov-meta">'.concat(cb(p2)).concat(f2 ? ' <span class="prov-tz">'.concat(cb(f2), "</span>") : "", "</div>") : "", "\n ").concat(h2 ? '<div class="prov-meta">'.concat(cb(h2), " houses</div>") : "", "\n "), qy.hidden = false;
7943
7980
  }
7944
- async function mb(e5) {
7981
+ async function wb(e5) {
7945
7982
  var t2;
7946
7983
  let n2 = (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2, r2 = "";
7947
7984
  if (e5.type === "planet") {
@@ -7968,36 +8005,36 @@ async function mb(e5) {
7968
8005
  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" : "", ".");
7969
8006
  }
7970
8007
  if (!r2) return;
7971
- let h2 = hy($ == null ? void 0 : $._birth_params_inner), g2 = hy($ == null ? void 0 : $._birth_params_outer);
8008
+ let h2 = _y($ == null ? void 0 : $._birth_params_inner), g2 = _y($ == null ? void 0 : $._birth_params_outer);
7972
8009
  if (h2 || g2) {
7973
8010
  let e6 = n2 === "transit" ? "Natal" : "Inner wheel", t3 = n2 === "transit" ? "Transits" : "Outer wheel";
7974
8011
  r2 = "".concat([h2 ? "".concat(e6, ": ").concat(h2) : "", g2 ? "".concat(t3, ": ").concat(g2) : ""].filter(Boolean).join("\n"), "\n\n").concat(r2);
7975
8012
  }
7976
- await $y(r2);
8013
+ await lb(r2);
7977
8014
  }
7978
- async function hb() {
8015
+ async function Tb() {
7979
8016
  var e5, t2, n2, r2, i2, a2, o2, s2;
7980
8017
  if (!$) return;
7981
8018
  let c2 = $, l2 = (e5 = c2.mode) == null ? "synastry" : e5, u2 = String((t2 = (n2 = c2._birth_params_inner) == null ? void 0 : n2.location) == null ? "Person 1" : t2), d2 = l2 === "transit" ? "transits (".concat(String((r2 = (i2 = c2._birth_params_outer) == null ? void 0 : i2.location) == null ? "today" : r2), ")") : String((a2 = (o2 = c2._birth_params_outer) == null ? void 0 : o2.location) == null ? "Person 2" : a2), f2 = ((s2 = c2.cross_aspects) == null ? [] : s2).slice(0, 8).map((e6) => " \u2022 ".concat(e6.planet1, " ").concat(e6.type, " ").concat(e6.planet2, " (").concat(e6.orb.toFixed(1), "\xB0").concat(e6.applying === void 0 ? "" : ", ".concat(e6.applying ? "applying" : "separating"), ")")).join("\n") || " \u2022 No cross-aspects within orb";
7982
- await $y(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."));
8019
+ await lb(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."));
7983
8020
  }
7984
- async function gb() {
8021
+ async function Eb() {
7985
8022
  var e5, t2, n2, r2, i2, a2;
7986
8023
  if (!$) return;
7987
8024
  let o2 = $, s2 = (e5 = o2.mode) == null ? "synastry" : e5, c2 = String((t2 = (n2 = o2._birth_params_inner) == null ? void 0 : n2.location) == null ? "Person 1" : t2), l2 = s2 === "transit" ? "today's transits" : String((r2 = (i2 = o2._birth_params_outer) == null ? void 0 : i2.location) == null ? "Person 2" : r2), u2 = ((a2 = o2.cross_aspects) == null ? [] : a2).slice(0, 6).map((e6) => "".concat(e6.planet1, " ").concat(e6.type, " ").concat(e6.planet2, " (").concat(e6.orb.toFixed(1), "\xB0)")).join(", ") || "none detected";
7988
- await $y(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."));
8025
+ await lb(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."));
7989
8026
  }
7990
- async function _b(e5) {
7991
- if (Hy) try {
8027
+ async function Db(e5) {
8028
+ if (Qy) try {
7992
8029
  var t2;
7993
- await By.updateModelContext({ content: [{ type: "text", text: "User selected ".concat(e5.type, ": ").concat(JSON.stringify(e5.data, null, 2), "\nMode: ").concat((t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2) }] });
8030
+ await Xy.updateModelContext({ content: [{ type: "text", text: "User selected ".concat(e5.type, ": ").concat(JSON.stringify(e5.data, null, 2), "\nMode: ").concat((t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2) }] });
7994
8031
  } catch (e6) {
7995
8032
  }
7996
8033
  }
7997
- function vb() {
7998
- if (Uy) return async (e5) => {
8034
+ function Ob() {
8035
+ if ($y) return async (e5) => {
7999
8036
  var t2;
8000
- let n2 = await By.createSamplingMessage({ maxTokens: 150, systemPrompt: "You are an expert astrologer interpreting a ".concat(($ == null ? void 0 : $.mode) === "synastry" ? "synastry (relationship)" : "".concat((t2 = $ == null ? void 0 : $.mode) == null ? "transit" : t2, " (planetary weather)"), " chart. Give a focused, mode-appropriate interpretation. Insightful and concise."), messages: [{ role: "user", content: { type: "text", text: e5 } }] });
8037
+ let n2 = await Xy.createSamplingMessage({ maxTokens: 150, systemPrompt: "You are an expert astrologer interpreting a ".concat(($ == null ? void 0 : $.mode) === "synastry" ? "synastry (relationship)" : "".concat((t2 = $ == null ? void 0 : $.mode) == null ? "transit" : t2, " (planetary weather)"), " chart. Give a focused, mode-appropriate interpretation. Insightful and concise."), messages: [{ role: "user", content: { type: "text", text: e5 } }] });
8001
8038
  if (n2.isError) {
8002
8039
  var r2, i2;
8003
8040
  throw Error((r2 = (i2 = n2.error) == null ? void 0 : i2.message) == null ? "Sampling failed" : r2);
@@ -8007,133 +8044,133 @@ function vb() {
8007
8044
  throw Error("Unexpected sampling response format");
8008
8045
  };
8009
8046
  }
8010
- function yb(e5) {
8047
+ function kb(e5) {
8011
8048
  var t2, n2, r2, i2, a2, o2, s2;
8012
- $ = e5, clearTimeout(Db), cb(e5), sy(My, e5, wb, Tb, mb, vb()), ib(), pb(e5, ob);
8013
- let c2 = bv(e5.inner), l2 = bv(e5.outer), u2 = (n2 = (r2 = (i2 = ((t2 = e5.inner_houses) == null ? [] : t2)[0]) == null ? void 0 : i2.cusp_lon) == null ? e5.ascendant : r2) == null ? 0 : n2;
8014
- Sb(ty((a2 = e5.cross_aspects) == null ? [] : a2), c2, l2, u2), e5.house_system && (Wy = e5.house_system);
8049
+ $ = e5, clearTimeout(Lb), vb(e5), ly(Hy, e5, Pb, Fb, wb, Ob()), mb(), Cb(e5, gb);
8050
+ let c2 = Sv(e5.inner), l2 = Sv(e5.outer), u2 = (n2 = (r2 = (i2 = ((t2 = e5.inner_houses) == null ? [] : t2)[0]) == null ? void 0 : i2.cusp_lon) == null ? e5.ascendant : r2) == null ? 0 : n2;
8051
+ Mb(ry((a2 = e5.cross_aspects) == null ? [] : a2), c2, l2, u2), e5.house_system && (eb = e5.house_system);
8015
8052
  let d2 = document.getElementById("bi-action-bar");
8016
8053
  if (!d2) {
8017
8054
  d2 = document.createElement("div"), d2.id = "bi-action-bar", d2.className = "hd-action-bar";
8018
8055
  let e6 = document.querySelector("#fs-bottom-bar [data-column='right']");
8019
8056
  if (e6) e6.appendChild(d2);
8020
8057
  else {
8021
- let e7 = document.getElementById("app"), t3 = Py.parentElement === e7 ? Py : null;
8058
+ let e7 = document.getElementById("app"), t3 = Wy.parentElement === e7 ? Wy : null;
8022
8059
  e7 == null || e7.insertBefore(d2, t3);
8023
8060
  }
8024
8061
  }
8025
- 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 hb()), (s2 = d2.querySelector("#bi-questions-btn")) == null || s2.addEventListener("click", () => void gb()), Jy(), Xy(), wy("bi-wheel");
8062
+ 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 Tb()), (s2 = d2.querySelector("#bi-questions-btn")) == null || s2.addEventListener("click", () => void Eb()), ib(), ob(), Ey("bi-wheel");
8026
8063
  }
8027
- var bb = null, xb = { "Cross Trine": "#52a8e0", "Cross T-Square": "#e08a52", "Cross Stellium": "#9a7fd4" };
8028
- function Sb(e5, t2, n2, r2) {
8029
- if (!Ry) return;
8064
+ var Ab = null, jb = { "Cross Trine": "#52a8e0", "Cross T-Square": "#e08a52", "Cross Stellium": "#9a7fd4" };
8065
+ function Mb(e5, t2, n2, r2) {
8066
+ if (!Jy) return;
8030
8067
  if (e5.length === 0) {
8031
- Ry.hidden = true, Ry.innerHTML = "";
8068
+ Jy.hidden = true, Jy.innerHTML = "";
8032
8069
  return;
8033
8070
  }
8034
- bb = null, Ry.innerHTML = '\n <span class="patterns-label">Cross-Patterns:</span>\n '.concat(e5.map((e6, t3) => {
8071
+ Ab = null, Jy.innerHTML = '\n <span class="patterns-label">Cross-Patterns:</span>\n '.concat(e5.map((e6, t3) => {
8035
8072
  var n3;
8036
- let r3 = (n3 = xb[e6.name]) == null ? "#888" : n3;
8073
+ let r3 = (n3 = jb[e6.name]) == null ? "#888" : n3;
8037
8074
  return '<button class="pattern-pill"\n data-idx="'.concat(t3, '"\n data-color="').concat(r3, '"\n style="color:').concat(r3, ";border-color:").concat(r3, '"\n title="').concat(e6.description, '">\n ').concat(e6.name, '\n <span class="pattern-pill-detail">').concat(e6.description, "</span>\n </button>");
8038
- }).join(""), "\n "), Ry.removeAttribute("hidden");
8075
+ }).join(""), "\n "), Jy.removeAttribute("hidden");
8039
8076
  let i2 = document.createElement("button");
8040
- i2.className = "pattern-ask-claude-btn", i2.textContent = "\u2728 Interpret", i2.style.display = "none", Ry.appendChild(i2), i2.addEventListener("click", () => {
8077
+ i2.className = "pattern-ask-claude-btn", i2.textContent = "\u2728 Interpret", i2.style.display = "none", Jy.appendChild(i2), i2.addEventListener("click", () => {
8041
8078
  var t3;
8042
- let n3 = bb;
8079
+ let n3 = Ab;
8043
8080
  if (n3 === null) return;
8044
8081
  let r3 = e5[n3];
8045
- r3 && (i2.disabled = true, i2.textContent = "\u23F3 Sending\u2026", mb({ type: "pattern", data: { name: r3.name, planets: r3.planets, description: (t3 = r3.description) == null ? "" : t3 } }).then(() => {
8082
+ r3 && (i2.disabled = true, i2.textContent = "\u23F3 Sending\u2026", wb({ type: "pattern", data: { name: r3.name, planets: r3.planets, description: (t3 = r3.description) == null ? "" : t3 } }).then(() => {
8046
8083
  i2.textContent = "\u2713 Sent", setTimeout(() => {
8047
8084
  i2.textContent = "\u2728 Interpret", i2.disabled = false;
8048
8085
  }, 2500);
8049
8086
  }).catch(() => {
8050
8087
  i2.textContent = "\u26A0 Failed", i2.disabled = false;
8051
8088
  }));
8052
- }), Ry.querySelectorAll(".pattern-pill").forEach((a2) => {
8089
+ }), Jy.querySelectorAll(".pattern-pill").forEach((a2) => {
8053
8090
  a2.addEventListener("click", () => {
8054
8091
  var o2, s2;
8055
8092
  let c2 = parseInt((o2 = a2.dataset.idx) == null ? "-1" : o2, 10), l2 = e5[c2];
8056
8093
  if (!l2) return;
8057
8094
  let u2 = (s2 = a2.dataset.color) == null ? "#888" : s2;
8058
- if (bb === c2) {
8059
- bb = null, a2.classList.remove("active"), a2.style.background = "transparent", a2.style.color = u2, a2.style.borderColor = u2, Xv(), ay(), i2.style.display = "none";
8095
+ if (Ab === c2) {
8096
+ Ab = null, a2.classList.remove("active"), a2.style.background = "transparent", a2.style.color = u2, a2.style.borderColor = u2, Qv(), sy(), i2.style.display = "none";
8060
8097
  return;
8061
8098
  }
8062
- bb = c2, Ry.querySelectorAll(".pattern-pill").forEach((e6) => {
8099
+ Ab = c2, Jy.querySelectorAll(".pattern-pill").forEach((e6) => {
8063
8100
  var t3;
8064
8101
  e6.classList.remove("active");
8065
8102
  let n3 = (t3 = e6.dataset.color) == null ? "#888" : t3;
8066
8103
  e6.style.color = n3, e6.style.borderColor = n3, e6.style.background = "transparent";
8067
- }), a2.classList.add("active"), a2.style.background = u2, a2.style.color = "#fff", a2.style.borderColor = u2, oy(l2), ay(), iy(l2, t2, n2, r2), i2.style.display = "", i2.textContent = "\u2728 Interpret", i2.disabled = false;
8104
+ }), a2.classList.add("active"), a2.style.background = u2, a2.style.color = "#fff", a2.style.borderColor = u2, cy(l2), sy(), oy(l2, t2, n2, r2), i2.style.display = "", i2.textContent = "\u2728 Interpret", i2.disabled = false;
8068
8105
  });
8069
8106
  });
8070
8107
  }
8071
- async function Cb(e5) {
8108
+ async function Nb(e5) {
8072
8109
  if (!$) return;
8073
8110
  let t2 = $;
8074
- Yy();
8111
+ ab();
8075
8112
  try {
8076
8113
  var n2, r2, i2, a2, o2, s2, c2, l2, u2, d2;
8077
- let f2 = new Promise((e6, t3) => setTimeout(() => t3(Error("House system recalculate timed out")), 3e4)), p2 = eb(await Promise.race([By.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n2 = t2._birth_params_inner) == null ? void 0 : n2.datetime, person1_latitude: (r2 = t2._birth_params_inner) == null ? void 0 : r2.latitude, person1_longitude: (i2 = t2._birth_params_inner) == null ? void 0 : i2.longitude, person1_timezone: (a2 = t2._birth_params_inner) == null ? void 0 : a2.timezone, person1_name: (o2 = t2._birth_params_inner) == null ? void 0 : o2.location, person2_datetime: (s2 = t2._birth_params_outer) == null ? void 0 : s2.datetime, person2_latitude: (c2 = t2._birth_params_outer) == null ? void 0 : c2.latitude, person2_longitude: (l2 = t2._birth_params_outer) == null ? void 0 : l2.longitude, person2_timezone: (u2 = t2._birth_params_outer) == null ? void 0 : u2.timezone, person2_name: (d2 = t2._birth_params_outer) == null ? void 0 : d2.location, house_system: e5 } }), f2]));
8078
- p2 ? yb(p2) : $ && Jy();
8114
+ let f2 = new Promise((e6, t3) => setTimeout(() => t3(Error("House system recalculate timed out")), 3e4)), p2 = ub(await Promise.race([Xy.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n2 = t2._birth_params_inner) == null ? void 0 : n2.datetime, person1_latitude: (r2 = t2._birth_params_inner) == null ? void 0 : r2.latitude, person1_longitude: (i2 = t2._birth_params_inner) == null ? void 0 : i2.longitude, person1_timezone: (a2 = t2._birth_params_inner) == null ? void 0 : a2.timezone, person1_name: (o2 = t2._birth_params_inner) == null ? void 0 : o2.location, person2_datetime: (s2 = t2._birth_params_outer) == null ? void 0 : s2.datetime, person2_latitude: (c2 = t2._birth_params_outer) == null ? void 0 : c2.latitude, person2_longitude: (l2 = t2._birth_params_outer) == null ? void 0 : l2.longitude, person2_timezone: (u2 = t2._birth_params_outer) == null ? void 0 : u2.timezone, person2_name: (d2 = t2._birth_params_outer) == null ? void 0 : d2.location, house_system: e5 } }), f2]));
8115
+ p2 ? kb(p2) : $ && ib();
8079
8116
  } catch (e6) {
8080
- console.error("[BiWheel] House system recalculate failed:", e6), $ && Jy();
8117
+ console.error("[BiWheel] House system recalculate failed:", e6), $ && ib();
8081
8118
  }
8082
8119
  }
8083
- function wb(e5, t2, n2) {
8120
+ function Pb(e5, t2, n2) {
8084
8121
  var r2, i2, a2, o2, s2;
8085
8122
  let c2 = Math.floor((e5.longitude % 360 + 360) % 360 / 30), l2 = (r2 = (i2 = e5.sign) == null ? ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"][c2] : i2) == null ? "Unknown" : r2;
8086
- _b({ type: "planet", data: { planet_name: e5.name, wheel: t2, longitude: e5.longitude, sign: l2, position: "".concat(Math.floor(e5.longitude % 30), "\xB0 ").concat(l2), house: (a2 = e5.house) == null ? null : a2, retrograde: (o2 = e5.retrograde) == null ? false : o2, mode: (s2 = $ == null ? void 0 : $.mode) == null ? "synastry" : s2, cross_aspects: n2.filter((n3) => t2 === "inner" && n3.planet1 === e5.name || t2 === "outer" && n3.planet2 === e5.name).slice(0, 5).map((e6) => ({ type: e6.type, partner: t2 === "inner" ? e6.planet2 : e6.planet1, orb: e6.orb, applying: e6.applying, orb_label: e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide" })) } });
8123
+ Db({ type: "planet", data: { planet_name: e5.name, wheel: t2, longitude: e5.longitude, sign: l2, position: "".concat(Math.floor(e5.longitude % 30), "\xB0 ").concat(l2), house: (a2 = e5.house) == null ? null : a2, retrograde: (o2 = e5.retrograde) == null ? false : o2, mode: (s2 = $ == null ? void 0 : $.mode) == null ? "synastry" : s2, cross_aspects: n2.filter((n3) => t2 === "inner" && n3.planet1 === e5.name || t2 === "outer" && n3.planet2 === e5.name).slice(0, 5).map((e6) => ({ type: e6.type, partner: t2 === "inner" ? e6.planet2 : e6.planet1, orb: e6.orb, applying: e6.applying, orb_label: e6.orb <= 1 ? "exact" : e6.orb <= 3 ? "tight" : "wide" })) } });
8087
8124
  }
8088
- function Tb(e5) {
8125
+ function Fb(e5) {
8089
8126
  var t2;
8090
8127
  let n2 = $ == null ? void 0 : $.inner.find((t3) => t3.name === e5.planet1), r2 = $ == null ? void 0 : $.outer.find((t3) => t3.name === e5.planet2), i2 = n2 ? Math.floor((n2.longitude % 360 + 360) % 360 / 30) : NaN, a2 = r2 ? Math.floor((r2.longitude % 360 + 360) % 360 / 30) : NaN, o2 = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"];
8091
- _b({ type: "cross_aspect", data: { planet1: e5.planet1, wheel1: e5.wheel1, planet2: e5.planet2, wheel2: e5.wheel2, aspect_type: e5.type, orb: e5.orb, applying: e5.applying, planet1_sign: isNaN(i2) ? null : o2[i2], planet2_sign: isNaN(a2) ? null : o2[a2], mode: (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2 } });
8128
+ Db({ type: "cross_aspect", data: { planet1: e5.planet1, wheel1: e5.wheel1, planet2: e5.planet2, wheel2: e5.wheel2, aspect_type: e5.type, orb: e5.orb, applying: e5.applying, planet1_sign: isNaN(i2) ? null : o2[i2], planet2_sign: isNaN(a2) ? null : o2[a2], mode: (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2 } });
8092
8129
  }
8093
- By.ontoolresult = (e5) => {
8094
- clearTimeout(Db);
8095
- let t2 = eb(e5);
8130
+ Xy.ontoolresult = (e5) => {
8131
+ clearTimeout(Lb);
8132
+ let t2 = ub(e5);
8096
8133
  if (!t2) {
8097
- Zy("The chart didn't load. Tap to try again.", Eb);
8134
+ sb("The chart didn't load. Tap to try again.", Ib);
8098
8135
  return;
8099
8136
  }
8100
- if (!Vy) {
8137
+ if (!Zy) {
8101
8138
  var n2, r2, i2, a2;
8102
8139
  let e6 = (n2 = t2._birth_params_outer) == null ? {} : n2, o2 = (r2 = e6.datetime) == null ? "" : r2, s2 = (i2 = e6.location) == null ? "" : i2, c2 = (a2 = e6.timezone) == null ? "" : a2, l2 = e6.latitude, u2 = e6.longitude, d2 = "", f2 = "12:00";
8103
8140
  if (o2 && o2.includes("T")) {
8104
8141
  let e7 = o2.split("T");
8105
8142
  d2 = e7[0], f2 = e7[1].substring(0, 5);
8106
8143
  }
8107
- Vy = new gy({ app: By, container: zy, initialParams: { date: d2, time: f2, locationName: s2, timezone: c2, latitude: typeof l2 == "number" ? l2 : null, longitude: typeof u2 == "number" ? u2 : null }, showStepControls: t2.mode === "transit", costHint: "~2 credits", onRefresh: async (e7) => {
8108
- Vy == null || Vy.setBusy(true), Yy(), zy.setAttribute("hidden", "");
8144
+ Zy = new vy({ app: Xy, container: Yy, initialParams: { date: d2, time: f2, locationName: s2, timezone: c2, latitude: typeof l2 == "number" ? l2 : null, longitude: typeof u2 == "number" ? u2 : null }, showStepControls: t2.mode === "transit", costHint: "~2 credits", onRefresh: async (e7) => {
8145
+ Zy == null || Zy.setBusy(true), ab(), Yy.setAttribute("hidden", "");
8109
8146
  try {
8110
8147
  var n3, r3, i3, a3, o3;
8111
- let s3 = "".concat(e7.date, "T").concat(e7.time, ":00"), c3 = new Promise((e8, t3) => setTimeout(() => t3(Error("Bi-wheel recalculate timed out after 30s")), 3e4)), l3 = eb(await Promise.race([By.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n3 = t2._birth_params_inner) == null ? void 0 : n3.datetime, person1_latitude: (r3 = t2._birth_params_inner) == null ? void 0 : r3.latitude, person1_longitude: (i3 = t2._birth_params_inner) == null ? void 0 : i3.longitude, person1_timezone: (a3 = t2._birth_params_inner) == null ? void 0 : a3.timezone, person1_name: (o3 = t2._birth_params_inner) == null ? void 0 : o3.location, person2_datetime: "".concat(s3).concat(e7.timezone ? "" : "Z"), person2_latitude: e7.latitude, person2_longitude: e7.longitude, person2_timezone: e7.timezone, person2_name: e7.locationName } }), c3]));
8112
- l3 ? yb(l3) : $ && Jy();
8148
+ let s3 = "".concat(e7.date, "T").concat(e7.time, ":00"), c3 = new Promise((e8, t3) => setTimeout(() => t3(Error("Bi-wheel recalculate timed out after 30s")), 3e4)), l3 = ub(await Promise.race([Xy.callServerTool({ name: "bi_wheel_recalculate", arguments: { mode: t2.mode, person1_datetime: (n3 = t2._birth_params_inner) == null ? void 0 : n3.datetime, person1_latitude: (r3 = t2._birth_params_inner) == null ? void 0 : r3.latitude, person1_longitude: (i3 = t2._birth_params_inner) == null ? void 0 : i3.longitude, person1_timezone: (a3 = t2._birth_params_inner) == null ? void 0 : a3.timezone, person1_name: (o3 = t2._birth_params_inner) == null ? void 0 : o3.location, person2_datetime: "".concat(s3).concat(e7.timezone ? "" : "Z"), person2_latitude: e7.latitude, person2_longitude: e7.longitude, person2_timezone: e7.timezone, person2_name: e7.locationName } }), c3]));
8149
+ l3 ? kb(l3) : $ && ib();
8113
8150
  } catch (e8) {
8114
- console.error("[BiWheel] Recalculate failed or timed out:", e8), $ && Jy();
8151
+ console.error("[BiWheel] Recalculate failed or timed out:", e8), $ && ib();
8115
8152
  } finally {
8116
- Vy == null || Vy.setBusy(false), zy.removeAttribute("hidden");
8153
+ Zy == null || Zy.setBusy(false), Yy.removeAttribute("hidden");
8117
8154
  }
8118
8155
  } });
8119
8156
  }
8120
- yb(t2), zy.removeAttribute("hidden");
8157
+ kb(t2), Yy.removeAttribute("hidden");
8121
8158
  };
8122
- function Eb() {
8123
- clearTimeout(Db), qy(), Db = setTimeout(() => {
8124
- My.hidden && Zy("The chart didn't load. Tap to try again.", Eb);
8125
- }, 3e4), By.sendMessage({ role: "user", content: [{ type: "text", text: "Please regenerate the bi-wheel chart." }] }).catch(() => {
8159
+ function Ib() {
8160
+ clearTimeout(Lb), rb(), Lb = setTimeout(() => {
8161
+ Hy.hidden && sb("The chart didn't load. Tap to try again.", Ib);
8162
+ }, 3e4), Xy.sendMessage({ role: "user", content: [{ type: "text", text: "Please regenerate the bi-wheel chart." }] }).catch(() => {
8126
8163
  });
8127
8164
  }
8128
- var Db = setTimeout(() => {
8129
- My.hidden && Zy("Chart data is taking longer than expected.", Eb);
8165
+ var Lb = setTimeout(() => {
8166
+ Hy.hidden && sb("Chart data is taking longer than expected.", Ib);
8130
8167
  }, 3e4);
8131
- qy(), ky(By, { loadingEl: Ny, contentEl: My, statusFn: Ky, paramControls: () => Vy }), (async () => {
8168
+ rb(), zy(Xy, { loadingEl: Uy, contentEl: Hy, statusFn: nb, paramControls: () => Zy }), (async () => {
8132
8169
  try {
8133
- await By.connect();
8134
- let e5 = By.getHostCapabilities();
8135
- Hy = !!(e5 != null && e5.modelContext), Uy = !!(e5 != null && e5.sampling), Oy(By, document.getElementById("pan-zoom-controls"), ["mode-badge", "aspect-filter", "param-controls-container", "chart-provenance", "bi-patterns-strip", "bi-action-bar"]), jy(By), g_(By, () => {
8136
- $ && yb($);
8170
+ await Xy.connect();
8171
+ let e5 = Xy.getHostCapabilities();
8172
+ Qy = !!(e5 != null && e5.modelContext), $y = !!(e5 != null && e5.sampling), Ly(Xy, document.getElementById("pan-zoom-controls"), ["mode-badge", "aspect-filter", "param-controls-container", "chart-provenance", "bi-patterns-strip", "bi-action-bar"]), Vy(Xy), v_(Xy, () => {
8173
+ $ && kb($);
8137
8174
  });
8138
8175
  } catch (e5) {
8139
8176
  console.error("[BiWheel] connect() failed:", e5);