@openephemeris/mcp-server 4.17.0 → 4.19.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 (47) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +10 -10
  3. package/dist/backend/client.d.ts +57 -1
  4. package/dist/backend/client.js +125 -15
  5. package/dist/index.js +8 -110
  6. package/dist/prompts.js +26 -24
  7. package/dist/server-sse.d.ts +18 -0
  8. package/dist/server-sse.js +48 -120
  9. package/dist/tools/apps/_render-token.d.ts +34 -0
  10. package/dist/tools/apps/_render-token.js +50 -0
  11. package/dist/tools/apps/bazi-app.d.ts +1 -1
  12. package/dist/tools/apps/bazi-app.js +39 -14
  13. package/dist/tools/apps/bi-wheel-app.d.ts +10 -3
  14. package/dist/tools/apps/bi-wheel-app.js +79 -119
  15. package/dist/tools/apps/bodygraph-app.d.ts +7 -4
  16. package/dist/tools/apps/bodygraph-app.js +101 -46
  17. package/dist/tools/apps/chart-wheel-app.d.ts +1 -1
  18. package/dist/tools/apps/chart-wheel-app.js +59 -18
  19. package/dist/tools/apps/location-tools.js +10 -3
  20. package/dist/tools/apps/moon-phase-app.d.ts +1 -1
  21. package/dist/tools/apps/moon-phase-app.js +13 -4
  22. package/dist/tools/apps/transit-timeline-app.d.ts +1 -1
  23. package/dist/tools/apps/transit-timeline-app.js +6 -6
  24. package/dist/tools/apps/ui-resource.d.ts +43 -0
  25. package/dist/tools/apps/ui-resource.js +66 -0
  26. package/dist/tools/apps/ui-resources.d.ts +22 -0
  27. package/dist/tools/apps/ui-resources.js +105 -0
  28. package/dist/tools/apps/vedic-chart-app.d.ts +1 -1
  29. package/dist/tools/apps/vedic-chart-app.js +13 -3
  30. package/dist/tools/datetime-historical.js +7 -2
  31. package/dist/tools/datetime.js +2 -1
  32. package/dist/tools/dev.js +7 -6
  33. package/dist/tools/specialized/electional.js +4 -3
  34. package/dist/tools/specialized/ephemeris_extended.js +19 -4
  35. package/dist/tools/specialized/hd_group.js +2 -2
  36. package/dist/tools/specialized/moon.d.ts +1 -1
  37. package/dist/tools/specialized/moon.js +51 -43
  38. package/dist/tools/specialized/progressed.js +2 -25
  39. package/dist/tools/specialized/transits.js +5 -5
  40. package/dist/ui/bazi.html +1199 -1161
  41. package/dist/ui/bi-wheel.html +573 -504
  42. package/dist/ui/bodygraph.html +437 -337
  43. package/dist/ui/chart-wheel.html +654 -584
  44. package/dist/ui/moon-phase.html +190 -155
  45. package/dist/ui/transit-timeline.html +865 -830
  46. package/dist/ui/vedic-chart.html +971 -934
  47. 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,49 +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_ = 310, w_ = 310, T_ = 240, E_ = 204, D_ = 190, O_ = 152, k_ = 118, A_ = 112, j_ = 290, M_ = 246, N_ = 264, P_ = 16;
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) {
6734
+ var t2;
6735
+ return (t2 = A_[e5.trim().toLowerCase()]) == null ? null : t2;
6736
+ }
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) {
6739
+ let t2 = /* @__PURE__ */ new Set();
6740
+ for (let n2 of e5) {
6741
+ let e6 = j_(n2);
6742
+ e6 && t2.add(e6);
6743
+ }
6744
+ return t2.has("north node (mean)") && t2.has("north node (true)") || t2.has("south node (mean)") && t2.has("south node (true)");
6745
+ }
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_]];
6748
+ for (let [e6, a2] of i2) n2.has(e6) && n2.has(a2) && r2.add(t2 === "true" ? e6 : a2);
6749
+ return r2.size === 0 ? e5 : e5.filter((e6) => {
6750
+ var t3;
6751
+ return !r2.has((t3 = j_(e6.name)) == null ? "" : t3);
6752
+ });
6753
+ }
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) {
6756
+ var t2;
6757
+ return (t2 = B_[e5.trim().toLowerCase()]) == null ? null : t2;
6758
+ }
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) {
6761
+ var t2, n2;
6762
+ return (t2 = (n2 = j_(e5)) == null ? V_(e5) : n2) == null ? e5 : t2;
6763
+ }
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;
6723
6765
  function Y(e5, t2, n2) {
6724
6766
  let r2 = -(e5 - n2 + 180) * Math.PI / 180;
6725
- return { x: C_ + t2 * Math.cos(r2), y: w_ + t2 * Math.sin(r2) };
6767
+ return { x: G_ + t2 * Math.cos(r2), y: K_ + t2 * Math.sin(r2) };
6726
6768
  }
6727
6769
  function X(e5) {
6728
6770
  return document.createElementNS("http://www.w3.org/2000/svg", e5);
6729
6771
  }
6730
- var F_ = { 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", asc: "AC", mc: "MC" }, I_ = ["\u2648", "\u2649", "\u264A", "\u264B", "\u264C", "\u264D", "\u264E", "\u264F", "\u2650", "\u2651", "\u2652", "\u2653"].map((e5) => e5 + "\uFE0E"), L_ = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], R_ = { conjunction: "\u260C", opposition: "\u260D", trine: "\u25B3", square: "\u25A1", sextile: "\u26B9" };
6731
- function z_(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) {
6732
6774
  let t2 = e5.toLowerCase();
6733
- return getComputedStyle(document.documentElement).getPropertyValue("--xasp-".concat(t2)).trim() || u_(t2, G_());
6775
+ return getComputedStyle(document.documentElement).getPropertyValue("--xasp-".concat(t2)).trim() || f_(t2, pv());
6734
6776
  }
6735
- function B_(e5) {
6777
+ function cv(e5) {
6736
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" };
6737
6779
  }
6738
- var V_ = { 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] } };
6739
- function H_(e5, t2) {
6740
- let n2 = V_[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()];
6741
6783
  if (!n2) return null;
6742
6784
  let r2 = Math.floor((t2 % 360 + 360) % 360 / 30);
6743
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;
6744
6786
  }
6745
- var U_ = ["fire", "earth", "air", "water", "fire", "earth", "air", "water", "fire", "earth", "air", "water"], W_ = ["cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable", "cardinal", "fixed", "mutable"], G_ = p_, K_ = (e5) => l_(e5, G_());
6746
- function q_(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) {
6747
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);
6748
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(" ");
6749
6791
  }
6750
- function J_(e5, t2, n2, r2, i2, a2, o2) {
6792
+ function gv(e5, t2, n2, r2, i2, a2, o2) {
6751
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");
6752
6794
  m2.setAttribute("d", p2), m2.setAttribute("fill", a2), m2.setAttribute("fill-opacity", String(o2)), m2.setAttribute("pointer-events", "none"), e5.appendChild(m2);
6753
6795
  }
6754
- var Y_ = /* @__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"]);
6755
- function X_(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) {
6756
6798
  let t2 = (e5 % 360 + 360) % 360, n2 = Math.floor(t2 / 30), r2 = Math.floor(t2 % 30);
6757
- return "".concat(r2, "\xB0").concat(Math.floor((t2 % 30 - r2) * 60).toString().padStart(2, "0"), "\u2032 ").concat(L_[n2]);
6799
+ return "".concat(r2, "\xB0").concat(Math.floor((t2 % 30 - r2) * 60).toString().padStart(2, "0"), "\u2032 ").concat(av[n2]);
6758
6800
  }
6759
6801
  function Z(e5) {
6760
6802
  return e5.replace(/\b\w/g, (e6) => e6.toUpperCase());
@@ -6762,29 +6804,29 @@ function Z(e5) {
6762
6804
  function Q(e5) {
6763
6805
  return String(e5).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
6764
6806
  }
6765
- var Z_ = "true";
6766
- function Q_(e5) {
6767
- Z_ = e5;
6807
+ var yv = "true";
6808
+ function bv(e5) {
6809
+ yv = e5;
6768
6810
  }
6769
- function $_(e5) {
6770
- let t2 = e5.some((e6) => e6.name === "true_node"), n2 = e5.some((e6) => e6.name === "north_node");
6771
- if (!t2 || !n2) return e5;
6772
- let r2 = Z_ === "true" ? "north_node" : "true_node";
6773
- return e5.filter((e6) => e6.name !== r2);
6811
+ function xv(e5) {
6812
+ return F_(e5.map((e6) => {
6813
+ let t2 = W_(e6.name);
6814
+ return t2 === e6.name ? e6 : { ...e6, name: t2 };
6815
+ }), yv);
6774
6816
  }
6775
- function ev(e5) {
6776
- return Array.isArray(e5) ? $_(e5.filter((e6) => e6 && typeof e6.longitude == "number" && isFinite(e6.longitude))) : e5 && typeof e5 == "object" ? $_(Object.entries(e5).filter(([e6]) => Y_.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]) => {
6777
6819
  var n2, r2, i2, a2, o2, s2;
6778
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 };
6779
6821
  })) : [];
6780
6822
  }
6781
- var tv = [{ 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 }];
6782
- function nv(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) {
6783
6825
  let r2 = [];
6784
6826
  for (let o2 of e5) for (let e6 of t2) {
6785
6827
  let t3 = Math.abs(o2.longitude - e6.longitude) % 360;
6786
6828
  t3 > 180 && (t3 = 360 - t3);
6787
- for (let s2 of tv) {
6829
+ for (let s2 of Cv) {
6788
6830
  let c2 = s2.orb * n2, l2 = Math.abs(t3 - s2.angle);
6789
6831
  if (l2 <= c2) {
6790
6832
  var i2, a2;
@@ -6796,39 +6838,39 @@ function nv(e5, t2, n2 = 1) {
6796
6838
  }
6797
6839
  return r2.sort((e6, t3) => e6.orb - t3.orb).slice(0, 40);
6798
6840
  }
6799
- var rv = null;
6800
- function iv(e5) {
6801
- rv = e5;
6841
+ var Tv = null;
6842
+ function Ev(e5) {
6843
+ Tv = e5;
6802
6844
  }
6803
- var av = null, ov = null;
6804
- function sv() {
6805
- return ov || (ov = document.getElementById("tooltip")), ov;
6845
+ var Dv = null, Ov = null;
6846
+ function kv() {
6847
+ return Ov || (Ov = document.getElementById("tooltip")), Ov;
6806
6848
  }
6807
- function cv(e5, t2, n2, r2, i2) {
6808
- let a2 = sv();
6849
+ function Av(e5, t2, n2, r2, i2) {
6850
+ let a2 = kv();
6809
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 ");
6810
6852
  let o2 = a2.getBoundingClientRect(), s2 = o2.width || 240, c2 = o2.height || 80, l2 = e5 + 14, u2 = t2 + 10;
6811
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");
6812
6854
  }
6813
- function lv() {
6814
- sv().classList.remove("visible");
6855
+ function jv() {
6856
+ kv().classList.remove("visible");
6815
6857
  }
6816
- var uv = { 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" }, dv = { conjunction: "fusion & amplification", opposition: "polarity & integration", trine: "ease & natural flow", square: "tension & growth", sextile: "opportunity & cooperation", quincunx: "adjustment & recalibration", semisquare: "friction & minor tension" }, fv = null, pv = null, mv = /* @__PURE__ */ new Map();
6817
- function hv(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) {
6818
6860
  return "".concat(e5.planet1, "|inner|").concat(e5.planet2, "|outer|").concat(e5.type);
6819
6861
  }
6820
- var gv = { 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"] } };
6821
- function _v(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) {
6822
6864
  var a2, o2;
6823
- let s2 = Sv(), c2 = gv[t2];
6865
+ let s2 = Wv(), c2 = Rv[t2];
6824
6866
  if (!c2) return;
6825
- let l2 = X_(n2), u2 = Math.floor((n2 % 360 + 360) % 360 / 30), d2 = U_[u2], f2 = W_[u2], p2 = I_[u2], m2 = K_(u2), h2 = i2 ? "".concat(i2, " \xB7 Natal") : "Inner \xB7 Natal", g2 = av ? '<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>' : "";
6826
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", () => {
6827
- Cv(), Av();
6869
+ Gv(), Qv();
6828
6870
  }), (o2 = document.getElementById("bi-ask-claude-angle-btn")) == null || o2.addEventListener("click", () => {
6829
- if (!av) return;
6871
+ if (!Dv) return;
6830
6872
  let e6 = document.getElementById("bi-ask-claude-angle-btn");
6831
- !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), av({ type: "angle_interpretation", data: { angle: c2.title, longitude: n2, sign: L_[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(() => {
6832
6874
  e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6833
6875
  e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
6834
6876
  }, 2500);
@@ -6837,32 +6879,32 @@ function _v(e5, t2, n2, r2, i2) {
6837
6879
  }));
6838
6880
  });
6839
6881
  }
6840
- var vv = { 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" };
6841
- function yv(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) {
6842
6884
  let r2 = (n2 - t2 + 360) % 360;
6843
6885
  return e5.filter((e6) => {
6844
6886
  let n3 = (e6.longitude - t2 + 360) % 360;
6845
6887
  return n3 >= 0 && n3 < r2;
6846
6888
  });
6847
6889
  }
6848
- function bv(e5, t2, n2, r2, i2, a2, o2, s2) {
6890
+ function Hv(e5, t2, n2, r2, i2, a2, o2, s2) {
6849
6891
  var c2, l2, u2, d2, f2;
6850
- let p2 = Sv(), m2 = Math.floor((t2.cusp_lon % 360 + 360) % 360 / 30), h2 = (c2 = (l2 = t2.sign) == null ? L_[m2] : l2) == null ? "" : c2, g2 = (u2 = I_[m2]) == null ? "" : u2, _2 = yv(o2, t2.cusp_lon, n2.cusp_lon), v2 = yv(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) => {
6851
- let n3 = X_(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" : "";
6852
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>");
6853
- }).join(""), S2 = av ? '<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>' : "";
6854
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", () => {
6855
- Cv(), Av();
6897
+ Gv(), Qv();
6856
6898
  }), (f2 = document.getElementById("bi-ask-claude-house-btn")) == null || f2.addEventListener("click", () => {
6857
6899
  var e6;
6858
- if (!av) return;
6900
+ if (!Dv) return;
6859
6901
  let n3 = document.getElementById("bi-ask-claude-house-btn");
6860
- !n3 || n3.disabled || (n3.disabled = true, n3.textContent = "\u23F3 Sending\u2026", n3.classList.add("sending"), av({ 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) => {
6861
6903
  var t3;
6862
- return { name: e7.name, position: X_(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 };
6863
6905
  }), outer_planets: v2.map((e7) => {
6864
6906
  var t3;
6865
- return { name: e7.name, position: X_(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 };
6866
6908
  }) } }).then(() => {
6867
6909
  n3.textContent = "\u2713 Sent", n3.classList.remove("sending"), n3.classList.add("sent"), setTimeout(() => {
6868
6910
  n3.textContent = "\u2728 Interpret this", n3.classList.remove("sent"), n3.disabled = false;
@@ -6872,23 +6914,23 @@ function bv(e5, t2, n2, r2, i2, a2, o2, s2) {
6872
6914
  }));
6873
6915
  });
6874
6916
  }
6875
- function xv(e5, t2, n2, r2, i2, a2, o2) {
6917
+ function Uv(e5, t2, n2, r2, i2, a2, o2) {
6876
6918
  var s2, c2;
6877
- let l2 = Sv(), u2 = L_[t2], d2 = I_[t2], f2 = U_[t2], p2 = W_[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) => {
6878
- let n3 = X_(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" : "";
6879
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>");
6880
- }).join(""), b2 = av ? '<button class="ask-claude-btn" id="bi-ask-claude-sign-btn">\u2728 Interpret this</button>' : "";
6881
- l2.innerHTML = '\n <div class="info-header">\n <span class="info-glyph" style="color:'.concat(K_(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", () => {
6882
- Cv(), Av();
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();
6883
6925
  }), (c2 = document.getElementById("bi-ask-claude-sign-btn")) == null || c2.addEventListener("click", () => {
6884
- if (!av) return;
6926
+ if (!Dv) return;
6885
6927
  let e6 = document.getElementById("bi-ask-claude-sign-btn");
6886
- !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), av({ 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) => {
6887
6929
  var t3;
6888
- return { name: e7.name, position: X_(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 };
6889
6931
  }), outer_planets: g2.map((e7) => {
6890
6932
  var t3;
6891
- return { name: e7.name, position: X_(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 };
6892
6934
  }) } }).then(() => {
6893
6935
  e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6894
6936
  e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
@@ -6898,7 +6940,7 @@ function xv(e5, t2, n2, r2, i2, a2, o2) {
6898
6940
  }));
6899
6941
  });
6900
6942
  }
6901
- function Sv() {
6943
+ function Wv() {
6902
6944
  if (document.body.classList.contains("is-fullscreen")) {
6903
6945
  let e6 = document.querySelector("#fs-bottom-bar [data-column='right']");
6904
6946
  if (e6) {
@@ -6906,36 +6948,36 @@ function Sv() {
6906
6948
  return t3 || (t3 = document.createElement("div"), t3.className = "info-drawer info-drawer--fs", e6.appendChild(t3)), t3;
6907
6949
  }
6908
6950
  }
6909
- if (fv && fv.isConnected) return fv;
6910
- fv = document.createElement("div"), fv.id = "bi-info-drawer", fv.className = "info-drawer";
6951
+ if (Pv && Pv.isConnected) return Pv;
6952
+ Pv = document.createElement("div"), Pv.id = "bi-info-drawer", Pv.className = "info-drawer";
6911
6953
  let e5 = document.getElementById("chart-container");
6912
- if (e5 != null && e5.parentElement) e5.parentElement.insertBefore(fv, e5.nextSibling);
6954
+ if (e5 != null && e5.parentElement) e5.parentElement.insertBefore(Pv, e5.nextSibling);
6913
6955
  else {
6914
6956
  var t2;
6915
- (t2 = document.getElementById("app")) == null || t2.appendChild(fv);
6957
+ (t2 = document.getElementById("app")) == null || t2.appendChild(Pv);
6916
6958
  }
6917
- return fv;
6959
+ return Pv;
6918
6960
  }
6919
- function Cv() {
6961
+ function Gv() {
6920
6962
  var e5;
6921
- fv == null || fv.classList.remove("open"), (e5 = document.querySelector("#fs-bottom-bar [data-column='right'] .info-drawer--fs")) == null || e5.classList.remove("open"), rv == null || rv(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);
6922
6964
  }
6923
- function wv(e5, t2, n2, r2, i2, a2, o2) {
6965
+ function Kv(e5, t2, n2, r2, i2, a2, o2) {
6924
6966
  var s2, c2, l2, u2, d2;
6925
- let f2 = Sv(), p2 = (s2 = F_[t2.name.toLowerCase()]) == null ? "\u2605" : s2, m2 = (c2 = I_[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "" : c2, h2 = H_(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;
6926
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";
6927
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) => {
6928
6970
  var t3, r3, a3, o3, s3, c3, l3;
6929
- let u3 = n2 === "inner" ? e6.planet2 : e6.planet1, d3 = (t3 = F_[u3.toLowerCase()]) == null ? u3 : t3, f3 = (r3 = (a3 = R_[(o3 = (s3 = e6.type) == null ? void 0 : s3.toLowerCase()) == null ? "" : o3]) == null ? e6.type : a3) == null ? "\u2014" : r3, p3 = z_((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";
6930
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>");
6931
- }).join("") : '<div class="no-aspects">No cross-aspects within orb</div>', b2 = (l2 = L_[Math.floor((t2.longitude % 360 + 360) % 360 / 30)]) == null ? "Unknown" : l2, x2 = av ? '<button class="ask-claude-btn" id="bi-ask-claude-planet-btn">\u2728 Interpret this</button>' : "";
6932
- 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(X_(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", () => {
6933
- Cv(), Av();
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();
6934
6976
  }), (d2 = document.getElementById("bi-ask-claude-planet-btn")) == null || d2.addEventListener("click", () => {
6935
6977
  var e6, r3;
6936
- if (!av) return;
6978
+ if (!Dv) return;
6937
6979
  let a3 = document.getElementById("bi-ask-claude-planet-btn");
6938
- !a3 || a3.disabled || (a3.disabled = true, a3.textContent = "\u23F3 Sending\u2026", a3.classList.add("sending"), av({ 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(() => {
6939
6981
  a3.textContent = "\u2713 Sent", a3.classList.remove("sending"), a3.classList.add("sent"), setTimeout(() => {
6940
6982
  a3.textContent = "\u2728 Interpret this", a3.classList.remove("sent"), a3.disabled = false;
6941
6983
  }, 2500);
@@ -6944,15 +6986,15 @@ function wv(e5, t2, n2, r2, i2, a2, o2) {
6944
6986
  }));
6945
6987
  });
6946
6988
  }
6947
- function Tv(e5, t2, n2, r2, i2) {
6989
+ function qv(e5, t2, n2, r2, i2) {
6948
6990
  var a2, o2, s2, c2, l2, u2, d2, f2, p2;
6949
- let m2 = Sv(), h2 = (a2 = F_[t2.planet1.toLowerCase()]) == null ? "\u2605" : a2, g2 = (o2 = F_[t2.planet2.toLowerCase()]) == null ? "\u2605" : o2, _2 = (s2 = R_[(c2 = (l2 = t2.type) == null ? void 0 : l2.toLowerCase()) == null ? "" : c2]) == null ? t2.type : s2, v2 = z_((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 = av ? '<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>' : "";
6950
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", () => {
6951
- Cv(), Av();
6993
+ Gv(), Qv();
6952
6994
  }), (p2 = document.getElementById("bi-ask-claude-asp-btn")) == null || p2.addEventListener("click", () => {
6953
- if (!av) return;
6995
+ if (!Dv) return;
6954
6996
  let e6 = document.getElementById("bi-ask-claude-asp-btn");
6955
- !e6 || e6.disabled || (e6.disabled = true, e6.textContent = "\u23F3 Sending\u2026", e6.classList.add("sending"), av({ 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(() => {
6956
6998
  e6.textContent = "\u2713 Sent", e6.classList.remove("sending"), e6.classList.add("sent"), setTimeout(() => {
6957
6999
  e6.textContent = "\u2728 Interpret this", e6.classList.remove("sent"), e6.disabled = false;
6958
7000
  }, 2500);
@@ -6961,82 +7003,82 @@ function Tv(e5, t2, n2, r2, i2) {
6961
7003
  }));
6962
7004
  });
6963
7005
  }
6964
- function Ev(e5, t2) {
6965
- mv.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
7006
+ function Jv(e5, t2) {
7007
+ Iv.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
6966
7008
  let o2 = a2.split("|");
6967
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"));
6968
- }), Ov(e5, t2);
7010
+ }), Xv(e5, t2);
6969
7011
  }
6970
- function Dv(e5, t2) {
6971
- mv.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
7012
+ function Yv(e5, t2) {
7013
+ Iv.forEach(({ vis: n2, color: r2, symbolEls: i2 }, a2) => {
6972
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"));
6973
7015
  });
6974
7016
  }
6975
- function Ov(e5, t2) {
7017
+ function Xv(e5, t2) {
6976
7018
  let n2 = e5.toLowerCase(), r2 = /* @__PURE__ */ new Set(), i2 = /* @__PURE__ */ new Set();
6977
- mv.forEach((e6, a3) => {
7019
+ Iv.forEach((e6, a3) => {
6978
7020
  var o2, s2;
6979
7021
  let c2 = a3.split("|"), l2 = ((o2 = c2[0]) == null ? "" : o2).toLowerCase(), u2 = ((s2 = c2[2]) == null ? "" : s2).toLowerCase();
6980
7022
  t2 === "inner" && l2 === n2 && i2.add(u2), t2 === "outer" && u2 === n2 && r2.add(l2);
6981
7023
  });
6982
7024
  let a2 = (e6, t3) => t3 === "inner" && r2.has(e6) || t3 === "outer" && i2.has(e6);
6983
- pv == null || pv.querySelectorAll(".planet-hit").forEach((e6) => {
7025
+ Fv == null || Fv.querySelectorAll(".planet-hit").forEach((e6) => {
6984
7026
  var r3;
6985
7027
  let i3 = e6.dataset.wheel, o2 = (r3 = e6.dataset.planet) == null ? "" : r3, s2 = o2 === n2 && i3 === t2, c2 = !s2 && a2(o2, i3);
6986
7028
  e6.classList.toggle("dim", !s2 && !c2);
6987
- }), pv == null || pv.querySelectorAll(".planet-glyph-group").forEach((e6) => {
7029
+ }), Fv == null || Fv.querySelectorAll(".planet-glyph-group").forEach((e6) => {
6988
7030
  var r3;
6989
7031
  let i3 = e6.dataset.wheel, o2 = (r3 = e6.dataset.planet) == null ? "" : r3;
6990
7032
  o2 === n2 && i3 === t2 ? e6.style.opacity = "1" : a2(o2, i3) ? e6.style.opacity = "0.55" : e6.style.opacity = "0.12";
6991
7033
  });
6992
7034
  }
6993
- function kv() {
6994
- mv.forEach(({ vis: e5, symbolEls: t2 }) => {
7035
+ function Zv() {
7036
+ Iv.forEach(({ vis: e5, symbolEls: t2 }) => {
6995
7037
  e5.style.strokeOpacity = "0.05", e5.style.strokeWidth = "0.5", e5.removeAttribute("filter"), t2.forEach((e6) => e6.style.opacity = "0.15");
6996
- }), pv == null || pv.querySelectorAll(".planet-glyph-group").forEach((e5) => {
7038
+ }), Fv == null || Fv.querySelectorAll(".planet-glyph-group").forEach((e5) => {
6997
7039
  e5.style.opacity = "0.3";
6998
- }), pv == null || pv.querySelectorAll(".planet-hit").forEach((e5) => {
7040
+ }), Fv == null || Fv.querySelectorAll(".planet-hit").forEach((e5) => {
6999
7041
  e5.classList.add("dim");
7000
7042
  });
7001
7043
  }
7002
- function Av() {
7003
- mv.forEach(({ vis: e5, color: t2, orb: n2, symbolEls: r2 }) => {
7004
- let i2 = B_(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);
7005
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 = "");
7006
- }), pv == null || pv.querySelectorAll(".planet-glyph-group").forEach((e5) => {
7048
+ }), Fv == null || Fv.querySelectorAll(".planet-glyph-group").forEach((e5) => {
7007
7049
  e5.style.opacity = "";
7008
- }), pv == null || pv.querySelectorAll(".planet-hit").forEach((e5) => e5.classList.remove("dim")), zv();
7050
+ }), Fv == null || Fv.querySelectorAll(".planet-hit").forEach((e5) => e5.classList.remove("dim")), sy();
7009
7051
  }
7010
- function jv(e5) {
7011
- mv.forEach(({ vis: t2, symbolEls: n2 }) => {
7052
+ function $v(e5) {
7053
+ Iv.forEach(({ vis: t2, symbolEls: n2 }) => {
7012
7054
  t2.style.display = e5 ? "" : "none", n2.forEach((t3) => t3.style.display = e5 ? "" : "none");
7013
- }), pv == null || pv.querySelectorAll(".aspect-hit").forEach((t2) => {
7055
+ }), Fv == null || Fv.querySelectorAll(".aspect-hit").forEach((t2) => {
7014
7056
  t2.style.display = e5 ? "" : "none";
7015
7057
  });
7016
7058
  }
7017
- function Mv(e5, t2, n2) {
7059
+ function ey(e5, t2, n2) {
7018
7060
  return "".concat(e5, "|inner|").concat(t2, "|outer|").concat(n2);
7019
7061
  }
7020
- function Nv(e5, t2, n2, r2, i2) {
7062
+ function ty(e5, t2, n2, r2, i2) {
7021
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);
7022
7064
  }
7023
- function Pv(e5, t2) {
7065
+ function ny(e5, t2) {
7024
7066
  return e5.filter((e6) => {
7025
7067
  var n2;
7026
7068
  return ((n2 = e6.type) == null ? "" : n2).toLowerCase() === t2;
7027
7069
  });
7028
7070
  }
7029
- function Fv(e5) {
7071
+ function ry(e5) {
7030
7072
  let t2 = [];
7031
7073
  if (!e5.length) return t2;
7032
- let n2 = Pv(e5, "trine"), r2 = Pv(e5, "square"), i2 = Pv(e5, "opposition"), a2 = Pv(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();
7033
7075
  for (let e6 = 0; e6 < n2.length; e6++) for (let r3 = e6 + 1; r3 < n2.length; r3++) {
7034
7076
  let i3 = n2[e6], a3 = n2[r3];
7035
7077
  if (i3.planet1 !== a3.planet1) continue;
7036
7078
  let s3 = i3.planet1, c3 = i3.planet2, l2 = a3.planet2;
7037
7079
  if (c3 === l2) continue;
7038
7080
  let u2 = [s3, c3, l2].sort().join("|");
7039
- 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: [Mv(s3, c3, "trine"), Mv(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")] }));
7040
7082
  }
7041
7083
  let s2 = /* @__PURE__ */ new Set();
7042
7084
  for (let e6 of i2) {
@@ -7051,7 +7093,7 @@ function Fv(e5) {
7051
7093
  if (s2.has(c3)) continue;
7052
7094
  let l2;
7053
7095
  if (l2 = o3 === "outer" ? e7 : r2.find((e8) => e8.planet1 === a3 && e8.planet2 === i3), l2) {
7054
- 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: [Mv(n3, i3, "opposition"), Nv(n3, "inner", a3, o3, "square"), Nv(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")] });
7055
7097
  break;
7056
7098
  }
7057
7099
  }
@@ -7067,26 +7109,26 @@ function Fv(e5) {
7067
7109
  for (let [r3, i3] of e6) {
7068
7110
  if (i3.length < 2) continue;
7069
7111
  let e7 = "".concat(r3, "|").concat([...i3].sort().join("|"));
7070
- 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) => Mv(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")) }));
7071
7113
  }
7072
7114
  }
7073
7115
  return t2;
7074
7116
  }
7075
- var Iv = { "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)" }, Lv = { "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)" };
7076
- function Rv(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) {
7077
7119
  var i2, a2;
7078
- if (!pv) return null;
7120
+ if (!Fv) return null;
7079
7121
  let o2 = /* @__PURE__ */ new Map();
7080
7122
  for (let e6 of t2) o2.set(e6.name.toLowerCase(), e6.longitude);
7081
7123
  let s2 = /* @__PURE__ */ new Map();
7082
7124
  for (let e6 of n2) s2.set(e6.name.toLowerCase(), e6.longitude);
7083
7125
  let c2 = [];
7084
7126
  for (let { name: t3, wheel: n3 } of e5.planets) {
7085
- let e6 = n3 === "inner" ? o2 : s2, i3 = n3 === "inner" ? A_ : N_, a3 = e6.get(t3.toLowerCase());
7127
+ let e6 = n3 === "inner" ? o2 : s2, i3 = n3 === "inner" ? Q_ : tv, a3 = e6.get(t3.toLowerCase());
7086
7128
  a3 != null && c2.push(Y(a3, i3, r2));
7087
7129
  }
7088
7130
  if (c2.length < 2) return null;
7089
- let l2 = (i2 = Iv[e5.name]) == null ? "rgba(128,128,128,0.12)" : i2, u2 = (a2 = Lv[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;
7090
7132
  if (c2.length === 2) {
7091
7133
  let e6 = X("line");
7092
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;
@@ -7095,39 +7137,39 @@ function Rv(e5, t2, n2, r2) {
7095
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;
7096
7138
  }
7097
7139
  d2.setAttribute("pointer-events", "none"), d2.setAttribute("class", "pattern-overlay");
7098
- let f2 = pv.querySelector(".aspect-hit");
7099
- return f2 ? pv.insertBefore(d2, f2) : pv.appendChild(d2), d2;
7140
+ let f2 = Fv.querySelector(".aspect-hit");
7141
+ return f2 ? Fv.insertBefore(d2, f2) : Fv.appendChild(d2), d2;
7100
7142
  }
7101
- function zv() {
7102
- pv == null || pv.querySelectorAll(".pattern-overlay").forEach((e5) => e5.remove());
7143
+ function sy() {
7144
+ Fv == null || Fv.querySelectorAll(".pattern-overlay").forEach((e5) => e5.remove());
7103
7145
  }
7104
- function Bv(e5) {
7146
+ function cy(e5) {
7105
7147
  let t2 = new Set(e5.aspectKeys);
7106
- mv.forEach(({ vis: e6, color: n3, symbolEls: r2 }, i2) => {
7148
+ Iv.forEach(({ vis: e6, color: n3, symbolEls: r2 }, i2) => {
7107
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"));
7108
7150
  });
7109
7151
  let n2 = new Set(e5.planets.map((e6) => "".concat(e6.name.toLowerCase(), "|").concat(e6.wheel)));
7110
- pv == null || pv.querySelectorAll(".planet-glyph-group").forEach((e6) => {
7152
+ Fv == null || Fv.querySelectorAll(".planet-glyph-group").forEach((e6) => {
7111
7153
  var t3, r2;
7112
7154
  let i2 = "".concat((t3 = e6.dataset.planet) == null ? "" : t3, "|").concat((r2 = e6.dataset.wheel) == null ? "" : r2);
7113
7155
  e6.style.opacity = n2.has(i2) ? "1" : "0.12";
7114
- }), pv == null || pv.querySelectorAll(".planet-hit").forEach((e6) => {
7156
+ }), Fv == null || Fv.querySelectorAll(".planet-hit").forEach((e6) => {
7115
7157
  var t3, r2;
7116
7158
  let i2 = "".concat((t3 = e6.dataset.planet) == null ? "" : t3, "|").concat((r2 = e6.dataset.wheel) == null ? "" : r2);
7117
7159
  e6.classList.toggle("dim", !n2.has(i2));
7118
7160
  });
7119
7161
  }
7120
- function Vv(e5, t2, n2, r2, i2, a2) {
7162
+ function ly(e5, t2, n2, r2, i2, a2) {
7121
7163
  var o2, s2, c2, l2, u2, d2, f2, p2, m2, h2, g2, _2;
7122
- av = i2 == null ? null : i2;
7164
+ Dv = i2 == null ? null : i2;
7123
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");
7124
- e5.innerHTML = "", x2 && e5.appendChild(x2), mv.clear(), Cv();
7125
- let S2 = ev(t2.inner), ee2 = ev(t2.outer), C2 = (l2 = t2.inner_houses) == null ? [] : l2, te2 = (u2 = t2.cross_aspects) == null ? [] : u2;
7126
- te2.length === 0 && S2.length > 0 && ee2.length > 0 && (te2 = nv(S2, ee2));
7127
- let w2 = (d2 = (f2 = (p2 = C2[0]) == null ? void 0 : p2.cusp_lon) == null ? t2.ascendant : f2) == null ? 0 : d2, T2 = G_(), E2 = X("svg");
7128
- E2.setAttribute("viewBox", "0 0 620 620"), E2.setAttribute("width", "100%"), E2.setAttribute("height", "100%"), E2.style.display = "block", e5.appendChild(E2), pv = 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;
7129
7171
  let ne2 = X("defs");
7130
- 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");
7131
7173
  let re2 = X("g");
7132
7174
  re2.setAttribute("class", "chart-layer"), re2.style.setProperty("--layer-index", "1"), E2.appendChild(re2);
7133
7175
  let D2 = X("g");
@@ -7142,110 +7184,110 @@ function Vv(e5, t2, n2, r2, i2, a2) {
7142
7184
  E2.appendChild(se2);
7143
7185
  let ce2 = X("circle");
7144
7186
  ce2.setAttribute("cx", "310"), ce2.setAttribute("cy", "310"), ce2.setAttribute("r", "304"), ce2.style.fill = "var(--bg, #faf9f5)";
7145
- let le2 = d_(T2), ue2 = (e6, t3) => {
7187
+ let le2 = p_(T2), ue2 = (e6, t3) => {
7146
7188
  e6.setAttribute("stroke", le2.ring.stroke), e6.setAttribute("stroke-opacity", String(le2.ring.opacity)), e6.setAttribute("stroke-width", t3);
7147
7189
  };
7148
7190
  ue2(ce2, "0.5"), ce2.setAttribute("pointer-events", "none"), re2.appendChild(ce2);
7149
7191
  let de2 = X("circle");
7150
- de2.setAttribute("cx", "310"), de2.setAttribute("cy", "310"), de2.setAttribute("r", String(j_)), 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);
7151
7193
  let fe2 = X("circle");
7152
- fe2.setAttribute("cx", "310"), fe2.setAttribute("cy", "310"), fe2.setAttribute("r", String(M_)), fe2.style.fill = "var(--bg, #faf9f5)", ue2(fe2, "0.8"), fe2.setAttribute("pointer-events", "none"), D2.appendChild(fe2);
7153
- for (let e6 = 0; e6 < 12; e6++) J_(D2, w2, e6, M_, j_, Hv(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);
7154
7196
  for (let e6 = 0; e6 < 12; e6++) {
7155
- let t3 = e6 * 30, { x: n3, y: r3 } = Y(t3, M_, w2), { x: i3, y: a3 } = Y(t3, j_, 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");
7156
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);
7157
7199
  let { x: s3, y: c3 } = Y(t3 + 15, 536 / 2, w2), l3 = X("text");
7158
- 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", Hv(l_(e6, T2))), l3.setAttribute("pointer-events", "none"), l3.style.fontFamily = a_, l3.textContent = I_[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);
7159
7201
  for (let e7 = 1; e7 < 30; e7++) {
7160
- let n4 = t3 + e7, r4 = e7 % 5 == 0, i4 = r4 ? j_ - 8 : j_ - 3.5, { x: a4, y: o4 } = Y(n4, j_, 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");
7161
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));
7162
7204
  let u4 = r4 ? le2.tickMajor : le2.tickMinor;
7163
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);
7164
7206
  }
7165
- let { x: u3, y: d3 } = Y(t3, j_, w2), { x: f3, y: p3 } = Y(t3 + 30, j_, w2), { x: m3, y: h3 } = Y(t3, M_, w2), { x: g3, y: _3 } = Y(t3 + 30, M_, w2), x3 = X("path");
7166
- x3.setAttribute("d", ["M ".concat(u3.toFixed(1), " ").concat(d3.toFixed(1)), "A ".concat(j_, " ").concat(j_, " 0 0 0 ").concat(f3.toFixed(1), " ").concat(p3.toFixed(1)), "L ".concat(g3.toFixed(1), " ").concat(_3.toFixed(1)), "A ".concat(M_, " ").concat(M_, " 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";
7167
- let C3 = "".concat(I_[e6], " ").concat(L_[e6]), te3 = "".concat(Z(U_[e6]), " \xB7 ").concat(Z(W_[e6]));
7168
- Uv(x3, "".concat(L_[e6], " \u2014 click for sign info")), x3.addEventListener("mouseenter", (e7) => cv(e7.clientX, e7.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mousemove", (e7) => cv(e7.clientX, e7.clientY, C3, te3, "Click for interpretation")), x3.addEventListener("mouseleave", lv), x3.addEventListener("click", (t4) => {
7169
- lv(), rv == null || rv("".concat(C3)), xv(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);
7170
7212
  }), se2.appendChild(x3);
7171
7213
  }
7172
7214
  let pe2 = X("circle");
7173
- pe2.setAttribute("cx", "310"), pe2.setAttribute("cy", "310"), pe2.setAttribute("r", String(T_)), 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);
7174
7216
  let me2 = X("circle");
7175
- me2.setAttribute("cx", "310"), me2.setAttribute("cy", "310"), me2.setAttribute("r", String(E_)), me2.style.fill = "var(--bg, #faf9f5)", ue2(me2, "0.6"), me2.setAttribute("pointer-events", "none"), D2.appendChild(me2);
7176
- for (let e6 = 0; e6 < 12; e6++) J_(D2, w2, e6, E_, T_, 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);
7177
7219
  for (let e6 = 0; e6 < 12; e6++) {
7178
- let t3 = e6 * 30, { x: n3, y: r3 } = Y(t3, E_, w2), { x: i3, y: a3 } = Y(t3, T_, 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");
7179
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);
7180
7222
  let { x: s3, y: c3 } = Y(t3 + 15, 444 / 2, w2), l3 = X("text");
7181
- 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 = I_[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);
7182
7224
  for (let e7 = 1; e7 < 30; e7++) {
7183
- let n4 = t3 + e7, r4 = e7 % 5 == 0, i4 = r4 ? T_ - 7 : T_ - 3, { x: a4, y: o4 } = Y(n4, T_, 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");
7184
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));
7185
7227
  let u3 = r4 ? le2.tickMajor : le2.tickMinor;
7186
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);
7187
7229
  }
7188
7230
  }
7189
7231
  let he2 = X("g");
7190
- he2.setAttribute("pointer-events", "none"), he2.setAttribute("opacity", T2 ? "0.18" : "0.10"), he2.setAttribute("transform", "translate(".concat(C_, ", ").concat(w_, ")"));
7232
+ he2.setAttribute("pointer-events", "none"), he2.setAttribute("opacity", T2 ? "0.18" : "0.10"), he2.setAttribute("transform", "translate(".concat(G_, ", ").concat(K_, ")"));
7191
7233
  let ge2 = X("circle");
7192
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);
7193
7235
  let _e2 = X("circle");
7194
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);
7195
7237
  let ve2 = X("text");
7196
- 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);
7197
7239
  for (let e6 of [0, 90, 180, 270]) {
7198
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");
7199
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);
7200
7242
  }
7201
7243
  re2.appendChild(he2);
7202
7244
  let ye2 = X("circle");
7203
- ye2.setAttribute("cx", "310"), ye2.setAttribute("cy", "310"), ye2.setAttribute("r", String(E_)), 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);
7204
7246
  let be2 = X("circle");
7205
- if (be2.setAttribute("cx", "310"), be2.setAttribute("cy", "310"), be2.setAttribute("r", String(k_)), 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++) {
7206
7248
  let t3 = C2[e6], n3 = C2[(e6 + 1) % C2.length], r3 = [1, 4, 7, 10].includes(t3.number), i3 = X("path");
7207
- i3.setAttribute("d", q_(t3.cusp_lon, n3.cusp_lon, k_, E_, 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);
7208
- let { x: a3, y: o3 } = Y(t3.cusp_lon, k_, w2), { x: s3, y: c3 } = Y(t3.cusp_lon, E_, 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");
7209
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));
7210
7252
  let u3 = r3 ? le2.cuspAngular : le2.cuspIntermediate;
7211
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);
7212
- let d3 = (n3.cusp_lon - t3.cusp_lon + 360) % 360, { x: f3, y: p3 } = Y(t3.cusp_lon + d3 / 2, O_, w2), m3 = X("text");
7213
- 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);
7214
7256
  let h3 = X("circle");
7215
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";
7216
- let g3 = "House ".concat(t3.number), _3 = "".concat(vv[t3.number] ? vv[t3.number] + " \xB7 " : "").concat(X_(t3.cusp_lon));
7217
- Uv(h3, "".concat(g3, " \u2014 click for interpretation")), h3.addEventListener("mouseenter", (e7) => cv(e7.clientX, e7.clientY, g3, _3, "Click for interpretation")), h3.addEventListener("mousemove", (e7) => cv(e7.clientX, e7.clientY, g3, _3, "Click for interpretation")), h3.addEventListener("mouseleave", lv), h3.addEventListener("click", (e7) => {
7218
- lv(), rv == null || rv("".concat(g3, " \xB7 ").concat(X_(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);
7219
7261
  }), se2.appendChild(h3);
7220
7262
  }
7221
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" }];
7222
7264
  for (let e6 of Ce2) {
7223
7265
  var we2;
7224
- let t3 = gv[e6.label], { x: n3, y: r3 } = Y(e6.lon, j_ - 8, w2), i3 = X("text");
7225
- 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);
7226
7268
  let a3 = X("circle");
7227
- 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", Uv(a3, "".concat((we2 = t3 == null ? void 0 : t3.title) == null ? e6.label : we2, " \u2014 click for interpretation"));
7228
- let o3 = X_(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);
7229
7271
  a3.addEventListener("mouseenter", (n4) => {
7230
7272
  var r4;
7231
- cv(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";
7232
7274
  }), a3.addEventListener("mouseleave", () => {
7233
- lv(), i3.style.opacity = "";
7275
+ jv(), i3.style.opacity = "";
7234
7276
  }), a3.addEventListener("click", (n4) => {
7235
7277
  var r4;
7236
- lv(), kv(), rv == null || rv("".concat(e6.label, " \u2014 ").concat((r4 = t3 == null ? void 0 : t3.title) == null ? "" : r4, " \xB7 ").concat(o3)), _v(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);
7237
7279
  }), se2.appendChild(a3);
7238
7280
  }
7239
7281
  for (let e6 of te2) {
7240
7282
  var Te2, Ee2, De2, Oe2, ke2, Ae2, je2, Me2, Ne2, Pe2, Fe2, Ie2;
7241
7283
  let t3 = S2.find((t4) => t4.name.toLowerCase() === e6.planet1.toLowerCase()), n3 = ee2.find((t4) => t4.name.toLowerCase() === e6.planet2.toLowerCase());
7242
7284
  if (!t3 || !n3) continue;
7243
- let i3 = z_((Te2 = (Ee2 = e6.type) == null ? void 0 : Ee2.toLowerCase()) == null ? "" : Te2), a3 = B_(e6.orb), { x: o3, y: s3 } = Y(t3.longitude, A_, w2), { x: c3, y: l3 } = Y(n3.longitude, M_, 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");
7244
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);
7245
7287
  let d3 = o3 + (c3 - o3) * 0.35, f3 = s3 + (l3 - s3) * 0.35, p3 = Math.hypot(c3 - o3, l3 - s3), m3 = [];
7246
7288
  if (p3 > 40) {
7247
7289
  var Le2, A2, Re2;
7248
- let t4 = (Le2 = R_[(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;
7249
7291
  if (t4) {
7250
7292
  let e7 = X("circle");
7251
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);
@@ -7254,123 +7296,123 @@ function Vv(e5, t2, n2, r2, i2, a2) {
7254
7296
  }
7255
7297
  }
7256
7298
  let h3 = X("line");
7257
- 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", Uv(h3, "Aspect: ".concat(e6.type || "Aspect", " between inner ").concat(e6.planet1, " and outer ").concat(e6.planet2));
7258
- let g3 = (De2 = F_[t3.name.toLowerCase()]) == null ? t3.name : De2, _3 = (Oe2 = F_[n3.name.toLowerCase()]) == null ? n3.name : Oe2, x3 = (ke2 = (Ae2 = R_[(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 = dv[(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);
7259
7301
  h3.addEventListener("mouseenter", (t4) => {
7260
7302
  var n4;
7261
- return cv(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");
7262
7304
  }), h3.addEventListener("mousemove", (t4) => {
7263
7305
  var n4;
7264
- return cv(t4.clientX, t4.clientY, Z((n4 = e6.type) == null ? "Cross-Aspect" : n4), T3, "Click for interpretation");
7265
- }), h3.addEventListener("mouseleave", lv), 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) => {
7266
7308
  var n4, a4, o4, s4, c4, l4;
7267
- lv(), Dv(hv(e6), i3), Tv(t4, e6, v2, y2, b2);
7268
- let u4 = (n4 = F_[e6.planet1.toLowerCase()]) == null ? e6.planet1 : n4, d4 = (a4 = F_[e6.planet2.toLowerCase()]) == null ? e6.planet2 : a4, f4 = (o4 = (s4 = R_[(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;
7269
- rv == null || rv("".concat(p4, " ").concat(f4, " ").concat(m4, " \xB7 ").concat(e6.orb.toFixed(1), "\xB0")), r2(e6);
7270
- }), mv.set(hv(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);
7271
7313
  }
7272
- 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");
7273
7315
  Be2.setAttribute("class", "outer-planet-group"), oe2.appendChild(Be2);
7274
7316
  for (let e6 of ee2) {
7275
7317
  var Ve2, He2, Ue2;
7276
- let t3 = (Ve2 = F_[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, N_, 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");
7277
7319
  s3.setAttribute("class", "planet-glyph-group"), s3.dataset.planet = r3, s3.dataset.wheel = "outer", s3.style.transition = "opacity 200ms ease", Be2.appendChild(s3);
7278
7320
  let { x: c3, y: l3 } = Y(e6.longitude, 251, w2), u3 = X("circle");
7279
- 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) {
7280
7322
  let e7 = X("line");
7281
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);
7282
7324
  }
7283
7325
  let d3 = X("text");
7284
- 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);
7285
- let f3 = Math.floor((e6.longitude % 360 + 360) % 360 % 30), { x: p3, y: m3 } = Y(i3, N_ - 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");
7286
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) {
7287
7329
  let { x: e7, y: t4 } = Y(i3, 277, w2), n3 = X("text");
7288
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);
7289
7331
  }
7290
- let g3 = H_(e6.name, e6.longitude);
7332
+ let g3 = uv(e6.name, e6.longitude);
7291
7333
  if (g3) {
7292
7334
  let { x: e7, y: t4 } = Y(i3, 276, w2), n3 = X("circle");
7293
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);
7294
7336
  }
7295
7337
  let _3 = X("circle");
7296
- _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(P_)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "outer", _3.style.pointerEvents = "all", Uv(_3, "Outer Planet: ".concat(e6.name));
7297
- let x3 = "".concat(v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "").concat(t3, " ").concat(Z(e6.name)), S3 = g3 ? " \xB7 ".concat(g3.label) : "", ee3 = (Ue2 = uv[e6.name.toLowerCase()]) == null ? "" : Ue2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(X_(e6.longitude)).concat(e6.house ? " \xB7 H".concat(e6.house) : "").concat(e6.retrograde ? " \u211E" : "").concat(S3);
7298
- _3.addEventListener("mouseenter", (e7) => cv(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e7) => cv(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", lv), _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) => {
7299
7341
  var r4, i4;
7300
- lv(), Ev(e6.name, "outer"), wv(t4, e6, "outer", te2, v2, y2, b2);
7301
- let a4 = (r4 = F_[e6.name.toLowerCase()]) == null ? "\u2605" : r4, o4 = Math.floor((e6.longitude % 360 + 360) % 360 / 30), s4 = v2 === "transit" ? "Tr. " : b2 ? "".concat(b2, "'s ") : "";
7302
- rv == null || rv("".concat(s4).concat(a4, " ").concat(Z(e6.name), " \xB7 ").concat((i4 = L_[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);
7303
7345
  }), s3.appendChild(_3);
7304
7346
  }
7305
- 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");
7306
7348
  Ge2.setAttribute("class", "inner-planet-group"), oe2.appendChild(Ge2);
7307
7349
  for (let e6 of S2) {
7308
7350
  var Ke2, qe2, Je2;
7309
- let t3 = (Ke2 = F_[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, D_, 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");
7310
7352
  s3.setAttribute("class", "planet-glyph-group"), s3.dataset.planet = r3, s3.dataset.wheel = "inner", s3.style.transition = "opacity 200ms ease", Ge2.appendChild(s3);
7311
- let { x: c3, y: l3 } = Y(e6.longitude, E_ - 5, w2), u3 = X("circle");
7312
- 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) {
7313
7355
  let e7 = X("line");
7314
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);
7315
7357
  }
7316
7358
  let d3 = X("text");
7317
- 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);
7318
- let f3 = Math.floor((e6.longitude % 360 + 360) % 360 % 30), { x: p3, y: m3 } = Y(i3, D_ - 17, w2), h3 = X("text");
7319
- 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) {
7320
7362
  let { x: e7, y: t4 } = Y(i3, 204, w2), n3 = X("text");
7321
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);
7322
7364
  }
7323
- let g3 = H_(e6.name, e6.longitude);
7365
+ let g3 = uv(e6.name, e6.longitude);
7324
7366
  if (g3) {
7325
7367
  let { x: e7, y: t4 } = Y(i3, 202, w2), n3 = X("circle");
7326
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);
7327
7369
  }
7328
7370
  let _3 = X("circle");
7329
- _3.setAttribute("cx", a3.toFixed(1)), _3.setAttribute("cy", o3.toFixed(1)), _3.setAttribute("r", String(P_)), _3.setAttribute("fill", "transparent"), _3.setAttribute("class", "hit-region planet-hit"), _3.dataset.planet = r3, _3.dataset.wheel = "inner", _3.style.pointerEvents = "all", Uv(_3, "Inner Planet: ".concat(e6.name));
7330
- 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 = uv[e6.name.toLowerCase()]) == null ? "" : Je2, C3 = "".concat(ee3 ? ee3 + " \xB7 " : "").concat(X_(e6.longitude)).concat(e6.house ? " \xB7 H".concat(e6.house) : "").concat(e6.retrograde ? " \u211E" : "").concat(S3);
7331
- _3.addEventListener("mouseenter", (e7) => cv(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mousemove", (e7) => cv(e7.clientX, e7.clientY, x3, C3, "Click to explore")), _3.addEventListener("mouseleave", lv), _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) => {
7332
7374
  var r4, i4, a4;
7333
- lv(), Ev(e6.name, "inner"), wv(t4, e6, "inner", te2, v2, y2, b2);
7334
- let o4 = (r4 = F_[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 = L_[s4]) == null ? "" : i4) : "".concat(o4, " ").concat(Z(e6.name), " \xB7 ").concat((a4 = L_[s4]) == null ? "" : a4, " (natal)");
7335
- rv == null || rv(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);
7336
7378
  }), s3.appendChild(_3);
7337
7379
  }
7338
7380
  let Ye2 = "__biWheelClickOutside__", Xe2 = document[Ye2];
7339
7381
  Xe2 && document.removeEventListener("click", Xe2, false);
7340
7382
  let Ze2 = (e6) => {
7341
7383
  let t3 = e6.target;
7342
- !t3.closest(".hit-region") && !t3.closest("#bi-info-drawer") && (Av(), Cv());
7384
+ !t3.closest(".hit-region") && !t3.closest("#bi-info-drawer") && (Qv(), Gv());
7343
7385
  };
7344
7386
  document[Ye2] = Ze2, document.addEventListener("click", Ze2, false);
7345
7387
  let Qe2 = (e6) => {
7346
- e6.key === "Escape" && (Av(), Cv());
7388
+ e6.key === "Escape" && (Qv(), Gv());
7347
7389
  };
7348
7390
  document.removeEventListener("keydown", window.__biWheelEscHandler, false), window.__biWheelEscHandler = Qe2, document.addEventListener("keydown", Qe2, false);
7349
7391
  }
7350
- function Hv(e5) {
7392
+ function uy(e5) {
7351
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;
7352
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), ")");
7353
7395
  }
7354
- function Uv(e5, t2) {
7396
+ function dy(e5, t2) {
7355
7397
  e5 && (e5.setAttribute("tabindex", "0"), e5.setAttribute("role", "button"), e5.setAttribute("aria-label", t2), e5.addEventListener("keydown", (t3) => {
7356
7398
  let n2 = t3;
7357
7399
  (n2.key === "Enter" || n2.key === " ") && (n2.preventDefault(), e5.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true })));
7358
7400
  }));
7359
7401
  }
7360
- function Wv(e5) {
7402
+ function fy(e5) {
7361
7403
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
7362
7404
  }
7363
- function Gv(e5) {
7405
+ function py(e5) {
7364
7406
  return e5.replace(/_/g, " ").replace(/\b\w/g, (e6) => e6.toUpperCase());
7365
7407
  }
7366
- function Kv(e5) {
7367
- let t2 = e5.filter((e6) => e6.items.length > 0).map((e6) => '<div class="legend-group"><span class="legend-group-title">'.concat(Wv(e6.title), "</span>") + e6.items.map((e7) => '<span class="legend-item"><span class="legend-glyph">'.concat(Wv(e7.glyph), "</span>").concat(Wv(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("");
7368
7410
  return t2 ? '<details class="glyph-legend"><summary><span class="legend-spark">\u2726</span> Legend</summary><div class="legend-body">'.concat(t2, "</div></details>") : "";
7369
7411
  }
7370
- var qv = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.\d+)?$/;
7371
- function Jv(e5, t2) {
7412
+ var hy = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.\d+)?$/;
7413
+ function gy(e5, t2) {
7372
7414
  if (!e5) return null;
7373
- let n2 = qv.exec(e5.trim());
7415
+ let n2 = hy.exec(e5.trim());
7374
7416
  if (n2) {
7375
7417
  let [, e6, t3, r3, i2, a2, o2] = n2, s2 = new Date(Date.UTC(+e6, t3 - 1, +r3, +i2, +a2, o2 ? +o2 : 0));
7376
7418
  return isNaN(s2.getTime()) ? null : { date: s2, timeZone: "UTC" };
@@ -7378,17 +7420,17 @@ function Jv(e5, t2) {
7378
7420
  let r2 = new Date(e5);
7379
7421
  return isNaN(r2.getTime()) ? null : { date: r2, timeZone: t2 || "UTC" };
7380
7422
  }
7381
- function Yv(e5) {
7423
+ function _y(e5) {
7382
7424
  var t2;
7383
7425
  if (!e5) return "";
7384
7426
  let n2 = [], r2 = (t2 = e5.location) == null ? void 0 : t2.trim();
7385
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) {
7386
- let t3 = /^\d{4}-\d{2}-\d{2}/.test(e5.datetime.trim()) ? Jv(e5.datetime, e5.timezone) : null;
7428
+ let t3 = /^\d{4}-\d{2}-\d{2}/.test(e5.datetime.trim()) ? gy(e5.datetime, e5.timezone) : null;
7387
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);
7388
7430
  }
7389
7431
  return n2.join(" \xB7 ");
7390
7432
  }
7391
- var Xv = class e4 {
7433
+ var vy = class e4 {
7392
7434
  constructor(t2) {
7393
7435
  var n2, r2, i2, a2, s2, c2;
7394
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();
@@ -7568,14 +7610,14 @@ var Xv = class e4 {
7568
7610
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
7569
7611
  }
7570
7612
  };
7571
- o(Xv, "comboSeq", 0);
7572
- var Zv = { "chart-wheel": { stripIcon: "\u2726", stripTitle: "About the Natal Chart", stripHints: ["Click any <strong>planet</strong> for a deep placement reading", "Click any <strong>aspect line</strong> for its dynamic interpretation", "Click any <strong>house cusp</strong> for house themes", "Use the <strong>date controls</strong> to move through time"], modalText: "This wheel is an exact celestial snapshot of the sky at a given moment and place \u2014 every planet, house, and aspect line is clickable." }, "bi-wheel": { stripIcon: "\u2295", stripTitle: "About the Bi-Wheel", stripHints: ["Click any <strong>inner planet</strong> for natal placement depth", "Click any <strong>outer planet</strong> for transit or synastry meaning", "Click a <strong>cross-aspect line</strong> for inter-chart dynamics", "Use the <strong>date controls</strong> to advance transits"], modalText: "Two charts are layered here \u2014 the inner wheel is the natal chart; the outer ring shows the second chart (transits or another person's planets)." }, bodygraph: { stripIcon: "\u25C8", stripTitle: "About the Bodygraph", stripHints: ["Click any <strong>center</strong> (defined or undefined) for its meaning", "Click any <strong>channel</strong> to explore its life theme", "Click any <strong>gate number</strong> for its I Ching hexagram reading", "Click a <strong>planet row</strong> in the sidebar for its HD role"], modalText: "The bodygraph is a living map of the energy centres, channels, and gates that define a Human Design chart." }, "vedic-chart": { stripIcon: "\u{1F549}", stripTitle: "About the Jyotish Chart", stripHints: ["Click any <strong>rashi cell</strong> for its themes and any planets placed there", "The <strong>diagonal mark</strong> shows the Lagna (Ascendant) rashi", "Use the <strong>action bar</strong> for a full chart interpretation", "Click <strong>Moon &amp; Nakshatra</strong> for lunar mansion detail"], modalText: "This is a Vedic birth chart rendered as a South Indian Rashi grid \u2014 sidereal planetary placements by fixed sign." }, "transit-timeline": { stripIcon: "\u2604", stripTitle: "About the Transit Timeline", stripHints: ["Each entry is an <strong>exact transit hit</strong> \u2014 a transiting planet contacting a natal point", "Events are <strong>grouped by month</strong> in chronological order", "The <strong>\u211E marker</strong> flags a retrograde crossing", "Click any transit for a focused <strong>interpretation</strong>"], modalText: "This timeline lists upcoming transits to the natal chart \u2014 the exact dates outer-planet energies activate each placement." }, "moon-phase": { stripIcon: "\u263E", stripTitle: "About the Moon Phase Dial", stripHints: ["Click the <strong>Moon</strong> for its phase interpretation", "Click the <strong>Void-of-Course</strong> card when the Moon is VOC", "Use the <strong>date control</strong> to move the sky to any moment"], modalText: "The dial shows the Moon's live illumination, phase, sign, and void-of-course status for the selected moment." }, bazi: { stripIcon: "\u56DB", stripTitle: "About the BaZi Chart", stripHints: ["Click any <strong>pillar</strong> (Year, Month, Day, Hour) for its interpretation", "The <strong>Day Master</strong> is the core identity element", "The <strong>Wu Xing bar</strong> shows the Five Element balance"], modalText: "This BaZi (Four Pillars of Destiny) chart maps the Heavenly Stems and Earthly Branches present at a given moment of birth." } }, Qv = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: oklch(0% 0 0 / 0.55);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: oe-fade-in 0.4s ease both;\n font-family: system-ui, sans-serif;\n }\n\n .oe-welcome-modal {\n /* Themed, not hardcoded: the title/text/hints below all resolve through\n var(--text\u2026), so a fixed dark surface here meant that once the light\n palette became reachable the modal rendered near-black text on a\n near-black card \u2014 1.09:1, effectively invisible. The fallback is the\n previous literal, and every app\'s dark --surface is oklch(11-12%), so\n dark rendering is unchanged. */\n background: var(--surface, oklch(11% 0.010 265));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px oklch(0% 0 0 / 0.55), inset 0 1px 0 oklch(100% 0 0 / 0.06);\n animation: oe-modal-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n @keyframes oe-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes oe-modal-in {\n from { opacity: 0; transform: scale(0.95) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .oe-welcome-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n }\n\n .oe-welcome-icon {\n font-size: 28px;\n color: var(--gold, oklch(72% 0.12 80));\n line-height: 1;\n text-shadow: 0 0 10px var(--gold-glow, oklch(72% 0.12 80 / 0.30));\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--text, oklch(92% 0.006 265));\n margin: 0;\n letter-spacing: 0.02em;\n }\n\n .oe-welcome-text {\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--text-secondary, oklch(68% 0.008 265));\n margin: 0;\n }\n\n .oe-welcome-hints {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin: 8px 0 12px 0;\n padding: 0;\n list-style: none;\n }\n\n .oe-welcome-hints li {\n font-size: 13.5px;\n line-height: 1.4;\n color: var(--text-secondary, oklch(68% 0.008 265));\n display: flex;\n align-items: flex-start;\n gap: 10px;\n opacity: 0;\n animation: oe-fade-in 0.4s ease forwards;\n }\n\n /* Stagger the hints */\n .oe-welcome-hints li:nth-child(1) { animation-delay: 0.15s; }\n .oe-welcome-hints li:nth-child(2) { animation-delay: 0.25s; }\n .oe-welcome-hints li:nth-child(3) { animation-delay: 0.35s; }\n .oe-welcome-hints li:nth-child(4) { animation-delay: 0.45s; }\n\n .oe-welcome-hints li::before {\n content: "\u2726";\n color: var(--gold-dim, oklch(52% 0.06 80));\n font-size: 12px;\n padding-top: 2px;\n }\n\n .oe-welcome-hints strong {\n color: var(--text, oklch(92% 0.006 265));\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: var(--gold-subtle, oklch(72% 0.12 80 / 0.10));\n color: var(--gold, oklch(72% 0.12 80));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease, border-color 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: oklch(72% 0.12 80 / 0.18);\n border-color: oklch(72% 0.12 80 / 0.40);\n }\n\n .oe-welcome-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n\n .oe-welcome-backdrop.is-dismissing {\n animation: oe-fade-out 0.3s ease forwards;\n }\n\n .oe-welcome-backdrop.is-dismissing .oe-welcome-modal {\n animation: oe-modal-out 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes oe-fade-out {\n to { opacity: 0; }\n }\n\n @keyframes oe-modal-out {\n to { opacity: 0; transform: scale(0.95) translateY(10px); }\n }\n';
7573
- function $v() {
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() {
7574
7616
  if (document.getElementById("oe-first-run-styles")) return;
7575
7617
  let e5 = document.createElement("style");
7576
- e5.id = "oe-first-run-styles", e5.textContent = Qv, document.head.appendChild(e5);
7618
+ e5.id = "oe-first-run-styles", e5.textContent = by, document.head.appendChild(e5);
7577
7619
  }
7578
- function ey(e5) {
7620
+ function Sy(e5) {
7579
7621
  let t2 = document.activeElement, n2 = document.createElement("div");
7580
7622
  n2.className = "oe-welcome-backdrop";
7581
7623
  let r2 = document.createElement("div");
@@ -7593,34 +7635,34 @@ function ey(e5) {
7593
7635
  e6.key === "Escape" && (e6.preventDefault(), o2()), e6.key === "Tab" && (e6.preventDefault(), a2.focus());
7594
7636
  }), requestAnimationFrame(() => a2.focus()), n2;
7595
7637
  }
7596
- function ty(e5) {
7597
- $v();
7598
- let t2 = ey(Zv[e5]);
7638
+ function Cy(e5) {
7639
+ xy();
7640
+ let t2 = Sy(yy[e5]);
7599
7641
  document.body.appendChild(t2);
7600
7642
  }
7601
- var ny = "\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";
7602
- function ry() {
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() {
7603
7645
  if (document.getElementById("oe-info-button-styles")) return;
7604
7646
  let e5 = document.createElement("style");
7605
- e5.id = "oe-info-button-styles", e5.textContent = ny, document.head.appendChild(e5);
7647
+ e5.id = "oe-info-button-styles", e5.textContent = wy, document.head.appendChild(e5);
7606
7648
  }
7607
- function iy(e5) {
7649
+ function Ey(e5) {
7608
7650
  if (document.getElementById("oe-info-button")) return;
7609
- ry();
7651
+ Ty();
7610
7652
  let t2 = document.createElement("button");
7611
- 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", () => ty(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);
7612
7654
  }
7613
- function ay(e5) {
7655
+ function Dy(e5) {
7614
7656
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
7615
7657
  }
7616
- function oy(e5) {
7617
- let { container: t2, message: n2, onRetry: r2, retryLabel: i2 = "\u21BA Try again" } = e5, a2 = r2 ? '<button class="error-retry-btn" type="button">'.concat(ay(i2), "</button>") : "";
7618
- if (t2.innerHTML = '<div class="error-state" role="alert"><div class="error-icon" aria-hidden="true">\u26A0\uFE0F</div><p class="error-msg">'.concat(ay(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) {
7619
7661
  var o2;
7620
7662
  (o2 = t2.querySelector(".error-retry-btn")) == null || o2.addEventListener("click", r2);
7621
7663
  }
7622
7664
  }
7623
- function sy(e5) {
7665
+ function ky(e5) {
7624
7666
  var t2;
7625
7667
  if (!e5) return null;
7626
7668
  if (e5.structuredContent != null && typeof e5.structuredContent == "object") return e5.structuredContent;
@@ -7633,12 +7675,25 @@ function sy(e5) {
7633
7675
  }
7634
7676
  return null;
7635
7677
  }
7636
- function cy(e5, t2, n2 = []) {
7637
- 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;
7638
7691
  if (!t2 || t2.querySelector("#btn-fullscreen")) return;
7639
7692
  let a2 = document.createElement("button");
7640
- 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>';
7641
- 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"];
7642
7697
  function c2() {
7643
7698
  if (document.getElementById("fs-bottom-bar") || !n2.length) return;
7644
7699
  let e6 = document.getElementById("app");
@@ -7671,59 +7726,59 @@ function cy(e5, t2, n2 = []) {
7671
7726
  }
7672
7727
  e6.remove();
7673
7728
  }
7674
- function u2(e6) {
7675
- let t3 = e6 === "fullscreen", n3 = document.body.classList.contains("is-fullscreen");
7676
- 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();
7677
7741
  }
7678
- a2.addEventListener("click", async () => {
7679
- try {
7680
- var t3, n3, r3, i3;
7681
- 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";
7682
- if (s3.length > 0 && !s3.includes(c3)) {
7683
- console.warn('[AppChrome] Display mode "'.concat(c3, '" not available. Available: ').concat(s3.join(", ")));
7684
- return;
7685
- }
7686
- let l3 = await e5.requestDisplayMode({ mode: c3 });
7687
- u2((i3 = l3 == null ? void 0 : l3.mode) == null ? "inline" : i3);
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);
7748
+ }
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);
7688
7754
  } catch (e6) {
7689
7755
  console.warn("[AppChrome] requestDisplayMode failed:", e6);
7690
7756
  }
7691
- }), document.addEventListener("keydown", async (t3) => {
7692
- if (t3.key === "Escape" && document.body.classList.contains("is-fullscreen")) {
7693
- t3.preventDefault();
7694
- try {
7695
- var n3;
7696
- let t4 = await e5.requestDisplayMode({ mode: "inline" });
7697
- u2((n3 = t4 == null ? void 0 : t4.mode) == null ? "inline" : n3);
7698
- } catch (e6) {
7699
- console.warn("[AppChrome] Escape fullscreen failed:", e6);
7700
- }
7701
- }
7702
- }), (r2 = e5.addEventListener) == null || r2.call(e5, "hostcontextchanged", (e6) => {
7703
- var t3;
7704
- u2((t3 = e6 == null ? void 0 : e6.displayMode) == null ? "inline" : t3);
7705
- });
7706
- let d2 = (i2 = e5.getHostContext) == null ? void 0 : i2.call(e5);
7707
- d2 != null && d2.displayMode && u2(d2.displayMode), t2.insertBefore(a2, t2.firstChild), t2.removeAttribute("hidden");
7708
- function f2() {
7709
- let e6 = document.getElementById("fs-hint-banner");
7710
- e6 && e6.remove();
7711
- let t3 = document.createElement("div");
7712
- 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(() => {
7713
- t3.style.opacity = "1";
7714
- }), setTimeout(() => {
7715
- t3.style.opacity = "0", setTimeout(() => t3.remove(), 350);
7716
- }, 4e3);
7717
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);
7718
7773
  }
7719
- function ly(e5, t2) {
7774
+ function zy(e5, t2) {
7720
7775
  e5.ontoolcancelled = (e6) => {
7721
7776
  var n2, r2, i2;
7722
7777
  let a2 = (n2 = e6.reason) == null ? "Tool call was cancelled" : n2;
7723
- 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), uy(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);
7724
7779
  };
7725
7780
  }
7726
- function uy(e5) {
7781
+ function By(e5) {
7727
7782
  var t2;
7728
7783
  (t2 = document.getElementById("cancel-toast")) == null || t2.remove();
7729
7784
  let n2 = document.createElement("div");
@@ -7731,162 +7786,176 @@ function uy(e5) {
7731
7786
  n2.classList.remove("visible"), setTimeout(() => n2.remove(), 300);
7732
7787
  }, 3e3);
7733
7788
  }
7734
- function dy(e5) {
7789
+ function Vy(e5) {
7735
7790
  var t2;
7736
- function n2(e6) {
7737
- if (!e6) return;
7738
- let t3 = e6.containerDimensions;
7739
- if (!t3) return;
7740
- let n3 = document.documentElement;
7741
- 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"));
7742
- }
7743
- n2((t2 = e5.getHostContext) == null ? void 0 : t2.call(e5)), e5.addEventListener("hostcontextchanged", (e6) => {
7744
- n2(e6);
7745
- });
7746
- }
7747
- var fy = document.getElementById("chart-container"), py = document.getElementById("loading-state"), my = document.getElementById("mode-badge"), hy = document.getElementById("chart-status"), gy = document.getElementById("aspect-filter"), _y = document.getElementById("chart-provenance"), vy = document.getElementById("bi-patterns-strip"), yy = document.getElementById("param-controls-container"), by = new r_({ name: "Bi-Wheel Chart Explorer", version: "1.0.0" }), $ = null, xy = null, Sy = false, Cy = false, wy = "placidus";
7748
- h_(() => {
7749
- $ && $y($);
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($);
7750
7819
  });
7751
- var Ty = "true";
7752
- function Ey(e5) {
7753
- if (hy) {
7820
+ var tb = "true";
7821
+ function nb(e5) {
7822
+ if (Gy) {
7754
7823
  if (!e5) {
7755
- hy.classList.remove("visible");
7824
+ Gy.classList.remove("visible");
7756
7825
  return;
7757
7826
  }
7758
- hy.textContent = "\xB7 ".concat(e5), hy.classList.add("visible");
7827
+ Gy.textContent = "\xB7 ".concat(e5), Gy.classList.add("visible");
7759
7828
  }
7760
7829
  }
7761
- iv(Ey);
7762
- function Dy() {
7763
- py.hidden = false, fy.hidden = true, my.hidden = true, _y && (_y.hidden = true), vy && (vy.hidden = true, vy.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 = "");
7764
7833
  }
7765
- function Oy() {
7766
- py.hidden = true, fy.hidden = false, fy.classList.remove("refreshing"), my.hidden = false, _y && (_y.hidden = false);
7834
+ function ib() {
7835
+ Uy.hidden = true, Hy.hidden = false, Hy.classList.remove("refreshing"), Wy.hidden = false, qy && (qy.hidden = false);
7767
7836
  }
7768
- function ky() {
7769
- if (!$ || fy.hidden) {
7770
- Dy();
7837
+ function ab() {
7838
+ if (!$ || Hy.hidden) {
7839
+ rb();
7771
7840
  return;
7772
7841
  }
7773
- fy.classList.add("refreshing");
7842
+ Hy.classList.add("refreshing");
7774
7843
  }
7775
- function Ay() {
7776
- fy.classList.remove("refreshing"), fy.classList.remove("chart-rendered"), fy.offsetWidth, fy.classList.add("chart-rendered");
7844
+ function ob() {
7845
+ Hy.classList.remove("refreshing"), Hy.classList.remove("chart-rendered"), Hy.offsetWidth, Hy.classList.add("chart-rendered");
7777
7846
  }
7778
- function jy(e5, t2) {
7779
- py.hidden = true, _y && (_y.hidden = true), oy({ container: fy, message: e5, onRetry: t2 });
7847
+ function sb(e5, t2) {
7848
+ Uy.hidden = true, qy && (qy.hidden = true), Oy({ container: Hy, message: e5, onRetry: t2 });
7780
7849
  }
7781
- function My(e5) {
7850
+ function cb(e5) {
7782
7851
  return e5.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
7783
7852
  }
7784
- async function Ny(e5) {
7853
+ async function lb(e5) {
7785
7854
  try {
7786
- (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");
7787
7856
  } catch (e6) {
7788
7857
  console.error("[BiWheel] sendMessage failed:", e6);
7789
7858
  }
7790
7859
  }
7791
- function Py(e5) {
7792
- let t2 = sy(e5);
7860
+ function ub(e5) {
7861
+ let t2 = ky(e5);
7793
7862
  return t2 && "inner" in t2 && "outer" in t2 ? t2 : null;
7794
7863
  }
7795
- var Fy = [{ label: "Tight", mult: 0.55 }, { label: "Standard", mult: 1 }, { label: "Wide", mult: 1.6 }], Iy = true, Ly = 1;
7796
- function Ry() {
7864
+ var db = [{ label: "Tight", mult: 0.55 }, { label: "Standard", mult: 1 }, { label: "Wide", mult: 1.6 }], fb = true, pb = 1;
7865
+ function mb() {
7797
7866
  var e5, t2, n2;
7798
- if (!gy) return;
7867
+ if (!Ky) return;
7799
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 = (() => {
7800
7869
  var e6, t3;
7801
7870
  let n3 = /* @__PURE__ */ new Set();
7802
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());
7803
- return n3.has("north_node") && n3.has("true_node");
7872
+ return P_(n3);
7804
7873
  })();
7805
- Q_(Ty);
7806
- 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(Ty === "mean" ? " active" : "", '" data-node="mean" title="Mean lunar node (averaged orbit)">Mean</button>\n <button class="orb-preset-btn node-btn').concat(Ty === "true" ? " active" : "", '" data-node="true" title="True (osculating) lunar node">True</button>\n </div>') : "";
7807
- Iy = true, gy.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(Fy.map((e6) => '<button class="orb-preset-btn'.concat(e6.mult === Ly ? " 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 ");
7808
- let s2 = [...ev($ == null ? void 0 : $.inner), ...ev($ == 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 = [];
7809
7878
  for (let e6 of s2) {
7810
7879
  let t3 = e6.name.toLowerCase();
7811
7880
  if (c2.has(t3)) continue;
7812
7881
  c2.add(t3);
7813
- let n3 = F_[t3];
7814
- n3 && l2.push({ glyph: n3, label: Gv(e6.name) });
7882
+ let n3 = rv[t3];
7883
+ n3 && l2.push({ glyph: n3, label: py(e6.name) });
7815
7884
  }
7816
7885
  let u2 = [...new Set(((n2 = $ == null ? void 0 : $.cross_aspects) == null ? [] : n2).map((e6) => {
7817
7886
  var t3;
7818
7887
  return ((t3 = e6.type) == null ? "" : t3).toLowerCase();
7819
7888
  }).filter(Boolean))].map((e6) => {
7820
7889
  var t3;
7821
- return { glyph: (t3 = R_[e6]) == null ? "" : t3, label: Gv(e6) };
7890
+ return { glyph: (t3 = ov[e6]) == null ? "" : t3, label: py(e6) };
7822
7891
  }).filter((e6) => e6.glyph);
7823
- gy.insertAdjacentHTML("beforeend", Kv([{ title: "Bodies", items: l2 }, { title: "Aspects", items: u2 }])), gy.removeAttribute("hidden");
7892
+ Ky.insertAdjacentHTML("beforeend", my([{ title: "Bodies", items: l2 }, { title: "Aspects", items: u2 }])), Ky.removeAttribute("hidden");
7824
7893
  let d2 = document.getElementById("aspect-vis-toggle");
7825
7894
  d2 == null || d2.addEventListener("click", () => {
7826
- Iy = !Iy, jv(Iy), d2.classList.toggle("active", Iy), d2.querySelector(".toggle-icon").textContent = Iy ? "\u2295" : "\u2296";
7827
- }), gy.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) => {
7828
7897
  e6.addEventListener("click", () => {
7829
7898
  var t3;
7830
7899
  let n3 = parseFloat((t3 = e6.dataset.mult) == null ? "1" : t3);
7831
- n3 !== Ly && (Ly = n3, gy.querySelectorAll(".orb-preset-btn[data-mult]").forEach((e7) => e7.classList.toggle("active", e7.dataset.mult === String(n3))), $ && zy($, 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));
7832
7901
  });
7833
- }), gy.querySelectorAll(".house-btn").forEach((e6) => {
7902
+ }), Ky.querySelectorAll(".house-btn").forEach((e6) => {
7834
7903
  e6.addEventListener("click", () => {
7835
7904
  var t3;
7836
7905
  let n3 = (t3 = e6.dataset.hs) == null ? "placidus" : t3;
7837
- n3 === wy || !$ || (wy = n3, gy.querySelectorAll(".house-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.hs === n3)), rb(n3));
7906
+ n3 === eb || !$ || (eb = n3, Ky.querySelectorAll(".house-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.hs === n3)), Nb(n3));
7838
7907
  });
7839
- }), gy.querySelectorAll(".node-btn").forEach((e6) => {
7908
+ }), Ky.querySelectorAll(".node-btn").forEach((e6) => {
7840
7909
  e6.addEventListener("click", () => {
7841
7910
  let t3 = e6.dataset.node === "mean" ? "mean" : "true";
7842
- t3 === Ty || !$ || (Ty = t3, Q_(t3), gy.querySelectorAll(".node-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.node === t3)), zy($, Ly));
7911
+ t3 === tb || !$ || (tb = t3, bv(t3), Ky.querySelectorAll(".node-btn").forEach((e7) => e7.classList.toggle("active", e7.dataset.node === t3)), hb($, pb));
7843
7912
  });
7844
7913
  });
7845
7914
  }
7846
- function zy(e5, t2) {
7915
+ function hb(e5, t2) {
7847
7916
  var n2, r2, i2, a2;
7848
- let o2 = ev(e5.inner), s2 = ev(e5.outer), c2 = nv(o2, s2, t2), l2 = { ...e5, cross_aspects: c2 };
7849
- Vv(fy, l2, ib, ab, Jy, Qy()), Iy || jv(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);
7850
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;
7851
- nb(Fv(c2), o2, s2, u2);
7920
+ Mb(ry(c2), o2, s2, u2);
7852
7921
  }
7853
- var By = null;
7854
- function Vy(e5) {
7855
- By = e5, e5 ? fy.setAttribute("data-focus", e5) : fy.removeAttribute("data-focus"), my.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) => {
7856
7925
  let n2 = t2.dataset.focus;
7857
7926
  t2.classList.toggle("focused", n2 === e5);
7858
- }), $ && qy($, e5);
7927
+ }), $ && Cb($, e5);
7859
7928
  }
7860
- function Hy(e5) {
7929
+ function vb(e5) {
7861
7930
  var t2, n2, r2, i2, a2, o2, s2;
7862
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;
7863
- By = null, fy.removeAttribute("data-focus");
7932
+ gb = null, Hy.removeAttribute("data-focus");
7864
7933
  let d2 = "";
7865
7934
  if (c2 === "transit" && (o2 = e5._birth_params_outer) != null && o2.datetime) try {
7866
- let t3 = Jv(e5._birth_params_outer.datetime, e5._birth_params_outer.timezone);
7867
- t3 && (d2 = '<span class="mode-badge-date">'.concat(My(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>"));
7868
7937
  } catch (e6) {
7869
7938
  }
7870
- my.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(My(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(My(u2), "\n </button>\n ").concat(d2), my.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) => {
7871
7940
  e6.addEventListener("click", () => {
7872
7941
  let t3 = e6.dataset.focus;
7873
- Vy(By === t3 ? null : t3);
7942
+ _b(gb === t3 ? null : t3);
7874
7943
  });
7875
- }), (s2 = my.querySelector(".mode-badge-swap")) == null || s2.addEventListener("click", () => {
7876
- Vy(By === "inner" ? "outer" : "inner");
7944
+ }), (s2 = Wy.querySelector(".mode-badge-swap")) == null || s2.addEventListener("click", () => {
7945
+ _b(gb === "inner" ? "outer" : "inner");
7877
7946
  });
7878
7947
  }
7879
- var Uy = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"], Wy = { sun: "\u2609", moon: "\u263D", mercury: "\u263F", venus: "\u2640", mars: "\u2642", jupiter: "\u2643", saturn: "\u2644", uranus: "\u2645", neptune: "\u2646", pluto: "\u2647", asc: "AC", mc: "MC" };
7880
- function Gy(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) {
7881
7950
  var n2, r2;
7882
7951
  let i2 = e5.find((e6) => e6.name.toLowerCase() === t2);
7883
7952
  if (!i2) return "\u2014";
7884
7953
  let a2 = Math.floor((i2.longitude % 360 + 360) % 360 / 30), o2 = Math.floor(i2.longitude % 30);
7885
- return "".concat((n2 = Wy[t2]) == null ? t2 : n2, " ").concat(o2, "\xB0 ").concat((r2 = Uy[a2]) == null ? "" : r2);
7954
+ return "".concat((n2 = bb[t2]) == null ? t2 : n2, " ").concat(o2, "\xB0 ").concat((r2 = yb[a2]) == null ? "" : r2);
7886
7955
  }
7887
- function Ky(e5, t2) {
7956
+ function Sb(e5, t2) {
7888
7957
  try {
7889
- let n2 = Jv(e5, t2);
7958
+ let n2 = gy(e5, t2);
7890
7959
  if (!n2) return e5;
7891
7960
  let { date: r2, timeZone: i2 } = n2;
7892
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 });
@@ -7894,22 +7963,22 @@ function Ky(e5, t2) {
7894
7963
  return e5;
7895
7964
  }
7896
7965
  }
7897
- function qy(e5, t2) {
7966
+ function Cb(e5, t2) {
7898
7967
  var n2, r2, i2, a2, o2;
7899
- if (!_y) return;
7900
- 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 ? Ky(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 = Gy(c2, "sun"), _2 = Gy(c2, "moon"), v2 = Gy(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");
7901
7970
  if (v2 === "AC \u2014" && m2.length > 0) {
7902
7971
  let e6 = m2.find((e7) => e7.number === 1);
7903
7972
  if (e6) {
7904
7973
  var y2;
7905
7974
  let t3 = Math.floor((e6.cusp_lon % 360 + 360) % 360 / 30);
7906
- v2 = "AC ".concat(Math.floor(e6.cusp_lon % 30), "\xB0 ").concat((y2 = Uy[t3]) == null ? "" : y2);
7975
+ v2 = "AC ".concat(Math.floor(e6.cusp_lon % 30), "\xB0 ").concat((y2 = yb[t3]) == null ? "" : y2);
7907
7976
  }
7908
7977
  }
7909
7978
  let b2 = s2 === "outer" && u2 === "transit" ? "Transit" : s2 === "outer" ? "Synastry" : "Natal";
7910
- _y.innerHTML = '\n <div class="prov-name">'.concat(My(d2), '\n <span class="prov-mode-tag">').concat(My(b2), '</span>\n </div>\n <div class="prov-trio">\n <span class="prov-planet">').concat(My(g2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(My(_2), '</span>\n <span class="prov-sep">\xB7</span>\n <span class="prov-planet">').concat(My(v2), "</span>\n </div>\n ").concat(p2 ? '<div class="prov-meta">'.concat(My(p2)).concat(f2 ? ' <span class="prov-tz">'.concat(My(f2), "</span>") : "", "</div>") : "", "\n ").concat(h2 ? '<div class="prov-meta">'.concat(My(h2), " houses</div>") : "", "\n "), _y.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;
7911
7980
  }
7912
- async function Jy(e5) {
7981
+ async function wb(e5) {
7913
7982
  var t2;
7914
7983
  let n2 = (t2 = $ == null ? void 0 : $.mode) == null ? "synastry" : t2, r2 = "";
7915
7984
  if (e5.type === "planet") {
@@ -7936,36 +8005,36 @@ async function Jy(e5) {
7936
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" : "", ".");
7937
8006
  }
7938
8007
  if (!r2) return;
7939
- let h2 = Yv($ == null ? void 0 : $._birth_params_inner), g2 = Yv($ == null ? void 0 : $._birth_params_outer);
8008
+ let h2 = _y($ == null ? void 0 : $._birth_params_inner), g2 = _y($ == null ? void 0 : $._birth_params_outer);
7940
8009
  if (h2 || g2) {
7941
8010
  let e6 = n2 === "transit" ? "Natal" : "Inner wheel", t3 = n2 === "transit" ? "Transits" : "Outer wheel";
7942
8011
  r2 = "".concat([h2 ? "".concat(e6, ": ").concat(h2) : "", g2 ? "".concat(t3, ": ").concat(g2) : ""].filter(Boolean).join("\n"), "\n\n").concat(r2);
7943
8012
  }
7944
- await Ny(r2);
8013
+ await lb(r2);
7945
8014
  }
7946
- async function Yy() {
8015
+ async function Tb() {
7947
8016
  var e5, t2, n2, r2, i2, a2, o2, s2;
7948
8017
  if (!$) return;
7949
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";
7950
- await Ny(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."));
7951
8020
  }
7952
- async function Xy() {
8021
+ async function Eb() {
7953
8022
  var e5, t2, n2, r2, i2, a2;
7954
8023
  if (!$) return;
7955
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";
7956
- await Ny(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."));
7957
8026
  }
7958
- async function Zy(e5) {
7959
- if (Sy) try {
8027
+ async function Db(e5) {
8028
+ if (Qy) try {
7960
8029
  var t2;
7961
- 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) }] });
7962
8031
  } catch (e6) {
7963
8032
  }
7964
8033
  }
7965
- function Qy() {
7966
- if (Cy) return async (e5) => {
8034
+ function Ob() {
8035
+ if ($y) return async (e5) => {
7967
8036
  var t2;
7968
- 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 } }] });
7969
8038
  if (n2.isError) {
7970
8039
  var r2, i2;
7971
8040
  throw Error((r2 = (i2 = n2.error) == null ? void 0 : i2.message) == null ? "Sampling failed" : r2);
@@ -7975,133 +8044,133 @@ function Qy() {
7975
8044
  throw Error("Unexpected sampling response format");
7976
8045
  };
7977
8046
  }
7978
- function $y(e5) {
8047
+ function kb(e5) {
7979
8048
  var t2, n2, r2, i2, a2, o2, s2;
7980
- $ = e5, clearTimeout(sb), Hy(e5), Vv(fy, e5, ib, ab, Jy, Qy()), Ry(), qy(e5, By);
7981
- let c2 = ev(e5.inner), l2 = ev(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;
7982
- nb(Fv((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);
7983
8052
  let d2 = document.getElementById("bi-action-bar");
7984
8053
  if (!d2) {
7985
8054
  d2 = document.createElement("div"), d2.id = "bi-action-bar", d2.className = "hd-action-bar";
7986
8055
  let e6 = document.querySelector("#fs-bottom-bar [data-column='right']");
7987
8056
  if (e6) e6.appendChild(d2);
7988
8057
  else {
7989
- let e7 = document.getElementById("app"), t3 = my.parentElement === e7 ? my : null;
8058
+ let e7 = document.getElementById("app"), t3 = Wy.parentElement === e7 ? Wy : null;
7990
8059
  e7 == null || e7.insertBefore(d2, t3);
7991
8060
  }
7992
8061
  }
7993
- 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 Yy()), (s2 = d2.querySelector("#bi-questions-btn")) == null || s2.addEventListener("click", () => void Xy()), Oy(), Ay(), iy("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");
7994
8063
  }
7995
- var eb = null, tb = { "Cross Trine": "#52a8e0", "Cross T-Square": "#e08a52", "Cross Stellium": "#9a7fd4" };
7996
- function nb(e5, t2, n2, r2) {
7997
- if (!vy) 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;
7998
8067
  if (e5.length === 0) {
7999
- vy.hidden = true, vy.innerHTML = "";
8068
+ Jy.hidden = true, Jy.innerHTML = "";
8000
8069
  return;
8001
8070
  }
8002
- eb = null, vy.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) => {
8003
8072
  var n3;
8004
- let r3 = (n3 = tb[e6.name]) == null ? "#888" : n3;
8073
+ let r3 = (n3 = jb[e6.name]) == null ? "#888" : n3;
8005
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>");
8006
- }).join(""), "\n "), vy.removeAttribute("hidden");
8075
+ }).join(""), "\n "), Jy.removeAttribute("hidden");
8007
8076
  let i2 = document.createElement("button");
8008
- i2.className = "pattern-ask-claude-btn", i2.textContent = "\u2728 Interpret", i2.style.display = "none", vy.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", () => {
8009
8078
  var t3;
8010
- let n3 = eb;
8079
+ let n3 = Ab;
8011
8080
  if (n3 === null) return;
8012
8081
  let r3 = e5[n3];
8013
- r3 && (i2.disabled = true, i2.textContent = "\u23F3 Sending\u2026", Jy({ 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(() => {
8014
8083
  i2.textContent = "\u2713 Sent", setTimeout(() => {
8015
8084
  i2.textContent = "\u2728 Interpret", i2.disabled = false;
8016
8085
  }, 2500);
8017
8086
  }).catch(() => {
8018
8087
  i2.textContent = "\u26A0 Failed", i2.disabled = false;
8019
8088
  }));
8020
- }), vy.querySelectorAll(".pattern-pill").forEach((a2) => {
8089
+ }), Jy.querySelectorAll(".pattern-pill").forEach((a2) => {
8021
8090
  a2.addEventListener("click", () => {
8022
8091
  var o2, s2;
8023
8092
  let c2 = parseInt((o2 = a2.dataset.idx) == null ? "-1" : o2, 10), l2 = e5[c2];
8024
8093
  if (!l2) return;
8025
8094
  let u2 = (s2 = a2.dataset.color) == null ? "#888" : s2;
8026
- if (eb === c2) {
8027
- eb = null, a2.classList.remove("active"), a2.style.background = "transparent", a2.style.color = u2, a2.style.borderColor = u2, Av(), zv(), 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";
8028
8097
  return;
8029
8098
  }
8030
- eb = c2, vy.querySelectorAll(".pattern-pill").forEach((e6) => {
8099
+ Ab = c2, Jy.querySelectorAll(".pattern-pill").forEach((e6) => {
8031
8100
  var t3;
8032
8101
  e6.classList.remove("active");
8033
8102
  let n3 = (t3 = e6.dataset.color) == null ? "#888" : t3;
8034
8103
  e6.style.color = n3, e6.style.borderColor = n3, e6.style.background = "transparent";
8035
- }), a2.classList.add("active"), a2.style.background = u2, a2.style.color = "#fff", a2.style.borderColor = u2, Bv(l2), zv(), Rv(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;
8036
8105
  });
8037
8106
  });
8038
8107
  }
8039
- async function rb(e5) {
8108
+ async function Nb(e5) {
8040
8109
  if (!$) return;
8041
8110
  let t2 = $;
8042
- ky();
8111
+ ab();
8043
8112
  try {
8044
8113
  var n2, r2, i2, a2, o2, s2, c2, l2, u2, d2;
8045
- let f2 = new Promise((e6, t3) => setTimeout(() => t3(Error("House system recalculate timed out")), 3e4)), p2 = Py(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]));
8046
- p2 ? $y(p2) : $ && Oy();
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();
8047
8116
  } catch (e6) {
8048
- console.error("[BiWheel] House system recalculate failed:", e6), $ && Oy();
8117
+ console.error("[BiWheel] House system recalculate failed:", e6), $ && ib();
8049
8118
  }
8050
8119
  }
8051
- function ib(e5, t2, n2) {
8120
+ function Pb(e5, t2, n2) {
8052
8121
  var r2, i2, a2, o2, s2;
8053
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;
8054
- Zy({ 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" })) } });
8055
8124
  }
8056
- function ab(e5) {
8125
+ function Fb(e5) {
8057
8126
  var t2;
8058
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"];
8059
- Zy({ 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 } });
8060
8129
  }
8061
- by.ontoolresult = (e5) => {
8062
- clearTimeout(sb);
8063
- let t2 = Py(e5);
8130
+ Xy.ontoolresult = (e5) => {
8131
+ clearTimeout(Lb);
8132
+ let t2 = ub(e5);
8064
8133
  if (!t2) {
8065
- jy("The chart didn't load. Tap to try again.", ob);
8134
+ sb("The chart didn't load. Tap to try again.", Ib);
8066
8135
  return;
8067
8136
  }
8068
- if (!xy) {
8137
+ if (!Zy) {
8069
8138
  var n2, r2, i2, a2;
8070
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";
8071
8140
  if (o2 && o2.includes("T")) {
8072
8141
  let e7 = o2.split("T");
8073
8142
  d2 = e7[0], f2 = e7[1].substring(0, 5);
8074
8143
  }
8075
- xy = new Xv({ app: by, 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) => {
8076
- xy == null || xy.setBusy(true), ky(), yy.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", "");
8077
8146
  try {
8078
8147
  var n3, r3, i3, a3, o3;
8079
- 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 = Py(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]));
8080
- l3 ? $y(l3) : $ && Oy();
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();
8081
8150
  } catch (e8) {
8082
- console.error("[BiWheel] Recalculate failed or timed out:", e8), $ && Oy();
8151
+ console.error("[BiWheel] Recalculate failed or timed out:", e8), $ && ib();
8083
8152
  } finally {
8084
- xy == null || xy.setBusy(false), yy.removeAttribute("hidden");
8153
+ Zy == null || Zy.setBusy(false), Yy.removeAttribute("hidden");
8085
8154
  }
8086
8155
  } });
8087
8156
  }
8088
- $y(t2), yy.removeAttribute("hidden");
8157
+ kb(t2), Yy.removeAttribute("hidden");
8089
8158
  };
8090
- function ob() {
8091
- clearTimeout(sb), Dy(), sb = setTimeout(() => {
8092
- fy.hidden && jy("The chart didn't load. Tap to try again.", ob);
8093
- }, 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(() => {
8094
8163
  });
8095
8164
  }
8096
- var sb = setTimeout(() => {
8097
- fy.hidden && jy("Chart data is taking longer than expected.", ob);
8165
+ var Lb = setTimeout(() => {
8166
+ Hy.hidden && sb("Chart data is taking longer than expected.", Ib);
8098
8167
  }, 3e4);
8099
- Dy(), ly(by, { loadingEl: py, contentEl: fy, statusFn: Ey, paramControls: () => xy }), (async () => {
8168
+ rb(), zy(Xy, { loadingEl: Uy, contentEl: Hy, statusFn: nb, paramControls: () => Zy }), (async () => {
8100
8169
  try {
8101
- await by.connect();
8102
- let e5 = by.getHostCapabilities();
8103
- Sy = !!(e5 != null && e5.modelContext), Cy = !!(e5 != null && e5.sampling), cy(by, document.getElementById("pan-zoom-controls"), ["mode-badge", "aspect-filter", "param-controls-container", "chart-provenance", "bi-patterns-strip", "bi-action-bar"]), dy(by), g_(by, () => {
8104
- $ && $y($);
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($);
8105
8174
  });
8106
8175
  } catch (e5) {
8107
8176
  console.error("[BiWheel] connect() failed:", e5);