@openephemeris/mcp-server 3.14.0 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,12 +6,12 @@
6
6
  <meta name="color-scheme" content="dark light" />
7
7
  <meta name="mcp-app-preferred-height" content="560" />
8
8
  <title>Moon Phase Explorer</title>
9
- <link rel="preconnect" href="https://fonts.googleapis.com" />
10
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
11
- <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
9
+ <!-- External Google Fonts removed: Claude.ai sandbox enforces hardcoded
10
+ frame-src 'self' blob: data: and blocks external CDN fetches at
11
+ iframe render time. Styles fall back to the system font stack. -->
12
12
 
13
13
 
14
- <style>*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary:#090b0f;--bg-secondary:#12161d;--bg-tertiary:#1c222b;--bg-hover:#272e3b;--border:#282e38;--border-subtle:#1d2229;--text-primary:#e1e5eb;--text-secondary:#9da5b1;--text-muted:#6c727b;--accent:#62b3ff;--accent-warm:#e6ac3d;--voc-warn:#f6922e;--radius:8px;--radius-sm:4px;--radius-lg:12px;--font-display:"Space Grotesk", system-ui, sans-serif;--font-body:"Inter", system-ui, sans-serif;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .036047 .0438664 .059078);--bg-secondary:color(display-p3 .0739679 .0866504 .111186);--bg-tertiary:color(display-p3 .114361 .13221 .166818);--bg-hover:color(display-p3 .15679 .180114 .225406);--border:color(display-p3 .161376 .180145 .216325);--border-subtle:color(display-p3 .118728 .13221 .158123);--text-primary:color(display-p3 .883958 .896627 .920543);--text-secondary:color(display-p3 .622745 .646433 .6914);--text-muted:color(display-p3 .429297 .445909 .477439);--accent:color(display-p3 .446063 .694439 1.01077);--accent-warm:color(display-p3 .866978 .684443 .324483);--voc-warn:color(display-p3 .910067 .591092 .274641)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(3.02674% -.179462 -2.15476);--bg-secondary:lab(7.16596% -.441141 -5.41423);--bg-tertiary:lab(12.9118% -.60384 -7.27841);--bg-hover:lab(18.6882% -.727877 -9.08878);--border:lab(18.7165% -.689313 -7.30941);--border-subtle:lab(12.9391% -.548743 -5.49436);--text-primary:lab(90.6878% -.517368 -3.73452);--text-secondary:lab(67.45% -.932217 -7.41489);--text-muted:lab(47.7476% -.701487 -5.56231);--accent:lab(70.4043% -7.21234 -50.7672);--accent-warm:lab(74.5248% 14.3487 62.5064);--voc-warn:lab(70.3313% 33.71 65.3029)}}@media (prefers-color-scheme:light){:root{--bg-primary:#f3f5f9;--bg-secondary:#e7ebf2;--bg-tertiary:#d8dee8;--bg-hover:#d0d8e5;--border:#bdc5d1;--border-subtle:#d2d8e2;--text-primary:#0f1216;--text-secondary:#414853;--text-muted:#6c727b;--accent:#0065b2;--accent-warm:#966800;--voc-warn:#a95a00;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .95471 .961142 .973263);--bg-secondary:color(display-p3 .909797 .922535 .946581);--bg-tertiary:color(display-p3 .852455 .871315 .906983);--bg-hover:color(display-p3 .821139 .84609 .893374);--border:color(display-p3 .745559 .770059 .816515);--border-subtle:color(display-p3 .826933 .845684 .881152);--text-primary:color(display-p3 .0608605 .0691527 .0850621);--text-secondary:color(display-p3 .261513 .281801 .32064);--text-muted:color(display-p3 .429297 .445909 .477439);--accent:color(display-p3 .143802 .388951 .683672);--accent-warm:color(display-p3 .596632 .396992 -.158844);--voc-warn:color(display-p3 .673365 .329149 -.157701)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(96.5044% -.267148 -1.87216);--bg-secondary:lab(93.0079% -.518024 -3.73493);--bg-tertiary:lab(88.3503% -.749856 -5.58736);--bg-hover:lab(86.0117% -.963002 -7.43048);--border:lab(79.0511% -.952899 -7.42528);--border-subtle:lab(86.0302% -.748128 -5.58645);--text-primary:lab(5.23796% -.285208 -3.0582);--text-secondary:lab(30.3224% -.794604 -7.35167);--text-muted:lab(47.7476% -.701487 -5.56231);--accent:lab(41.1205% -1.70796 -50.1423);--accent-warm:lab(47.6194% 20.1868 104.51);--voc-warn:lab(46.8395% 41.0975 106.287)}}}html,body{width:100%;height:100%;min-height:480px;font-family:var(--font-body);background:var(--bg-primary);color:var(--text-primary);font-size:13px;line-height:1.5;overflow-y:auto}body{flex-direction:column;display:flex}#app{flex-direction:column;flex:1;display:flex;overflow:hidden}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}#loading-state[hidden]{display:none}.oe-loader{width:48px;height:48px;animation:1.2s linear infinite spin}.oe-loader circle{fill:none;stroke:var(--accent);stroke-width:3px;stroke-dasharray:200;stroke-dashoffset:80px;stroke-linecap:round}@keyframes spin{to{transform:rotate(360deg)}}.chart-status{background:var(--bg-secondary);border-top:1px solid var(--border-subtle);color:var(--text-muted);opacity:0;z-index:50;padding:6px 14px;font-size:11px;transition:opacity .2s,transform .2s;position:fixed;bottom:0;left:0;right:0;transform:translateY(100%)}.chart-status.visible{opacity:1;transform:translateY(0)}.pan-zoom-controls{z-index:40;gap:4px;display:flex;position:fixed;top:8px;right:8px}.pan-zoom-controls[hidden]{display:none}.pan-btn{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);width:28px;height:28px;color:var(--text-secondary);cursor:pointer;justify-content:center;align-items:center;font-size:14px;transition:background .15s,color .15s;display:flex}.pan-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.pan-btn.reset{width:auto;padding:0 10px;font-size:12px}#moon-container{flex-direction:column;flex:1;min-height:440px;padding:16px;display:flex;overflow-y:auto}#moon-container[hidden]{display:none}.moon-layout{flex:1;align-items:flex-start;gap:24px;display:flex}@media (max-width:500px){.moon-layout{flex-direction:column;align-items:center;gap:16px}}.moon-dial-col{flex-direction:column;flex-shrink:0;align-items:center;gap:12px;display:flex}.moon-dial{justify-content:center;align-items:center;width:200px;height:200px;display:flex;position:relative}.moon-svg{filter:drop-shadow(0 0 20px rgba(131,163,187,.2));filter:drop-shadow(0 0 20px color(display-p3 .537913 .6362 .723376/.2));filter:drop-shadow(0 0 20px lab(65.2381% -7.35197 -16.1178/.2));width:100%;height:100%;animation:.8s ease-out moon-fade-in}@keyframes moon-fade-in{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.moon-illum-ring{background:var(--bg-secondary);border:1px solid var(--border-subtle);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:20px;flex-direction:column;align-items:center;gap:1px;padding:3px 10px;display:flex;position:absolute;bottom:-2px}.moon-illum-value{font-size:22px;font-weight:700;font-family:var(--font-display);font-variant-numeric:tabular-nums;color:var(--accent-warm);letter-spacing:-.02em}.moon-illum-label{text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);font-size:9px}.moon-phase-badge{background:var(--bg-secondary);border:1px solid var(--border);border-radius:20px;align-items:center;gap:6px;padding:6px 14px;display:flex}.moon-phase-icon{font-size:18px}.moon-phase-name{font-size:15px;font-weight:700;font-family:var(--font-display);letter-spacing:-.01em;text-transform:capitalize}.moon-direction{color:var(--text-muted);align-items:center;gap:4px;font-size:12px;display:flex}.dir-arrow{font-size:14px;font-weight:700}.dir-waxing{color:#57bc8a;color:color(display-p3 .44464 .726476 .557142);color:lab(69.1118% -39.6203 15.6094)}.dir-waning{color:#e6857e;color:color(display-p3 .850722 .541293 .507352);color:lab(66.3643% 37.397 20.9063)}.moon-info-col{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.moon-card{background:var(--bg-secondary);border:1px solid var(--border-subtle);border-radius:var(--radius);cursor:pointer;padding:10px 14px;transition:background .15s,border-color .15s,box-shadow .15s}.moon-card:hover{background:var(--bg-hover);border-color:var(--border);box-shadow:0 2px 12px rgba(0,0,0,.1);box-shadow:0 2px 12px color(display-p3 0 0 0/.1);box-shadow:0 2px 12px lab(0% 0 0/.1)}.moon-card--voc.moon-card--active{border-color:var(--voc-warn);background:#2c1e13;background:color(display-p3 .165435 .120647 .0798046);background:lab(12.9057% 5.79391 10.6146)}@media (prefers-color-scheme:light){.moon-card--voc.moon-card--active{background:#ffead8;background:color(display-p3 1.00032 .917094 .842425);background:lab(94.1113% 7.0433 13.5336)}}.moon-card-header{align-items:center;gap:6px;margin-bottom:4px;display:flex}.moon-card-icon{font-size:14px}.moon-card-title{font-size:11px;font-weight:600;font-family:var(--font-body);text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted)}.moon-card-chevron{color:var(--text-muted);flex-shrink:0;margin-left:auto;font-size:13px;transition:transform .2s}.moon-card--open .moon-card-chevron{transform:rotate(90deg)}.moon-card-value{font-size:16px;font-weight:700;font-family:var(--font-display);color:var(--text-primary);text-transform:capitalize;line-height:1.2}.moon-card-detail{color:var(--text-muted);margin-top:2px;font-size:11px}.moon-card--primary{border-color:var(--border);padding:8px 13px}.moon-card--primary .moon-card-value{letter-spacing:-.02em;font-size:16px}.moon-card--primary .moon-card-header{margin-bottom:2px}.moon-card--primary .moon-card-title{font-size:10px}.moon-card--compact{padding:6px 12px}.moon-card--compact .moon-card-header{margin-bottom:2px}.moon-card--compact .moon-card-value{font-size:13px;font-weight:600}.moon-card--compact .moon-card-title{letter-spacing:.06em;font-size:10px}.moon-card--inline{padding:6px 12px}.moon-card--inline .moon-card-header{gap:8px;margin-bottom:0}.moon-card--inline .moon-card-title{letter-spacing:.06em;font-size:10px}.moon-card-inline-value{font-family:var(--font-display);color:var(--text-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;margin-left:auto;font-size:13px;font-weight:600}.moon-card--inline .moon-card-chevron{margin-left:0}.moon-card-expand{grid-template-rows:0fr;margin-top:0;transition:grid-template-rows .22s,margin-top .22s;display:grid}.moon-card--open .moon-card-expand{grid-template-rows:1fr;margin-top:8px}.moon-card-expand-inner{overflow:hidden}.moon-card-expand-text{font-size:11px;font-family:var(--font-body);color:var(--text-secondary);border-top:1px solid var(--border-subtle);padding-top:7px;font-style:italic;line-height:1.55;display:block}.moon-card-row{color:var(--text-secondary);align-items:center;gap:4px;padding:1px 0;font-size:12px;display:flex}.moon-card-row-icon{font-size:12px}.moon-actions{flex-wrap:wrap;gap:8px;margin-top:6px;display:flex}.action-btn{border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;align-items:center;gap:4px;padding:8px 14px;font-size:12px;font-weight:600;transition:background .15s,color .15s,box-shadow .15s;display:inline-flex}.action-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.action-btn--primary{color:#cbdfff;color:color(display-p3 .811259 .873257 .992208);color:lab(88.2011% -1.89927 -18.3428);background:#11397b;background:color(display-p3 .112797 .221529 .46413);background:lab(24.6079% 7.13965 -41.9262);border-color:#305289;border-color:color(display-p3 .218625 .316452 .521702);border-color:lab(34.3143% 2.02942 -35.2838)}.action-btn--primary:hover{background:#1b478f;background:color(display-p3 .151166 .273205 .543079);background:lab(30.361% 6.93905 -45.4659);box-shadow:0 0 0 1px #3862a7;box-shadow:0 0 0 1px color(display-p3 .2584 .379139 .634372);box-shadow:0 0 0 1px lab(41.0971% 2.98774 -42.2721)}.error-state,.empty-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:32px;display:flex}.error-icon,.empty-icon{font-size:32px}.tooltip{z-index:100;border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-primary);pointer-events:none;opacity:0;max-width:200px;padding:6px 10px;font-size:11px;transition:opacity .15s;position:fixed}.tooltip.visible{opacity:1}.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%}}
14
+ <style>*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary:#090b0f;--bg-secondary:#12161d;--bg-tertiary:#1c222b;--bg-hover:#272e3b;--border:#282e38;--border-subtle:#1d2229;--text-primary:#e1e5eb;--text-secondary:#9da5b1;--text-muted:#6c727b;--accent:#62b3ff;--accent-warm:#e6ac3d;--voc-warn:#f6922e;--cue-warm:#f4a34b;--cue-cool:#6ab3fd;--radius:8px;--radius-sm:4px;--radius-lg:12px;--font-display:"Space Grotesk", system-ui, sans-serif;--font-body:"Inter", system-ui, sans-serif;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .036047 .0438664 .059078);--bg-secondary:color(display-p3 .0739679 .0866504 .111186);--bg-tertiary:color(display-p3 .114361 .13221 .166818);--bg-hover:color(display-p3 .15679 .180114 .225406);--border:color(display-p3 .161376 .180145 .216325);--border-subtle:color(display-p3 .118728 .13221 .158123);--text-primary:color(display-p3 .883958 .896627 .920543);--text-secondary:color(display-p3 .622745 .646433 .6914);--text-muted:color(display-p3 .429297 .445909 .477439);--accent:color(display-p3 .446063 .694439 1.01077);--accent-warm:color(display-p3 .866978 .684443 .324483);--voc-warn:color(display-p3 .910067 .591092 .274641);--cue-warm:color(display-p3 .911412 .653072 .360243);--cue-cool:color(display-p3 .48245 .695507 .967802)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(3.02674% -.179462 -2.15476);--bg-secondary:lab(7.16596% -.441141 -5.41423);--bg-tertiary:lab(12.9118% -.60384 -7.27841);--bg-hover:lab(18.6882% -.727877 -9.08878);--border:lab(18.7165% -.689313 -7.30941);--border-subtle:lab(12.9391% -.548743 -5.49436);--text-primary:lab(90.6878% -.517368 -3.73452);--text-secondary:lab(67.45% -.932217 -7.41489);--text-muted:lab(47.7476% -.701487 -5.56231);--accent:lab(70.4043% -7.21234 -50.7672);--accent-warm:lab(74.5248% 14.3487 62.5064);--voc-warn:lab(70.3313% 33.71 65.3029);--cue-warm:lab(74.0849% 25.4197 56.7058);--cue-cool:lab(70.5454% -7.4636 -44.2057)}}@media (prefers-color-scheme:light){:root{--bg-primary:#f3f5f9;--bg-secondary:#e7ebf2;--bg-tertiary:#d8dee8;--bg-hover:#d0d8e5;--border:#bdc5d1;--border-subtle:#d2d8e2;--text-primary:#0f1216;--text-secondary:#414853;--text-muted:#585e67;--accent:#0065b2;--accent-warm:#966800;--voc-warn:#a95a00;--cue-warm:#954200;--cue-cool:#1e5ba1;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .95471 .961142 .973263);--bg-secondary:color(display-p3 .909797 .922535 .946581);--bg-tertiary:color(display-p3 .852455 .871315 .906983);--bg-hover:color(display-p3 .821139 .84609 .893374);--border:color(display-p3 .745559 .770059 .816515);--border-subtle:color(display-p3 .826933 .845684 .881152);--text-primary:color(display-p3 .0608605 .0691527 .0850621);--text-secondary:color(display-p3 .261513 .281801 .32064);--text-muted:color(display-p3 .350602 .367691 .400197);--accent:color(display-p3 .143802 .388951 .683672);--accent-warm:color(display-p3 .596632 .396992 -.158844);--voc-warn:color(display-p3 .673365 .329149 -.157701);--cue-warm:color(display-p3 .567457 .255699 -.0353967);--cue-cool:color(display-p3 .186321 .349931 .613332)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(96.5044% -.267148 -1.87216);--bg-secondary:lab(93.0079% -.518024 -3.73493);--bg-tertiary:lab(88.3503% -.749856 -5.58736);--bg-hover:lab(86.0117% -.963002 -7.43048);--border:lab(79.0511% -.952899 -7.42528);--border-subtle:lab(86.0302% -.748128 -5.58645);--text-primary:lab(5.23796% -.285208 -3.0582);--text-secondary:lab(30.3224% -.794604 -7.35167);--text-muted:lab(39.6225% -.718519 -5.91861);--accent:lab(41.1205% -1.70796 -50.1423);--accent-warm:lab(47.6194% 20.1868 104.51);--voc-warn:lab(46.8395% 41.0975 106.287);--cue-warm:lab(38.6598% 39.325 67.0649);--cue-cool:lab(37.6228% 1.24846 -44.7496)}}}html,body{width:100%;height:100%;min-height:480px;font-family:var(--font-body);background:var(--bg-primary);color:var(--text-primary);font-size:13px;line-height:1.5;overflow-y:auto}body{flex-direction:column;display:flex}#app{flex-direction:column;flex:1;display:flex;overflow:hidden}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}#loading-state[hidden]{display:none}.oe-loader{width:48px;height:48px;animation:1.2s linear infinite spin}.oe-loader circle{fill:none;stroke:var(--accent);stroke-width:3px;stroke-dasharray:200;stroke-dashoffset:80px;stroke-linecap:round}@keyframes spin{to{transform:rotate(360deg)}}.chart-status{background:var(--bg-secondary);border-top:1px solid var(--border-subtle);color:var(--text-muted);opacity:0;z-index:50;padding:6px 14px;font-size:11px;transition:opacity .2s,transform .2s;position:fixed;bottom:0;left:0;right:0;transform:translateY(100%)}.chart-status.visible{opacity:1;transform:translateY(0)}.pan-zoom-controls{z-index:40;gap:4px;display:flex;position:fixed;top:8px;right:8px}.pan-zoom-controls[hidden]{display:none}.pan-btn{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);width:28px;height:28px;color:var(--text-secondary);cursor:pointer;justify-content:center;align-items:center;font-size:14px;transition:background .15s,color .15s;display:flex}.pan-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.pan-btn.reset{width:auto;padding:0 10px;font-size:12px}#moon-container{flex-direction:column;flex:1;min-height:440px;padding:16px;display:flex;overflow-y:auto}#moon-container[hidden]{display:none}.moon-layout{flex:1;align-items:flex-start;gap:24px;display:flex}@media (max-width:500px){.moon-layout{flex-direction:column;align-items:center;gap:16px}}.moon-dial-col{flex-direction:column;flex-shrink:0;align-items:center;gap:12px;display:flex}.moon-dial{justify-content:center;align-items:center;width:200px;height:200px;display:flex;position:relative}.moon-svg{filter:drop-shadow(0 0 20px rgba(131,163,187,.2));filter:drop-shadow(0 0 20px color(display-p3 .537913 .6362 .723376/.2));filter:drop-shadow(0 0 20px lab(65.2381% -7.35197 -16.1178/.2));width:100%;height:100%;animation:.8s ease-out moon-fade-in}@keyframes moon-fade-in{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.moon-illum-ring{background:var(--bg-secondary);border:1px solid var(--border-subtle);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:20px;flex-direction:column;align-items:center;gap:1px;padding:3px 10px;display:flex;position:absolute;bottom:-2px}.moon-illum-value{font-size:22px;font-weight:700;font-family:var(--font-display);font-variant-numeric:tabular-nums;color:var(--accent-warm);letter-spacing:-.02em}.moon-illum-label{text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);font-size:9px}.moon-phase-badge{background:var(--bg-secondary);border:1px solid var(--border);border-radius:20px;align-items:center;gap:6px;padding:6px 14px;display:flex}.moon-phase-icon{font-size:18px}.moon-phase-name{font-size:15px;font-weight:700;font-family:var(--font-display);letter-spacing:-.01em;text-transform:capitalize}.moon-direction{color:var(--text-muted);align-items:center;gap:4px;font-size:12px;display:flex}.dir-arrow{font-size:14px;font-weight:700}.dir-waxing{color:#57bc8a;color:color(display-p3 .44464 .726476 .557142);color:lab(69.1118% -39.6203 15.6094)}.dir-waning{color:#e6857e;color:color(display-p3 .850722 .541293 .507352);color:lab(66.3643% 37.397 20.9063)}.moon-info-col{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.moon-card{background:var(--bg-secondary);border:1px solid var(--border-subtle);border-radius:var(--radius);cursor:pointer;padding:10px 14px;transition:background .15s,border-color .15s,box-shadow .15s}.moon-card:hover{background:var(--bg-hover);border-color:var(--border);box-shadow:0 2px 12px rgba(0,0,0,.1);box-shadow:0 2px 12px color(display-p3 0 0 0/.1);box-shadow:0 2px 12px lab(0% 0 0/.1)}.moon-card--voc.moon-card--active{border-color:var(--voc-warn);background:#2c1e13;background:color(display-p3 .165435 .120647 .0798046);background:lab(12.9057% 5.79391 10.6146)}@media (prefers-color-scheme:light){.moon-card--voc.moon-card--active{background:#ffead8;background:color(display-p3 1.00032 .917094 .842425);background:lab(94.1113% 7.0433 13.5336)}}.moon-card-header{align-items:center;gap:6px;margin-bottom:4px;display:flex}.moon-card-icon{font-size:14px}.moon-card-title{font-size:11px;font-weight:600;font-family:var(--font-body);text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted)}.moon-card-chevron{color:var(--text-muted);flex-shrink:0;margin-left:auto;font-size:13px;transition:transform .2s}.moon-card--open .moon-card-chevron{transform:rotate(90deg)}.moon-card-value{font-size:16px;font-weight:700;font-family:var(--font-display);color:var(--text-primary);text-transform:capitalize;line-height:1.2}.moon-card-detail{color:var(--text-muted);margin-top:2px;font-size:11px}.moon-card--primary{border-color:var(--border);padding:8px 13px}.moon-card--primary .moon-card-value{letter-spacing:-.02em;font-size:16px}.moon-card--primary .moon-card-header{margin-bottom:2px}.moon-card--primary .moon-card-title{font-size:10px}.moon-card--compact{padding:6px 12px}.moon-card--compact .moon-card-header{margin-bottom:2px}.moon-card--compact .moon-card-value{font-size:13px;font-weight:600}.moon-card--compact .moon-card-title{letter-spacing:.06em;font-size:10px}.moon-card--inline{padding:6px 12px}.moon-card--inline .moon-card-header{gap:8px;margin-bottom:0}.moon-card--inline .moon-card-title{letter-spacing:.06em;font-size:10px}.moon-card-inline-value{font-family:var(--font-display);color:var(--text-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;margin-left:auto;font-size:13px;font-weight:600}.moon-card-inline-value.tempo-fast,.moon-card-inline-value.prox-super{color:var(--cue-warm)}.moon-card-inline-value.tempo-slow{color:var(--cue-cool)}.moon-card-inline-value.prox-micro{color:var(--text-secondary)}.moon-card--inline .moon-card-chevron{margin-left:0}.moon-card-expand{grid-template-rows:0fr;margin-top:0;transition:grid-template-rows .22s,margin-top .22s;display:grid}.moon-card--open .moon-card-expand{grid-template-rows:1fr;margin-top:8px}.moon-card-expand-inner{overflow:hidden}.moon-card-expand-text{font-size:11px;font-family:var(--font-body);color:var(--text-secondary);border-top:1px solid var(--border-subtle);padding-top:7px;font-style:italic;line-height:1.55;display:block}.moon-card-row{color:var(--text-secondary);align-items:center;gap:4px;padding:1px 0;font-size:12px;display:flex}.moon-card-row-icon{font-size:12px}.moon-actions{flex-wrap:wrap;gap:8px;margin-top:6px;display:flex}.action-btn{border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;align-items:center;gap:4px;padding:8px 14px;font-size:12px;font-weight:600;transition:background .15s,color .15s,box-shadow .15s;display:inline-flex}.action-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.action-btn--primary{color:#cbdfff;color:color(display-p3 .811259 .873257 .992208);color:lab(88.2011% -1.89927 -18.3428);background:#11397b;background:color(display-p3 .112797 .221529 .46413);background:lab(24.6079% 7.13965 -41.9262);border-color:#305289;border-color:color(display-p3 .218625 .316452 .521702);border-color:lab(34.3143% 2.02942 -35.2838)}.action-btn--primary:hover{background:#1b478f;background:color(display-p3 .151166 .273205 .543079);background:lab(30.361% 6.93905 -45.4659);box-shadow:0 0 0 1px #3862a7;box-shadow:0 0 0 1px color(display-p3 .2584 .379139 .634372);box-shadow:0 0 0 1px lab(41.0971% 2.98774 -42.2721)}.error-state,.empty-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:32px;display:flex}.error-icon,.empty-icon{font-size:32px}.error-retry-btn{border:1px solid var(--border,rgba(128,128,160,.3));color:var(--accent-warm,var(--text-primary,inherit));font:inherit;letter-spacing:.02em;cursor:pointer;background:0 0;border-radius:999px;margin-top:4px;padding:7px 20px;font-size:11px;font-weight:600;transition:background .18s,border-color .18s}.error-retry-btn:hover{background:rgba(128,128,160,.12)}.tooltip{z-index:100;border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-primary);pointer-events:none;opacity:0;max-width:200px;padding:6px 10px;font-size:11px;transition:opacity .15s;position:fixed}.tooltip.visible{opacity:1}.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%}}
15
15
  /*$vite$:1*/</style>
16
16
  </head>
17
17
  <body>
@@ -6624,16 +6624,16 @@ function c_(e4, t2, n2, r2) {
6624
6624
  b2 += "</div>";
6625
6625
  }
6626
6626
  if (typeof t2.moon_speed == "number") {
6627
- var le2 = t2.moon_speed, ue2 = (Math.round(le2 * 100) / 100).toFixed(2), de2 = le2 > 14.5 ? "Fast" : le2 < 12 ? "Slow" : "Average", fe2 = le2 > 14.5 ? "Building momentum \u2014 quick emotional shifts" : le2 < 12 ? "Deliberate pace \u2014 deeper but slower" : "Steady rhythm \u2014 balanced lunar energy";
6628
- b2 += '<div class="moon-card moon-card--inline" data-detail="Moon speed: ' + ue2 + '\xB0/day">', b2 += '<div class="moon-card-header">', b2 += '<span class="moon-card-icon">\u26A1</span>', b2 += '<span class="moon-card-title">Moon Speed</span>', b2 += '<span class="moon-card-inline-value">' + ue2 + "\xB0/d \xB7 " + de2 + "</span>", b2 += '<span class="moon-card-chevron">\u203A</span>', b2 += "</div>", b2 += x2(fe2 + " The Moon's mean motion is 13.18\xB0/day. Above 14.5\xB0/day the Moon is moving faster than average, associated with rapidly shifting moods and a sense of momentum. Below 12\xB0/day it's slower, often linked to more sustained and inward emotional states."), b2 += "</div>";
6627
+ var le2 = t2.moon_speed, ue2 = (Math.round(le2 * 100) / 100).toFixed(2), de2 = le2 > 14.5 ? "Fast" : le2 < 12 ? "Slow" : "Average", fe2 = le2 > 14.5 ? "tempo-fast" : le2 < 12 ? "tempo-slow" : "tempo-avg", pe2 = le2 > 14.5 ? "Building momentum \u2014 quick emotional shifts" : le2 < 12 ? "Deliberate pace \u2014 deeper but slower" : "Steady rhythm \u2014 balanced lunar energy";
6628
+ b2 += '<div class="moon-card moon-card--inline" data-detail="Moon speed: ' + ue2 + '\xB0/day">', b2 += '<div class="moon-card-header">', b2 += '<span class="moon-card-icon">\u26A1</span>', b2 += '<span class="moon-card-title">Moon Speed</span>', b2 += '<span class="moon-card-inline-value ' + fe2 + '">' + ue2 + "\xB0/d \xB7 " + de2 + "</span>", b2 += '<span class="moon-card-chevron">\u203A</span>', b2 += "</div>", b2 += x2(pe2 + " The Moon's mean motion is 13.18\xB0/day. Above 14.5\xB0/day the Moon is moving faster than average, associated with rapidly shifting moods and a sense of momentum. Below 12\xB0/day it's slower, often linked to more sustained and inward emotional states."), b2 += "</div>";
6629
6629
  }
6630
6630
  if (typeof t2.angular_diameter == "number" && t2.angular_diameter > 0) {
6631
- var pe2 = t2.angular_diameter, me2 = (Math.round(pe2 * 100) / 100).toFixed(2), he2 = pe2 > 32.5 ? "Supermoon proximity" : pe2 < 29.8 ? "Micromoon proximity" : "Average distance", ge2 = t2.moon_distance_km ? Math.round(t2.moon_distance_km).toLocaleString() + " km" : "";
6632
- b2 += '<div class="moon-card moon-card--inline" data-detail="Angular diameter: ' + me2 + "'\">", b2 += '<div class="moon-card-header">', b2 += '<span class="moon-card-icon">\u{1F52D}</span>', b2 += '<span class="moon-card-title">Proximity</span>', b2 += '<span class="moon-card-inline-value">' + me2 + "' \xB7 " + he2.replace(" proximity", "") + "</span>", b2 += '<span class="moon-card-chevron">\u203A</span>', b2 += "</div>", b2 += x2((ge2 ? ge2 + " away. " : "") + "The Moon's angular diameter averages 31.08 arcminutes. A Supermoon (>32.5') appears up to 14% larger and 30% brighter than a Micromoon. Closer proximity also strengthens tidal forces and is associated with intensified lunar influence in some traditions."), b2 += "</div>";
6631
+ var me2 = t2.angular_diameter, he2 = (Math.round(me2 * 100) / 100).toFixed(2), ge2 = me2 > 32.5 ? "Supermoon proximity" : me2 < 29.8 ? "Micromoon proximity" : "Average distance", _e2 = me2 > 32.5 ? "prox-super" : me2 < 29.8 ? "prox-micro" : "prox-avg", ve2 = t2.moon_distance_km ? Math.round(t2.moon_distance_km).toLocaleString() + " km" : "";
6632
+ b2 += '<div class="moon-card moon-card--inline" data-detail="Angular diameter: ' + he2 + "'\">", b2 += '<div class="moon-card-header">', b2 += '<span class="moon-card-icon">\u{1F52D}</span>', b2 += '<span class="moon-card-title">Proximity</span>', b2 += '<span class="moon-card-inline-value ' + _e2 + '">' + he2 + "' \xB7 " + ge2.replace(" proximity", "") + "</span>", b2 += '<span class="moon-card-chevron">\u203A</span>', b2 += "</div>", b2 += x2((ve2 ? ve2 + " away. " : "") + "The Moon's angular diameter averages 31.08 arcminutes. A Supermoon (>32.5') appears up to 14% larger and 30% brighter than a Micromoon. Closer proximity also strengthens tidal forces and is associated with intensified lunar influence in some traditions."), b2 += "</div>";
6633
6633
  } else t2.moon_distance_km && (b2 += '<div class="moon-card moon-card--inline" data-detail="Distance: ' + Math.round(t2.moon_distance_km).toLocaleString() + ' km">', b2 += '<div class="moon-card-header">', b2 += '<span class="moon-card-icon">\u{1F52D}</span>', b2 += '<span class="moon-card-title">Distance</span>', b2 += '<span class="moon-card-inline-value">' + Math.round(t2.moon_distance_km).toLocaleString() + " km</span>", b2 += "</div>", b2 += "</div>");
6634
6634
  Array.isArray(t2.applying_aspects) && t2.applying_aspects.length > 0 && (b2 += '<div class="moon-card moon-card--compact" data-detail="Moon applying aspects">', b2 += '<div class="moon-card-header">', b2 += '<span class="moon-card-icon">\u{1F319}</span>', b2 += '<span class="moon-card-title">Approaching</span>', b2 += '<span class="moon-card-chevron">\u203A</span>', b2 += "</div>", t2.applying_aspects.slice(0, 3).forEach(function(e5) {
6635
6635
  var t3, n3, r3, i3, a3 = ((t3 = e5.aspect) == null ? "" : t3).toLowerCase().replace(/-/g, ""), o3 = (n3 = t_[a3]) == null ? e5.aspect : n3, s3 = (r3 = n_[a3]) == null ? e5.aspect : r3, c3 = e5.orb === null ? "" : " \xB7 " + (Math.round(((i3 = e5.orb) == null ? 0 : i3) * 100) / 100).toFixed(1) + "\xB0";
6636
- b2 += '<div class="moon-card-row">\u263D ' + o3 + ' <span style="opacity:.7; font-size:10px; letter-spacing:.04em; text-transform:uppercase; margin-right:2px">' + l_(s3) + "</span> \xB7 " + l_(e5.planet) + c3 + "</div>";
6636
+ b2 += '<div class="moon-card-row">\u263D ' + o3 + ' <span style="color:var(--text-muted); font-size:10px; letter-spacing:.04em; text-transform:uppercase; margin-right:2px">' + l_(s3) + "</span> \xB7 " + l_(e5.planet) + c3 + "</div>";
6637
6637
  }), b2 += x2("Applying aspects are those the Moon is building toward before leaving the current sign. Tighter orbs (closer to 0\xB0) carry more weight. Aspects to benefics (Venus, Jupiter) are generally favorable; to malefics (Mars, Saturn) may bring tension."), b2 += "</div>"), b2 += '<div class="moon-actions">', b2 += '<button class="action-btn action-btn--primary" id="moon-interpret-btn">\u2728 Interpret this phase</button>', _2 && (b2 += '<button class="action-btn" id="moon-voc-btn">\u{1F52E} What does VOC mean?</button>'), b2 += "</div>", b2 += "</div>", b2 += "</div>", e4.innerHTML = b2, e4.querySelectorAll(".moon-card[data-detail]").forEach(function(t3) {
6638
6638
  t3.addEventListener("click", function(n3) {
6639
6639
  var i3;
@@ -6650,12 +6650,12 @@ function c_(e4, t2, n2, r2) {
6650
6650
  }
6651
6651
  });
6652
6652
  });
6653
- var _e2 = document.getElementById("moon-interpret-btn");
6654
- _e2 && _e2.addEventListener("click", function() {
6653
+ var ye2 = document.getElementById("moon-interpret-btn");
6654
+ ye2 && ye2.addEventListener("click", function() {
6655
6655
  n2({ type: "interpret_phase", data: {} });
6656
6656
  });
6657
- var ve2 = document.getElementById("moon-voc-btn");
6658
- ve2 && ve2.addEventListener("click", function() {
6657
+ var be2 = document.getElementById("moon-voc-btn");
6658
+ be2 && be2.addEventListener("click", function() {
6659
6659
  n2({ type: "voc_meaning", data: {} });
6660
6660
  });
6661
6661
  }
@@ -6690,19 +6690,42 @@ function f_(e4) {
6690
6690
  n2(e5);
6691
6691
  });
6692
6692
  }
6693
- var p_ = document.getElementById("loading-state"), m_ = document.getElementById("moon-container"), h_ = document.getElementById("chart-status"), g_ = new Qg({ name: "Moon Phase Explorer", version: "1.0.0" }), __ = null, v_ = false;
6694
- function y_(e4) {
6695
- if (h_) {
6693
+ function p_(e4) {
6694
+ var t2;
6695
+ if (!e4) return null;
6696
+ if (e4.structuredContent != null && typeof e4.structuredContent == "object") return e4.structuredContent;
6697
+ for (let n2 of (t2 = e4.content) == null ? [] : t2) {
6698
+ let e5 = n2 == null ? void 0 : n2.text;
6699
+ if (typeof e5 == "string" && e5.length > 0) try {
6700
+ return JSON.parse(e5);
6701
+ } catch (e6) {
6702
+ }
6703
+ }
6704
+ return null;
6705
+ }
6706
+ function m_(e4) {
6707
+ return e4.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
6708
+ }
6709
+ function h_(e4) {
6710
+ let { container: t2, message: n2, onRetry: r2, retryLabel: i2 = "\u21BA Try again" } = e4, a2 = r2 ? '<button class="error-retry-btn" type="button">'.concat(m_(i2), "</button>") : "";
6711
+ if (t2.innerHTML = '<div class="error-state" role="alert"><div class="error-icon" aria-hidden="true">\u26A0\uFE0F</div><p class="error-msg">'.concat(m_(n2), "</p>") + a2 + "</div>", t2.removeAttribute("hidden"), r2) {
6712
+ var o2;
6713
+ (o2 = t2.querySelector(".error-retry-btn")) == null || o2.addEventListener("click", r2);
6714
+ }
6715
+ }
6716
+ var g_ = document.getElementById("loading-state"), __ = document.getElementById("moon-container"), v_ = document.getElementById("chart-status"), y_ = new Qg({ name: "Moon Phase Explorer", version: "1.0.0" }), b_ = null, x_ = false;
6717
+ function S_(e4) {
6718
+ if (v_) {
6696
6719
  if (!e4) {
6697
- h_.classList.remove("visible");
6720
+ v_.classList.remove("visible");
6698
6721
  return;
6699
6722
  }
6700
- h_.textContent = "\xB7 " + e4, h_.classList.add("visible");
6723
+ v_.textContent = "\xB7 " + e4, v_.classList.add("visible");
6701
6724
  }
6702
6725
  }
6703
- async function b_(e4) {
6704
- if (__) {
6705
- var t2 = __, n2 = "";
6726
+ async function C_(e4) {
6727
+ if (b_) {
6728
+ var t2 = b_, n2 = "";
6706
6729
  if (e4.type === "interpret_phase") {
6707
6730
  var r2, i2, a2;
6708
6731
  n2 = "The Moon is currently in " + String((r2 = t2.phase_name) == null ? "unknown phase" : r2) + " at " + Math.round(((i2 = t2.illumination) == null ? 0 : i2) * 100) + "% illumination" + (t2.moon_sign ? " in " + t2.moon_sign : "") + ((a2 = t2.voc_status) != null && a2.is_void ? ", currently Void of Course" : "") + ".\n\nWhat does this lunar phase mean for daily activities, emotional rhythms, and intention-setting? Include any relevant gardening, wellness, or spiritual correspondences.";
@@ -6711,50 +6734,50 @@ async function b_(e4) {
6711
6734
  n2 = "The Moon is Void of Course" + ((o2 = t2.voc_status) != null && o2.started ? " since " + t2.voc_status.started : "") + ((s2 = t2.voc_status) != null && s2.ends ? " until " + t2.voc_status.ends : "") + ".\n\nWhat exactly does Void of Course mean in practical terms? What should be avoided and what is favored during this period?";
6712
6735
  }
6713
6736
  if (n2) try {
6714
- await g_.sendMessage({ role: "user", content: [{ type: "text", text: n2 }] });
6737
+ await y_.sendMessage({ role: "user", content: [{ type: "text", text: n2 }] });
6715
6738
  } catch (e5) {
6716
6739
  console.error("[MoonPhase] sendMessage failed:", e5);
6717
6740
  }
6718
6741
  }
6719
6742
  }
6720
- async function x_(e4) {
6721
- if (y_(e4), v_) try {
6722
- await g_.updateModelContext({ content: [{ type: "text", text: "[Moon Phase] User viewed: " + e4 }] });
6743
+ async function w_(e4) {
6744
+ if (S_(e4), x_) try {
6745
+ await y_.updateModelContext({ content: [{ type: "text", text: "[Moon Phase] User viewed: " + e4 }] });
6723
6746
  } catch (e5) {
6724
6747
  }
6725
6748
  }
6726
- function S_(e4) {
6727
- p_.setAttribute("hidden", ""), m_.innerHTML = '<div class="error-state"><div class="error-icon">\u26A0\uFE0F</div><p>' + C_(e4) + "</p></div>", m_.removeAttribute("hidden");
6749
+ var T_;
6750
+ function E_() {
6751
+ T_ && (clearTimeout(T_), T_ = void 0);
6728
6752
  }
6729
- function C_(e4) {
6730
- return e4.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
6753
+ function D_(e4, t2) {
6754
+ E_(), g_.setAttribute("hidden", ""), h_({ container: __, message: e4, onRetry: t2 });
6731
6755
  }
6732
- g_.ontoolresult = function(e4) {
6756
+ function O_() {
6757
+ E_(), __.setAttribute("hidden", ""), g_.removeAttribute("hidden"), T_ = setTimeout(() => {
6758
+ D_("Still no response from the server. Please close and re-open the moon phase view.");
6759
+ }, 3e4), y_.sendMessage({ role: "user", content: [{ type: "text", text: "Please regenerate the moon phase." }] }).catch(() => {
6760
+ });
6761
+ }
6762
+ y_.ontoolresult = function(e4) {
6763
+ E_();
6733
6764
  try {
6734
- for (var t2, n2 = null, r2 = 0; r2 < ((t2 = e4.content) == null ? [] : t2).length; r2++) {
6735
- var i2, a2 = ((i2 = e4.content) == null ? [] : i2)[r2];
6736
- if (a2.type === "text" && a2.text) try {
6737
- var o2 = JSON.parse(a2.text);
6738
- if (o2 && typeof o2 == "object" && (o2.phase_name || o2.illumination != null || o2.moon_sign)) {
6739
- n2 = o2;
6740
- break;
6741
- }
6742
- } catch (e5) {
6743
- }
6744
- }
6745
- if (!n2) {
6746
- S_("Moon phase data could not be parsed from the server response.");
6765
+ let t2 = p_(e4);
6766
+ if (!t2 || !(t2.phase_name || t2.illumination != null || t2.moon_sign)) {
6767
+ D_("Moon phase data could not be parsed from the server response.", O_);
6747
6768
  return;
6748
6769
  }
6749
- __ = n2, p_.setAttribute("hidden", ""), m_.removeAttribute("hidden"), c_(m_, n2, b_, x_);
6770
+ b_ = t2, g_.setAttribute("hidden", ""), __.removeAttribute("hidden"), c_(__, t2, C_, w_);
6750
6771
  } catch (e5) {
6751
- S_("An error occurred while rendering the moon phase dial."), console.error("[MoonPhase] Render error:", e5);
6772
+ D_("An error occurred while rendering the moon phase dial.", O_), console.error("[MoonPhase] Render error:", e5);
6752
6773
  }
6753
- }, u_(g_, { loadingEl: p_, contentEl: m_, statusFn: y_, paramControls: null }), (async function() {
6774
+ }, u_(y_, { loadingEl: g_, contentEl: __, statusFn: S_, paramControls: null }), T_ = setTimeout(() => {
6775
+ D_("Moon phase data is taking longer than expected.", O_);
6776
+ }, 3e4), (async function() {
6754
6777
  try {
6755
- await g_.connect();
6756
- var e4 = g_.getHostCapabilities();
6757
- v_ = !!(e4 != null && e4.modelContext), f_(g_);
6778
+ await y_.connect();
6779
+ var e4 = y_.getHostCapabilities();
6780
+ x_ = !!(e4 != null && e4.modelContext), f_(y_);
6758
6781
  } catch (e5) {
6759
6782
  console.error("[MoonPhase] connect() failed:", e5);
6760
6783
  }
@@ -7,7 +7,7 @@
7
7
  <title>Transit Timeline Explorer</title>
8
8
 
9
9
 
10
- <style>*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary:#090b0f;--bg-secondary:#12161d;--bg-tertiary:#1c222b;--bg-hover:#272e3b;--border:#282e38;--border-subtle:#1d2229;--text-primary:#e1e5eb;--text-secondary:#9da5b1;--text-muted:#6c727b;--accent:#7caeff;--accent-glow:rgba(99,143,216,.25);--radius:8px;--radius-sm:4px;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .036047 .0438664 .059078);--bg-secondary:color(display-p3 .0739679 .0866504 .111186);--bg-tertiary:color(display-p3 .114361 .13221 .166818);--bg-hover:color(display-p3 .15679 .180114 .225406);--border:color(display-p3 .161376 .180145 .216325);--border-subtle:color(display-p3 .118728 .13221 .158123);--text-primary:color(display-p3 .883958 .896627 .920543);--text-secondary:color(display-p3 .622745 .646433 .6914);--text-muted:color(display-p3 .429297 .445909 .477439);--accent:color(display-p3 .504479 .673595 1.02281);--accent-glow:color(display-p3 .425092 .556285 .824818/.25)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(3.02674% -.179462 -2.15476);--bg-secondary:lab(7.16596% -.441141 -5.41423);--bg-tertiary:lab(12.9118% -.60384 -7.27841);--bg-hover:lab(18.6882% -.727877 -9.08878);--border:lab(18.7165% -.689313 -7.30941);--border-subtle:lab(12.9391% -.548743 -5.49436);--text-primary:lab(90.6878% -.517368 -3.73452);--text-secondary:lab(67.45% -.932217 -7.41489);--text-muted:lab(47.7476% -.701487 -5.56231);--accent:lab(69.9955% 1.58134 -53.1349);--accent-glow:lab(58.6334% .6136 -42.6155/.25)}}@media (prefers-color-scheme:light){:root{--bg-primary:#f3f5f9;--bg-secondary:#e7ebf2;--bg-tertiary:#d8dee8;--bg-hover:#d0d8e5;--border:#bdc5d1;--border-subtle:#d2d8e2;--text-primary:#0f1216;--text-secondary:#414853;--text-muted:#6c727b;--accent:#2a5fb7;--accent-glow:rgba(70,113,183,.15);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .95471 .961142 .973263);--bg-secondary:color(display-p3 .909797 .922535 .946581);--bg-tertiary:color(display-p3 .852455 .871315 .906983);--bg-hover:color(display-p3 .821139 .84609 .893374);--border:color(display-p3 .745559 .770059 .816515);--border-subtle:color(display-p3 .826933 .845684 .881152);--text-primary:color(display-p3 .0608605 .0691527 .0850621);--text-secondary:color(display-p3 .261513 .281801 .32064);--text-muted:color(display-p3 .429297 .445909 .477439);--accent:color(display-p3 .22062 .369139 .694389);--accent-glow:color(display-p3 .31272 .437198 .696973/.15)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(96.5044% -.267148 -1.87216);--bg-secondary:lab(93.0079% -.518024 -3.73493);--bg-tertiary:lab(88.3503% -.749856 -5.58736);--bg-hover:lab(86.0117% -.963002 -7.43048);--border:lab(79.0511% -.952899 -7.42528);--border-subtle:lab(86.0302% -.748128 -5.58645);--text-primary:lab(5.23796% -.285208 -3.0582);--text-secondary:lab(30.3224% -.794604 -7.35167);--text-muted:lab(47.7476% -.701487 -5.56231);--accent:lab(40.6749% 7.04834 -52.5258);--accent-glow:lab(46.9518% 2.04313 -42.3932/.15)}}}html,body{background:var(--bg-primary);width:100%;height:100%;color:var(--text-primary);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.5;overflow:hidden}body{flex-direction:column;display:flex}#app{flex-direction:column;flex:1;display:flex;overflow:hidden}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}#loading-state[hidden]{display:none}.oe-loader{width:48px;height:48px;animation:1.2s linear infinite spin}.oe-loader circle{fill:none;stroke:var(--accent);stroke-width:3px;stroke-dasharray:200;stroke-dashoffset:80px;stroke-linecap:round}@keyframes spin{to{transform:rotate(360deg)}}.chart-status{background:var(--bg-secondary);border-top:1px solid var(--border-subtle);color:var(--text-muted);opacity:0;z-index:50;padding:6px 14px;font-size:11px;transition:opacity .2s,transform .2s;position:fixed;bottom:0;left:0;right:0;transform:translateY(100%)}.chart-status.visible{opacity:1;transform:translateY(0)}.pan-zoom-controls{z-index:40;gap:4px;display:flex;position:absolute;top:8px;right:8px}.pan-zoom-controls[hidden]{display:none}.pan-btn{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);width:28px;height:28px;color:var(--text-secondary);cursor:pointer;justify-content:center;align-items:center;font-size:14px;transition:background .15s,color .15s;display:flex}.pan-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.pan-btn.reset{width:auto;padding:0 10px;font-size:12px}#timeline-container{flex-direction:column;flex:1;gap:10px;padding:16px;display:flex;position:relative;overflow-y:auto}#timeline-container[hidden]{display:none}.tl-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.tl-header-left{flex-direction:column;gap:3px;display:flex}.tl-title{letter-spacing:-.02em;background:linear-gradient(135deg,#accfff,#be95ff);background:linear-gradient(135deg,color(display-p3 .663419 .805776 1.09027),color(display-p3 .719754 .587108 .989297));background:linear-gradient(135deg,lab(81.935% -1.1887 -42.9782),lab(68.7632% 32.9719 -49.9367));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;font-size:18px;font-weight:700}.tl-subtitle{color:var(--text-muted);font-size:12px}.tl-aspect-badge{background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-secondary);border-radius:12px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin-top:2px;padding:2px 8px;font-size:11px;display:inline-block}.tl-header-right{align-items:center;gap:6px;display:flex}.tl-natal-bar{background:var(--bg-secondary);border:1px solid var(--border-subtle);border-radius:var(--radius);flex-wrap:wrap;align-items:center;gap:6px;padding:8px 12px;display:flex}.tl-natal-label{color:var(--text-muted);margin-right:2px;font-size:11px}.info-chip{border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border-subtle);color:var(--text-secondary);font-variant-numeric:tabular-nums;align-items:center;padding:2px 6px;font-size:11px;display:inline-flex}.tl-axis{align-items:flex-end;gap:0;display:flex}.tl-axis-label-col{flex-shrink:0;width:100px}.tl-axis-track{border-bottom:1px solid var(--border);flex:1;height:24px;position:relative}.tl-axis-tick{position:absolute;bottom:0;transform:translate(-50%)}.tl-axis-tick:before{content:"";background:var(--border);width:1px;height:6px;margin:0 auto;display:block}.tl-axis-tick span{color:var(--text-muted);white-space:nowrap;text-align:center;margin-bottom:4px;font-size:10px;display:block}.tl-body{flex-direction:column;gap:0;display:flex}.tl-row{border-bottom:1px solid var(--border-subtle);align-items:stretch;min-height:36px;transition:background .15s;display:flex}.tl-row:hover{background:var(--bg-secondary)}.tl-row-label{border-right:2px solid var(--planet-color,var(--border));flex-shrink:0;align-items:center;gap:6px;width:100px;padding:6px 10px;display:flex}.tl-planet-glyph{color:var(--planet-color,var(--text-primary));text-shadow:0 0 8px var(--planet-color,transparent);opacity:.9;font-size:16px}.tl-planet-name{color:var(--text-secondary);text-transform:capitalize;font-size:11px;font-weight:600}.tl-row-track{flex:1;align-items:center;padding:4px 0;display:flex;position:relative}.tl-grid-line{background:var(--border-subtle);opacity:.5;width:1px;position:absolute;top:0;bottom:0}.tl-bar{cursor:pointer;z-index:2;border-radius:4px;justify-content:center;align-items:center;height:24px;transition:filter .15s,transform .15s,box-shadow .15s;display:flex;position:absolute}.tl-bar:hover{filter:brightness(1.15);z-index:3;box-shadow:0 2px 12px var(--bar-color,#6b90cc);transform:scaleY(1.15)}@supports (color:color(display-p3 0 0 0)){.tl-bar:hover{box-shadow:0 2px 12px var(--bar-color,color(display-p3 .449061 .559519 .781774))}}@supports (color:lab(0% 0 0)){.tl-bar:hover{box-shadow:0 2px 12px var(--bar-color,lab(58.8216% -.557482 -35.7189))}}.tl-bar.active{filter:brightness(1.25);z-index:4;box-shadow:0 0 16px var(--bar-color,#6b90cc);transform:scaleY(1.2)}@supports (color:color(display-p3 0 0 0)){.tl-bar.active{box-shadow:0 0 16px var(--bar-color,color(display-p3 .449061 .559519 .781774))}}@supports (color:lab(0% 0 0)){.tl-bar.active{box-shadow:0 0 16px var(--bar-color,lab(58.8216% -.557482 -35.7189))}}.tl-bar-fill{border-radius:inherit;background:var(--bar-color);opacity:.35;position:absolute;top:0;bottom:0;left:0;right:0}.tl-bar:hover .tl-bar-fill,.tl-bar.active .tl-bar-fill{opacity:.55}.tl-bar-marker{color:var(--bar-color);filter:brightness(1.6)saturate(1.2);text-shadow:0 0 6px var(--bar-color);pointer-events:none;font-size:10px;position:absolute;top:50%;transform:translate(-50%,-50%)}.tl-bar-label{color:var(--text-primary);opacity:0;pointer-events:none;white-space:nowrap;font-size:10px;font-weight:600;transition:opacity .15s;position:relative}.tl-bar:hover .tl-bar-label{opacity:1}.action-btn{border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;align-items:center;gap:4px;padding:6px 12px;font-size:12px;font-weight:600;transition:background .15s,color .15s,box-shadow .15s;display:inline-flex}.action-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.action-btn--primary{color:#cbdfff;color:color(display-p3 .811259 .873257 .992208);color:lab(88.2011% -1.89927 -18.3428);background:linear-gradient(135deg,#1d4587,#32326d);background:linear-gradient(135deg,color(display-p3 .153533 .2659 .511983),color(display-p3 .195291 .194916 .412031));background:linear-gradient(135deg,lab(29.3399% 5.63866 -42.0206),lab(23.3003% 14.2058 -35.0966));border-color:#33548c;border-color:color(display-p3 .229049 .327581 .533696);border-color:lab(35.4848% 1.84765 -35.3079)}.action-btn--primary:hover{background:linear-gradient(135deg,#2151a1,#3d3c86);background:linear-gradient(135deg,color(display-p3 .180134 .31482 .611657),color(display-p3 .239239 .236673 .50744));background:linear-gradient(135deg,lab(34.9279% 7.15981 -48.9835),lab(28.8006% 17.5515 -42.0715));box-shadow:0 2px 12px rgba(29,69,135,.3);box-shadow:0 2px 12px color(display-p3 .153533 .2659 .511983/.3);box-shadow:0 2px 12px lab(29.3399% 5.63866 -42.0206/.3)}.error-state,.empty-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:32px;display:flex}.error-icon,.empty-icon{font-size:32px}.empty-title{color:var(--text-primary);font-size:16px;font-weight:600}.empty-desc{color:var(--text-muted);font-size:13px}.tl-tooltip{z-index:200;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);pointer-events:auto;flex-direction:column;gap:8px;min-width:230px;max-width:270px;padding:12px 14px 10px;animation:.15s tt-in;display:flex;position:absolute;box-shadow:0 8px 32px rgba(0,0,0,.45),0 2px 8px rgba(0,0,0,.3);box-shadow:0 8px 32px color(display-p3 0 0 0/.45),0 2px 8px color(display-p3 0 0 0/.3);box-shadow:0 8px 32px lab(0% 0 0/.45),0 2px 8px lab(0% 0 0/.3)}@keyframes tt-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.tl-tooltip[hidden]{display:none!important}.tl-tooltip-close{border:1px solid var(--border);background:var(--bg-tertiary);width:20px;height:20px;color:var(--text-muted);cursor:pointer;border-radius:50%;justify-content:center;align-items:center;font-size:13px;line-height:1;transition:background .12s,color .12s;display:flex;position:absolute;top:8px;right:8px}.tl-tooltip-close:hover{background:var(--bg-hover);color:var(--text-primary)}.tl-tooltip-planet{color:var(--text-primary);flex-wrap:wrap;align-items:center;gap:5px;padding-right:24px;font-size:14px;font-weight:600;display:flex}.tt-sep{color:var(--text-muted);margin:0 2px;font-size:12px}.tl-tooltip-aspect{background:var(--bg-tertiary);border:1px solid var(--border-subtle);color:var(--text-secondary);border-radius:10px;align-self:flex-start;align-items:center;padding:2px 8px;font-size:11px;display:inline-flex}.tl-tooltip-dates{border-top:1px solid var(--border-subtle);flex-direction:column;gap:4px;padding-top:8px;display:flex}.tt-date-row{color:var(--text-secondary);font-variant-numeric:tabular-nums;align-items:center;gap:10px;font-size:12px;display:flex}.tt-dl{text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);flex-shrink:0;width:52px;font-size:10px;font-weight:600}.tt-date-peak{color:var(--text-primary);font-weight:600}.tt-date-peak .tt-dl{color:var(--accent,#6fa4fc)}@supports (color:color(display-p3 0 0 0)){.tt-date-peak .tt-dl{color:var(--accent,color(display-p3 .481698 .638218 .960393))}}@supports (color:lab(0% 0 0)){.tt-date-peak .tt-dl{color:var(--accent,lab(66.5981% 1.20059 -49.6365))}}.tl-tooltip-claude{border-radius:var(--radius-sm);color:#c1d9ff;color:color(display-p3 .774044 .847695 .989755);color:lab(85.8279% -2.03902 -21.9173);cursor:pointer;background:linear-gradient(135deg,#253e7c,#2e2e62);background:linear-gradient(135deg,color(display-p3 .166649 .240671 .470633),color(display-p3 .178667 .179657 .371356));background:linear-gradient(135deg,lab(26.9892% 7.73893 -38.9991),lab(21.137% 12.4425 -31.621));border:1px solid #33548c;border:1px solid color(display-p3 .229049 .327581 .533696);border:1px solid lab(35.4848% 1.84765 -35.3079);width:100%;margin-top:2px;padding:7px 10px;font-size:12px;font-weight:600;transition:background .15s,box-shadow .15s}.tl-tooltip-claude:hover{background:linear-gradient(135deg,#2c4a96,#39387b);background:linear-gradient(135deg,color(display-p3 .198595 .287609 .56917),color(display-p3 .222009 .221094 .465204));background:linear-gradient(135deg,lab(32.552% 9.74825 -46.0441),lab(26.6408% 15.748 -38.595));box-shadow:0 2px 10px rgba(29,69,135,.3);box-shadow:0 2px 10px color(display-p3 .153533 .2659 .511983/.3);box-shadow:0 2px 10px lab(29.3399% 5.63866 -42.0206/.3)}.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)}}
10
+ <style>*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary:#090b0f;--bg-secondary:#12161d;--bg-tertiary:#1c222b;--bg-hover:#272e3b;--border:#282e38;--border-subtle:#1d2229;--text-primary:#e1e5eb;--text-secondary:#9da5b1;--text-muted:#6c727b;--accent:#7caeff;--accent-glow:rgba(99,143,216,.25);--radius:8px;--radius-sm:4px;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .036047 .0438664 .059078);--bg-secondary:color(display-p3 .0739679 .0866504 .111186);--bg-tertiary:color(display-p3 .114361 .13221 .166818);--bg-hover:color(display-p3 .15679 .180114 .225406);--border:color(display-p3 .161376 .180145 .216325);--border-subtle:color(display-p3 .118728 .13221 .158123);--text-primary:color(display-p3 .883958 .896627 .920543);--text-secondary:color(display-p3 .622745 .646433 .6914);--text-muted:color(display-p3 .429297 .445909 .477439);--accent:color(display-p3 .504479 .673595 1.02281);--accent-glow:color(display-p3 .425092 .556285 .824818/.25)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(3.02674% -.179462 -2.15476);--bg-secondary:lab(7.16596% -.441141 -5.41423);--bg-tertiary:lab(12.9118% -.60384 -7.27841);--bg-hover:lab(18.6882% -.727877 -9.08878);--border:lab(18.7165% -.689313 -7.30941);--border-subtle:lab(12.9391% -.548743 -5.49436);--text-primary:lab(90.6878% -.517368 -3.73452);--text-secondary:lab(67.45% -.932217 -7.41489);--text-muted:lab(47.7476% -.701487 -5.56231);--accent:lab(69.9955% 1.58134 -53.1349);--accent-glow:lab(58.6334% .6136 -42.6155/.25)}}@media (prefers-color-scheme:light){:root{--bg-primary:#f3f5f9;--bg-secondary:#e7ebf2;--bg-tertiary:#d8dee8;--bg-hover:#d0d8e5;--border:#bdc5d1;--border-subtle:#d2d8e2;--text-primary:#0f1216;--text-secondary:#414853;--text-muted:#6c727b;--accent:#2a5fb7;--accent-glow:rgba(70,113,183,.15);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .95471 .961142 .973263);--bg-secondary:color(display-p3 .909797 .922535 .946581);--bg-tertiary:color(display-p3 .852455 .871315 .906983);--bg-hover:color(display-p3 .821139 .84609 .893374);--border:color(display-p3 .745559 .770059 .816515);--border-subtle:color(display-p3 .826933 .845684 .881152);--text-primary:color(display-p3 .0608605 .0691527 .0850621);--text-secondary:color(display-p3 .261513 .281801 .32064);--text-muted:color(display-p3 .429297 .445909 .477439);--accent:color(display-p3 .22062 .369139 .694389);--accent-glow:color(display-p3 .31272 .437198 .696973/.15)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(96.5044% -.267148 -1.87216);--bg-secondary:lab(93.0079% -.518024 -3.73493);--bg-tertiary:lab(88.3503% -.749856 -5.58736);--bg-hover:lab(86.0117% -.963002 -7.43048);--border:lab(79.0511% -.952899 -7.42528);--border-subtle:lab(86.0302% -.748128 -5.58645);--text-primary:lab(5.23796% -.285208 -3.0582);--text-secondary:lab(30.3224% -.794604 -7.35167);--text-muted:lab(47.7476% -.701487 -5.56231);--accent:lab(40.6749% 7.04834 -52.5258);--accent-glow:lab(46.9518% 2.04313 -42.3932/.15)}}}html,body{background:var(--bg-primary);width:100%;height:100%;color:var(--text-primary);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.5;overflow:hidden}body{flex-direction:column;display:flex}#app{flex-direction:column;flex:1;display:flex;overflow:hidden}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}#loading-state[hidden]{display:none}.oe-loader{width:48px;height:48px;animation:1.2s linear infinite spin}.oe-loader circle{fill:none;stroke:var(--accent);stroke-width:3px;stroke-dasharray:200;stroke-dashoffset:80px;stroke-linecap:round}@keyframes spin{to{transform:rotate(360deg)}}.chart-status{background:var(--bg-secondary);border-top:1px solid var(--border-subtle);color:var(--text-muted);opacity:0;z-index:50;padding:6px 14px;font-size:11px;transition:opacity .2s,transform .2s;position:fixed;bottom:0;left:0;right:0;transform:translateY(100%)}.chart-status.visible{opacity:1;transform:translateY(0)}.pan-zoom-controls{z-index:40;gap:4px;display:flex;position:absolute;top:8px;right:8px}.pan-zoom-controls[hidden]{display:none}.pan-btn{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);width:28px;height:28px;color:var(--text-secondary);cursor:pointer;justify-content:center;align-items:center;font-size:14px;transition:background .15s,color .15s;display:flex}.pan-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.pan-btn.reset{width:auto;padding:0 10px;font-size:12px}#timeline-container{flex-direction:column;flex:1;gap:10px;padding:16px;display:flex;position:relative;overflow-y:auto}#timeline-container[hidden]{display:none}.tl-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.tl-header-left{flex-direction:column;gap:3px;display:flex}.tl-title{letter-spacing:-.02em;background:linear-gradient(135deg,#accfff,#be95ff);background:linear-gradient(135deg,color(display-p3 .663419 .805776 1.09027),color(display-p3 .719754 .587108 .989297));background:linear-gradient(135deg,lab(81.935% -1.1887 -42.9782),lab(68.7632% 32.9719 -49.9367));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;font-size:18px;font-weight:700}.tl-subtitle{color:var(--text-muted);font-size:12px}.tl-aspect-badge{background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-secondary);border-radius:12px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin-top:2px;padding:2px 8px;font-size:11px;display:inline-block}.tl-header-right{align-items:center;gap:6px;display:flex}.tl-natal-bar{background:var(--bg-secondary);border:1px solid var(--border-subtle);border-radius:var(--radius);flex-wrap:wrap;align-items:center;gap:6px;padding:8px 12px;display:flex}.tl-natal-label{color:var(--text-muted);margin-right:2px;font-size:11px}.info-chip{border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border-subtle);color:var(--text-secondary);font-variant-numeric:tabular-nums;align-items:center;padding:2px 6px;font-size:11px;display:inline-flex}.tl-axis{align-items:flex-end;gap:0;display:flex}.tl-axis-label-col{flex-shrink:0;width:100px}.tl-axis-track{border-bottom:1px solid var(--border);flex:1;height:24px;position:relative}.tl-axis-tick{position:absolute;bottom:0;transform:translate(-50%)}.tl-axis-tick:before{content:"";background:var(--border);width:1px;height:6px;margin:0 auto;display:block}.tl-axis-tick span{color:var(--text-muted);white-space:nowrap;text-align:center;margin-bottom:4px;font-size:10px;display:block}.tl-body{flex-direction:column;gap:0;display:flex}.tl-row{border-bottom:1px solid var(--border-subtle);align-items:stretch;min-height:36px;transition:background .15s;display:flex}.tl-row:hover{background:var(--bg-secondary)}.tl-row-label{border-right:2px solid var(--planet-color,var(--border));flex-shrink:0;align-items:center;gap:6px;width:100px;padding:6px 10px;display:flex}.tl-planet-glyph{color:var(--planet-color,var(--text-primary));text-shadow:0 0 8px var(--planet-color,transparent);opacity:.9;font-size:16px}.tl-planet-name{color:var(--text-secondary);text-transform:capitalize;font-size:11px;font-weight:600}.tl-row-track{flex:1;align-items:center;padding:4px 0;display:flex;position:relative}.tl-grid-line{background:var(--border-subtle);opacity:.5;width:1px;position:absolute;top:0;bottom:0}.tl-bar{cursor:pointer;z-index:2;border-radius:4px;justify-content:center;align-items:center;height:24px;transition:filter .15s,transform .15s,box-shadow .15s;display:flex;position:absolute}.tl-bar:hover{filter:brightness(1.15);z-index:3;box-shadow:0 2px 12px var(--bar-color,#6b90cc);transform:scaleY(1.15)}@supports (color:color(display-p3 0 0 0)){.tl-bar:hover{box-shadow:0 2px 12px var(--bar-color,color(display-p3 .449061 .559519 .781774))}}@supports (color:lab(0% 0 0)){.tl-bar:hover{box-shadow:0 2px 12px var(--bar-color,lab(58.8216% -.557482 -35.7189))}}.tl-bar.active{filter:brightness(1.25);z-index:4;box-shadow:0 0 16px var(--bar-color,#6b90cc);transform:scaleY(1.2)}@supports (color:color(display-p3 0 0 0)){.tl-bar.active{box-shadow:0 0 16px var(--bar-color,color(display-p3 .449061 .559519 .781774))}}@supports (color:lab(0% 0 0)){.tl-bar.active{box-shadow:0 0 16px var(--bar-color,lab(58.8216% -.557482 -35.7189))}}.tl-bar-fill{border-radius:inherit;background:var(--bar-color);opacity:.35;position:absolute;top:0;bottom:0;left:0;right:0}.tl-bar:hover .tl-bar-fill,.tl-bar.active .tl-bar-fill{opacity:.55}.tl-bar-marker{color:var(--bar-color);filter:brightness(1.6)saturate(1.2);text-shadow:0 0 6px var(--bar-color);pointer-events:none;font-size:10px;position:absolute;top:50%;transform:translate(-50%,-50%)}.tl-bar-label{color:var(--text-primary);opacity:0;pointer-events:none;white-space:nowrap;font-size:10px;font-weight:600;transition:opacity .15s;position:relative}.tl-bar:hover .tl-bar-label{opacity:1}.action-btn{border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;align-items:center;gap:4px;padding:6px 12px;font-size:12px;font-weight:600;transition:background .15s,color .15s,box-shadow .15s;display:inline-flex}.action-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.action-btn--primary{color:#cbdfff;color:color(display-p3 .811259 .873257 .992208);color:lab(88.2011% -1.89927 -18.3428);background:linear-gradient(135deg,#1d4587,#32326d);background:linear-gradient(135deg,color(display-p3 .153533 .2659 .511983),color(display-p3 .195291 .194916 .412031));background:linear-gradient(135deg,lab(29.3399% 5.63866 -42.0206),lab(23.3003% 14.2058 -35.0966));border-color:#33548c;border-color:color(display-p3 .229049 .327581 .533696);border-color:lab(35.4848% 1.84765 -35.3079)}.action-btn--primary:hover{background:linear-gradient(135deg,#2151a1,#3d3c86);background:linear-gradient(135deg,color(display-p3 .180134 .31482 .611657),color(display-p3 .239239 .236673 .50744));background:linear-gradient(135deg,lab(34.9279% 7.15981 -48.9835),lab(28.8006% 17.5515 -42.0715));box-shadow:0 2px 12px rgba(29,69,135,.3);box-shadow:0 2px 12px color(display-p3 .153533 .2659 .511983/.3);box-shadow:0 2px 12px lab(29.3399% 5.63866 -42.0206/.3)}.error-state,.empty-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:32px;display:flex}.error-icon,.empty-icon{font-size:32px}.empty-title{color:var(--text-primary);font-size:16px;font-weight:600}.empty-desc{color:var(--text-muted);font-size:13px}.tl-tooltip{z-index:200;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);pointer-events:auto;flex-direction:column;gap:8px;min-width:230px;max-width:270px;padding:12px 14px 10px;animation:.15s tt-in;display:flex;position:absolute;box-shadow:0 8px 32px rgba(0,0,0,.45),0 2px 8px rgba(0,0,0,.3);box-shadow:0 8px 32px color(display-p3 0 0 0/.45),0 2px 8px color(display-p3 0 0 0/.3);box-shadow:0 8px 32px lab(0% 0 0/.45),0 2px 8px lab(0% 0 0/.3)}@keyframes tt-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.tl-tooltip[hidden]{display:none!important}.tl-tooltip-close{border:1px solid var(--border);background:var(--bg-tertiary);width:20px;height:20px;color:var(--text-muted);cursor:pointer;border-radius:50%;justify-content:center;align-items:center;font-size:13px;line-height:1;transition:background .12s,color .12s;display:flex;position:absolute;top:8px;right:8px}.tl-tooltip-close:hover{background:var(--bg-hover);color:var(--text-primary)}.tl-tooltip-planet{color:var(--text-primary);flex-wrap:wrap;align-items:center;gap:5px;padding-right:24px;font-size:14px;font-weight:600;display:flex}.tt-sep{color:var(--text-muted);margin:0 2px;font-size:12px}.tl-tooltip-aspect{background:var(--bg-tertiary);border:1px solid var(--border-subtle);color:var(--text-secondary);border-radius:10px;align-self:flex-start;align-items:center;padding:2px 8px;font-size:11px;display:inline-flex}.tl-tooltip-dates{border-top:1px solid var(--border-subtle);flex-direction:column;gap:4px;padding-top:8px;display:flex}.tt-date-row{color:var(--text-secondary);font-variant-numeric:tabular-nums;align-items:center;gap:10px;font-size:12px;display:flex}.tt-dl{text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);flex-shrink:0;width:52px;font-size:10px;font-weight:600}.tt-date-peak{color:var(--text-primary);font-weight:600}.tt-date-peak .tt-dl{color:var(--accent,#6fa4fc)}@supports (color:color(display-p3 0 0 0)){.tt-date-peak .tt-dl{color:var(--accent,color(display-p3 .481698 .638218 .960393))}}@supports (color:lab(0% 0 0)){.tt-date-peak .tt-dl{color:var(--accent,lab(66.5981% 1.20059 -49.6365))}}.tl-tooltip-claude{border-radius:var(--radius-sm);color:#c1d9ff;color:color(display-p3 .774044 .847695 .989755);color:lab(85.8279% -2.03902 -21.9173);cursor:pointer;background:linear-gradient(135deg,#253e7c,#2e2e62);background:linear-gradient(135deg,color(display-p3 .166649 .240671 .470633),color(display-p3 .178667 .179657 .371356));background:linear-gradient(135deg,lab(26.9892% 7.73893 -38.9991),lab(21.137% 12.4425 -31.621));border:1px solid #33548c;border:1px solid color(display-p3 .229049 .327581 .533696);border:1px solid lab(35.4848% 1.84765 -35.3079);width:100%;margin-top:2px;padding:7px 10px;font-size:12px;font-weight:600;transition:background .15s,box-shadow .15s}.tl-tooltip-claude:hover{background:linear-gradient(135deg,#2c4a96,#39387b);background:linear-gradient(135deg,color(display-p3 .198595 .287609 .56917),color(display-p3 .222009 .221094 .465204));background:linear-gradient(135deg,lab(32.552% 9.74825 -46.0441),lab(26.6408% 15.748 -38.595));box-shadow:0 2px 10px rgba(29,69,135,.3);box-shadow:0 2px 10px color(display-p3 .153533 .2659 .511983/.3);box-shadow:0 2px 10px lab(29.3399% 5.63866 -42.0206/.3)}.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)}}@media (max-width:480px){body,#app{padding:0}#pan-zoom-controls{flex-wrap:wrap;gap:6px}.pan-btn{min-width:40px;min-height:40px}.controls,.control-row{flex-wrap:wrap;gap:8px}}
11
11
  /*$vite$:1*/</style>
12
12
  </head>
13
13
  <body>
@@ -1,26 +1,26 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <meta name="color-scheme" content="dark light" />
7
- <title>Vedic Jyotish Chart</title>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="color-scheme" content="dark light" />
7
+ <title>Vedic Jyotish Chart</title>
8
8
 
9
9
 
10
10
  <style>*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary:#05070c;--bg-secondary:#0d1219;--bg-tertiary:#171d26;--bg-hover:#222935;--border:#2c333e;--border-subtle:#1b1f27;--text-primary:#e1e5eb;--text-secondary:#979fab;--text-muted:#646972;--gold:#eaab05;--gold-dim:#aa7e1a;--gold-glow:rgba(234,171,5,.25);--gold-subtle:rgba(234,171,5,.08);--planet-sun:#ffa837;--planet-moon:#a1cae8;--planet-mercury:#6ec272;--planet-venus:#f18ac1;--planet-mars:#fc5855;--planet-jupiter:#eaab05;--planet-saturn:#8fa6cb;--planet-rahu:#8186d7;--planet-ketu:#da8659;--dignity-exalted:#eaab05;--dignity-debilitated:#f3625d;--dignity-own:#6ec272;--radius:6px;--radius-sm:3px;--radius-lg:10px;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .0216652 .0286234 .0452973);--bg-secondary:color(display-p3 .0560261 .0691379 .0946654);--bg-tertiary:color(display-p3 .096217 .113655 .147573);--bg-hover:color(display-p3 .137776 .160653 .2052);--border:color(display-p3 .178937 .199903 .240355);--border-subtle:color(display-p3 .108709 .122909 .150282);--text-primary:color(display-p3 .883958 .896627 .920543);--text-secondary:color(display-p3 .598684 .622198 .66685);--text-muted:color(display-p3 .39567 .412041 .443131);--gold:color(display-p3 .879508 .6816 .234703);--gold-dim:color(display-p3 .639817 .500341 .194357);--gold-glow:color(display-p3 .879508 .6816 .234703/.25);--gold-subtle:color(display-p3 .879508 .6816 .234703/.08);--planet-sun:color(display-p3 .979154 .659227 .21215);--planet-moon:color(display-p3 .664971 .787746 .896611);--planet-mercury:color(display-p3 .509102 .751692 .477144);--planet-venus:color(display-p3 .89124 .561977 .746576);--planet-mars:color(display-p3 .913707 .390639 .360361);--planet-jupiter:color(display-p3 .879508 .6816 .234703);--planet-saturn:color(display-p3 .57766 .647332 .78263);--planet-rahu:color(display-p3 .510127 .524428 .81989);--planet-ketu:color(display-p3 .810621 .541171 .382256);--dignity-exalted:color(display-p3 .879508 .6816 .234703);--dignity-debilitated:color(display-p3 .885816 .42028 .386667);--dignity-own:color(display-p3 .509102 .751692 .477144)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(1.96267% -.122614 -2.00764);--bg-secondary:lab(5.21286% -.326827 -5.10724);--bg-tertiary:lab(10.5893% -.558816 -7.26317);--bg-hover:lab(16.3655% -.679582 -9.07274);--border:lab(21.0274% -.743657 -8.03484);--border-subtle:lab(11.7732% -.55144 -5.84751);--text-primary:lab(90.6878% -.517368 -3.73452);--text-secondary:lab(65.1297% -.927329 -7.41251);--text-muted:lab(44.2672% -.694215 -5.55873);--gold:lab(74.5441% 15.4997 76.437);--gold-dim:lab(55.9871% 11.3091 55.5836);--gold-glow:lab(74.5441% 15.4997 76.437/.25);--gold-subtle:lab(74.5441% 15.4997 76.437/.08);--planet-sun:lab(76.3024% 31.6825 83.6057);--planet-moon:lab(79.1643% -8.79321 -19.3308);--planet-mercury:lab(71.5613% -39.2213 32.0347);--planet-venus:lab(70.2618% 44.9914 -10.5022);--planet-mars:lab(60.882% 63.057 37.6481);--planet-jupiter:lab(74.5441% 15.4997 76.437);--planet-saturn:lab(67.2517% -1.74686 -21.8131);--planet-rahu:lab(58.1033% 13.5385 -42.6181);--planet-ketu:lab(64.4827% 30.1677 38.2587);--dignity-exalted:lab(74.5441% 15.4997 76.437);--dignity-debilitated:lab(61.0965% 56.6147 33.1618);--dignity-own:lab(71.5613% -39.2213 32.0347)}}@media (prefers-color-scheme:light){:root{--bg-primary:#f3f5f8;--bg-secondary:#e5e8ed;--bg-tertiary:#d3d8e0;--bg-hover:#c4cbd7;--border:#b1b8c3;--border-subtle:#ccd1d9;--text-primary:#0b0d12;--text-secondary:#3d434c;--text-muted:#646971;--gold:#896100;--gold-dim:#6f4b00;--gold-glow:rgba(137,97,0,.2);--gold-subtle:rgba(137,97,0,.07);--planet-sun:#a45f00;--planet-moon:#1b5274;--planet-mercury:#006c15;--planet-venus:#a03273;--planet-mars:#bd001b;--planet-jupiter:#896100;--planet-saturn:#3f5374;--planet-rahu:#413e96;--planet-ketu:#964100;--dignity-exalted:#896100;--dignity-debilitated:#bd001b;--dignity-own:#006c15;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .955887 .961034 .970732);--bg-secondary:color(display-p3 .899196 .909367 .928554);--bg-tertiary:color(display-p3 .8304 .845419 .873798);--bg-hover:color(display-p3 .772896 .795102 .837167);--border:color(display-p3 .698201 .719987 .761278);--border-subtle:color(display-p3 .805005 .819937 .848152);--text-primary:color(display-p3 .0441372 .0521689 .0676233);--text-secondary:color(display-p3 .242812 .260856 .295362);--text-muted:color(display-p3 .396691 .411981 .440999);--gold:color(display-p3 .57038 .356834 -.203198);--gold-dim:color(display-p3 .442672 .285282 -.134595);--gold-glow:color(display-p3 .57038 .356834 -.203198/.2);--gold-subtle:color(display-p3 .57038 .356834 -.203198/.07);--planet-sun:color(display-p3 .652927 .351579 -.183632);--planet-moon:color(display-p3 .168375 .317534 .44376);--planet-mercury:color(display-p3 .148908 .420483 .120432);--planet-venus:color(display-p3 .579328 .227384 .442243);--planet-mars:color(display-p3 .694209 .0659429 .120262);--planet-jupiter:color(display-p3 .57038 .356834 -.203198);--planet-saturn:color(display-p3 .262684 .323159 .443709);--planet-rahu:color(display-p3 .254224 .245063 .569023);--planet-ketu:color(display-p3 .557919 .263616 .052663);--dignity-exalted:color(display-p3 .57038 .356834 -.203198);--dignity-debilitated:color(display-p3 .694209 .0659429 .120262);--dignity-own:color(display-p3 .148908 .420483 .120432)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(96.5076% -.214994 -1.49846);--bg-secondary:lab(91.8546% -.419319 -2.9907);--bg-tertiary:lab(86.0409% -.610828 -4.47587);--bg-hover:lab(81.3789% -.873804 -6.69111);--border:lab(74.4184% -.864774 -6.68644);--border-subtle:lab(83.7208% -.609636 -4.47524);--text-primary:lab(3.67543% -.212148 -2.43837);--text-secondary:lab(28.0109% -.729963 -6.62285);--text-muted:lab(44.2712% -.656128 -5.19227);--gold:lab(44.0736% 22.5353 118.781);--gold-dim:lab(34.8944% 16.8155 79.322);--gold-glow:lab(44.0736% 22.5353 118.781/.2);--gold-subtle:lab(44.0736% 22.5353 118.781/.07);--planet-sun:lab(47.0942% 34.9095 115.734);--planet-moon:lab(32.6468% -8.89629 -25.0579);--planet-mercury:lab(39.2064% -45.2416 40.6297);--planet-venus:lab(39.8088% 50.4598 -11.9132);--planet-mars:lab(39.7145% 70.0599 49.6254);--planet-jupiter:lab(44.0736% 22.5353 118.781);--planet-saturn:lab(34.713% -.692427 -21.5121);--planet-rahu:lab(30.7426% 21.8588 -48.9882);--planet-ketu:lab(38.7083% 37.2573 56.6234);--dignity-exalted:lab(44.0736% 22.5353 118.781);--dignity-debilitated:lab(39.7145% 70.0599 49.6254);--dignity-own:lab(39.2064% -45.2416 40.6297)}}}html,body{background:var(--bg-primary);width:100%;height:100%;color:var(--text-primary);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.5;overflow:hidden}body{flex-direction:column;display:flex}#app{flex-direction:column;flex:1;display:flex;overflow:hidden}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}#loading-state[hidden]{display:none}.oe-loader{width:48px;height:48px;animation:1.4s linear infinite spin}.oe-loader circle{fill:none;stroke:var(--gold);stroke-width:3px;stroke-dasharray:200;stroke-dashoffset:80px;stroke-linecap:round}@keyframes spin{to{transform:rotate(360deg)}}.chart-status{background:var(--bg-secondary);border-top:1px solid var(--border-subtle);color:var(--text-muted);opacity:0;z-index:50;padding:6px 14px;font-size:11px;transition:opacity .2s,transform .2s;position:fixed;bottom:0;left:0;right:0;transform:translateY(100%)}.chart-status.visible{opacity:1;transform:translateY(0)}#vedic-container{flex-direction:column;flex:1;align-items:center;gap:12px;padding:12px;display:flex;overflow-y:auto}#vedic-container[hidden]{display:none}.vedic-header{justify-content:space-between;align-items:center;gap:8px;width:100%;max-width:540px;animation:.5s ease-out vedic-fade-in;display:flex}.vedic-title{text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);font-size:12px;font-weight:700}.vedic-header-meta{align-items:center;gap:8px;display:flex}.vedic-ayanamsa-badge{border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border-subtle);color:var(--text-secondary);font-variant-numeric:tabular-nums;padding:2px 8px;font-size:10px;font-weight:600}.vedic-toggle-btn{border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;padding:3px 8px;font-size:10px;font-weight:600;transition:background .15s,color .15s}.vedic-toggle-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.vedic-toggle-btn.active{border-color:var(--gold-dim);color:var(--gold);background:var(--gold-subtle)}.rashi-grid{aspect-ratio:1;border:1px solid var(--border);border-radius:var(--radius);width:min(100%,540px);box-shadow:0 0 0 1px var(--border-subtle), 0 4px 32px rgba(0,0,0,.3);grid-template-rows:repeat(4,1fr);grid-template-columns:repeat(4,1fr);animation:.6s ease-out vedic-fade-in;display:grid;overflow:hidden}@supports (color:color(display-p3 0 0 0)){.rashi-grid{box-shadow:0 0 0 1px var(--border-subtle), 0 4px 32px color(display-p3 0 0 0/.3)}}@supports (color:lab(0% 0 0)){.rashi-grid{box-shadow:0 0 0 1px var(--border-subtle), 0 4px 32px lab(0% 0 0/.3)}}@keyframes vedic-fade-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.rashi-cell{background:var(--bg-secondary);border:1px solid var(--border-subtle);cursor:pointer;flex-direction:column;min-width:0;min-height:0;padding:4px 5px;transition:background .12s,box-shadow .12s;display:flex;position:relative;overflow:hidden}.rashi-cell.occupied:hover{background:var(--bg-hover);box-shadow:inset 0 0 0 1px var(--gold-glow), 0 0 12px var(--gold-glow);z-index:2}.rashi-cell.lagna{border-color:var(--gold-dim);background:#110d05;background:color(display-p3 .0641956 .0497811 .0230015);background:lab(3.71843% .818238 3.47664)}.rashi-cell.lagna:hover{box-shadow:inset 0 0 0 1px var(--gold), 0 0 18px var(--gold-glow)}.rashi-cell.center{background:var(--bg-primary);border-color:var(--border-subtle);cursor:default;text-align:center;justify-content:center;align-items:center;gap:2px}.rashi-cell.center:hover{background:var(--bg-primary);box-shadow:none}.cell-sign{text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;flex-shrink:0;font-size:9px;font-weight:700;line-height:1.2;overflow:hidden}.cell-sign-devanagari{color:var(--text-muted);flex-shrink:0;font-family:Noto Sans Devanagari,Mangal,sans-serif;font-size:10px;line-height:1.2;display:none}#vedic-container.show-devanagari .cell-sign-devanagari{display:block}#vedic-container.show-devanagari .cell-sign{display:none}.cell-top-row{flex-shrink:0;justify-content:space-between;align-items:baseline;gap:2px;min-width:0;display:flex}.cell-house-num{color:var(--text-muted);opacity:.5;font-variant-numeric:tabular-nums;flex-shrink:0;font-size:8px;font-weight:700;line-height:1}.rashi-cell.lagna .cell-house-num{color:var(--gold-dim);opacity:1}.cell-planets{flex-wrap:wrap;gap:2px;min-height:0;margin-top:auto;padding-top:2px;display:flex;overflow:hidden}.planet-badge{white-space:nowrap;font-variant-numeric:tabular-nums;background:rgba(0,0,0,.2);background:color(display-p3 0 0 0/.2);background:lab(0% 0 0/.2);border-radius:2px;padding:1px 3px;font-size:10px;font-weight:700;line-height:1}.planet-badge[data-planet=sun]{color:var(--planet-sun)}.planet-badge[data-planet=moon]{color:var(--planet-moon)}.planet-badge[data-planet=mercury]{color:var(--planet-mercury)}.planet-badge[data-planet=venus]{color:var(--planet-venus)}.planet-badge[data-planet=mars]{color:var(--planet-mars)}.planet-badge[data-planet=jupiter]{color:var(--planet-jupiter)}.planet-badge[data-planet=saturn]{color:var(--planet-saturn)}.planet-badge[data-planet=rahu]{color:var(--planet-rahu)}.planet-badge[data-planet=ketu]{color:var(--planet-ketu)}.planet-badge .retro{opacity:.75;font-size:8px}.planet-badge .dignity-ex{color:var(--dignity-exalted);font-size:7px}.planet-badge .dignity-db{color:var(--dignity-debilitated);font-size:7px}@media (max-width:420px){.planet-label-full{display:none}.planet-label-short{display:inline}}@media (min-width:421px){.planet-label-full{display:inline}.planet-label-short{display:none}}.lagna-diagonal{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.lagna-diagonal line{stroke:var(--gold);stroke-width:1.5px;stroke-linecap:round;opacity:.7}.center-label{text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted);font-size:9px;font-weight:700}.center-ayanamsa{color:var(--gold-dim);font-family:JetBrains Mono,Fira Mono,ui-monospace,monospace;font-size:10px;font-weight:600}.center-lagna{color:var(--text-secondary);font-family:Noto Sans Devanagari,Mangal,sans-serif;font-size:11px;font-weight:700}.vedic-legend{flex-wrap:wrap;justify-content:center;gap:6px 12px;width:100%;max-width:540px;animation:.8s ease-out .2s both vedic-fade-in;display:flex}.legend-item{color:var(--text-muted);align-items:center;gap:4px;font-size:10px;display:flex}.legend-dot{border-radius:50%;flex-shrink:0;width:7px;height:7px}.vedic-actions{flex-wrap:wrap;gap:6px;width:100%;max-width:540px;animation:.8s ease-out .3s both vedic-fade-in;display:flex}.action-btn{border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;align-items:center;gap:4px;padding:7px 12px;font-size:11px;font-weight:600;transition:background .15s,color .15s,box-shadow .15s;display:inline-flex}.action-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.action-btn--primary{color:#cbdfff;color:color(display-p3 .811259 .873257 .992208);color:lab(88.2011% -1.89927 -18.3428);background:linear-gradient(135deg,#1d4587,#32326d);background:linear-gradient(135deg,color(display-p3 .153533 .2659 .511983),color(display-p3 .195291 .194916 .412031));background:linear-gradient(135deg,lab(29.3399% 5.63866 -42.0206),lab(23.3003% 14.2058 -35.0966));border-color:#33548c;border-color:color(display-p3 .229049 .327581 .533696);border-color:lab(35.4848% 1.84765 -35.3079)}.action-btn--primary:hover{background:linear-gradient(135deg,#2151a1,#3d3c86);background:linear-gradient(135deg,color(display-p3 .180134 .31482 .611657),color(display-p3 .239239 .236673 .50744));background:linear-gradient(135deg,lab(34.9279% 7.15981 -48.9835),lab(28.8006% 17.5515 -42.0715));box-shadow:0 2px 12px rgba(29,69,135,.3);box-shadow:0 2px 12px color(display-p3 .153533 .2659 .511983/.3);box-shadow:0 2px 12px lab(29.3399% 5.63866 -42.0206/.3)}.vedic-drawer-overlay{z-index:60;opacity:0;background:rgba(0,0,0,.45);background:color(display-p3 0 0 0/.45);background:lab(0% 0 0/.45);transition:opacity .2s;position:fixed;top:0;bottom:0;left:0;right:0}.vedic-drawer-overlay.visible{opacity:1}.vedic-drawer{background:var(--bg-secondary);border-top:1px solid var(--border);border-radius:var(--radius-lg) var(--radius-lg) 0 0;z-index:61;max-height:65vh;padding:16px;transition:transform .25s ease-out;position:fixed;bottom:0;left:0;right:0;overflow-y:auto;transform:translateY(100%)}.vedic-drawer.visible{transform:translateY(0)}.drawer-handle{background:var(--border);border-radius:2px;width:36px;height:4px;margin:0 auto 14px}.drawer-sign-title{align-items:center;gap:8px;margin-bottom:4px;font-size:16px;font-weight:700;display:flex}.drawer-sign-devanagari{color:var(--text-secondary);font-family:Noto Sans Devanagari,Mangal,sans-serif;font-size:14px;font-weight:400}.drawer-sign-element{border-radius:var(--radius-sm);background:var(--bg-tertiary);color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;padding:2px 7px;font-size:10px;font-weight:600}.drawer-section{margin-top:14px}.drawer-section-title{text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted);margin-bottom:8px;font-size:10px;font-weight:700}.drawer-planet-row{background:var(--bg-tertiary);border-radius:var(--radius-sm);align-items:flex-start;gap:10px;margin-bottom:5px;padding:8px 10px;display:flex}.drawer-planet-abbr{min-width:22px;font-size:14px;font-weight:700}.drawer-planet-info{flex-direction:column;flex:1;gap:1px;display:flex}.drawer-planet-name{color:var(--text-primary);font-size:12px;font-weight:600}.drawer-planet-meta{color:var(--text-secondary);font-size:11px}.drawer-planet-nakshatra{color:var(--text-muted);font-size:10px}.drawer-planet-dignity{border-radius:10px;align-self:center;margin-left:auto;padding:1px 5px;font-size:9px;font-weight:700}.drawer-planet-dignity.exalted{background:var(--gold-subtle);color:var(--gold)}.drawer-planet-dignity.debilitated{color:var(--planet-mars);background:rgba(243,98,93,.12);background:color(display-p3 .885816 .42028 .386667/.12);background:lab(61.0965% 56.6147 33.1618/.12)}.drawer-planet-dignity.own{color:var(--planet-mercury);background:rgba(110,194,114,.1);background:color(display-p3 .509102 .751692 .477144/.1);background:lab(71.5613% -39.2213 32.0347/.1)}.error-state,.empty-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:32px;display:flex}.error-icon,.empty-icon{font-size:32px}.tooltip{z-index:100;border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-primary);pointer-events:none;opacity:0;white-space:pre-line;max-width:220px;padding:5px 9px;font-size:11px;transition:opacity .15s;position:fixed}.tooltip.visible{opacity:1}@media (max-width:360px){.cell-sign{font-size:7px}.planet-badge{padding:1px 2px;font-size:8px}#vedic-container{gap:8px;padding:8px}.vedic-legend{display:none}}@media (max-width:420px){.cell-sign{font-size:8px}.center-ayanamsa{font-size:9px}}.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)}}
11
11
  /*$vite$:1*/</style>
12
- </head>
13
- <body>
14
- <div id="app">
15
- <div id="loading-state">
16
- <svg class="oe-loader" viewBox="0 0 100 100"><circle cx="50" cy="50" r="45"/></svg>
17
- <p>Computing Vedic chart…</p>
18
- </div>
19
- <div id="chart-status" class="chart-status" role="status" aria-live="polite"></div>
20
- <div id="vedic-container" hidden></div>
21
- <div id="tooltip" class="tooltip" role="tooltip"></div>
22
- </div>
23
-
12
+ </head>
13
+ <body>
14
+ <div id="app">
15
+ <div id="loading-state">
16
+ <svg class="oe-loader" viewBox="0 0 100 100"><circle cx="50" cy="50" r="45"/></svg>
17
+ <p>Computing Vedic chart…</p>
18
+ </div>
19
+ <div id="chart-status" class="chart-status" role="status" aria-live="polite"></div>
20
+ <div id="vedic-container" hidden></div>
21
+ <div id="tooltip" class="tooltip" aria-live="polite"></div>
22
+ </div>
23
+
24
24
  <script type="module">(function() {
25
25
  let e2 = document.createElement("link").relList;
26
26
  if (e2 && e2.supports && e2.supports("modulepreload")) return;
@@ -206,5 +206,5 @@ function F(e2) {
206
206
  }
207
207
  document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", C) : C();
208
208
  </script>
209
- </body>
210
- </html>
209
+ </body>
210
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openephemeris/mcp-server",
3
- "version": "3.14.0",
3
+ "version": "3.16.0",
4
4
  "description": "Model Context Protocol server for the Open Ephemeris astronomical computation API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -29,6 +29,8 @@
29
29
  "start:sse": "node dist/server-sse.js",
30
30
  "test": "vitest run --exclude \"dist/**\"",
31
31
  "test:watch": "vitest --exclude \"dist/**\"",
32
+ "harness": "vite --config vite.harness.config.ts",
33
+ "validate:visual": "node scripts/visual-check.mjs",
32
34
  "test:integration": "tsx scripts/test-client.ts",
33
35
  "test:sse": "tsx scripts/test-sse-client.ts",
34
36
  "typecheck": "tsc --noEmit",
@@ -77,6 +79,8 @@
77
79
  "zod": "^4.1.13"
78
80
  },
79
81
  "devDependencies": {
82
+ "@axe-core/playwright": "^4.11.3",
83
+ "@playwright/test": "^1.60.0",
80
84
  "@types/express": "^5.0.3",
81
85
  "@types/node": "^25.0.1",
82
86
  "adm-zip": "^0.5.17",