@openephemeris/mcp-server 3.21.1 → 3.23.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.
- package/CHANGELOG.md +41 -0
- package/LICENSE +21 -21
- package/README.md +2 -2
- package/dist/index.js +45 -0
- package/dist/server-sse.js +52 -3
- package/dist/tools/apps/bazi-app.d.ts +24 -0
- package/dist/tools/apps/bazi-app.js +231 -0
- package/dist/tools/apps/bi-wheel-app.js +3 -1
- package/dist/tools/apps/bodygraph-app.js +55 -10
- package/dist/tools/apps/moon-phase-app.js +141 -93
- package/dist/tools/apps/transit-timeline-app.d.ts +20 -0
- package/dist/tools/apps/transit-timeline-app.js +302 -0
- package/dist/tools/apps/vedic-chart-app.d.ts +25 -0
- package/dist/tools/apps/vedic-chart-app.js +297 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/specialized/bi_wheel.js +1 -0
- package/dist/tools/specialized/chart_wheel.js +1 -0
- package/dist/tools/specialized/hd_bodygraph.js +1 -0
- package/dist/tools/specialized/human_design.js +1 -0
- package/dist/tools/specialized/moon.js +1 -0
- package/dist/tools/specialized/natal.js +6 -1
- package/dist/ui/bazi.html +6928 -0
- package/dist/ui/bi-wheel.html +2091 -2031
- package/dist/ui/bodygraph.html +286 -221
- package/dist/ui/chart-wheel.html +552 -453
- package/dist/ui/moon-phase.html +310 -42
- package/dist/ui/transit-timeline.html +6911 -0
- package/dist/ui/vedic-chart.html +7043 -0
- package/package.json +2 -2
package/dist/ui/moon-phase.html
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
iframe render time. Styles fall back to the system font stack. -->
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
<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:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.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%}}
|
|
17
|
+
<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:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.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%}}.param-controls{background:var(--surface);border-top:1px solid var(--border);flex-shrink:0;padding:6px 12px}.param-controls-grid{flex-wrap:wrap;align-items:center;gap:6px 10px;display:flex}.param-group{flex-direction:row;align-items:center;gap:6px;display:flex}.param-group label{text-transform:uppercase;color:var(--text-secondary);letter-spacing:.06em;white-space:nowrap;font-size:10px;font-weight:700}.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{background:var(--surface-2);border:1px solid var(--border-strong);color:var(--text);color-scheme:inherit;border-radius:var(--radius-sm);width:120px;height:24px;padding:3px 6px;font-family:inherit;font-size:11px}@media (prefers-reduced-motion:no-preference){.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{transition:border-color .15s}}.param-group input:focus{border-color:var(--gold-dim);outline:none}.loc-searching{border-color:var(--gold-dim)!important}@media (prefers-reduced-motion:no-preference){.loc-searching{animation:1s ease-in-out infinite alternate loc-pulse}}@keyframes loc-pulse{0%{border-color:var(--gold-dim)}to{border-color:rgba(204,156,66,.55);border-color:color(display-p3 .76996 .617341 .321369/.55);border-color:lab(67.5798% 11.9379 52.333/.55)}}.param-group-loc{flex:1;position:relative}.param-group-loc input{width:100%}.loc-suggestions{background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--radius-sm);z-index:100;max-height:200px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 4px 12px rgba(0,0,0,.35);box-shadow:0 4px 12px color(display-p3 0 0 0/.35);box-shadow:0 4px 12px lab(0% 0 0/.35)}.loc-item{color:var(--text);cursor:pointer;white-space:nowrap;text-overflow:ellipsis;border-bottom:1px solid var(--border);padding:8px 10px;font-size:12px;overflow:hidden}.loc-item:last-child{border-bottom:none}@media (prefers-reduced-motion:no-preference){.loc-item{transition:background .1s,color .1s}}.loc-item:hover{background:var(--gold-subtle);color:var(--gold)}.loc-status{color:var(--text-secondary);letter-spacing:.01em;padding:8px 10px;font-size:11px;font-style:italic}.loc-status-error{color:#d76a5a;color:color(display-p3 .788241 .439621 .373983);color:lab(58.1265% 42.6447 29.9439);font-style:normal;font-weight:600}.param-actions{align-items:center;gap:6px;margin-left:auto;display:flex}.param-cost-hint{color:var(--text-secondary);white-space:nowrap;letter-spacing:.02em;font-size:10px}.param-btn-icon{border:1px solid var(--border-strong);color:var(--text-secondary);border-radius:var(--radius-sm);cursor:pointer;background:0 0;justify-content:center;align-items:center;width:24px;height:24px;display:flex}@media (prefers-reduced-motion:no-preference){.param-btn-icon{transition:background .15s,border-color .15s,color .15s}}.param-btn-icon:hover{background:var(--surface-2);color:var(--text);border-color:var(--gold-dim)}.param-btn-primary{color:var(--gold);border-radius:var(--radius-sm);cursor:pointer;text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;background:rgba(204,156,66,.12);background:color(display-p3 .76996 .617341 .321369/.12);background:lab(67.5798% 11.9379 52.333/.12);border:1px solid rgba(204,156,66,.4);border:1px solid color(display-p3 .76996 .617341 .321369/.4);border:1px solid lab(67.5798% 11.9379 52.333/.4);height:24px;padding:3px 10px;font-family:inherit;font-size:10px;font-weight:600}@media (prefers-reduced-motion:no-preference){.param-btn-primary{transition:background .15s,border-color .15s}}.param-btn-primary:hover:not(:disabled){background:rgba(204,156,66,.2);background:color(display-p3 .76996 .617341 .321369/.2);background:lab(67.5798% 11.9379 52.333/.2);border-color:rgba(204,156,66,.65);border-color:color(display-p3 .76996 .617341 .321369/.65);border-color:lab(67.5798% 11.9379 52.333/.65)}.param-btn-primary:disabled{opacity:.5;cursor:not-allowed}@media (prefers-color-scheme:light){.param-group input[type=date],.param-group input[type=time],.param-group input[type=text]{border-color:var(--border-strong);color:var(--text);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background:#fdfcf9;background:color(display-p3 .990365 .986474 .97916);background:lab(98.849% .167578 1.1277)}.loc-suggestions{border-color:var(--border-strong);background:#fdfcf9;background:color(display-p3 .990365 .986474 .97916);background:lab(98.849% .167578 1.1277)}.param-btn-primary{background:rgba(160,112,0,.12);background:color(display-p3 .615135 .441554 -.0204711/.12);background:lab(51.2092% 16.2654 78.3504/.12);border-color:rgba(160,112,0,.4);border-color:color(display-p3 .615135 .441554 -.0204711/.4);border-color:lab(51.2092% 16.2654 78.3504/.4)}.param-btn-primary:hover:not(:disabled){background:rgba(160,112,0,.22);background:color(display-p3 .615135 .441554 -.0204711/.22);background:lab(51.2092% 16.2654 78.3504/.22);border-color:rgba(160,112,0,.65);border-color:color(display-p3 .615135 .441554 -.0204711/.65);border-color:lab(51.2092% 16.2654 78.3504/.65)}}.param-summary-bar{border-bottom:1px solid var(--border);flex-wrap:wrap;align-items:baseline;gap:2px 0;margin-bottom:4px;padding:3px 4px 5px;font-size:10px;line-height:1.3;display:flex}.param-summary-bar[hidden]{display:none}.summary-name{color:var(--gold,#d6a54d);letter-spacing:.01em;padding-right:2px;font-size:12px;font-weight:700}@supports (color:color(display-p3 0 0 0)){.summary-name{color:var(--gold,color(display-p3 .808073 .654274 .358094))}}@supports (color:lab(0% 0 0)){.summary-name{color:var(--gold,lab(71.071% 11.7474 51.7651))}}.summary-datetime{font-variant-numeric:tabular-nums;color:var(--text-secondary);align-items:baseline;gap:4px;font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-size:11px;display:inline-flex}.summary-time-sep{color:var(--border-strong);opacity:.7;font-family:inherit;font-size:9px}.summary-loc{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;max-width:200px;padding-left:2px;font-size:11px;font-style:italic;overflow:hidden}.summary-sep{background:var(--border-strong);opacity:.5;vertical-align:middle;flex-shrink:0;width:1px;height:11px;margin:0 7px;display:inline-block}
|
|
18
18
|
/*$vite$:1*/</style>
|
|
19
19
|
</head>
|
|
20
20
|
<body>
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
setupFullscreenToggle has a host to inject the fullscreen button into. -->
|
|
29
29
|
<div id="pan-zoom-controls" class="pan-zoom-controls" hidden></div>
|
|
30
30
|
<div id="moon-container" hidden></div>
|
|
31
|
+
<div id="param-controls-container" hidden></div>
|
|
31
32
|
<div id="tooltip" class="tooltip" aria-live="polite"></div>
|
|
32
33
|
</div>
|
|
33
34
|
|
|
@@ -6669,14 +6670,97 @@ function c_(e4, t2, n2, r2) {
|
|
|
6669
6670
|
function l_(e4) {
|
|
6670
6671
|
return e4.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
6671
6672
|
}
|
|
6672
|
-
function u_(e4, t2) {
|
|
6673
|
+
function u_(e4, t2, n2 = []) {
|
|
6674
|
+
var r2, i2;
|
|
6675
|
+
if (!t2 || t2.querySelector("#btn-fullscreen")) return;
|
|
6676
|
+
let a2 = document.createElement("button");
|
|
6677
|
+
a2.id = "btn-fullscreen", a2.className = "pan-btn pan-btn--fullscreen", a2.setAttribute("aria-label", "Toggle fullscreen"), a2.innerHTML = '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\n <polyline points="5,1 1,1 1,5"/>\n <polyline points="11,1 15,1 15,5"/>\n <polyline points="5,15 1,15 1,11"/>\n <polyline points="11,15 15,15 15,11"/>\n </svg>';
|
|
6678
|
+
let o2 = a2.innerHTML, s2 = ["param-controls", "aspect-filter", "controls-panel", "mode-badge"];
|
|
6679
|
+
function c2() {
|
|
6680
|
+
if (document.getElementById("fs-bottom-bar") || !n2.length) return;
|
|
6681
|
+
let e5 = document.getElementById("app");
|
|
6682
|
+
if (!e5) return;
|
|
6683
|
+
let t3 = document.createElement("div");
|
|
6684
|
+
t3.id = "fs-bottom-bar";
|
|
6685
|
+
let r3 = document.createElement("div");
|
|
6686
|
+
r3.setAttribute("data-column", "left");
|
|
6687
|
+
let i3 = document.createElement("div");
|
|
6688
|
+
i3.setAttribute("data-column", "center"), i3.setAttribute("aria-hidden", "true");
|
|
6689
|
+
let a3 = document.createElement("div");
|
|
6690
|
+
a3.setAttribute("data-column", "right"), t3.append(r3, i3, a3);
|
|
6691
|
+
for (let e6 of n2) {
|
|
6692
|
+
let t4 = document.getElementById(e6);
|
|
6693
|
+
t4 && (s2.some((t5) => e6.toLowerCase().includes(t5)) ? r3 : a3).appendChild(t4);
|
|
6694
|
+
}
|
|
6695
|
+
e5.appendChild(t3);
|
|
6696
|
+
}
|
|
6697
|
+
function l2() {
|
|
6698
|
+
let e5 = document.getElementById("fs-bottom-bar");
|
|
6699
|
+
if (!e5) return;
|
|
6700
|
+
let t3 = document.getElementById("app");
|
|
6701
|
+
if (!t3) {
|
|
6702
|
+
e5.remove();
|
|
6703
|
+
return;
|
|
6704
|
+
}
|
|
6705
|
+
for (let e6 of n2) {
|
|
6706
|
+
let n3 = document.getElementById(e6);
|
|
6707
|
+
n3 && t3.appendChild(n3);
|
|
6708
|
+
}
|
|
6709
|
+
e5.remove();
|
|
6710
|
+
}
|
|
6711
|
+
function u2(e5) {
|
|
6712
|
+
let t3 = e5 === "fullscreen", n3 = document.body.classList.contains("is-fullscreen");
|
|
6713
|
+
document.body.classList.toggle("is-fullscreen", t3), a2.innerHTML = t3 ? '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\n <polyline points="1,5 5,5 5,1"/>\n <polyline points="15,5 11,5 11,1"/>\n <polyline points="1,11 5,11 5,15"/>\n <polyline points="15,11 11,11 11,15"/>\n </svg>' : o2, a2.setAttribute("aria-label", t3 ? "Exit fullscreen (Esc)" : "Toggle fullscreen"), a2.title = t3 ? "Press Esc or click to exit fullscreen" : "Enter fullscreen", t3 && !n3 && (c2(), f2()), !t3 && n3 && l2();
|
|
6714
|
+
}
|
|
6715
|
+
a2.addEventListener("click", async () => {
|
|
6716
|
+
try {
|
|
6717
|
+
var t3, n3, r3, i3;
|
|
6718
|
+
let a3 = (t3 = e4.getHostContext) == null ? void 0 : t3.call(e4), o3 = (n3 = a3 == null ? void 0 : a3.displayMode) == null ? "inline" : n3, s3 = (r3 = a3 == null ? void 0 : a3.availableDisplayModes) == null ? [] : r3, c3 = o3 === "inline" ? "fullscreen" : "inline";
|
|
6719
|
+
if (s3.length > 0 && !s3.includes(c3)) {
|
|
6720
|
+
console.warn('[AppChrome] Display mode "'.concat(c3, '" not available. Available: ').concat(s3.join(", ")));
|
|
6721
|
+
return;
|
|
6722
|
+
}
|
|
6723
|
+
let l3 = await e4.requestDisplayMode({ mode: c3 });
|
|
6724
|
+
u2((i3 = l3 == null ? void 0 : l3.mode) == null ? "inline" : i3);
|
|
6725
|
+
} catch (e5) {
|
|
6726
|
+
console.warn("[AppChrome] requestDisplayMode failed:", e5);
|
|
6727
|
+
}
|
|
6728
|
+
}), document.addEventListener("keydown", async (t3) => {
|
|
6729
|
+
if (t3.key === "Escape" && document.body.classList.contains("is-fullscreen")) {
|
|
6730
|
+
t3.preventDefault();
|
|
6731
|
+
try {
|
|
6732
|
+
var n3;
|
|
6733
|
+
let t4 = await e4.requestDisplayMode({ mode: "inline" });
|
|
6734
|
+
u2((n3 = t4 == null ? void 0 : t4.mode) == null ? "inline" : n3);
|
|
6735
|
+
} catch (e5) {
|
|
6736
|
+
console.warn("[AppChrome] Escape fullscreen failed:", e5);
|
|
6737
|
+
}
|
|
6738
|
+
}
|
|
6739
|
+
}), (r2 = e4.addEventListener) == null || r2.call(e4, "hostcontextchanged", (e5) => {
|
|
6740
|
+
var t3;
|
|
6741
|
+
u2((t3 = e5 == null ? void 0 : e5.displayMode) == null ? "inline" : t3);
|
|
6742
|
+
});
|
|
6743
|
+
let d2 = (i2 = e4.getHostContext) == null ? void 0 : i2.call(e4);
|
|
6744
|
+
d2 != null && d2.displayMode && u2(d2.displayMode), t2.insertBefore(a2, t2.firstChild), t2.removeAttribute("hidden");
|
|
6745
|
+
function f2() {
|
|
6746
|
+
let e5 = document.getElementById("fs-hint-banner");
|
|
6747
|
+
e5 && e5.remove();
|
|
6748
|
+
let t3 = document.createElement("div");
|
|
6749
|
+
t3.id = "fs-hint-banner", Object.assign(t3.style, { position: "fixed", top: "12px", left: "50%", transform: "translateX(-50%)", background: "oklch(14% 0.012 265 / 0.90)", backdropFilter: "blur(12px)", WebkitBackdropFilter: "blur(12px)", border: "1px solid oklch(72% 0.12 80 / 0.3)", borderRadius: "20px", padding: "6px 16px", fontSize: "11px", fontWeight: "600", color: "oklch(80% 0.08 80)", letterSpacing: "0.04em", zIndex: "9999", pointerEvents: "none", opacity: "0", transition: "opacity 300ms ease", whiteSpace: "nowrap" }), t3.textContent = "Esc \u2014 exit fullscreen & return to Claude chat", document.body.appendChild(t3), requestAnimationFrame(() => {
|
|
6750
|
+
t3.style.opacity = "1";
|
|
6751
|
+
}), setTimeout(() => {
|
|
6752
|
+
t3.style.opacity = "0", setTimeout(() => t3.remove(), 350);
|
|
6753
|
+
}, 4e3);
|
|
6754
|
+
}
|
|
6755
|
+
}
|
|
6756
|
+
function d_(e4, t2) {
|
|
6673
6757
|
e4.ontoolcancelled = (e5) => {
|
|
6674
6758
|
var n2, r2, i2;
|
|
6675
6759
|
let a2 = (n2 = e5.reason) == null ? "Tool call was cancelled" : n2;
|
|
6676
|
-
console.warn("[AppChrome] Tool cancelled:", a2), (r2 = t2.statusFn) == null || r2.call(t2, null), !t2.loadingEl.hidden && t2.loadingEl.getAttribute("hidden") === null && (t2.loadingEl.setAttribute("hidden", ""), t2.contentEl.removeAttribute("hidden")), (i2 = t2.paramControls) == null || i2.setBusy(false),
|
|
6760
|
+
console.warn("[AppChrome] Tool cancelled:", a2), (r2 = t2.statusFn) == null || r2.call(t2, null), !t2.loadingEl.hidden && t2.loadingEl.getAttribute("hidden") === null && (t2.loadingEl.setAttribute("hidden", ""), t2.contentEl.removeAttribute("hidden")), (i2 = t2.paramControls) == null || i2.setBusy(false), f_(a2);
|
|
6677
6761
|
};
|
|
6678
6762
|
}
|
|
6679
|
-
function
|
|
6763
|
+
function f_(e4) {
|
|
6680
6764
|
var t2;
|
|
6681
6765
|
(t2 = document.getElementById("cancel-toast")) == null || t2.remove();
|
|
6682
6766
|
let n2 = document.createElement("div");
|
|
@@ -6684,7 +6768,7 @@ function d_(e4) {
|
|
|
6684
6768
|
n2.classList.remove("visible"), setTimeout(() => n2.remove(), 300);
|
|
6685
6769
|
}, 3e3);
|
|
6686
6770
|
}
|
|
6687
|
-
function
|
|
6771
|
+
function p_(e4) {
|
|
6688
6772
|
var t2;
|
|
6689
6773
|
function n2(e5) {
|
|
6690
6774
|
if (!e5) return;
|
|
@@ -6697,7 +6781,7 @@ function f_(e4) {
|
|
|
6697
6781
|
n2(e5);
|
|
6698
6782
|
});
|
|
6699
6783
|
}
|
|
6700
|
-
function
|
|
6784
|
+
function m_(e4) {
|
|
6701
6785
|
var t2;
|
|
6702
6786
|
if (!e4) return null;
|
|
6703
6787
|
if (e4.structuredContent != null && typeof e4.structuredContent == "object") return e4.structuredContent;
|
|
@@ -6710,29 +6794,194 @@ function p_(e4) {
|
|
|
6710
6794
|
}
|
|
6711
6795
|
return null;
|
|
6712
6796
|
}
|
|
6713
|
-
function
|
|
6797
|
+
function h_(e4) {
|
|
6714
6798
|
return e4.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
6715
6799
|
}
|
|
6716
|
-
function
|
|
6717
|
-
let { container: t2, message: n2, onRetry: r2, retryLabel: i2 = "\u21BA Try again" } = e4, a2 = r2 ? '<button class="error-retry-btn" type="button">'.concat(
|
|
6718
|
-
if (t2.innerHTML = '<div class="error-state" role="alert"><div class="error-icon" aria-hidden="true">\u26A0\uFE0F</div><p class="error-msg">'.concat(
|
|
6800
|
+
function g_(e4) {
|
|
6801
|
+
let { container: t2, message: n2, onRetry: r2, retryLabel: i2 = "\u21BA Try again" } = e4, a2 = r2 ? '<button class="error-retry-btn" type="button">'.concat(h_(i2), "</button>") : "";
|
|
6802
|
+
if (t2.innerHTML = '<div class="error-state" role="alert"><div class="error-icon" aria-hidden="true">\u26A0\uFE0F</div><p class="error-msg">'.concat(h_(n2), "</p>") + a2 + "</div>", t2.removeAttribute("hidden"), r2) {
|
|
6719
6803
|
var o2;
|
|
6720
6804
|
(o2 = t2.querySelector(".error-retry-btn")) == null || o2.addEventListener("click", r2);
|
|
6721
6805
|
}
|
|
6722
6806
|
}
|
|
6723
|
-
var
|
|
6724
|
-
|
|
6725
|
-
|
|
6807
|
+
var __ = class {
|
|
6808
|
+
constructor(e4) {
|
|
6809
|
+
var t2, n2, r2, i2, a2, s2;
|
|
6810
|
+
o(this, "config", void 0), o(this, "params", void 0), o(this, "dateInput", void 0), o(this, "timeInput", void 0), o(this, "refreshBtn", void 0), o(this, "locInput", void 0), o(this, "locDropdown", void 0), o(this, "summaryBar", void 0), o(this, "searchTimeout", null), o(this, "searchVersion", 0), o(this, "isSearching", false), this.config = e4, this.params = { date: ((t2 = e4.initialParams) == null ? void 0 : t2.date) || this.getTodayDate(), time: ((n2 = e4.initialParams) == null ? void 0 : n2.time) || "12:00", latitude: ((r2 = e4.initialParams) == null ? void 0 : r2.latitude) || null, longitude: ((i2 = e4.initialParams) == null ? void 0 : i2.longitude) || null, timezone: ((a2 = e4.initialParams) == null ? void 0 : a2.timezone) || null, locationName: ((s2 = e4.initialParams) == null ? void 0 : s2.locationName) || null }, this.render();
|
|
6811
|
+
}
|
|
6812
|
+
getTodayDate() {
|
|
6813
|
+
return (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
6814
|
+
}
|
|
6815
|
+
getParams() {
|
|
6816
|
+
return { ...this.params };
|
|
6817
|
+
}
|
|
6818
|
+
setBusy(e4) {
|
|
6819
|
+
this.refreshBtn && (this.refreshBtn.disabled = e4, this.refreshBtn.textContent = e4 ? "Recalculating..." : "Recalculate");
|
|
6820
|
+
}
|
|
6821
|
+
updateSummary(e4) {
|
|
6822
|
+
(e4 == null ? void 0 : e4.name) !== void 0 && (this.config.subjectName = e4.name), e4 != null && e4.date && (this.params.date = e4.date), e4 != null && e4.time && (this.params.time = e4.time), e4 != null && e4.location && (this.params.locationName = e4.location), this.renderSummaryBar();
|
|
6823
|
+
}
|
|
6824
|
+
renderSummaryBar() {
|
|
6825
|
+
if (!this.summaryBar) return;
|
|
6826
|
+
let e4 = this.config.subjectName, t2 = this.params.locationName, n2 = this.params.date, r2 = this.params.time, i2 = "";
|
|
6827
|
+
if (n2) try {
|
|
6828
|
+
i2 = (/* @__PURE__ */ new Date(n2 + "T12:00:00")).toLocaleDateString("en-GB", { day: "numeric", month: "short", year: "numeric" });
|
|
6829
|
+
} catch (e5) {
|
|
6830
|
+
i2 = n2;
|
|
6831
|
+
}
|
|
6832
|
+
let a2 = "";
|
|
6833
|
+
r2 && (a2 = r2.substring(0, 5));
|
|
6834
|
+
let o2 = [];
|
|
6835
|
+
if (e4 && o2.push('<span class="summary-name">'.concat(this.escHtml(e4), "</span>")), i2 && a2 ? o2.push('<span class="summary-datetime"><span class="summary-date">'.concat(this.escHtml(i2), '</span><span class="summary-time-sep">@</span><span class="summary-time">').concat(this.escHtml(a2), "</span></span>")) : i2 ? o2.push('<span class="summary-date">'.concat(this.escHtml(i2), "</span>")) : a2 && o2.push('<span class="summary-time">'.concat(this.escHtml(a2), "</span>")), t2 && o2.push('<span class="summary-loc">'.concat(this.escHtml(t2), "</span>")), o2.length === 0) {
|
|
6836
|
+
this.summaryBar.setAttribute("hidden", "");
|
|
6837
|
+
return;
|
|
6838
|
+
}
|
|
6839
|
+
this.summaryBar.removeAttribute("hidden"), this.summaryBar.innerHTML = o2.join('<span class="summary-sep" aria-hidden="true"></span>');
|
|
6840
|
+
}
|
|
6841
|
+
setSearching(e4) {
|
|
6842
|
+
this.isSearching = e4, e4 ? (this.locInput.classList.add("loc-searching"), this.locDropdown.innerHTML = '<div class="loc-status">Searching\u2026</div>', this.locDropdown.removeAttribute("hidden")) : this.locInput.classList.remove("loc-searching");
|
|
6843
|
+
}
|
|
6844
|
+
async searchLocation(e4) {
|
|
6845
|
+
if (e4.length < 2) {
|
|
6846
|
+
this.hideSuggestions();
|
|
6847
|
+
return;
|
|
6848
|
+
}
|
|
6849
|
+
let t2 = ++this.searchVersion;
|
|
6850
|
+
this.setSearching(true);
|
|
6851
|
+
try {
|
|
6852
|
+
var n2;
|
|
6853
|
+
let r2 = await this.config.app.callServerTool({ name: "location_search", arguments: { query: e4 } });
|
|
6854
|
+
if (t2 !== this.searchVersion) return;
|
|
6855
|
+
this.setSearching(false);
|
|
6856
|
+
let i2 = r2, a2 = [];
|
|
6857
|
+
for (let e5 of (n2 = i2.content) == null ? [] : n2) if (e5.type === "text" && e5.text) try {
|
|
6858
|
+
let t3 = JSON.parse(e5.text);
|
|
6859
|
+
Array.isArray(t3) ? a2.push(...t3) : "suggestions" in t3 && Array.isArray(t3.suggestions) ? a2.push(...t3.suggestions) : "displayName" in t3 && a2.push(t3);
|
|
6860
|
+
} catch (e6) {
|
|
6861
|
+
}
|
|
6862
|
+
this.showSuggestions(a2);
|
|
6863
|
+
} catch (e5) {
|
|
6864
|
+
if (t2 !== this.searchVersion) return;
|
|
6865
|
+
this.setSearching(false), console.error("[ParamControls] Location search failed:", e5), this.locDropdown.innerHTML = '<div class="loc-status loc-status-error">Search unavailable \u2014 try again</div>', this.locDropdown.removeAttribute("hidden");
|
|
6866
|
+
}
|
|
6867
|
+
}
|
|
6868
|
+
showSuggestions(e4) {
|
|
6869
|
+
if (this.locDropdown) {
|
|
6870
|
+
if (e4.length === 0) {
|
|
6871
|
+
this.locDropdown.innerHTML = '<div class="loc-status">No locations found</div>', this.locDropdown.removeAttribute("hidden");
|
|
6872
|
+
return;
|
|
6873
|
+
}
|
|
6874
|
+
this.locDropdown.innerHTML = e4.slice(0, 6).map((e5, t2) => '<div class="loc-item" data-idx="'.concat(t2, '">').concat(this.escHtml(e5.displayName), "</div>")).join(""), this.locDropdown.removeAttribute("hidden"), this.locDropdown.querySelectorAll(".loc-item").forEach((t2) => {
|
|
6875
|
+
t2.addEventListener("click", () => {
|
|
6876
|
+
var n2;
|
|
6877
|
+
let r2 = e4[parseInt((n2 = t2.dataset.idx) == null ? "-1" : n2, 10)];
|
|
6878
|
+
r2 && (this.params.latitude = r2.latitude, this.params.longitude = r2.longitude, this.params.timezone = r2.timezone, this.params.locationName = r2.displayName, this.locInput.value = r2.displayName, this.hideSuggestions(), this.renderSummaryBar());
|
|
6879
|
+
});
|
|
6880
|
+
});
|
|
6881
|
+
}
|
|
6882
|
+
}
|
|
6883
|
+
hideSuggestions() {
|
|
6884
|
+
this.locDropdown && (this.locDropdown.innerHTML = "", this.locDropdown.setAttribute("hidden", ""));
|
|
6885
|
+
}
|
|
6886
|
+
render() {
|
|
6887
|
+
this.config.container.innerHTML = "", this.config.container.className = "param-controls", this.summaryBar = document.createElement("div"), this.summaryBar.className = "param-summary-bar", this.summaryBar.setAttribute("hidden", ""), this.config.container.append(this.summaryBar), this.renderSummaryBar();
|
|
6888
|
+
let e4 = document.createElement("div");
|
|
6889
|
+
e4.className = "param-controls-grid";
|
|
6890
|
+
let t2 = document.createElement("div");
|
|
6891
|
+
t2.className = "param-group";
|
|
6892
|
+
let n2 = document.createElement("label");
|
|
6893
|
+
n2.textContent = "Date", n2.htmlFor = "param-ctrl-date", this.dateInput = document.createElement("input"), this.dateInput.type = "date", this.dateInput.id = "param-ctrl-date", this.dateInput.value = this.params.date, this.dateInput.addEventListener("change", (e5) => {
|
|
6894
|
+
this.params.date = e5.target.value, this.renderSummaryBar();
|
|
6895
|
+
}), t2.append(n2, this.dateInput);
|
|
6896
|
+
let r2 = document.createElement("div");
|
|
6897
|
+
r2.className = "param-group";
|
|
6898
|
+
let i2 = document.createElement("label");
|
|
6899
|
+
i2.textContent = "Time (Local)", i2.htmlFor = "param-ctrl-time", this.timeInput = document.createElement("input"), this.timeInput.type = "time", this.timeInput.id = "param-ctrl-time", this.timeInput.value = this.params.time, this.timeInput.addEventListener("change", (e5) => {
|
|
6900
|
+
this.params.time = e5.target.value, this.renderSummaryBar();
|
|
6901
|
+
}), r2.append(i2, this.timeInput);
|
|
6902
|
+
let a2 = document.createElement("div");
|
|
6903
|
+
a2.className = "param-group param-group-loc";
|
|
6904
|
+
let o2 = document.createElement("label");
|
|
6905
|
+
o2.textContent = "Location", o2.htmlFor = "param-ctrl-loc", this.locInput = document.createElement("input"), this.locInput.type = "text", this.locInput.id = "param-ctrl-loc", this.locInput.placeholder = "Search location...", this.locInput.value = this.params.locationName || "", this.locInput.autocomplete = "off", this.locDropdown = document.createElement("div"), this.locDropdown.className = "loc-suggestions", this.locDropdown.setAttribute("hidden", ""), this.locInput.addEventListener("input", (e5) => {
|
|
6906
|
+
let t3 = e5.target.value.trim();
|
|
6907
|
+
this.searchTimeout && clearTimeout(this.searchTimeout), this.searchTimeout = setTimeout(() => void this.searchLocation(t3), 300);
|
|
6908
|
+
}), this.locInput.addEventListener("blur", () => {
|
|
6909
|
+
setTimeout(() => this.hideSuggestions(), 250);
|
|
6910
|
+
}), a2.append(o2, this.locInput, this.locDropdown);
|
|
6911
|
+
let s2 = document.createElement("div");
|
|
6912
|
+
if (s2.className = "param-actions", this.config.showStepControls) {
|
|
6913
|
+
let e5 = document.createElement("button");
|
|
6914
|
+
e5.className = "param-btn-icon", e5.innerHTML = "\u25C0", e5.title = "Previous Day", e5.addEventListener("click", () => this.stepDay(-1));
|
|
6915
|
+
let t3 = document.createElement("button");
|
|
6916
|
+
t3.className = "param-btn-icon", t3.innerHTML = "\u25B6", t3.title = "Next Day", t3.addEventListener("click", () => this.stepDay(1)), s2.append(e5, t3);
|
|
6917
|
+
}
|
|
6918
|
+
if (this.refreshBtn = document.createElement("button"), this.refreshBtn.className = "param-btn-primary", this.refreshBtn.textContent = "Recalculate", this.refreshBtn.addEventListener("click", () => {
|
|
6919
|
+
this.config.onRefresh(this.params);
|
|
6920
|
+
}), s2.append(this.refreshBtn), this.config.costHint) {
|
|
6921
|
+
let e5 = document.createElement("span");
|
|
6922
|
+
e5.className = "param-cost-hint", e5.textContent = this.config.costHint, e5.title = "Approximate credit cost each time you recalculate", s2.append(e5);
|
|
6923
|
+
}
|
|
6924
|
+
this.config.hideLocation ? e4.append(t2, r2, s2) : e4.append(t2, r2, a2, s2), this.config.container.append(e4);
|
|
6925
|
+
}
|
|
6926
|
+
stepDay(e4) {
|
|
6927
|
+
if (!this.params.date) return;
|
|
6928
|
+
let t2 = new Date(this.params.date);
|
|
6929
|
+
t2.setUTCDate(t2.getUTCDate() + e4), this.params.date = t2.toISOString().split("T")[0], this.dateInput.value = this.params.date, this.renderSummaryBar(), this.config.onRefresh(this.params);
|
|
6930
|
+
}
|
|
6931
|
+
escHtml(e4) {
|
|
6932
|
+
return e4.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
6933
|
+
}
|
|
6934
|
+
}, v_ = /* @__PURE__ */ new Set();
|
|
6935
|
+
function y_(e4) {
|
|
6936
|
+
return v_.has(e4);
|
|
6937
|
+
}
|
|
6938
|
+
function b_(e4) {
|
|
6939
|
+
v_.add(e4);
|
|
6940
|
+
}
|
|
6941
|
+
var x_ = { "chart-wheel": { stripIcon: "\u2726", stripTitle: "Welcome to your Natal Chart", stripHints: ["Click any <strong>planet</strong> for a deep placement reading", "Click any <strong>aspect line</strong> for its dynamic interpretation", "Click any <strong>house cusp</strong> for house themes", "Use the <strong>date controls</strong> to move through time"], modalText: "Your birth chart is now rendered \u2014 an exact celestial snapshot of the sky at your moment of birth." }, "bi-wheel": { stripIcon: "\u2295", stripTitle: "Welcome to the Bi-Wheel", stripHints: ["Click any <strong>inner planet</strong> for natal placement depth", "Click any <strong>outer planet</strong> for transit or synastry meaning", "Click a <strong>cross-aspect line</strong> for inter-chart dynamics", "Use the <strong>date controls</strong> to advance transits"], modalText: "Two charts are now layered \u2014 the inner wheel is your natal chart; the outer ring shows the second chart (transits or another person's planets)." }, bodygraph: { stripIcon: "\u25C8", stripTitle: "Welcome to your Bodygraph", stripHints: ["Click any <strong>center</strong> (defined or undefined) for its meaning", "Click any <strong>channel</strong> to explore its life theme", "Click any <strong>gate number</strong> for its I Ching hexagram reading", "Click a <strong>planet row</strong> in the sidebar for its HD role"], modalText: "Your bodygraph is now rendered \u2014 a living map of the energy centres, channels, and gates that define your design." }, "vedic-chart": { stripIcon: "\u{1F549}", stripTitle: "Welcome to your Jyotish Chart", stripHints: ["Click any <strong>rashi cell</strong> for its themes and any planets placed there", "The <strong>diagonal mark</strong> shows your Lagna (Ascendant) rashi", "Use the <strong>action bar</strong> for a full chart interpretation", "Click <strong>Moon & Nakshatra</strong> for lunar mansion detail"], modalText: "Your Vedic birth chart is now rendered as a South Indian Rashi grid \u2014 sidereal planetary placements by fixed sign." }, "transit-timeline": { stripIcon: "\u2604", stripTitle: "Welcome to your Transit Timeline", stripHints: ["Each entry is an <strong>exact transit hit</strong> \u2014 a transiting planet contacting a natal point", "Events are <strong>grouped by month</strong> in chronological order", "The <strong>\u211E marker</strong> flags a retrograde crossing", "Click any transit for a focused <strong>interpretation</strong>"], modalText: "This timeline lists upcoming transits to your natal chart \u2014 the exact dates outer-planet energies activate your placements." }, "moon-phase": { stripIcon: "\u263E", stripTitle: "Welcome to the Moon Phase dial", stripHints: ["Click the <strong>Moon</strong> for its phase interpretation", "Click the <strong>Void-of-Course</strong> card when the Moon is VOC", "Use the <strong>date control</strong> to move the sky to any moment"], modalText: "The dial shows the Moon's live illumination, phase, sign, and void-of-course status \u2014 a snapshot of tonight's sky." }, bazi: { stripIcon: "\u56DB", stripTitle: "Welcome to your BaZi Chart", stripHints: ["Click any <strong>pillar</strong> (Year, Month, Day, Hour) for its interpretation", "The <strong>Day Master</strong> is your core identity element", "The <strong>Wu Xing bar</strong> shows your Five Element balance"], modalText: "Your BaZi (Four Pillars of Destiny) chart is now rendered \u2014 a map of the Heavenly Stems and Earthly Branches present at your moment of birth." } }, S_ = '\n .oe-welcome-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: oklch(0% 0 0 / 0.55);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: oe-fade-in 0.4s ease both;\n font-family: system-ui, sans-serif;\n }\n\n .oe-welcome-modal {\n background: oklch(11% 0.010 265);\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n border-radius: 16px;\n padding: 32px;\n width: 90%;\n max-width: 440px;\n box-shadow: 0 20px 40px oklch(0% 0 0 / 0.55), inset 0 1px 0 oklch(100% 0 0 / 0.06);\n animation: oe-modal-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n\n @keyframes oe-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes oe-modal-in {\n from { opacity: 0; transform: scale(0.95) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .oe-welcome-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 4px;\n }\n\n .oe-welcome-icon {\n font-size: 28px;\n color: var(--gold, oklch(72% 0.12 80));\n line-height: 1;\n text-shadow: 0 0 10px var(--gold-glow, oklch(72% 0.12 80 / 0.30));\n }\n\n .oe-welcome-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--text, oklch(92% 0.006 265));\n margin: 0;\n letter-spacing: 0.02em;\n }\n\n .oe-welcome-text {\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--text-secondary, oklch(68% 0.008 265));\n margin: 0;\n }\n\n .oe-welcome-hints {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin: 8px 0 12px 0;\n padding: 0;\n list-style: none;\n }\n\n .oe-welcome-hints li {\n font-size: 13.5px;\n line-height: 1.4;\n color: var(--text-secondary, oklch(68% 0.008 265));\n display: flex;\n align-items: flex-start;\n gap: 10px;\n opacity: 0;\n animation: oe-fade-in 0.4s ease forwards;\n }\n\n /* Stagger the hints */\n .oe-welcome-hints li:nth-child(1) { animation-delay: 0.15s; }\n .oe-welcome-hints li:nth-child(2) { animation-delay: 0.25s; }\n .oe-welcome-hints li:nth-child(3) { animation-delay: 0.35s; }\n .oe-welcome-hints li:nth-child(4) { animation-delay: 0.45s; }\n\n .oe-welcome-hints li::before {\n content: "\u2726";\n color: var(--gold-dim, oklch(52% 0.06 80));\n font-size: 12px;\n padding-top: 2px;\n }\n\n .oe-welcome-hints strong {\n color: var(--text, oklch(92% 0.006 265));\n font-weight: 600;\n }\n\n .oe-welcome-button {\n align-self: flex-end;\n background: var(--gold-subtle, oklch(72% 0.12 80 / 0.10));\n color: var(--gold, oklch(72% 0.12 80));\n border: 1px solid var(--gold-glow, oklch(72% 0.12 80 / 0.20));\n padding: 10px 24px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.2s ease, border-color 0.2s ease;\n margin-top: 4px;\n }\n\n .oe-welcome-button:hover {\n background: oklch(72% 0.12 80 / 0.18);\n border-color: oklch(72% 0.12 80 / 0.40);\n }\n\n .oe-welcome-button:focus-visible {\n outline: 2px solid var(--gold, oklch(72% 0.12 80));\n outline-offset: 2px;\n }\n\n .oe-welcome-backdrop.is-dismissing {\n animation: oe-fade-out 0.3s ease forwards;\n }\n\n .oe-welcome-backdrop.is-dismissing .oe-welcome-modal {\n animation: oe-modal-out 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n }\n\n @keyframes oe-fade-out {\n to { opacity: 0; }\n }\n\n @keyframes oe-modal-out {\n to { opacity: 0; transform: scale(0.95) translateY(10px); }\n }\n';
|
|
6942
|
+
function C_() {
|
|
6943
|
+
if (document.getElementById("oe-first-run-styles")) return;
|
|
6944
|
+
let e4 = document.createElement("style");
|
|
6945
|
+
e4.id = "oe-first-run-styles", e4.textContent = S_, document.head.appendChild(e4);
|
|
6946
|
+
}
|
|
6947
|
+
function w_(e4, t2) {
|
|
6948
|
+
let n2 = document.activeElement, r2 = document.createElement("div");
|
|
6949
|
+
r2.className = "oe-welcome-backdrop";
|
|
6950
|
+
let i2 = document.createElement("div");
|
|
6951
|
+
i2.className = "oe-welcome-modal", i2.setAttribute("role", "dialog"), i2.setAttribute("aria-modal", "true"), i2.setAttribute("aria-labelledby", "oe-welcome-title");
|
|
6952
|
+
let a2 = e4.stripHints.map((e5) => "<li>".concat(e5, "</li>")).join("");
|
|
6953
|
+
i2.innerHTML = '\n <div class="oe-welcome-header">\n <div class="oe-welcome-icon" aria-hidden="true">'.concat(e4.stripIcon, '</div>\n <h2 id="oe-welcome-title" class="oe-welcome-title">').concat(e4.stripTitle, '</h2>\n </div>\n <p class="oe-welcome-text">').concat(e4.modalText, '</p>\n <ul class="oe-welcome-hints">').concat(a2, '</ul>\n <button class="oe-welcome-button" aria-label="Explore the chart">Explore</button>\n '), r2.appendChild(i2);
|
|
6954
|
+
let o2 = i2.querySelector(".oe-welcome-button"), s2 = () => {
|
|
6955
|
+
r2.classList.add("is-dismissing"), r2.addEventListener("animationend", () => {
|
|
6956
|
+
r2.remove(), n2 == null || n2.focus();
|
|
6957
|
+
}, { once: true }), b_(t2);
|
|
6958
|
+
};
|
|
6959
|
+
return o2.addEventListener("click", s2), r2.addEventListener("click", (e5) => {
|
|
6960
|
+
e5.target === r2 && s2();
|
|
6961
|
+
}), r2.addEventListener("keydown", (e5) => {
|
|
6962
|
+
e5.key === "Escape" && (e5.preventDefault(), s2()), e5.key === "Tab" && (e5.preventDefault(), o2.focus());
|
|
6963
|
+
}), requestAnimationFrame(() => o2.focus()), r2;
|
|
6964
|
+
}
|
|
6965
|
+
function T_(e4, t2) {
|
|
6966
|
+
if (y_(e4)) return;
|
|
6967
|
+
let n2 = x_[e4];
|
|
6968
|
+
C_();
|
|
6969
|
+
let r2 = w_(n2, e4);
|
|
6970
|
+
document.body.appendChild(r2);
|
|
6971
|
+
}
|
|
6972
|
+
var E_ = document.getElementById("loading-state"), D_ = document.getElementById("moon-container"), O_ = document.getElementById("chart-status"), k_ = document.getElementById("param-controls-container"), A_ = new Qg({ name: "Moon Phase Explorer", version: "1.0.0" }), j_ = null, M_ = null, N_ = false;
|
|
6973
|
+
function P_(e4) {
|
|
6974
|
+
if (O_) {
|
|
6726
6975
|
if (!e4) {
|
|
6727
|
-
|
|
6976
|
+
O_.classList.remove("visible");
|
|
6728
6977
|
return;
|
|
6729
6978
|
}
|
|
6730
|
-
|
|
6979
|
+
O_.textContent = "\xB7 " + e4, O_.classList.add("visible");
|
|
6731
6980
|
}
|
|
6732
6981
|
}
|
|
6733
|
-
async function
|
|
6734
|
-
if (
|
|
6735
|
-
var t2 =
|
|
6982
|
+
async function F_(e4) {
|
|
6983
|
+
if (j_) {
|
|
6984
|
+
var t2 = j_, n2 = "";
|
|
6736
6985
|
if (e4.type === "interpret_phase") {
|
|
6737
6986
|
var r2, i2, a2;
|
|
6738
6987
|
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.";
|
|
@@ -6741,50 +6990,69 @@ async function C_(e4) {
|
|
|
6741
6990
|
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?";
|
|
6742
6991
|
}
|
|
6743
6992
|
if (n2) try {
|
|
6744
|
-
await
|
|
6993
|
+
await A_.sendMessage({ role: "user", content: [{ type: "text", text: n2 }] });
|
|
6745
6994
|
} catch (e5) {
|
|
6746
6995
|
console.error("[MoonPhase] sendMessage failed:", e5);
|
|
6747
6996
|
}
|
|
6748
6997
|
}
|
|
6749
6998
|
}
|
|
6750
|
-
async function
|
|
6751
|
-
if (
|
|
6752
|
-
await
|
|
6999
|
+
async function I_(e4) {
|
|
7000
|
+
if (P_(e4), N_) try {
|
|
7001
|
+
await A_.updateModelContext({ content: [{ type: "text", text: "[Moon Phase] User viewed: " + e4 }] });
|
|
6753
7002
|
} catch (e5) {
|
|
6754
7003
|
}
|
|
6755
7004
|
}
|
|
6756
|
-
var
|
|
6757
|
-
function
|
|
6758
|
-
|
|
7005
|
+
var L_;
|
|
7006
|
+
function R_() {
|
|
7007
|
+
L_ && (clearTimeout(L_), L_ = void 0);
|
|
6759
7008
|
}
|
|
6760
|
-
function
|
|
6761
|
-
|
|
7009
|
+
function z_(e4, t2) {
|
|
7010
|
+
R_(), E_.setAttribute("hidden", ""), g_({ container: D_, message: e4, onRetry: t2 });
|
|
6762
7011
|
}
|
|
6763
|
-
function
|
|
6764
|
-
|
|
6765
|
-
|
|
6766
|
-
}, 3e4),
|
|
7012
|
+
function B_() {
|
|
7013
|
+
R_(), D_.setAttribute("hidden", ""), E_.removeAttribute("hidden"), L_ = setTimeout(() => {
|
|
7014
|
+
z_("The moon phase didn't load. Tap to try again.", B_);
|
|
7015
|
+
}, 3e4), A_.sendMessage({ role: "user", content: [{ type: "text", text: "Please regenerate the moon phase." }] }).catch(() => {
|
|
6767
7016
|
});
|
|
6768
7017
|
}
|
|
6769
|
-
|
|
6770
|
-
E_();
|
|
7018
|
+
function V_(e4) {
|
|
7019
|
+
j_ = e4, E_.setAttribute("hidden", ""), D_.removeAttribute("hidden"), c_(D_, e4, F_, I_), H_(e4), k_ == null || k_.removeAttribute("hidden"), T_("moon-phase", D_);
|
|
7020
|
+
}
|
|
7021
|
+
function H_(e4) {
|
|
7022
|
+
var t2;
|
|
7023
|
+
if (M_ || !k_) return;
|
|
7024
|
+
let n2 = (t2 = e4.datetime) == null ? "" : t2, r2 = "", i2 = "12:00";
|
|
7025
|
+
n2.includes("T") && (r2 = n2.split("T")[0], i2 = n2.split("T")[1].substring(0, 5)), M_ = new __({ app: A_, container: k_, initialParams: { date: r2, time: i2 }, hideLocation: true, costHint: "~3 credits", onRefresh: async (e5) => {
|
|
7026
|
+
M_ == null || M_.setBusy(true), E_.removeAttribute("hidden"), D_.setAttribute("hidden", "");
|
|
7027
|
+
try {
|
|
7028
|
+
let t3 = "".concat(e5.date, "T").concat(e5.time, ":00Z"), n3 = new Promise((e6, t4) => setTimeout(() => t4(Error("Moon phase recalculate timed out after 30s")), 3e4)), r3 = m_(await Promise.race([A_.callServerTool({ name: "moon_phase_recalculate", arguments: { datetime: t3 } }), n3]));
|
|
7029
|
+
r3 && (r3.phase_name || r3.illumination != null || r3.moon_sign) ? V_(r3) : j_ && (E_.setAttribute("hidden", ""), D_.removeAttribute("hidden"));
|
|
7030
|
+
} catch (e6) {
|
|
7031
|
+
console.error("[MoonPhase] Recalculate failed or timed out:", e6), j_ && (E_.setAttribute("hidden", ""), D_.removeAttribute("hidden"));
|
|
7032
|
+
} finally {
|
|
7033
|
+
M_ == null || M_.setBusy(false);
|
|
7034
|
+
}
|
|
7035
|
+
} });
|
|
7036
|
+
}
|
|
7037
|
+
A_.ontoolresult = function(e4) {
|
|
7038
|
+
R_();
|
|
6771
7039
|
try {
|
|
6772
|
-
let t2 =
|
|
7040
|
+
let t2 = m_(e4);
|
|
6773
7041
|
if (!t2 || !(t2.phase_name || t2.illumination != null || t2.moon_sign)) {
|
|
6774
|
-
|
|
7042
|
+
z_("Moon phase data could not be parsed from the server response.", B_);
|
|
6775
7043
|
return;
|
|
6776
7044
|
}
|
|
6777
|
-
|
|
7045
|
+
V_(t2);
|
|
6778
7046
|
} catch (e5) {
|
|
6779
|
-
|
|
7047
|
+
z_("An error occurred while rendering the moon phase dial.", B_), console.error("[MoonPhase] Render error:", e5);
|
|
6780
7048
|
}
|
|
6781
|
-
},
|
|
6782
|
-
|
|
7049
|
+
}, d_(A_, { loadingEl: E_, contentEl: D_, statusFn: P_, paramControls: null }), L_ = setTimeout(() => {
|
|
7050
|
+
z_("Moon phase data is taking longer than expected.", B_);
|
|
6783
7051
|
}, 3e4), (async function() {
|
|
6784
7052
|
try {
|
|
6785
|
-
await
|
|
6786
|
-
var e4 =
|
|
6787
|
-
|
|
7053
|
+
await A_.connect();
|
|
7054
|
+
var e4 = A_.getHostCapabilities();
|
|
7055
|
+
N_ = !!(e4 != null && e4.modelContext), u_(A_, document.getElementById("pan-zoom-controls"), ["param-controls-container"]), p_(A_);
|
|
6788
7056
|
} catch (e5) {
|
|
6789
7057
|
console.error("[MoonPhase] connect() failed:", e5);
|
|
6790
7058
|
}
|