@roxyapi/ui 0.8.1 → 0.10.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/AGENTS.md +54 -13
- package/README.md +33 -22
- package/THEMING.md +7 -5
- package/dist/cdn/components/angel-number-card.js +45 -0
- package/dist/cdn/components/angel-number-card.js.map +7 -0
- package/dist/cdn/components/angel-number-lookup.js +45 -0
- package/dist/cdn/components/angel-number-lookup.js.map +7 -0
- package/dist/cdn/components/ashtakavarga-grid.js +3 -3
- package/dist/cdn/components/ashtakavarga-grid.js.map +3 -3
- package/dist/cdn/components/biorhythm-chart.js +3 -3
- package/dist/cdn/components/biorhythm-chart.js.map +3 -3
- package/dist/cdn/components/bodygraph.js +8 -8
- package/dist/cdn/components/bodygraph.js.map +3 -3
- package/dist/cdn/components/choghadiya-grid.js +3 -3
- package/dist/cdn/components/choghadiya-grid.js.map +3 -3
- package/dist/cdn/components/compatibility-card.js +2 -2
- package/dist/cdn/components/compatibility-card.js.map +3 -3
- package/dist/cdn/components/crystal-grid.js +45 -0
- package/dist/cdn/components/crystal-grid.js.map +7 -0
- package/dist/cdn/components/dasha-timeline.js +2 -2
- package/dist/cdn/components/dasha-timeline.js.map +3 -3
- package/dist/cdn/components/data.js +2 -2
- package/dist/cdn/components/data.js.map +3 -3
- package/dist/cdn/components/divisional-chart.js +7 -7
- package/dist/cdn/components/divisional-chart.js.map +3 -3
- package/dist/cdn/components/dosha-card.js +3 -3
- package/dist/cdn/components/dosha-card.js.map +3 -3
- package/dist/cdn/components/dream-card.js +45 -0
- package/dist/cdn/components/dream-card.js.map +7 -0
- package/dist/cdn/components/forecast-timeline.js +3 -3
- package/dist/cdn/components/forecast-timeline.js.map +3 -3
- package/dist/cdn/components/guna-milan.js +3 -3
- package/dist/cdn/components/guna-milan.js.map +3 -3
- package/dist/cdn/components/hexagram.js +2 -2
- package/dist/cdn/components/hexagram.js.map +3 -3
- package/dist/cdn/components/horoscope-card.js +3 -3
- package/dist/cdn/components/horoscope-card.js.map +3 -3
- package/dist/cdn/components/kp-chart.js +2 -2
- package/dist/cdn/components/kp-chart.js.map +3 -3
- package/dist/cdn/components/kp-planets-table.js +3 -3
- package/dist/cdn/components/kp-planets-table.js.map +3 -3
- package/dist/cdn/components/kp-ruling-planets.js +3 -3
- package/dist/cdn/components/kp-ruling-planets.js.map +3 -3
- package/dist/cdn/components/moon-phase.js +3 -3
- package/dist/cdn/components/moon-phase.js.map +3 -3
- package/dist/cdn/components/nakshatra-card.js +3 -3
- package/dist/cdn/components/nakshatra-card.js.map +3 -3
- package/dist/cdn/components/natal-chart.js +2 -2
- package/dist/cdn/components/natal-chart.js.map +3 -3
- package/dist/cdn/components/numerology-card.js +3 -3
- package/dist/cdn/components/numerology-card.js.map +3 -3
- package/dist/cdn/components/panchang-table.js +2 -2
- package/dist/cdn/components/panchang-table.js.map +3 -3
- package/dist/cdn/components/shadbala-table.js +3 -3
- package/dist/cdn/components/shadbala-table.js.map +3 -3
- package/dist/cdn/components/synastry-chart.js +5 -5
- package/dist/cdn/components/synastry-chart.js.map +3 -3
- package/dist/cdn/components/tarot-card.js.map +3 -3
- package/dist/cdn/components/tarot-spread.js +3 -3
- package/dist/cdn/components/tarot-spread.js.map +3 -3
- package/dist/cdn/components/transits-table.js +3 -3
- package/dist/cdn/components/transits-table.js.map +3 -3
- package/dist/cdn/components/vedic-kundli.js +16 -16
- package/dist/cdn/components/vedic-kundli.js.map +3 -3
- package/dist/cdn/components/vedic-planets-table.js +3 -3
- package/dist/cdn/components/vedic-planets-table.js.map +3 -3
- package/dist/cdn/components/western-planets-table.js +2 -2
- package/dist/cdn/components/western-planets-table.js.map +3 -3
- package/dist/cdn/components/yoga-list.js +2 -2
- package/dist/cdn/components/yoga-list.js.map +3 -3
- package/dist/cdn/roxy-ui.js +289 -66
- package/dist/cdn/roxy-ui.js.map +4 -4
- package/dist/cdn.d.ts +8 -0
- package/dist/cdn.d.ts.map +1 -0
- package/dist/components/angel-number-card.d.ts +18 -0
- package/dist/components/angel-number-card.d.ts.map +1 -0
- package/dist/components/angel-number-card.js +2 -0
- package/dist/components/angel-number-card.js.map +7 -0
- package/dist/components/angel-number-lookup.d.ts +18 -0
- package/dist/components/angel-number-lookup.d.ts.map +1 -0
- package/dist/components/angel-number-lookup.js +2 -0
- package/dist/components/angel-number-lookup.js.map +7 -0
- package/dist/components/ashtakavarga-grid.js +1 -1
- package/dist/components/ashtakavarga-grid.js.map +3 -3
- package/dist/components/biorhythm-chart.js +1 -1
- package/dist/components/biorhythm-chart.js.map +3 -3
- package/dist/components/bodygraph.js +4 -4
- package/dist/components/bodygraph.js.map +3 -3
- package/dist/components/choghadiya-grid.js +1 -1
- package/dist/components/choghadiya-grid.js.map +3 -3
- package/dist/components/compatibility-card.js +1 -1
- package/dist/components/compatibility-card.js.map +3 -3
- package/dist/components/crystal-grid.d.ts +27 -0
- package/dist/components/crystal-grid.d.ts.map +1 -0
- package/dist/components/crystal-grid.js +2 -0
- package/dist/components/crystal-grid.js.map +7 -0
- package/dist/components/dasha-timeline.js +1 -1
- package/dist/components/dasha-timeline.js.map +3 -3
- package/dist/components/data.js +1 -1
- package/dist/components/data.js.map +3 -3
- package/dist/components/divisional-chart.js +34 -34
- package/dist/components/divisional-chart.js.map +3 -3
- package/dist/components/dosha-card.js +1 -1
- package/dist/components/dosha-card.js.map +3 -3
- package/dist/components/dream-card.d.ts +17 -0
- package/dist/components/dream-card.d.ts.map +1 -0
- package/dist/components/dream-card.js +2 -0
- package/dist/components/dream-card.js.map +7 -0
- package/dist/components/forecast-timeline.js.map +3 -3
- package/dist/components/guna-milan.js +1 -1
- package/dist/components/guna-milan.js.map +3 -3
- package/dist/components/hexagram.js +1 -1
- package/dist/components/hexagram.js.map +3 -3
- package/dist/components/horoscope-card.js +1 -1
- package/dist/components/horoscope-card.js.map +3 -3
- package/dist/components/kp-chart.js +1 -1
- package/dist/components/kp-chart.js.map +3 -3
- package/dist/components/kp-planets-table.js +1 -1
- package/dist/components/kp-planets-table.js.map +3 -3
- package/dist/components/kp-ruling-planets.js +1 -1
- package/dist/components/kp-ruling-planets.js.map +3 -3
- package/dist/components/moon-phase.js +1 -1
- package/dist/components/moon-phase.js.map +3 -3
- package/dist/components/nakshatra-card.js +1 -1
- package/dist/components/nakshatra-card.js.map +3 -3
- package/dist/components/natal-chart.js +5 -5
- package/dist/components/natal-chart.js.map +3 -3
- package/dist/components/numerology-card.d.ts +7 -3
- package/dist/components/numerology-card.d.ts.map +1 -1
- package/dist/components/numerology-card.js +1 -1
- package/dist/components/numerology-card.js.map +3 -3
- package/dist/components/panchang-table.js +1 -1
- package/dist/components/panchang-table.js.map +3 -3
- package/dist/components/shadbala-table.js +1 -1
- package/dist/components/shadbala-table.js.map +3 -3
- package/dist/components/synastry-chart.js +4 -4
- package/dist/components/synastry-chart.js.map +3 -3
- package/dist/components/tarot-card.js +1 -1
- package/dist/components/tarot-card.js.map +3 -3
- package/dist/components/tarot-spread.js +1 -1
- package/dist/components/tarot-spread.js.map +3 -3
- package/dist/components/transits-table.js +1 -1
- package/dist/components/transits-table.js.map +3 -3
- package/dist/components/vedic-kundli.d.ts +18 -0
- package/dist/components/vedic-kundli.d.ts.map +1 -1
- package/dist/components/vedic-kundli.js +62 -62
- package/dist/components/vedic-kundli.js.map +3 -3
- package/dist/components/vedic-planets-table.js +1 -1
- package/dist/components/vedic-planets-table.js.map +3 -3
- package/dist/components/western-planets-table.js +1 -1
- package/dist/components/western-planets-table.js.map +3 -3
- package/dist/components/yoga-list.js +1 -1
- package/dist/components/yoga-list.js.map +3 -3
- package/dist/index.cjs +74 -74
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +74 -74
- package/dist/index.js.map +4 -4
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.json +28 -24
- package/dist/styles/tokens-css.d.ts +2 -0
- package/dist/styles/tokens-css.d.ts.map +1 -0
- package/dist/styles/tokens.css +26 -11
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.gen.d.ts +43 -26
- package/dist/types/types.gen.d.ts.map +1 -1
- package/dist/utils/inject-tokens.d.ts +16 -0
- package/dist/utils/inject-tokens.d.ts.map +1 -0
- package/dist/utils/kundli-render.d.ts +2 -1
- package/dist/utils/kundli-render.d.ts.map +1 -1
- package/dist/utils/markup-data.d.ts +34 -0
- package/dist/utils/markup-data.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/cdn.ts +15 -0
- package/src/components/angel-number-card.ts +234 -0
- package/src/components/angel-number-lookup.ts +208 -0
- package/src/components/crystal-grid.ts +191 -0
- package/src/components/dream-card.ts +98 -0
- package/src/components/numerology-card.ts +22 -10
- package/src/components/vedic-kundli.ts +37 -2
- package/src/index.ts +14 -0
- package/src/manifest.ts +57 -5
- package/src/styles/tokens-css.ts +225 -0
- package/src/styles/tokens.css +26 -11
- package/src/types/index.ts +1 -1
- package/src/types/types.gen.ts +43 -26
- package/src/utils/inject-tokens.ts +27 -0
- package/src/utils/kundli-render.ts +9 -2
- package/src/utils/markup-data.ts +45 -0
- package/src/version.ts +1 -1
package/dist/cdn/roxy-ui.js
CHANGED
|
@@ -1,96 +1,319 @@
|
|
|
1
|
-
"use strict";var RoxyUI=(()=>{var
|
|
2
|
-
\f\r]`,
|
|
3
|
-
\f\r"'\`<>=]|("|')|))|$)`,"g"),lr=/'/g,dr=/"/g,hr=/^(?:script|style|textarea|title)$/i,_t=n=>(a,...e)=>({_$litType$:n,strings:a,values:e}),s=_t(1),w=_t(2),ls=_t(3),Ne=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),cr=new WeakMap,Re=Le.createTreeWalker(Le,129);function gr(n,a){if(!zt(n)||!n.hasOwnProperty("raw"))throw Error("invalid template strings array");return or!==void 0?or.createHTML(a):a}var Wr=(n,a)=>{let e=n.length-1,t=[],r,o=a===2?"<svg>":a===3?"<math>":"",i=We;for(let d=0;d<e;d++){let c=n[d],m,g,h=-1,y=0;for(;y<c.length&&(i.lastIndex=y,g=i.exec(c),g!==null);)y=i.lastIndex,i===We?g[1]==="!--"?i=nr:g[1]!==void 0?i=ir:g[2]!==void 0?(hr.test(g[2])&&(r=RegExp("</"+g[2],"g")),i=Te):g[3]!==void 0&&(i=Te):i===Te?g[0]===">"?(i=r??We,h=-1):g[1]===void 0?h=-2:(h=i.lastIndex-g[2].length,m=g[1],i=g[3]===void 0?Te:g[3]==='"'?dr:lr):i===dr||i===lr?i=Te:i===nr||i===ir?i=We:(i=Te,r=void 0);let S=i===Te&&n[d+1].startsWith("/>")?" ":"";o+=i===We?c+Fr:h>=0?(t.push(m),c.slice(0,h)+pr+c.slice(h)+ge+S):c+ge+(h===-2?d:S)}return[gr(n,o+(n[e]||"<?>")+(a===2?"</svg>":a===3?"</math>":"")),t]},Ze=class n{constructor({strings:a,_$litType$:e},t){let r;this.parts=[];let o=0,i=0,d=a.length-1,c=this.parts,[m,g]=Wr(a,e);if(this.el=n.createElement(m,t),Re.currentNode=this.el.content,e===2||e===3){let h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(r=Re.nextNode())!==null&&c.length<d;){if(r.nodeType===1){if(r.hasAttributes())for(let h of r.getAttributeNames())if(h.endsWith(pr)){let y=g[i++],S=r.getAttribute(h).split(ge),k=/([.?@])?(.*)/.exec(y);c.push({type:1,index:o,name:k[2],strings:S,ctor:k[1]==="."?Tt:k[1]==="?"?Rt:k[1]==="@"?Lt:He}),r.removeAttribute(h)}else h.startsWith(ge)&&(c.push({type:6,index:o}),r.removeAttribute(h));if(hr.test(r.tagName)){let h=r.textContent.split(ge),y=h.length-1;if(y>0){r.textContent=pt?pt.emptyScript:"";for(let S=0;S<y;S++)r.append(h[S],Je()),Re.nextNode(),c.push({type:2,index:++o});r.append(h[y],Je())}}}else if(r.nodeType===8)if(r.data===mr)c.push({type:2,index:o});else{let h=-1;for(;(h=r.data.indexOf(ge,h+1))!==-1;)c.push({type:7,index:o}),h+=ge.length-1}o++}}static createElement(a,e){let t=Le.createElement("template");return t.innerHTML=a,t}};function Oe(n,a,e=n,t){if(a===Ne)return a;let r=t!==void 0?e._$Co?.[t]:e._$Cl,o=Xe(a)?void 0:a._$litDirective$;return r?.constructor!==o&&(r?._$AO?.(!1),o===void 0?r=void 0:(r=new o(n),r._$AT(n,e,t)),t!==void 0?(e._$Co??=[])[t]=r:e._$Cl=r),r!==void 0&&(a=Oe(n,r._$AS(n,a.values),r,t)),a}var Et=class{constructor(a,e){this._$AV=[],this._$AN=void 0,this._$AD=a,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(a){let{el:{content:e},parts:t}=this._$AD,r=(a?.creationScope??Le).importNode(e,!0);Re.currentNode=r;let o=Re.nextNode(),i=0,d=0,c=t[0];for(;c!==void 0;){if(i===c.index){let m;c.type===2?m=new Qe(o,o.nextSibling,this,a):c.type===1?m=new c.ctor(o,c.name,c.strings,this,a):c.type===6&&(m=new Nt(o,this,a)),this._$AV.push(m),c=t[++d]}i!==c?.index&&(o=Re.nextNode(),i++)}return Re.currentNode=Le,r}p(a){let e=0;for(let t of this._$AV)t!==void 0&&(t.strings!==void 0?(t._$AI(a,t,e),e+=t.strings.length-2):t._$AI(a[e])),e++}},Qe=class n{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(a,e,t,r){this.type=2,this._$AH=l,this._$AN=void 0,this._$AA=a,this._$AB=e,this._$AM=t,this.options=r,this._$Cv=r?.isConnected??!0}get parentNode(){let a=this._$AA.parentNode,e=this._$AM;return e!==void 0&&a?.nodeType===11&&(a=e.parentNode),a}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(a,e=this){a=Oe(this,a,e),Xe(a)?a===l||a==null||a===""?(this._$AH!==l&&this._$AR(),this._$AH=l):a!==this._$AH&&a!==Ne&&this._(a):a._$litType$!==void 0?this.$(a):a.nodeType!==void 0?this.T(a):Ur(a)?this.k(a):this._(a)}O(a){return this._$AA.parentNode.insertBefore(a,this._$AB)}T(a){this._$AH!==a&&(this._$AR(),this._$AH=this.O(a))}_(a){this._$AH!==l&&Xe(this._$AH)?this._$AA.nextSibling.data=a:this.T(Le.createTextNode(a)),this._$AH=a}$(a){let{values:e,_$litType$:t}=a,r=typeof t=="number"?this._$AC(a):(t.el===void 0&&(t.el=Ze.createElement(gr(t.h,t.h[0]),this.options)),t);if(this._$AH?._$AD===r)this._$AH.p(e);else{let o=new Et(r,this),i=o.u(this.options);o.p(e),this.T(i),this._$AH=o}}_$AC(a){let e=cr.get(a.strings);return e===void 0&&cr.set(a.strings,e=new Ze(a)),e}k(a){zt(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,t,r=0;for(let o of a)r===e.length?e.push(t=new n(this.O(Je()),this.O(Je()),this,this.options)):t=e[r],t._$AI(o),r++;r<e.length&&(this._$AR(t&&t._$AB.nextSibling,r),e.length=r)}_$AR(a=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);a!==this._$AB;){let t=sr(a).nextSibling;sr(a).remove(),a=t}}setConnected(a){this._$AM===void 0&&(this._$Cv=a,this._$AP?.(a))}},He=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(a,e,t,r,o){this.type=1,this._$AH=l,this._$AN=void 0,this.element=a,this.name=e,this._$AM=r,this.options=o,t.length>2||t[0]!==""||t[1]!==""?(this._$AH=Array(t.length-1).fill(new String),this.strings=t):this._$AH=l}_$AI(a,e=this,t,r){let o=this.strings,i=!1;if(o===void 0)a=Oe(this,a,e,0),i=!Xe(a)||a!==this._$AH&&a!==Ne,i&&(this._$AH=a);else{let d=a,c,m;for(a=o[0],c=0;c<o.length-1;c++)m=Oe(this,d[t+c],e,c),m===Ne&&(m=this._$AH[c]),i||=!Xe(m)||m!==this._$AH[c],m===l?a=l:a!==l&&(a+=(m??"")+o[c+1]),this._$AH[c]=m}i&&!r&&this.j(a)}j(a){a===l?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,a??"")}},Tt=class extends He{constructor(){super(...arguments),this.type=3}j(a){this.element[this.name]=a===l?void 0:a}},Rt=class extends He{constructor(){super(...arguments),this.type=4}j(a){this.element.toggleAttribute(this.name,!!a&&a!==l)}},Lt=class extends He{constructor(a,e,t,r,o){super(a,e,t,r,o),this.type=5}_$AI(a,e=this){if((a=Oe(this,a,e,0)??l)===Ne)return;let t=this._$AH,r=a===l&&t!==l||a.capture!==t.capture||a.once!==t.once||a.passive!==t.passive,o=a!==l&&(t===l||r);r&&this.element.removeEventListener(this.name,this,t),o&&this.element.addEventListener(this.name,this,a),this._$AH=a}handleEvent(a){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,a):this._$AH.handleEvent(a)}},Nt=class{constructor(a,e,t){this.element=a,this.type=6,this._$AN=void 0,this._$AM=e,this.options=t}get _$AU(){return this._$AM._$AU}_$AI(a){Oe(this,a)}};var Jr=Mt.litHtmlPolyfillSupport;Jr?.(Ze,Qe),(Mt.litHtmlVersions??=[]).push("3.3.2");var ur=(n,a,e)=>{let t=e?.renderBefore??a,r=t._$litPart$;if(r===void 0){let o=e?.renderBefore??null;t._$litPart$=r=new Qe(a.insertBefore(Je(),o),o,void 0,e??{})}return r._$AI(n),r};var Dt=globalThis,f=class extends U{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let a=super.createRenderRoot();return this.renderOptions.renderBefore??=a.firstChild,a}update(a){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(a),this._$Do=ur(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Ne}};f._$litElement$=!0,f.finalized=!0,Dt.litElementHydrateSupport?.({LitElement:f});var Xr=Dt.litElementPolyfillSupport;Xr?.({LitElement:f});(Dt.litElementVersions??=[]).push("4.2.2");var b=n=>(a,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(n,a)}):customElements.define(n,a)};var Zr={attribute:!0,type:String,converter:Ue,reflect:!1,hasChanged:ct},Qr=(n=Zr,a,e)=>{let{kind:t,metadata:r}=e,o=globalThis.litPropertyMetadata.get(r);if(o===void 0&&globalThis.litPropertyMetadata.set(r,o=new Map),t==="setter"&&((n=Object.create(n)).wrapped=!0),o.set(e.name,n),t==="accessor"){let{name:i}=e;return{set(d){let c=a.get.call(this);a.set.call(this,d),this.requestUpdate(i,c,n,!0,d)},init(d){return d!==void 0&&this.C(i,void 0,n,d),d}}}if(t==="setter"){let{name:i}=e;return function(d){let c=this[i];a.call(this,d),this.requestUpdate(i,c,n,!0,d)}}throw Error("Unsupported decorator location: "+t)};function u(n){return(a,e)=>typeof e=="object"?Qr(n,a,e):((t,r,o)=>{let i=r.hasOwnProperty(o);return r.constructor.createProperty(o,t),i?Object.getOwnPropertyDescriptor(r,o):void 0})(n,a,e)}function N(n){return u({...n,state:!0,attribute:!1})}var L={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},yr={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},G={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},ht={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},_=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],Us=_.map(n=>n.toLowerCase()),et={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},Ot={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},xr={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var v=x`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var ea="roxy-data";function ta(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var $=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(ta(a)&&a.classList.contains(ea))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var ra={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Me=["sarva","bhinna","pinda"],W=class extends f{constructor(){super();this.data=null;this.activeTab="sarva";new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return s`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?s`<p class="subtitle">${e.length} signs</p>`:l}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Me.map(t=>s`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${ra[t]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let t=Me.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Me[(t+1)%Me.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Me[(t-1+Me.length)%Me.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let t=this.data.sarvashtakavarga;return t?s`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((r,o)=>{let i=t.bindus[o]??0,d=this.sarvaHeat(i);return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${G[r]??""}</span> ${r}</div></td><td class="${`heat-cell ${d}`}">${i}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${t.total}</td></tr></tfoot></table></div>`:s`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let t=this.data.bhinnashtakavarga;return t?.length?s`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(r=>s`<th scope="col" title="${r}">${G[r]??r.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${t.map(r=>s`<tr><td>${r.planet}</td>${r.bindus.map(o=>{let i=this.bhinnaHeat(o);return s`<td class="${`heat-cell ${i}`}">${o}</td>`})}<td>${r.total}</td></tr>`)}</tbody></table></div>`:s`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?s`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(t=>s`<tr><td>${t.planet}</td><td>${t.rashiPinda}</td><td>${t.grahaPinda}</td><td>${t.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:s`<p class="roxy-empty">No shodhya pinda data</p>`}};W.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],p([u({attribute:!1})],W.prototype,"data",2),p([N()],W.prototype,"activeTab",2),W=p([b("roxy-ashtakavarga-grid")],W);var fr={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},J=class extends f{constructor(){super();this.data=null;this.mode="daily";new $(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):s`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let t=e.quickRead??{},r=Object.entries(t).map(([o,i])=>{let d=typeof i=="number"?i:0,c=Math.abs(d)>1?d/100:d;return[o,c]});return s`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?s`<span class="energy">Energy ${e.energyRating}/10</span>`:l}</header><div class="bars" role="list">${r.map(([o,i])=>{let d=(i+1)/2*100,c=fr[o]??"var(--roxy-accent, #f59e0b)";return s`<div class="bar" role="listitem"><span style="text-transform:capitalize">${o}</span> <span class="track"><span class="fill" style="width:${d}%;background:${c}"></span> </span><span class="value">${Math.round(i*100)}%</span></div>`})}</div>${e.dailyMessage?s`<p class="advice">${e.dailyMessage}</p>`:l} ${e.advice?s`<p class="advice">${e.advice}</p>`:l}</section>`}renderForecast(e){let t=e.days??[];if(t.length===0)return s`<div class="roxy-empty" role="status">No forecast</div>`;let r=600,o=160,i=r/Math.max(t.length-1,1),d=["physical","emotional","intellectual","intuitive"];return s`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${r} ${o}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${o/2}" x2="${r}" y2="${o/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${d.map(c=>{let m=t.map((h,y)=>{let S=h[c]??0,k=y*i,Ee=o/2-S/100*(o/2-8);return`${k.toFixed(2)},${Ee.toFixed(2)}`}).join(" "),g=fr[c]??"#475569";return w`<polyline points=${m} fill="none" stroke=${g} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?s`<p class="advice">${e.summary.periodAdvice}</p>`:l}</section>`}renderCritical(e){return s`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(t=>s`<span class="crit">${t.date} · ${t.cycle} ${t.severity}</span>`)}</div></section>`}};J.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],p([u({attribute:!1})],J.prototype,"data",2),p([u({type:String,reflect:!0})],J.prototype,"mode",2),J=p([b("roxy-biorhythm-chart")],J);var yt=4,xt=9,vr=(100+2*xt)*yt,aa=(100+2*xt)*yt;function I(n,a){return{x:(n+xt)*yt,y:(a+xt)*yt}}var tt=50,jt=n=>2*tt-n,Ht={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},sa={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function oa(){let n={},a={};for(let[e,[t,r]]of Object.entries(Ht.spleen))Ht["solar-plexus"][sa[Number(e)]]=[jt(t),r];for(let[e,t]of Object.entries(Ht))for(let[r,[o,i]]of Object.entries(t))n[Number(r)]=I(o,i),a[Number(r)]=e;return{points:n,centerOf:a}}var{points:It,centerOf:go}=oa(),uo=vr/2;function ze(n){return n.map(([a,e])=>I(a,e))}function Gt(n,a,e){return ze([[tt-n,a],[tt+n,a],[tt+n,e],[tt-n,e]])}var br=[[18.4,68],[18.4,81.8],[34.7,74.9]],na=[{id:"head",label:"Head",color:"gold",points:ze([[40,14.3],[60,14.3],[50,6]]),labelAnchor:I(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:ze([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:I(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Gt(9.5,30.4,43.6),labelAnchor:I(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:ze([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:I(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:ze([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:I(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:ze(br),labelAnchor:I(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Gt(9.5,70.6,83.6),labelAnchor:I(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:ze(br.map(([n,a])=>[jt(n),a])),labelAnchor:I(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Gt(9.5,87.9,99.9),labelAnchor:I(50,103),labelAlign:"middle"}],ia=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],la=da();function da(){let n=jt,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${gt(a[0])}`];for(let t=1;t+2<a.length;t+=3)e.push(`C ${gt(a[t])} ${gt(a[t+1])} ${gt(a[t+2])}`);e.push(`L ${ut(a[a.length-1],n)}`);for(let t=a.length-3;t>=1;t-=3)e.push(`C ${ut(a[t+1],n)} ${ut(a[t],n)} ${ut(a[t-1],n)}`);return e.push("Z"),e.join(" ")}function gt([n,a]){let e=I(n,a);return`${e.x} ${e.y}`}function ut([n,a],e){let t=I(e(n),a);return`${t.x} ${t.y}`}function ca(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function $r(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function pa(){return w`<path class="bg-body" d=${la} />`}function ma(n,a){let e=[];for(let[t,r]of ia){let o=It[t],i=It[r];if(!o||!i)continue;if(e.push(w`<line class="bg-channel" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`),n.has($r(t,r))){e.push(w`<line class="bg-channel on" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`);continue}let d={x:(o.x+i.x)/2,y:(o.y+i.y)/2};a.has(t)&&e.push(w`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${d.x} y2=${d.y} />`),a.has(r)&&e.push(w`<line class="bg-half" x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} />`)}return e}function ha(n,a,e){let t=e.x-a.x,r=e.y-a.y,o=t*t+r*r;if(o===0)return a;let i=Math.max(0,Math.min(1,((n.x-a.x)*t+(n.y-a.y)*r)/o));return{x:a.x+i*t,y:a.y+i*r}}function ga(n,a){let e=a[0],t=Number.POSITIVE_INFINITY;for(let r=0;r<a.length;r++){let o=ha(n,a[r],a[(r+1)%a.length]),i=(o.x-n.x)**2+(o.y-n.y)**2;i<t&&(t=i,e=o)}return e}function ua(n){return na.map(a=>{let e=n.has(a.id),t=`bg-center bg-${a.color}${e?" defined":""}`,r=ga(a.labelAnchor,a.points);return w`<g>
|
|
4
|
-
<line class="bg-leader" x1=${a.labelAnchor.x} y1=${a.labelAnchor.y} x2=${
|
|
5
|
-
<polygon class=${
|
|
1
|
+
"use strict";var RoxyUI=(()=>{var cr=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var Yt=Object.getOwnPropertyNames;var Ut=Object.prototype.hasOwnProperty;var Vt=(n,a)=>{for(var e in a)cr(n,e,{get:a[e],enumerable:!0})},Ft=(n,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of Yt(a))!Ut.call(n,t)&&t!==e&&cr(n,t,{get:()=>a[t],enumerable:!(r=ot(a,t))||r.enumerable});return n};var Wt=n=>Ft(cr({},"__esModule",{value:!0}),n),p=(n,a,e,r)=>{for(var t=r>1?void 0:r?ot(a,e):a,o=n.length-1,i;o>=0;o--)(i=n[o])&&(t=(r?i(a,e,t):i(t))||t);return r&&t&&cr(a,e,t),t};var ys={};Vt(ys,{ROXY_COMPONENTS:()=>Tr,ROXY_UI_COMPONENTS:()=>hs,ROXY_UI_TOKENS_STYLE_ID:()=>Rr,ROXY_UI_VERSION:()=>Kt,RoxyAngelNumberCard:()=>ue,RoxyAngelNumberLookup:()=>xe,RoxyAshtakavargaGrid:()=>J,RoxyBiorhythmChart:()=>X,RoxyBodygraph:()=>fe,RoxyChoghadiyaGrid:()=>be,RoxyCompatibilityCard:()=>Z,RoxyCrystalGrid:()=>Q,RoxyDashaTimeline:()=>ee,RoxyData:()=>re,RoxyDivisionalChart:()=>ae,RoxyDoshaCard:()=>se,RoxyDreamCard:()=>we,RoxyEndpointForm:()=>G,RoxyForecastTimeline:()=>ke,RoxyGunaMilan:()=>Se,RoxyHexagram:()=>oe,RoxyHoroscopeCard:()=>ne,RoxyKpChart:()=>ie,RoxyKpPlanetsTable:()=>Ae,RoxyKpRulingPlanets:()=>Ce,RoxyLocationSearch:()=>_,RoxyMoonPhase:()=>le,RoxyNakshatraCard:()=>Ee,RoxyNatalChart:()=>F,RoxyNumerologyCard:()=>de,RoxyPanchangTable:()=>ce,RoxyShadbalaTable:()=>Te,RoxySynastryChart:()=>Re,RoxyTarotCard:()=>pe,RoxyTarotSpread:()=>me,RoxyTransitsTable:()=>ge,RoxyVedicKundli:()=>K,RoxyVedicPlanetsTable:()=>Pe,RoxyWesternPlanetsTable:()=>Le,RoxyYogaList:()=>he,injectRoxyTokens:()=>Pr,roxyDataScript:()=>St,serializeRoxyData:()=>Kr});var pr=globalThis,mr=pr.ShadowRoot&&(pr.ShadyCSS===void 0||pr.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Lr=Symbol(),nt=new WeakMap,Je=class{constructor(a,e,r){if(this._$cssResult$=!0,r!==Lr)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=a,this.t=e}get styleSheet(){let a=this.o,e=this.t;if(mr&&a===void 0){let r=e!==void 0&&e.length===1;r&&(a=nt.get(e)),a===void 0&&((this.o=a=new CSSStyleSheet).replaceSync(this.cssText),r&&nt.set(e,a))}return a}toString(){return this.cssText}},it=n=>new Je(typeof n=="string"?n:n+"",void 0,Lr),u=(n,...a)=>{let e=n.length===1?n[0]:a.reduce((r,t,o)=>r+(i=>{if(i._$cssResult$===!0)return i.cssText;if(typeof i=="number")return i;throw Error("Value passed to 'css' function must be a 'css' function result: "+i+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(t)+n[o+1],n[0]);return new Je(e,n,Lr)},lt=(n,a)=>{if(mr)n.adoptedStyleSheets=a.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of a){let r=document.createElement("style"),t=pr.litNonce;t!==void 0&&r.setAttribute("nonce",t),r.textContent=e.cssText,n.appendChild(r)}},Nr=mr?n=>n:n=>n instanceof CSSStyleSheet?(a=>{let e="";for(let r of a.cssRules)e+=r.cssText;return it(e)})(n):n;var{is:Jt,defineProperty:Xt,getOwnPropertyDescriptor:Zt,getOwnPropertyNames:Qt,getOwnPropertySymbols:ea,getPrototypeOf:ra}=Object,gr=globalThis,dt=gr.trustedTypes,ta=dt?dt.emptyScript:"",aa=gr.reactiveElementPolyfillSupport,Xe=(n,a)=>n,Ze={toAttribute(n,a){switch(a){case Boolean:n=n?ta:null;break;case Object:case Array:n=n==null?n:JSON.stringify(n)}return n},fromAttribute(n,a){let e=n;switch(a){case Boolean:e=n!==null;break;case Number:e=n===null?null:Number(n);break;case Object:case Array:try{e=JSON.parse(n)}catch{e=null}}return e}},hr=(n,a)=>!Jt(n,a),ct={attribute:!0,type:String,converter:Ze,reflect:!1,useDefault:!1,hasChanged:hr};Symbol.metadata??=Symbol("metadata"),gr.litPropertyMetadata??=new WeakMap;var W=class extends HTMLElement{static addInitializer(a){this._$Ei(),(this.l??=[]).push(a)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(a,e=ct){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(a)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(a,e),!e.noAccessor){let r=Symbol(),t=this.getPropertyDescriptor(a,r,e);t!==void 0&&Xt(this.prototype,a,t)}}static getPropertyDescriptor(a,e,r){let{get:t,set:o}=Zt(this.prototype,a)??{get(){return this[e]},set(i){this[e]=i}};return{get:t,set(i){let d=t?.call(this);o?.call(this,i),this.requestUpdate(a,d,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(a){return this.elementProperties.get(a)??ct}static _$Ei(){if(this.hasOwnProperty(Xe("elementProperties")))return;let a=ra(this);a.finalize(),a.l!==void 0&&(this.l=[...a.l]),this.elementProperties=new Map(a.elementProperties)}static finalize(){if(this.hasOwnProperty(Xe("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(Xe("properties"))){let e=this.properties,r=[...Qt(e),...ea(e)];for(let t of r)this.createProperty(t,e[t])}let a=this[Symbol.metadata];if(a!==null){let e=litPropertyMetadata.get(a);if(e!==void 0)for(let[r,t]of e)this.elementProperties.set(r,t)}this._$Eh=new Map;for(let[e,r]of this.elementProperties){let t=this._$Eu(e,r);t!==void 0&&this._$Eh.set(t,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(a){let e=[];if(Array.isArray(a)){let r=new Set(a.flat(1/0).reverse());for(let t of r)e.unshift(Nr(t))}else a!==void 0&&e.push(Nr(a));return e}static _$Eu(a,e){let r=e.attribute;return r===!1?void 0:typeof r=="string"?r:typeof a=="string"?a.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(a=>this.enableUpdating=a),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(a=>a(this))}addController(a){(this._$EO??=new Set).add(a),this.renderRoot!==void 0&&this.isConnected&&a.hostConnected?.()}removeController(a){this._$EO?.delete(a)}_$E_(){let a=new Map,e=this.constructor.elementProperties;for(let r of e.keys())this.hasOwnProperty(r)&&(a.set(r,this[r]),delete this[r]);a.size>0&&(this._$Ep=a)}createRenderRoot(){let a=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return lt(a,this.constructor.elementStyles),a}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(a=>a.hostConnected?.())}enableUpdating(a){}disconnectedCallback(){this._$EO?.forEach(a=>a.hostDisconnected?.())}attributeChangedCallback(a,e,r){this._$AK(a,r)}_$ET(a,e){let r=this.constructor.elementProperties.get(a),t=this.constructor._$Eu(a,r);if(t!==void 0&&r.reflect===!0){let o=(r.converter?.toAttribute!==void 0?r.converter:Ze).toAttribute(e,r.type);this._$Em=a,o==null?this.removeAttribute(t):this.setAttribute(t,o),this._$Em=null}}_$AK(a,e){let r=this.constructor,t=r._$Eh.get(a);if(t!==void 0&&this._$Em!==t){let o=r.getPropertyOptions(t),i=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:Ze;this._$Em=t;let d=i.fromAttribute(e,o.type);this[t]=d??this._$Ej?.get(t)??d,this._$Em=null}}requestUpdate(a,e,r,t=!1,o){if(a!==void 0){let i=this.constructor;if(t===!1&&(o=this[a]),r??=i.getPropertyOptions(a),!((r.hasChanged??hr)(o,e)||r.useDefault&&r.reflect&&o===this._$Ej?.get(a)&&!this.hasAttribute(i._$Eu(a,r))))return;this.C(a,e,r)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(a,e,{useDefault:r,reflect:t,wrapped:o},i){r&&!(this._$Ej??=new Map).has(a)&&(this._$Ej.set(a,i??e??this[a]),o!==!0||i!==void 0)||(this._$AL.has(a)||(this.hasUpdated||r||(e=void 0),this._$AL.set(a,e)),t===!0&&this._$Em!==a&&(this._$Eq??=new Set).add(a))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let a=this.scheduleUpdate();return a!=null&&await a,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[t,o]of this._$Ep)this[t]=o;this._$Ep=void 0}let r=this.constructor.elementProperties;if(r.size>0)for(let[t,o]of r){let{wrapped:i}=o,d=this[t];i!==!0||this._$AL.has(t)||d===void 0||this.C(t,void 0,o,d)}}let a=!1,e=this._$AL;try{a=this.shouldUpdate(e),a?(this.willUpdate(e),this._$EO?.forEach(r=>r.hostUpdate?.()),this.update(e)):this._$EM()}catch(r){throw a=!1,this._$EM(),r}a&&this._$AE(e)}willUpdate(a){}_$AE(a){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(a)),this.updated(a)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(a){return!0}update(a){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(a){}firstUpdated(a){}};W.elementStyles=[],W.shadowRootOptions={mode:"open"},W[Xe("elementProperties")]=new Map,W[Xe("finalized")]=new Map,aa?.({ReactiveElement:W}),(gr.reactiveElementVersions??=[]).push("2.1.2");var Hr=globalThis,pt=n=>n,yr=Hr.trustedTypes,mt=yr?yr.createPolicy("lit-html",{createHTML:n=>n}):void 0,ft="$lit$",ye=`lit$${Math.random().toFixed(9).slice(2)}$`,bt="?"+ye,sa=`<${bt}>`,De=document,er=()=>De.createComment(""),rr=n=>n===null||typeof n!="object"&&typeof n!="function",Ir=Array.isArray,oa=n=>Ir(n)||typeof n?.[Symbol.iterator]=="function",Mr=`[
|
|
2
|
+
\f\r]`,Qe=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,gt=/-->/g,ht=/>/g,Me=RegExp(`>|${Mr}(?:([^\\s"'>=/]+)(${Mr}*=${Mr}*(?:[^
|
|
3
|
+
\f\r"'\`<>=]|("|')|))|$)`,"g"),yt=/'/g,ut=/"/g,vt=/^(?:script|style|textarea|title)$/i,jr=n=>(a,...e)=>({_$litType$:n,strings:a,values:e}),s=jr(1),w=jr(2),$s=jr(3),_e=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),xt=new WeakMap,ze=De.createTreeWalker(De,129);function $t(n,a){if(!Ir(n)||!n.hasOwnProperty("raw"))throw Error("invalid template strings array");return mt!==void 0?mt.createHTML(a):a}var na=(n,a)=>{let e=n.length-1,r=[],t,o=a===2?"<svg>":a===3?"<math>":"",i=Qe;for(let d=0;d<e;d++){let c=n[d],m,y,g=-1,f=0;for(;f<c.length&&(i.lastIndex=f,y=i.exec(c),y!==null);)f=i.lastIndex,i===Qe?y[1]==="!--"?i=gt:y[1]!==void 0?i=ht:y[2]!==void 0?(vt.test(y[2])&&(t=RegExp("</"+y[2],"g")),i=Me):y[3]!==void 0&&(i=Me):i===Me?y[0]===">"?(i=t??Qe,g=-1):y[1]===void 0?g=-2:(g=i.lastIndex-y[2].length,m=y[1],i=y[3]===void 0?Me:y[3]==='"'?ut:yt):i===ut||i===yt?i=Me:i===gt||i===ht?i=Qe:(i=Me,t=void 0);let S=i===Me&&n[d+1].startsWith("/>")?" ":"";o+=i===Qe?c+sa:g>=0?(r.push(m),c.slice(0,g)+ft+c.slice(g)+ye+S):c+ye+(g===-2?d:S)}return[$t(n,o+(n[e]||"<?>")+(a===2?"</svg>":a===3?"</math>":"")),r]},tr=class n{constructor({strings:a,_$litType$:e},r){let t;this.parts=[];let o=0,i=0,d=a.length-1,c=this.parts,[m,y]=na(a,e);if(this.el=n.createElement(m,r),ze.currentNode=this.el.content,e===2||e===3){let g=this.el.content.firstChild;g.replaceWith(...g.childNodes)}for(;(t=ze.nextNode())!==null&&c.length<d;){if(t.nodeType===1){if(t.hasAttributes())for(let g of t.getAttributeNames())if(g.endsWith(ft)){let f=y[i++],S=t.getAttribute(g).split(ye),k=/([.?@])?(.*)/.exec(f);c.push({type:1,index:o,name:k[2],strings:S,ctor:k[1]==="."?Dr:k[1]==="?"?_r:k[1]==="@"?Or:Be}),t.removeAttribute(g)}else g.startsWith(ye)&&(c.push({type:6,index:o}),t.removeAttribute(g));if(vt.test(t.tagName)){let g=t.textContent.split(ye),f=g.length-1;if(f>0){t.textContent=yr?yr.emptyScript:"";for(let S=0;S<f;S++)t.append(g[S],er()),ze.nextNode(),c.push({type:2,index:++o});t.append(g[f],er())}}}else if(t.nodeType===8)if(t.data===bt)c.push({type:2,index:o});else{let g=-1;for(;(g=t.data.indexOf(ye,g+1))!==-1;)c.push({type:7,index:o}),g+=ye.length-1}o++}}static createElement(a,e){let r=De.createElement("template");return r.innerHTML=a,r}};function je(n,a,e=n,r){if(a===_e)return a;let t=r!==void 0?e._$Co?.[r]:e._$Cl,o=rr(a)?void 0:a._$litDirective$;return t?.constructor!==o&&(t?._$AO?.(!1),o===void 0?t=void 0:(t=new o(n),t._$AT(n,e,r)),r!==void 0?(e._$Co??=[])[r]=t:e._$Cl=t),t!==void 0&&(a=je(n,t._$AS(n,a.values),t,r)),a}var zr=class{constructor(a,e){this._$AV=[],this._$AN=void 0,this._$AD=a,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(a){let{el:{content:e},parts:r}=this._$AD,t=(a?.creationScope??De).importNode(e,!0);ze.currentNode=t;let o=ze.nextNode(),i=0,d=0,c=r[0];for(;c!==void 0;){if(i===c.index){let m;c.type===2?m=new ar(o,o.nextSibling,this,a):c.type===1?m=new c.ctor(o,c.name,c.strings,this,a):c.type===6&&(m=new Gr(o,this,a)),this._$AV.push(m),c=r[++d]}i!==c?.index&&(o=ze.nextNode(),i++)}return ze.currentNode=De,t}p(a){let e=0;for(let r of this._$AV)r!==void 0&&(r.strings!==void 0?(r._$AI(a,r,e),e+=r.strings.length-2):r._$AI(a[e])),e++}},ar=class n{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(a,e,r,t){this.type=2,this._$AH=l,this._$AN=void 0,this._$AA=a,this._$AB=e,this._$AM=r,this.options=t,this._$Cv=t?.isConnected??!0}get parentNode(){let a=this._$AA.parentNode,e=this._$AM;return e!==void 0&&a?.nodeType===11&&(a=e.parentNode),a}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(a,e=this){a=je(this,a,e),rr(a)?a===l||a==null||a===""?(this._$AH!==l&&this._$AR(),this._$AH=l):a!==this._$AH&&a!==_e&&this._(a):a._$litType$!==void 0?this.$(a):a.nodeType!==void 0?this.T(a):oa(a)?this.k(a):this._(a)}O(a){return this._$AA.parentNode.insertBefore(a,this._$AB)}T(a){this._$AH!==a&&(this._$AR(),this._$AH=this.O(a))}_(a){this._$AH!==l&&rr(this._$AH)?this._$AA.nextSibling.data=a:this.T(De.createTextNode(a)),this._$AH=a}$(a){let{values:e,_$litType$:r}=a,t=typeof r=="number"?this._$AC(a):(r.el===void 0&&(r.el=tr.createElement($t(r.h,r.h[0]),this.options)),r);if(this._$AH?._$AD===t)this._$AH.p(e);else{let o=new zr(t,this),i=o.u(this.options);o.p(e),this.T(i),this._$AH=o}}_$AC(a){let e=xt.get(a.strings);return e===void 0&&xt.set(a.strings,e=new tr(a)),e}k(a){Ir(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,r,t=0;for(let o of a)t===e.length?e.push(r=new n(this.O(er()),this.O(er()),this,this.options)):r=e[t],r._$AI(o),t++;t<e.length&&(this._$AR(r&&r._$AB.nextSibling,t),e.length=t)}_$AR(a=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);a!==this._$AB;){let r=pt(a).nextSibling;pt(a).remove(),a=r}}setConnected(a){this._$AM===void 0&&(this._$Cv=a,this._$AP?.(a))}},Be=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(a,e,r,t,o){this.type=1,this._$AH=l,this._$AN=void 0,this.element=a,this.name=e,this._$AM=t,this.options=o,r.length>2||r[0]!==""||r[1]!==""?(this._$AH=Array(r.length-1).fill(new String),this.strings=r):this._$AH=l}_$AI(a,e=this,r,t){let o=this.strings,i=!1;if(o===void 0)a=je(this,a,e,0),i=!rr(a)||a!==this._$AH&&a!==_e,i&&(this._$AH=a);else{let d=a,c,m;for(a=o[0],c=0;c<o.length-1;c++)m=je(this,d[r+c],e,c),m===_e&&(m=this._$AH[c]),i||=!rr(m)||m!==this._$AH[c],m===l?a=l:a!==l&&(a+=(m??"")+o[c+1]),this._$AH[c]=m}i&&!t&&this.j(a)}j(a){a===l?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,a??"")}},Dr=class extends Be{constructor(){super(...arguments),this.type=3}j(a){this.element[this.name]=a===l?void 0:a}},_r=class extends Be{constructor(){super(...arguments),this.type=4}j(a){this.element.toggleAttribute(this.name,!!a&&a!==l)}},Or=class extends Be{constructor(a,e,r,t,o){super(a,e,r,t,o),this.type=5}_$AI(a,e=this){if((a=je(this,a,e,0)??l)===_e)return;let r=this._$AH,t=a===l&&r!==l||a.capture!==r.capture||a.once!==r.once||a.passive!==r.passive,o=a!==l&&(r===l||t);t&&this.element.removeEventListener(this.name,this,r),o&&this.element.addEventListener(this.name,this,a),this._$AH=a}handleEvent(a){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,a):this._$AH.handleEvent(a)}},Gr=class{constructor(a,e,r){this.element=a,this.type=6,this._$AN=void 0,this._$AM=e,this.options=r}get _$AU(){return this._$AM._$AU}_$AI(a){je(this,a)}};var ia=Hr.litHtmlPolyfillSupport;ia?.(tr,ar),(Hr.litHtmlVersions??=[]).push("3.3.2");var wt=(n,a,e)=>{let r=e?.renderBefore??a,t=r._$litPart$;if(t===void 0){let o=e?.renderBefore??null;r._$litPart$=t=new ar(a.insertBefore(er(),o),o,void 0,e??{})}return t._$AI(n),t};var Br=globalThis,x=class extends W{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let a=super.createRenderRoot();return this.renderOptions.renderBefore??=a.firstChild,a}update(a){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(a),this._$Do=wt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return _e}};x._$litElement$=!0,x.finalized=!0,Br.litElementHydrateSupport?.({LitElement:x});var la=Br.litElementPolyfillSupport;la?.({LitElement:x});(Br.litElementVersions??=[]).push("4.2.2");var b=n=>(a,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(n,a)}):customElements.define(n,a)};var da={attribute:!0,type:String,converter:Ze,reflect:!1,hasChanged:hr},ca=(n=da,a,e)=>{let{kind:r,metadata:t}=e,o=globalThis.litPropertyMetadata.get(t);if(o===void 0&&globalThis.litPropertyMetadata.set(t,o=new Map),r==="setter"&&((n=Object.create(n)).wrapped=!0),o.set(e.name,n),r==="accessor"){let{name:i}=e;return{set(d){let c=a.get.call(this);a.set.call(this,d),this.requestUpdate(i,c,n,!0,d)},init(d){return d!==void 0&&this.C(i,void 0,n,d),d}}}if(r==="setter"){let{name:i}=e;return function(d){let c=this[i];a.call(this,d),this.requestUpdate(i,c,n,!0,d)}}throw Error("Unsupported decorator location: "+r)};function h(n){return(a,e)=>typeof e=="object"?ca(n,a,e):((r,t,o)=>{let i=t.hasOwnProperty(o);return t.constructor.createProperty(o,r),i?Object.getOwnPropertyDescriptor(t,o):void 0})(n,a,e)}function N(n){return h({...n,state:!0,attribute:!1})}var v=u`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var kt="roxy-data";function Kr(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function St(n){return`<script type="application/json" class="${kt}">${Kr(n)}<\/script>`}function pa(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var $=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(pa(a)&&a.classList.contains(kt))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var ma=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"twinFlame",label:"Twin flame"}],ue=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No angel number</div>`;let r=(e.energy??"").toLowerCase(),t=r==="positive"||r==="cautionary"||r==="neutral"?r:"",o=e.keywords??[],i=e.actionSteps??[];return s`<article class="card" aria-label="${`Angel number ${e.number??""}`}"><div class="hero">${e.number?s`<div class="numeral">${e.number}</div>`:l}<div><p class="label">Angel number</p>${e.title?s`<h2 class="title">${e.title}</h2>`:l}</div></div>${e.coreMessage?s`<p class="core">${e.coreMessage}</p>`:l}<div class="badges">${e.type?s`<span class="badge">${e.type}</span>`:l} ${typeof e.digitRoot=="number"?s`<span class="badge">Digit root ${e.digitRoot}</span>`:l} ${e.energy?s`<span class="${`badge ${t}`}">${e.energy}</span>`:l}</div>${o.length>0?s`<div class="chips">${o.map(d=>s`<span>${d}</span>`)}</div>`:l} ${this.renderSections(e)} ${e.affirmation?s`<p class="affirmation">${e.affirmation}</p>`:l} ${i.length>0?s`<div class="steps"><h3>Action steps</h3><ul>${i.map(d=>s`<li>${d}</li>`)}</ul></div>`:l}</article>`}renderSections(e){let r=e.meaning;if(!r)return l;let t=ma.filter(o=>r[o.key]);return t.length===0?l:s`<div class="sections">${t.map((o,i)=>s`<details name="angel-meaning" ?open="${i===0}"><summary>${o.label}</summary><p>${r[o.key]}</p></details>`)}</div>`}};ue.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.core{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;padding:3px 10px;display:inline-flex}.badge.positive{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.cautionary{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.badge.neutral{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.sections{gap:var(--roxy-space-xs,.25rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);display:grid}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.affirmation{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);border-left:3px solid var(--roxy-accent,#f59e0b);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-sm,4px);color:var(--roxy-fg,#0a0a0a);margin:0;font-style:italic}.steps h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.steps ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);gap:2px;margin:0;display:grid}`],p([h({attribute:!1})],ue.prototype,"data",2),ue=p([b("roxy-angel-number-card")],ue);var ga=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"twinFlame",label:"Twin flame"}],xe=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No number analysis</div>`;let r=e.knownMeaning,t=e.digitRootMeaning,o=r?.title??"Number analysis";return s`<article class="card" aria-label="${`Number ${e.number??""}`}"><div class="hero">${e.number?s`<div class="numeral">${e.number}</div>`:l}<div><p class="label">Number analysis</p><h2 class="title">${o}</h2></div></div><div class="badges">${e.type?s`<span class="badge">${e.type}</span>`:l} ${typeof e.digits=="number"?s`<span class="badge">${e.digits} digits</span>`:l} ${typeof e.uniqueDigits=="number"?s`<span class="badge">${e.uniqueDigits} unique</span>`:l} ${typeof e.digitRoot=="number"?s`<span class="badge">Digit root ${e.digitRoot}</span>`:l} ${e.isPalindrome?s`<span class="badge flag">Palindrome</span>`:l} ${e.isRepeating?s`<span class="badge flag">Repeating</span>`:l}</div>${r?s`<div class="section"><p class="label">Known angel number</p>${r.coreMessage?s`<p>${r.coreMessage}</p>`:l} ${r.keywords&&r.keywords.length>0?s`<div class="chips">${r.keywords.map(i=>s`<span>${i}</span>`)}</div>`:l} ${this.renderMeaning(r.meaning)} ${r.affirmation?s`<p><em>${r.affirmation}</em></p>`:l}</div>`:l} ${t?s`<div class="section"><p class="label">Foundational digit root${t.number?` (${t.number})`:""}</p>${t.title?s`<h3>${t.title}</h3>`:l} ${t.coreMessage?s`<p>${t.coreMessage}</p>`:l}</div>`:l}</article>`}renderMeaning(e){if(!e)return l;let r=ga.filter(t=>e[t.key]);return r.length===0?l:s`${r.map((t,o)=>s`<details name="lookup-meaning" ?open="${o===0}"><summary>${t.label}</summary><p>${e[t.key]}</p></details>`)}`}};xe.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;align-items:center;padding:3px 10px;display:inline-flex}.badge.flag{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.section>.label{margin:0}.section h3{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.section p{color:var(--roxy-fg,#0a0a0a);line-height:1.6;font-size:var(--roxy-text-sm,.875rem);margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem)}`],p([h({attribute:!1})],xe.prototype,"data",2),xe=p([b("roxy-angel-number-lookup")],xe);var L={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},At={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},H={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},xr={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},D=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],ko=D.map(n=>n.toLowerCase()),sr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},qr={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},Ct={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var ha={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Oe=["sarva","bhinna","pinda"],J=class extends x{constructor(){super();this.data=null;this.activeTab="sarva";new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return s`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?s`<p class="subtitle">${e.length} signs</p>`:l}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Oe.map(r=>s`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${ha[r]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=Oe.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Oe[(r+1)%Oe.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Oe[(r-1+Oe.length)%Oe.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?s`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,o)=>{let i=r.bindus[o]??0,d=this.sarvaHeat(i);return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${H[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${d}`}">${i}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:s`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?s`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>s`<th scope="col" title="${t}">${H[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>s`<tr><td>${t.planet}</td>${t.bindus.map(o=>{let i=this.bhinnaHeat(o);return s`<td class="${`heat-cell ${i}`}">${o}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:s`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?s`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>s`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:s`<p class="roxy-empty">No shodhya pinda data</p>`}};J.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],p([h({attribute:!1})],J.prototype,"data",2),p([N()],J.prototype,"activeTab",2),J=p([b("roxy-ashtakavarga-grid")],J);var Et={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},X=class extends x{constructor(){super();this.data=null;this.mode="daily";new $(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):s`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([o,i])=>{let d=typeof i=="number"?i:0,c=Math.abs(d)>1?d/100:d;return[o,c]});return s`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?s`<span class="energy">Energy ${e.energyRating}/10</span>`:l}</header><div class="bars" role="list">${t.map(([o,i])=>{let d=(i+1)/2*100,c=Et[o]??"var(--roxy-accent, #f59e0b)";return s`<div class="bar" role="listitem"><span style="text-transform:capitalize">${o}</span> <span class="track"><span class="fill" style="width:${d}%;background:${c}"></span> </span><span class="value">${Math.round(i*100)}%</span></div>`})}</div>${e.dailyMessage?s`<p class="advice">${e.dailyMessage}</p>`:l} ${e.advice?s`<p class="advice">${e.advice}</p>`:l}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return s`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,o=160,i=t/Math.max(r.length-1,1),d=["physical","emotional","intellectual","intuitive"];return s`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${o}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${o/2}" x2="${t}" y2="${o/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${d.map(c=>{let m=r.map((g,f)=>{let S=g[c]??0,k=f*i,Ne=o/2-S/100*(o/2-8);return`${k.toFixed(2)},${Ne.toFixed(2)}`}).join(" "),y=Et[c]??"#475569";return w`<polyline points=${m} fill="none" stroke=${y} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?s`<p class="advice">${e.summary.periodAdvice}</p>`:l}</section>`}renderCritical(e){return s`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>s`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};X.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],p([h({attribute:!1})],X.prototype,"data",2),p([h({type:String,reflect:!0})],X.prototype,"mode",2),X=p([b("roxy-biorhythm-chart")],X);var vr=4,$r=9,Rt=(100+2*$r)*vr,ya=(100+2*$r)*vr;function I(n,a){return{x:(n+$r)*vr,y:(a+$r)*vr}}var or=50,Fr=n=>2*or-n,Yr={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},ua={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function xa(){let n={},a={};for(let[e,[r,t]]of Object.entries(Yr.spleen))Yr["solar-plexus"][ua[Number(e)]]=[Fr(r),t];for(let[e,r]of Object.entries(Yr))for(let[t,[o,i]]of Object.entries(r))n[Number(t)]=I(o,i),a[Number(t)]=e;return{points:n,centerOf:a}}var{points:Vr,centerOf:Ho}=xa(),Io=Rt/2;function Ge(n){return n.map(([a,e])=>I(a,e))}function Ur(n,a,e){return Ge([[or-n,a],[or+n,a],[or+n,e],[or-n,e]])}var Tt=[[18.4,68],[18.4,81.8],[34.7,74.9]],fa=[{id:"head",label:"Head",color:"gold",points:Ge([[40,14.3],[60,14.3],[50,6]]),labelAnchor:I(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:Ge([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:I(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Ur(9.5,30.4,43.6),labelAnchor:I(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:Ge([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:I(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:Ge([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:I(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:Ge(Tt),labelAnchor:I(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Ur(9.5,70.6,83.6),labelAnchor:I(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:Ge(Tt.map(([n,a])=>[Fr(n),a])),labelAnchor:I(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Ur(9.5,87.9,99.9),labelAnchor:I(50,103),labelAlign:"middle"}],ba=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],va=$a();function $a(){let n=Fr,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${fr(a[0])}`];for(let r=1;r+2<a.length;r+=3)e.push(`C ${fr(a[r])} ${fr(a[r+1])} ${fr(a[r+2])}`);e.push(`L ${br(a[a.length-1],n)}`);for(let r=a.length-3;r>=1;r-=3)e.push(`C ${br(a[r+1],n)} ${br(a[r],n)} ${br(a[r-1],n)}`);return e.push("Z"),e.join(" ")}function fr([n,a]){let e=I(n,a);return`${e.x} ${e.y}`}function br([n,a],e){let r=I(e(n),a);return`${r.x} ${r.y}`}function wa(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function Pt(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function ka(){return w`<path class="bg-body" d=${va} />`}function Sa(n,a){let e=[];for(let[r,t]of ba){let o=Vr[r],i=Vr[t];if(!o||!i)continue;if(e.push(w`<line class="bg-channel" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`),n.has(Pt(r,t))){e.push(w`<line class="bg-channel on" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`);continue}let d={x:(o.x+i.x)/2,y:(o.y+i.y)/2};a.has(r)&&e.push(w`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${d.x} y2=${d.y} />`),a.has(t)&&e.push(w`<line class="bg-half" x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} />`)}return e}function Aa(n,a,e){let r=e.x-a.x,t=e.y-a.y,o=r*r+t*t;if(o===0)return a;let i=Math.max(0,Math.min(1,((n.x-a.x)*r+(n.y-a.y)*t)/o));return{x:a.x+i*r,y:a.y+i*t}}function Ca(n,a){let e=a[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<a.length;t++){let o=Aa(n,a[t],a[(t+1)%a.length]),i=(o.x-n.x)**2+(o.y-n.y)**2;i<r&&(r=i,e=o)}return e}function Ea(n){return fa.map(a=>{let e=n.has(a.id),r=`bg-center bg-${a.color}${e?" defined":""}`,t=Ca(a.labelAnchor,a.points);return w`<g>
|
|
4
|
+
<line class="bg-leader" x1=${a.labelAnchor.x} y1=${a.labelAnchor.y} x2=${t.x} y2=${t.y} />
|
|
5
|
+
<polygon class=${r} points=${wa(a.points)}><title>${a.label}: ${e?"defined":"open"}</title></polygon>
|
|
6
6
|
<text class="bg-center-label" x=${a.labelAnchor.x} y=${a.labelAnchor.y} text-anchor=${a.labelAlign} dominant-baseline="central">${a.label}</text>
|
|
7
|
-
</g>`})}function
|
|
8
|
-
${
|
|
9
|
-
${
|
|
10
|
-
${
|
|
11
|
-
${
|
|
12
|
-
`}function A(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function j(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var ue=class extends f{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No bodygraph data</div>`;let t=new Set((e.centers??[]).filter(d=>d.defined).map(d=>d.id)),r=new Set((e.gates??[]).map(d=>d.gate).filter(d=>d!=null)),o=new Set((e.channels??[]).map(d=>wr(d.gateA,d.gateB))),i=this.buildGateTitles(e.gates??[]);return s`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?s`<div class="type-line">${e.type}${e.profile?s`· Profile ${e.profile}`:l}</div>`:l}</header><div class="layout"><svg viewBox="${kr}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Sr({definedCenters:t,activeChannels:o,activeGates:r,gateTitles:i})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let t=new Map;for(let r of e){if(r.gate==null)continue;let o=[`Gate ${r.gate}`];r.line!=null&&(o[0]+=`.${r.line}`),r.gateName&&o.push(r.gateName);let i=r.planet?A(r.planet):"",d=i?L[i]??i:"";d&&o.push(`${d} ${r.side??""}`.trim()),t.set(r.gate,o.join(" \xB7 "))}return t}renderSummary(e){let t=[{label:"Type",value:e.type},{label:"Strategy",value:e.strategy},{label:"Authority",value:e.authority},{label:"Profile",value:e.profile},{label:"Definition",value:e.definition}],r=e.incarnationCross;return s`<div class="summary"><div class="facts">${t.map(o=>o.value?s`<div class="fact"><span>${o.label}</span> <strong>${o.value}</strong></div>`:l)}</div>${r?.name?s`<p class="cross">${r.name} ${r.gates?.length?s`<span class="gates">(${r.gates.join(", ")})</span>`:l}</p>`:l} ${e.signature||e.notSelf?s`<div class="themes">${e.signature?s`<span class="pill pill--good">Signature: ${e.signature}</span>`:l} ${e.notSelf?s`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:l}</div>`:l}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};ue.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:340px;height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],p([u({attribute:!1})],ue.prototype,"data",2),ue=p([b("roxy-bodygraph")],ue);function Ar(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var ye=class extends f{constructor(){super();this.data=null;new $(this)}isCurrent(e){let t=Date.now(),r=Date.parse(e.start),o=Date.parse(e.end);return Number.isNaN(r)||Number.isNaN(o)?!1:t>=r&&t<o}renderTile(e){let t=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",r=this.isCurrent(e),o=L[A(e.lord)]??"",i=`${Ar(e.start)} - ${Ar(e.end)}`;return s`<div class="cho-tile ${t}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${e.name}${r?s`<span class="now-badge">Now</span>`:l} </span><span class="tile-time" aria-label="Time range">${i}</span> <span class="tile-lord">${o?s`<span aria-hidden="true">${o}</span>`:l} ${e.lord}</span></div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:t,nightChoghadiya:r}=this.data;return s`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?s`<p class="subtitle">${e}</p>`:l}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${t&&t.length>0?t.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${r&&r.length>0?r.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};ye.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],p([u({attribute:!1})],ye.prototype,"data",2),ye=p([b("roxy-choghadiya-grid")],ye);function K(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,t=new Date(e);return Number.isNaN(t.getTime())?n:t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function xe(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Bt(n){if(!n)return"";let a=K(n.start),e=K(n.end);return a&&e?`${a} - ${e}`:a||e||""}function C(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function Cr(n,a=1){let e=C(n,a);return e?`${e}%`:""}var _e={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function Ge(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}var X=class extends f{constructor(){super();this.data=null;this.mode="astrology";new $(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let t={};for(let[r,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(t[r]=o);return t}return{}}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No compatibility data</div>`;let t=e.overallScore,r=this.getBreakdown(),o="rating"in e?e.rating:void 0,i="archetype"in e?e.archetype:void 0,d="advice"in e?e.advice:void 0,c="summary"in e?e.summary:void 0,m="interpretation"in e?e.interpretation:void 0,g="strengths"in e?e.strengths:void 0,h="challenges"in e?e.challenges:void 0,y="keyAspects"in e?e.keyAspects:void 0;return s`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof t=="number"?s`<div class="score">${C(t,0)}</div>`:l} ${o?s`<div class="rating">${o}</div>`:l}</div></div>${Object.keys(r).length>0?s`<div role="list">${Object.entries(r).map(([S,k])=>s`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${S}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,k))}%"></span></span> <span>${C(k,0)}</span></div>`)}</div>`:l} ${i?s`<p><span class="archetype">${i.label}</span> ${i.description?s`· ${i.description}`:l}</p>`:l} ${c?s`<p>${c}</p>`:l} ${m&&!c?s`<p>${m}</p>`:l} ${d?s`<p>${d}</p>`:l} ${(g?.length??0)>0||(h?.length??0)>0?s`<div class="lists">${g?.length?s`<div><h3>Strengths</h3><ul>${g.map(S=>s`<li>${S}</li>`)}</ul></div>`:l} ${h?.length?s`<div><h3>Challenges</h3><ul>${h.map(S=>s`<li>${S}</li>`)}</ul></div>`:l}</div>`:l} ${y?.length?s`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${y.slice(0,6).map(S=>s`<li>${xa(S)}</li>`)}</ul></div>`:l}</article>`}};X.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],p([u({attribute:!1})],X.prototype,"data",2),p([u({type:String,reflect:!0})],X.prototype,"mode",2),X=p([b("roxy-compatibility-card")],X);function xa(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${C(n.orb,1)}\xB0)`:"",t=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${t}${e} \xB7 ${n.description}`:`${t}${e}`}var Z=class extends f{constructor(){super();this.data=null;this.period="current";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dasha data</div>`;let t=this.collectPeriods(e),r=t.length?Math.max(...t.map(o=>o.durationYears)):0;return s`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?s`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?s`(lord ${e.nakshatraLord})`:l}</div>`:l}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):l} ${t.length>0?s`<div class="timeline" role="list">${t.map(o=>this.renderBar(o,r))}</div>`:l} ${this.renderActiveInterpretation(t)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return l;let t=e.birthDashaBalance,r="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",o=t.years??0,i=t.months??0,d=t.days??0,c=[];o&&c.push(`${o}y`),i&&c.push(`${i}m`),d&&c.push(`${d}d`);let m=c.length?c.join(" "):"0d";return s`<p class="balance">Birth dasha balance: ${m} of ${r?s`<strong>${r}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let t=e.find(r=>this.isCurrent(r));return t?.interpretation?s`<div class="interp"><h3>${t.planet} mahadasha</h3><p>${t.interpretation}</p></div>`:l}renderCurrent(e){return"mahadasha"in e?s`<div class="current">${"mahadasha"in e&&e.mahadasha?s`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?s`<small>${C(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:l}</div>`:l} ${"antardasha"in e&&e.antardasha?s`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?s`<small>${C(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:l}</div>`:l} ${"pratyantardasha"in e&&e.pratyantardasha?s`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?s`<small>${C(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:l}</div>`:l}</div>`:l}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let t=Date.now(),r=Date.parse(e.startDate),o=Date.parse(e.endDate);return Number.isNaN(r)||Number.isNaN(o)?!1:t>=r&&t<o}progressIn(e){if(!e.startDate||!e.endDate)return-1;let t=Date.parse(e.startDate),r=Date.parse(e.endDate),o=Date.now();return Number.isNaN(t)||Number.isNaN(r)||o<t||o>=r||r<=t?-1:(o-t)/(r-t)}renderBar(e,t){let r=e.durationYears,o=t>0?r/t*100:0,i=this.isCurrent(e),d=i?this.progressIn(e):-1,c=i?"bar-track bar-now":"bar-track";return s`<div class="${i?"bar now":"bar"}" role="listitem" aria-current="${i?"time":"false"}"><span><strong>${e.planet}</strong>${i?s`<span class="now-badge">Now</span>`:l} </span><span class="${c}"><span class="bar-fill" style="width:${o}%"></span> ${d>=0?s`<span class="bar-progress" style="left:${d*o}%" aria-hidden="true"></span>`:l} </span><span class="dates">${e.startDate?Pr(e.startDate):""} ${e.endDate?s`- ${Pr(e.endDate)}`:""}</span></div>`}};Z.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],p([u({attribute:!1})],Z.prototype,"data",2),p([u({type:String,reflect:!0})],Z.prototype,"period",2),Z=p([b("roxy-dasha-timeline")],Z);function Pr(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var fa=["title","name","label","heading","overview","summary"],ba=["imageUrl","image","icon","symbol"],va=["imageUrl","image"],$a=6,Q=class extends f{constructor(){super();this.data=null;this.depth=0;new $(this)}render(){return this.data==null?s`<div class="roxy-empty" role="status">No data</div>`:this.depth>=$a?s`<div class="roxy-empty" role="status">…</div>`:s`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?l:typeof e=="string"?s`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?s`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?s`<div class="roxy-empty" role="status">Empty list</div>`:e.every(o=>o===null||["string","number","boolean"].includes(typeof o))?s`<ul class="roxy-chips">${e.map(o=>s`<li>${String(o)}</li>`)}</ul>`:e.every(o=>o!==null&&typeof o=="object"&&!Array.isArray(o))?this.renderTable(e):s`<ol>${e.map(o=>s`<li>${this.renderValue(o)}</li>`)}</ol>`}renderTable(e){let t=this.collectKeys(e);return s`<table class="roxy-table" role="table"><thead><tr>${t.map(r=>s`<th>${j(r)}</th>`)}</tr></thead><tbody>${e.map(r=>s`<tr>${t.map(o=>s`<td>${this.formatPrimitive(r[o])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let t=fa.find(d=>typeof e[d]=="string"),r=ba.find(d=>typeof e[d]=="string"&&e[d].startsWith("http")),o=t!=="summary"&&typeof e.summary=="string"?"summary":null,i=Object.entries(e).filter(([d,c])=>d!==t&&d!==o&&!va.includes(d)&&c!==null&&c!==void 0);return s`${r?s`<img class="roxy-image" src="${String(e[r])}" alt="${t?String(e[t]):"illustration"}" loading="lazy">`:l} ${t?s`<h3 class="roxy-title">${e[t]}</h3>`:l} ${o?s`<p class="roxy-summary">${e[o]}</p>`:l} ${i.length>0?s`<dl class="roxy-rows">${i.map(([d,c])=>s`<dt>${j(d)}</dt><dd>${this.renderField(c)}</dd>`)}</dl>`:l}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(r=>["string","number","boolean"].includes(typeof r))?s`<ul class="roxy-chips">${e.map(r=>s`<li>${String(r)}</li>`)}</ul>`:s`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let t=new Set;for(let r of e)for(let o of Object.keys(r))t.add(o);return Array.from(t)}};Q.styles=[v,x`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],p([u({attribute:!1})],Q.prototype,"data",2),p([u({attribute:!1})],Q.prototype,"depth",2),Q=p([b("roxy-data")],Q);function q(n){let a=n%360;return a<0?a+360:a}function V(n){let a=q(n),e=Math.floor(a/30)%12,t=a%30,r=Math.floor(t),o=(t-r)*60,i=Math.floor(o),d=Math.round((o-i)*60);return{sign:_[e]??"Aries",signIndex:e,degree:r,minute:i,second:d}}function ft(n){let{sign:a,degree:e,minute:t}=V(n);return`${e}\xB0 ${a} ${String(t).padStart(2,"0")}'`}function Kt(n){return q(n+180)}function Er(n,a){let e=q(n),t=q(a)-e;return t<0&&(t+=360),q(e+t/2)}function T(n,a,e,t){let r=t*Math.PI/180;return{x:n+e*Math.cos(r),y:a+e*Math.sin(r)}}var fe=x`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function Ie(n){let{items:a,active:e,onSelect:t,label:r,idPrefix:o,controls:i=!1}=n;return s`<div class="roxy-tablist" role="tablist" aria-label="${r}" @keydown="${c=>{if(c.key!=="ArrowRight"&&c.key!=="ArrowLeft")return;c.preventDefault();let m=a.findIndex(S=>S.id===e);if(m===-1)return;let g=c.key==="ArrowRight"?1:-1,h=a[(m+g+a.length)%a.length];if(!h)return;t(h.id);let y=c.currentTarget.getRootNode();requestAnimationFrame(()=>{y.querySelector(`#${o}-tab-${h.id}`)?.focus()})}}">${a.map(c=>s`<button type="button" class="roxy-tab" role="tab" id="${o}-tab-${c.id}" aria-selected="${e===c.id?"true":"false"}" aria-controls="${i&&e===c.id?`${o}-panel-${c.id}`:l}" tabindex="${e===c.id?"0":"-1"}" @click="${()=>t(c.id)}">${c.label}</button>`)}</div>`}var B=400,R=20,O=B-2*R,z=B/2,wa=Object.fromEntries(_.map(n=>[n.toLowerCase(),n])),ka=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Sa="\u02B3";function Tr(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:V(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function Aa(n,a){let e=yr[A(n.graha)]??n.graha.slice(0,2),t=n.isRetrograde?Sa:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||Tr(n,a))return`${e}${t}`;let{degree:r}=V(n.longitude);return`${e} ${r}\xB0${t}`}function Ca(n,a){let e=[A(n.graha)],t=Tr(n,a);if(t&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let r=V(n.longitude),o=String(r.minute).padStart(2,"0");e.push(t?`D1: ${r.degree}\xB0${o}' ${r.sign}`:`${r.degree}\xB0${o}' ${r.sign}`)}if(n.nakshatra?.name){let r=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${r}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function qt(n,a,e,t,r){let o=t-(n.length-1)*r/2;return n.map((i,d)=>{let c=o+d*r;return w`<text class="planet-text" x=${e} y=${c} text-anchor="middle" dominant-baseline="central">${Aa(i,a)}<title>${Ca(i,a)}</title></text>`})}function vt(n,a){let e={};for(let r of _)e[r.toLowerCase()]=[];let t="";for(let[r,o]of Object.entries(n??{})){let i=(o?.rashi??"").toLowerCase();if(r==="Lagna"||o?.graha==="Lagna"){t=wa[i]??"";continue}!i||!(i in e)||e[i]?.push({graha:o.graha??r,longitude:o.longitude,nakshatra:o.nakshatra,isRetrograde:o.isRetrograde,awastha:o.awastha})}return{lagnaSign:t,placements:e,divisionLabel:a}}var De=O/4,Pa={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function Ea(n){let a=Pa[n]??{col:0,row:0};return{x:R+a.col*De,y:R+a.row*De,w:De,h:De}}function Ta(n){let a=R,e=R+De,t=R+2*De,r=R+3*De,o=B-R;return w`
|
|
7
|
+
</g>`})}function Ta(n,a){let e=[];for(let[r,t]of Object.entries(Vr)){let o=Number(r);if(!n.has(o))continue;let i=a.get(o);e.push(w`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${o}${i?w`<title>${i}</title>`:l}</text>`)}return e}function Lt(n,a){return Pt(n,a)}var Nt=`0 0 ${Rt} ${ya}`;function Mt(n){return w`
|
|
8
|
+
${ka()}
|
|
9
|
+
${Sa(n.activeChannels,n.activeGates)}
|
|
10
|
+
${Ea(n.definedCenters)}
|
|
11
|
+
${Ta(n.activeGates,n.gateTitles)}
|
|
12
|
+
`}function A(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function j(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var fe=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No bodygraph data</div>`;let r=new Set((e.centers??[]).filter(d=>d.defined).map(d=>d.id)),t=new Set((e.gates??[]).map(d=>d.gate).filter(d=>d!=null)),o=new Set((e.channels??[]).map(d=>Lt(d.gateA,d.gateB))),i=this.buildGateTitles(e.gates??[]);return s`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?s`<div class="type-line">${e.type}${e.profile?s`· Profile ${e.profile}`:l}</div>`:l}</header><div class="layout"><svg viewBox="${Nt}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Mt({definedCenters:r,activeChannels:o,activeGates:t,gateTitles:i})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let r=new Map;for(let t of e){if(t.gate==null)continue;let o=[`Gate ${t.gate}`];t.line!=null&&(o[0]+=`.${t.line}`),t.gateName&&o.push(t.gateName);let i=t.planet?A(t.planet):"",d=i?L[i]??i:"";d&&o.push(`${d} ${t.side??""}`.trim()),r.set(t.gate,o.join(" \xB7 "))}return r}renderSummary(e){let r=[{label:"Type",value:e.type},{label:"Strategy",value:e.strategy},{label:"Authority",value:e.authority},{label:"Profile",value:e.profile},{label:"Definition",value:e.definition}],t=e.incarnationCross;return s`<div class="summary"><div class="facts">${r.map(o=>o.value?s`<div class="fact"><span>${o.label}</span> <strong>${o.value}</strong></div>`:l)}</div>${t?.name?s`<p class="cross">${t.name} ${t.gates?.length?s`<span class="gates">(${t.gates.join(", ")})</span>`:l}</p>`:l} ${e.signature||e.notSelf?s`<div class="themes">${e.signature?s`<span class="pill pill--good">Signature: ${e.signature}</span>`:l} ${e.notSelf?s`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:l}</div>`:l}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};fe.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:340px;height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],p([h({attribute:!1})],fe.prototype,"data",2),fe=p([b("roxy-bodygraph")],fe);function zt(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var be=class extends x{constructor(){super();this.data=null;new $(this)}isCurrent(e){let r=Date.now(),t=Date.parse(e.start),o=Date.parse(e.end);return Number.isNaN(t)||Number.isNaN(o)?!1:r>=t&&r<o}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",t=this.isCurrent(e),o=L[A(e.lord)]??"",i=`${zt(e.start)} - ${zt(e.end)}`;return s`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?s`<span class="now-badge">Now</span>`:l} </span><span class="tile-time" aria-label="Time range">${i}</span> <span class="tile-lord">${o?s`<span aria-hidden="true">${o}</span>`:l} ${e.lord}</span></div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return s`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?s`<p class="subtitle">${e}</p>`:l}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};be.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],p([h({attribute:!1})],be.prototype,"data",2),be=p([b("roxy-choghadiya-grid")],be);function q(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,r=new Date(e);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function ve(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Wr(n){if(!n)return"";let a=q(n.start),e=q(n.end);return a&&e?`${a} - ${e}`:a||e||""}function C(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function Dt(n,a=1){let e=C(n,a);return e?`${e}%`:""}var He={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function Ke(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}var Z=class extends x{constructor(){super();this.data=null;this.mode="astrology";new $(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(r[t]=o);return r}return{}}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),o="rating"in e?e.rating:void 0,i="archetype"in e?e.archetype:void 0,d="advice"in e?e.advice:void 0,c="summary"in e?e.summary:void 0,m="interpretation"in e?e.interpretation:void 0,y="strengths"in e?e.strengths:void 0,g="challenges"in e?e.challenges:void 0,f="keyAspects"in e?e.keyAspects:void 0;return s`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?s`<div class="score">${C(r,0)}</div>`:l} ${o?s`<div class="rating">${o}</div>`:l}</div></div>${Object.keys(t).length>0?s`<div role="list">${Object.entries(t).map(([S,k])=>s`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${S}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,k))}%"></span></span> <span>${C(k,0)}</span></div>`)}</div>`:l} ${i?s`<p><span class="archetype">${i.label}</span> ${i.description?s`· ${i.description}`:l}</p>`:l} ${c?s`<p>${c}</p>`:l} ${m&&!c?s`<p>${m}</p>`:l} ${d?s`<p>${d}</p>`:l} ${(y?.length??0)>0||(g?.length??0)>0?s`<div class="lists">${y?.length?s`<div><h3>Strengths</h3><ul>${y.map(S=>s`<li>${S}</li>`)}</ul></div>`:l} ${g?.length?s`<div><h3>Challenges</h3><ul>${g.map(S=>s`<li>${S}</li>`)}</ul></div>`:l}</div>`:l} ${f?.length?s`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${f.slice(0,6).map(S=>s`<li>${Ra(S)}</li>`)}</ul></div>`:l}</article>`}};Z.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],p([h({attribute:!1})],Z.prototype,"data",2),p([h({type:String,reflect:!0})],Z.prototype,"mode",2),Z=p([b("roxy-compatibility-card")],Z);function Ra(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${C(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}var Pa=["January","February","March","April","May","June","July","August","September","October","November","December"],Q=class extends x{constructor(){super();this.data=null;this.heading="";new $(this)}render(){let e=this.data,r=e?.crystals??[];if(!e||r.length===0)return s`<div class="roxy-empty" role="status">No crystals</div>`;let t=this.heading||this.deriveHeading(e),o="total"in e&&typeof e.total=="number"?e.total:r.length;return s`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${o} ${o===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(i=>s`<li class="tile">${i.imageUrl?s`<img class="photo" src="${i.imageUrl}" alt="${i.name??"Crystal"}" loading="lazy">`:s`<div class="photo" aria-hidden="true"></div>`}<p class="name">${i.name}</p>${i.colors&&i.colors.length>0?s`<div class="colors" aria-label="${`Colours: ${i.colors.join(", ")}`}">${i.colors.map(d=>s`<span class="swatch" style="${`background:${La(d)}`}" title="${d}"></span>`)}</div>`:l}</li>`)}</ul></section>`}deriveHeading(e){return"chakra"in e&&e.chakra?`${e.chakra} chakra crystals`:"element"in e&&e.element?`${e.element} element crystals`:"sign"in e&&e.sign?`Crystals for ${e.sign}`:"month"in e&&typeof e.month=="number"?`${Pa[e.month-1]??""} birthstones`.trim():"Crystals"}};Q.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.photo{aspect-ratio:1;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.colors{flex-wrap:wrap;gap:4px;display:flex}.swatch{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:10px;height:10px}`],p([h({attribute:!1})],Q.prototype,"data",2),p([h({type:String,reflect:!0})],Q.prototype,"heading",2),Q=p([b("roxy-crystal-grid")],Q);function La(n){return n.trim().toLowerCase().replace(/\s+/g,"")}var ee=class extends x{constructor(){super();this.data=null;this.period="current";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(o=>o.durationYears)):0;return s`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?s`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?s`(lord ${e.nakshatraLord})`:l}</div>`:l}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):l} ${r.length>0?s`<div class="timeline" role="list">${r.map(o=>this.renderBar(o,t))}</div>`:l} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return l;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",o=r.years??0,i=r.months??0,d=r.days??0,c=[];o&&c.push(`${o}y`),i&&c.push(`${i}m`),d&&c.push(`${d}d`);let m=c.length?c.join(" "):"0d";return s`<p class="balance">Birth dasha balance: ${m} of ${t?s`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?s`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:l}renderCurrent(e){return"mahadasha"in e?s`<div class="current">${"mahadasha"in e&&e.mahadasha?s`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?s`<small>${C(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:l}</div>`:l} ${"antardasha"in e&&e.antardasha?s`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?s`<small>${C(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:l}</div>`:l} ${"pratyantardasha"in e&&e.pratyantardasha?s`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?s`<small>${C(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:l}</div>`:l}</div>`:l}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),o=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(o)?!1:r>=t&&r<o}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),o=Date.now();return Number.isNaN(r)||Number.isNaN(t)||o<r||o>=t||t<=r?-1:(o-r)/(t-r)}renderBar(e,r){let t=e.durationYears,o=r>0?t/r*100:0,i=this.isCurrent(e),d=i?this.progressIn(e):-1,c=i?"bar-track bar-now":"bar-track";return s`<div class="${i?"bar now":"bar"}" role="listitem" aria-current="${i?"time":"false"}"><span><strong>${e.planet}</strong>${i?s`<span class="now-badge">Now</span>`:l} </span><span class="${c}"><span class="bar-fill" style="width:${o}%"></span> ${d>=0?s`<span class="bar-progress" style="left:${d*o}%" aria-hidden="true"></span>`:l} </span><span class="dates">${e.startDate?_t(e.startDate):""} ${e.endDate?s`- ${_t(e.endDate)}`:""}</span></div>`}};ee.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],p([h({attribute:!1})],ee.prototype,"data",2),p([h({type:String,reflect:!0})],ee.prototype,"period",2),ee=p([b("roxy-dasha-timeline")],ee);function _t(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var Na=["title","name","label","heading","overview","summary"],Ma=["imageUrl","image","icon","symbol"],za=["imageUrl","image"],Da=6,re=class extends x{constructor(){super();this.data=null;this.depth=0;new $(this)}render(){return this.data==null?s`<div class="roxy-empty" role="status">No data</div>`:this.depth>=Da?s`<div class="roxy-empty" role="status">…</div>`:s`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?l:typeof e=="string"?s`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?s`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?s`<div class="roxy-empty" role="status">Empty list</div>`:e.every(o=>o===null||["string","number","boolean"].includes(typeof o))?s`<ul class="roxy-chips">${e.map(o=>s`<li>${String(o)}</li>`)}</ul>`:e.every(o=>o!==null&&typeof o=="object"&&!Array.isArray(o))?this.renderTable(e):s`<ol>${e.map(o=>s`<li>${this.renderValue(o)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return s`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>s`<th>${j(t)}</th>`)}</tr></thead><tbody>${e.map(t=>s`<tr>${r.map(o=>s`<td>${this.formatPrimitive(t[o])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=Na.find(d=>typeof e[d]=="string"),t=Ma.find(d=>typeof e[d]=="string"&&e[d].startsWith("http")),o=r!=="summary"&&typeof e.summary=="string"?"summary":null,i=Object.entries(e).filter(([d,c])=>d!==r&&d!==o&&!za.includes(d)&&c!==null&&c!==void 0);return s`${t?s`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:l} ${r?s`<h3 class="roxy-title">${e[r]}</h3>`:l} ${o?s`<p class="roxy-summary">${e[o]}</p>`:l} ${i.length>0?s`<dl class="roxy-rows">${i.map(([d,c])=>s`<dt>${j(d)}</dt><dd>${this.renderField(c)}</dd>`)}</dl>`:l}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?s`<ul class="roxy-chips">${e.map(t=>s`<li>${String(t)}</li>`)}</ul>`:s`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let o of Object.keys(t))r.add(o);return Array.from(r)}};re.styles=[v,u`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],p([h({attribute:!1})],re.prototype,"data",2),p([h({attribute:!1})],re.prototype,"depth",2),re=p([b("roxy-data")],re);function Y(n){let a=n%360;return a<0?a+360:a}function U(n){let a=Y(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),o=(r-t)*60,i=Math.floor(o),d=Math.round((o-i)*60);return{sign:D[e]??"Aries",signIndex:e,degree:t,minute:i,second:d}}function wr(n){let{sign:a,degree:e,minute:r}=U(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function Jr(n){return Y(n+180)}function Ot(n,a){let e=Y(n),r=Y(a)-e;return r<0&&(r+=360),Y(e+r/2)}function R(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}var $e=u`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function qe(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:o,controls:i=!1}=n;return s`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${c=>{if(c.key!=="ArrowRight"&&c.key!=="ArrowLeft")return;c.preventDefault();let m=a.findIndex(S=>S.id===e);if(m===-1)return;let y=c.key==="ArrowRight"?1:-1,g=a[(m+y+a.length)%a.length];if(!g)return;r(g.id);let f=c.currentTarget.getRootNode();requestAnimationFrame(()=>{f.querySelector(`#${o}-tab-${g.id}`)?.focus()})}}">${a.map(c=>s`<button type="button" class="roxy-tab" role="tab" id="${o}-tab-${c.id}" aria-selected="${e===c.id?"true":"false"}" aria-controls="${i&&e===c.id?`${o}-panel-${c.id}`:l}" tabindex="${e===c.id?"0":"-1"}" @click="${()=>r(c.id)}">${c.label}</button>`)}</div>`}var B=400,P=20,O=B-2*P,z=B/2,Gt=Object.fromEntries(D.map(n=>[n.toLowerCase(),n])),_a=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Oa="\u02B3";function Ht(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:U(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function Ga(n,a){let e=At[A(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?Oa:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||Ht(n,a))return`${e}${r}`;let{degree:t}=U(n.longitude);return`${e} ${t}\xB0${r}`}function Ha(n,a){let e=[A(n.graha)],r=Ht(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=U(n.longitude),o=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${o}' ${t.sign}`:`${t.degree}\xB0${o}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Xr(n,a,e,r,t){let o=r-(n.length-1)*t/2;return n.map((i,d)=>{let c=o+d*t;return w`<text class="planet-text" x=${e} y=${c} text-anchor="middle" dominant-baseline="central">${Ga(i,a)}<title>${Ha(i,a)}</title></text>`})}function Sr(n,a,e){let r={};for(let i of D)r[i.toLowerCase()]=[];let t=e?Gt[e.toLowerCase()]??"":"",o=t;for(let[i,d]of Object.entries(n??{})){let c=(d?.rashi??"").toLowerCase();if(i==="Lagna"||d?.graha==="Lagna"){t||(o=Gt[c]??"");continue}!c||!(c in r)||r[c]?.push({graha:d.graha??i,longitude:d.longitude,nakshatra:d.nakshatra,isRetrograde:d.isRetrograde,awastha:d.awastha})}return{lagnaSign:o,placements:r,divisionLabel:a}}var Ie=O/4,Ia={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function ja(n){let a=Ia[n]??{col:0,row:0};return{x:P+a.col*Ie,y:P+a.row*Ie,w:Ie,h:Ie}}function Ba(n){let a=P,e=P+Ie,r=P+2*Ie,t=P+3*Ie,o=B-P;return w`
|
|
13
13
|
<rect class="line" x=${a} y=${a} width=${O} height=${O} stroke-width="1.5" fill="none" />
|
|
14
14
|
<line class="line" x1=${a} y1=${e} x2=${o} y2=${e} stroke-width="1" />
|
|
15
|
-
<line class="line" x1=${a} y1=${
|
|
15
|
+
<line class="line" x1=${a} y1=${t} x2=${o} y2=${t} stroke-width="1" />
|
|
16
16
|
<line class="line" x1=${e} y1=${a} x2=${e} y2=${o} stroke-width="1" />
|
|
17
|
-
<line class="line" x1=${
|
|
18
|
-
<line class="line" x1=${a} y1=${
|
|
19
|
-
<line class="line" x1=${
|
|
20
|
-
<line class="line" x1=${
|
|
21
|
-
<line class="line" x1=${
|
|
17
|
+
<line class="line" x1=${t} y1=${a} x2=${t} y2=${o} stroke-width="1" />
|
|
18
|
+
<line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
19
|
+
<line class="line" x1=${t} y1=${r} x2=${o} y2=${r} stroke-width="1" />
|
|
20
|
+
<line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
|
|
21
|
+
<line class="line" x1=${r} y1=${t} x2=${r} y2=${o} stroke-width="1" />
|
|
22
22
|
${n?w`<text class="centre-label" x=${z} y=${z} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
|
|
23
|
-
`}function
|
|
23
|
+
`}function It(n,a){let e=D.findIndex(t=>t===a),r=D.findIndex(t=>t===n);return e===-1||r===-1?0:(r-e+12)%12+1}function Ka(n,a,e,r){let t=ja(n),o=t.x+t.w/2,i=t.y+t.h/2,d=xr[n]??n.slice(0,2),c=14;return w`
|
|
24
24
|
<g class=${e?"cell lagna":"cell"}>
|
|
25
25
|
${e?w`
|
|
26
|
-
<rect class="lagna-bg" x=${
|
|
27
|
-
<line class="lagna-slash" x1=${
|
|
26
|
+
<rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
|
|
27
|
+
<line class="lagna-slash" x1=${t.x+t.w-c} y1=${t.y+c} x2=${t.x+c} y2=${t.y+t.h-c} stroke-width="1.2" />
|
|
28
28
|
`:l}
|
|
29
|
-
<text class="sign-text" x=${
|
|
30
|
-
${
|
|
31
|
-
${e?w`<text class="lagna-marker" x=${o} y=${
|
|
32
|
-
${a.length?
|
|
29
|
+
<text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${d}</text>
|
|
30
|
+
${r>0?w`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:l}
|
|
31
|
+
${e?w`<text class="lagna-marker" x=${o} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
|
|
32
|
+
${a.length?Xr(a,n,o,i+4,14):l}
|
|
33
33
|
</g>
|
|
34
|
-
`}function
|
|
35
|
-
${
|
|
36
|
-
${
|
|
37
|
-
`}var
|
|
34
|
+
`}function qa(n){let a=n.lagnaSign.toLowerCase();return w`
|
|
35
|
+
${Ba(n.divisionLabel)}
|
|
36
|
+
${D.map(e=>Ka(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,It(e,n.lagnaSign)))}
|
|
37
|
+
`}var T={tl:{x:P,y:P},tr:{x:B-P,y:P},br:{x:B-P,y:B-P},bl:{x:P,y:B-P},top:{x:z,y:P},right:{x:B-P,y:z},bottom:{x:z,y:B-P},left:{x:P,y:z},tlMid:{x:z-O/4,y:z-O/4},trMid:{x:z+O/4,y:z-O/4},brMid:{x:z+O/4,y:z+O/4},blMid:{x:z-O/4,y:z+O/4}};function te(n){let a=n.reduce((r,t)=>r+t.x,0)/n.length,e=n.reduce((r,t)=>r+t.y,0)/n.length;return{x:a,y:e}}var Ya={1:{x:z,y:T.tlMid.y},2:te([T.tl,T.top,T.tlMid]),3:te([T.tl,T.left,T.tlMid]),4:{x:T.tlMid.x,y:z},5:te([T.bl,T.left,T.blMid]),6:te([T.bl,T.bottom,T.blMid]),7:{x:z,y:T.blMid.y},8:te([T.br,T.bottom,T.brMid]),9:te([T.br,T.right,T.brMid]),10:{x:T.brMid.x,y:z},11:te([T.tr,T.right,T.trMid]),12:te([T.tr,T.top,T.trMid])};function Ua(n,a){let e=D.findIndex(r=>r===a);return e===-1?n:(e+n-1)%12+1}function Va(n){let{tl:a,tr:e,br:r,bl:t,top:o,right:i,bottom:d,left:c}=T;return w`
|
|
38
38
|
<rect class="line" x=${a.x} y=${a.y} width=${O} height=${O} stroke-width="1.5" fill="none" />
|
|
39
39
|
<polygon class="line" points="${o.x},${o.y} ${i.x},${i.y} ${d.x},${d.y} ${c.x},${c.y}" stroke-width="1" fill="none" />
|
|
40
|
-
<line class="line" x1=${a.x} y1=${a.y} x2=${
|
|
41
|
-
<line class="line" x1=${e.x} y1=${e.y} x2=${
|
|
40
|
+
<line class="line" x1=${a.x} y1=${a.y} x2=${r.x} y2=${r.y} stroke-width="1" />
|
|
41
|
+
<line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
|
|
42
42
|
${n?w`<text class="centre-label" x=${z} y=${z} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
|
|
43
|
-
`}function
|
|
44
|
-
<g class=${
|
|
43
|
+
`}function Fa(n,a,e,r,t){let o=Ya[n];if(!o)return w``;let i=Math.min(14,Math.abs(o.y-z)*.45+6),d=i+12,c=t?`${a} \xB7 ${xr[e]??e.slice(0,2)}`:`${a}`;return w`
|
|
44
|
+
<g class=${t?"cell lagna":"cell"}>
|
|
45
45
|
<text class="rashi-num" x=${o.x} y=${o.y-i} text-anchor="middle" dominant-baseline="central">${c}</text>
|
|
46
|
-
${
|
|
47
|
-
${
|
|
46
|
+
${t?w`<text class="lagna-marker" x=${o.x} y=${o.y-d} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
|
|
47
|
+
${r.length?Xr(r,e,o.x,o.y+8,12):l}
|
|
48
48
|
</g>
|
|
49
|
-
`}function
|
|
50
|
-
${
|
|
51
|
-
${Array.from({length:12},(e,
|
|
52
|
-
`}var
|
|
49
|
+
`}function Wa(n){let a=n.lagnaSign||"Aries";return w`
|
|
50
|
+
${Va(n.divisionLabel)}
|
|
51
|
+
${Array.from({length:12},(e,r)=>{let t=r+1,o=Ua(t,a),i=D[o-1]??"Aries";return Fa(t,o,i,n.placements[i.toLowerCase()]??[],t===1)})}
|
|
52
|
+
`}var kr=O/3;function Ja(){let n=P,a=P+kr,e=P+2*kr,r=B-P,ir={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:r}],Virgo:[{x:a,y:e},{x:a,y:r},{x:n,y:r}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:r},{x:a,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:a},{x:r,y:a},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:n},{x:r,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:r,y:n},{x:e,y:a}]},We={};for(let[lr,dr]of Object.entries(ir))We[lr]={points:[...dr],centroid:te(dr)};return We}var Xa=Ja();function Za(n){let a=P,e=P+kr,r=P+2*kr,t=B-P;return w`
|
|
53
53
|
<rect class="line" x=${a} y=${a} width=${O} height=${O} stroke-width="1.5" fill="none" />
|
|
54
54
|
<line class="line" x1=${a} y1=${e} x2=${e} y2=${e} stroke-width="1" />
|
|
55
|
-
<line class="line" x1=${
|
|
56
|
-
<line class="line" x1=${a} y1=${
|
|
57
|
-
<line class="line" x1=${
|
|
55
|
+
<line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
|
|
56
|
+
<line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
57
|
+
<line class="line" x1=${r} y1=${r} x2=${t} y2=${r} stroke-width="1" />
|
|
58
58
|
<line class="line" x1=${e} y1=${a} x2=${e} y2=${e} stroke-width="1" />
|
|
59
|
-
<line class="line" x1=${e} y1=${
|
|
60
|
-
<line class="line" x1=${
|
|
61
|
-
<line class="line" x1=${
|
|
59
|
+
<line class="line" x1=${e} y1=${r} x2=${e} y2=${t} stroke-width="1" />
|
|
60
|
+
<line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
|
|
61
|
+
<line class="line" x1=${r} y1=${r} x2=${r} y2=${t} stroke-width="1" />
|
|
62
62
|
<line class="line" x1=${a} y1=${a} x2=${e} y2=${e} stroke-width="1" />
|
|
63
|
-
<line class="line" x1=${
|
|
64
|
-
<line class="line" x1=${
|
|
65
|
-
<line class="line" x1=${a} y1=${
|
|
63
|
+
<line class="line" x1=${t} y1=${a} x2=${r} y2=${e} stroke-width="1" />
|
|
64
|
+
<line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
|
|
65
|
+
<line class="line" x1=${a} y1=${t} x2=${e} y2=${r} stroke-width="1" />
|
|
66
66
|
${n?w`<text class="centre-label" x=${z} y=${z} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
|
|
67
|
-
`}function
|
|
67
|
+
`}function Qa(n,a,e,r){let t=Xa[n];if(!t)return w``;let{centroid:o,points:i}=t,d=xr[n]??n.slice(0,2),c=i.map(m=>`${m.x},${m.y}`).join(" ");return w`
|
|
68
68
|
<g class=${e?"cell lagna":"cell"}>
|
|
69
69
|
${e?w`<polygon class="lagna-bg" points=${c} />`:l}
|
|
70
70
|
<text class="sign-text" x=${o.x} y=${o.y-16} text-anchor="middle" dominant-baseline="central">${d}</text>
|
|
71
|
-
${
|
|
71
|
+
${r>0?w`<text class="house-num" x=${o.x+18} y=${o.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:l}
|
|
72
72
|
${e?w`<text class="lagna-marker" x=${o.x} y=${o.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
|
|
73
|
-
${a.length?
|
|
73
|
+
${a.length?Xr(a,n,o.x,o.y+4,12):l}
|
|
74
74
|
</g>
|
|
75
|
-
`}function
|
|
76
|
-
${
|
|
77
|
-
${
|
|
78
|
-
`}function $t(n,a){switch(a){case"north":return Da(n);case"east":return ja(n);default:return La(n)}}function wt(n,a){return Ie({items:ka,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var kt=x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var te=class extends f{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new $(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,t=`D${e.number} ${e.name}`;return vt(this.data.chart.meta,t)}render(){let e=this.viewModel();if(!this.data||!e)return s`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:t,vargottama:r}=this.data;return s`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?s`<span class="division-meta">· ${t.sanskritName}</span>`:l}</h2>${t.significance?s`<p class="significance">${t.significance}</p>`:l}</div>${wt(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${$t(e,this.chartStyle)}</svg> ${r&&r.length>0?s`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${r.map(o=>s`<span class="vargottama-pill" role="listitem">${L[o]??""} ${o}</span>`)}</div>`:l}</div>`}};te.styles=[v,kt,fe,x`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],p([u({attribute:!1})],te.prototype,"data",2),p([u({type:String,reflect:!0,attribute:"chart-style"})],te.prototype,"chartStyle",2),te=p([b("roxy-divisional-chart")],te);var Ba={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},re=class extends f{constructor(){super();this.data=null;this.type="manglik";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dosha data</div>`;let t=!!e.present,r=Ba[this.type]??this.type,o=(e.severity??"").toLowerCase(),i=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=i*33,c=i===3?"var(--roxy-danger)":i===2?"var(--roxy-warning)":i===1?"var(--roxy-success)":"transparent";return s`<article class="card" aria-label="${r}"><header class="head"><h2 class="title">${r}</h2><span class="${`badge ${t?"present":"absent"}`}">${t?"Present":"Absent"}</span></header>${e.severity?s`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${i}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${d}%;background:${c}"></span></div>`:l} ${e.description?s`<p class="description">${e.description}</p>`:l} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?s`<div><h3>Remedies</h3><ul>${e.remedies.map(m=>s`<li>${m}</li>`)}</ul></div>`:l} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?s`<div><h3>Exceptions</h3><ul>${e.exceptions.map(m=>s`<li>${m}</li>`)}</ul></div>`:l}</article>`}renderEffects(e){if(!e.effects)return l;let t=Object.entries(e.effects).filter(([,r])=>typeof r=="string"&&r.length>0);return t.length===0?l:s`<div class="effects">${t.map(([r,o])=>s`<div><h3>${r}</h3><p>${o}</p></div>`)}</div>`}};re.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],p([u({attribute:!1})],re.prototype,"data",2),p([u({type:String,reflect:!0})],re.prototype,"type",2),re=p([b("roxy-dosha-card")],re);var Vt=new Map;async function Ka(n){let a=Vt.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Vt.delete(n),e}),Vt.set(n,a)),a}var H=class extends f{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let t=e.detail;t&&(this.values={...this.values,latitude:t.latitude,longitude:t.longitude,timezone:t.timezone??t.utcOffset})};this.onSubmit=e=>{e.preventDefault();let t=this.fields.filter(r=>r.required).filter(r=>this.values[r.name]===void 0||this.values[r.name]==="");if(t.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:t.map(r=>r.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Ka(this.specUrl),t=`/${this.endpoint.replace(/^\//,"")}`,r=e.paths?.[t]?.[this.method.toLowerCase()];if(!r)throw new Error(`Endpoint ${this.method} ${t} not found in OpenAPI spec`);let o=e.components?.schemas??{},i=[],d;if(r.requestBody){let m=r.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[g,h]of Object.entries(d.properties)){let y=this.resolve(h,o)??{};i.push({name:g,type:this.fieldType(y),required:m.has(g),description:y.description,enum:y.enum,min:y.minimum,max:y.maximum,default:y.default})}}for(let m of r.parameters??[])if(m.in==="path"||m.in==="query"){let g=this.resolve(m.schema,o)??{};i.push({name:m.name,type:this.fieldType(g),required:!!m.required,description:g.description,enum:g.enum,default:g.default})}this.fields=i,this.hasLocation=i.some(m=>m.name==="latitude")&&i.some(m=>m.name==="longitude")&&i.some(m=>m.name==="timezone");let c={};for(let m of i)m.default!==void 0&&(c[m.name]=m.default);this.values=c,this.loaded=!0}catch(e){let t=e instanceof Error?e.message:String(e);this.specError=t,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:t},bubbles:!0,composed:!0}))}}resolve(e,t){if(e){if("$ref"in e&&e.$ref){let r=e.$ref.split("/").pop();return r?t[r]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,t){this.values={...this.values,[e]:t}}render(){if(!this.loaded)return s`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return s`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=t=>{if(this.hasLocation&&(t.name==="latitude"||t.name==="longitude"||t.name==="timezone"))return l;let r=`roxy-form-${t.name}`;return s`<div class="field"><label for="${r}">${j(t.name)}${t.required?s`<span class="req" aria-hidden="true">*</span>`:l}</label> ${t.enum?s`<select id="${r}" ?required="${t.required}" @change="${o=>this.setValue(t.name,o.target.value)}"><option value="">Choose</option>${t.enum.map(o=>s`<option value="${o}" ?selected="${this.values[t.name]===o}">${o}</option>`)}</select>`:s`<input id="${r}" type="${this.htmlType(t.type)}" ?required="${t.required}" min="${t.min??""}" max="${t.max??""}" step="${t.type==="number"?"any":""}" .value="${this.values[t.name]??""}" @input="${o=>this.setValue(t.name,this.coerce(t.type,o.target.value))}">`} ${t.description?s`<small class="help">${t.description}</small>`:l}</div>`};return s`<form @submit="${this.onSubmit}"><h2 class="title">${j(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?s`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:l}<div class="fields">${this.fields.map(t=>e(t))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,t){if(t!==""){if(e==="number"){let r=Number(t);return Number.isFinite(r)?r:void 0}return t}}};H.styles=[v,x`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],p([u({type:String,attribute:"data-endpoint"})],H.prototype,"endpoint",2),p([u({type:String})],H.prototype,"method",2),p([u({type:String,attribute:"spec-url"})],H.prototype,"specUrl",2),p([u({type:String,attribute:"submit-label"})],H.prototype,"submitLabel",2),p([N()],H.prototype,"fields",2),p([N()],H.prototype,"values",2),p([N()],H.prototype,"hasLocation",2),p([N()],H.prototype,"loaded",2),p([N()],H.prototype,"specError",2),H=p([b("roxy-endpoint-form")],H);var qa={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Va=["western","vedic","biorhythm"],be=class extends f{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No forecast data</div>`;let t=e.events??[],r=this.groupByDate(t),o=Va.filter(i=>t.some(d=>d.domain===i));return s`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?s`<div class="range">${xe(e.startDate)} - ${xe(e.endDate)} · ${e.count??t.length} events</div>`:l}</header>${o.length?s`<div class="legend">${o.map(i=>s`<span><span class="swatch swatch-${i}"></span>${qa[i]}</span>`)}</div>`:l} ${r.length?s`<div class="days" role="list">${r.map(([i,d])=>this.renderDay(i,d))}</div>`:s`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(e){let t=new Map;for(let r of e){let o=r.date??"",i=t.get(o)??[];i.push(r),t.set(o,i)}return[...t.entries()]}renderDay(e,t){return s`<div class="day" role="listitem"><div class="day-date">${xe(e)}</div><div class="events">${t.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(e){let t=typeof e.significance=="number"?e.significance:0,r=Math.max(0,Math.min(100,t));return s`<div class="event"><span class="dot dot-${e.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(e)}</div>${e.description?s`<p class="event-desc">${e.description}</p>`:l}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${e.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(e){let t=e.body?A(e.body):"",r=e.target?A(e.target):"",o=e.aspect?e.aspect.toLowerCase():"",i=_e[o]??"",d=o?et[o]??o:"",c=typeof e.orb=="number"?C(e.orb,1):"",m=this.typeQualifier(e);return o&&r?s`<strong>${t}</strong> <span class="${i}">${d}</span> <strong>${r}</strong>${c?s`<span class="kind">orb ${c}°</span>`:l}`:s`<strong>${t||j(e.type??"")}</strong>${m?s`<span class="kind">${m}</span>`:l}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${A(e.target)}`:e.type==="retrograde-station"&&e.station?e.station:e.type==="eclipse"?[e.kind,"eclipse"].filter(Boolean).join(" "):e.type==="critical-day"?"critical day":e.type==="dasha-change"&&e.target?`dasha ${A(e.target)}`:j(e.type??"")}};be.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],p([u({attribute:!1})],be.prototype,"data",2),be=p([b("roxy-forecast-timeline")],be);var ve=class extends f{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let t=(e.breakdown??[]).filter(h=>h?.category!==void 0),r=e.total??0,o=e.maxScore??36,i=r/o*100,d="color-mix(in srgb, var(--roxy-border) 50%, transparent)",c=i>=70?"var(--roxy-success)":i>=50?"var(--roxy-warning)":"var(--roxy-danger)",m=i*2.827,g=(100-i)*2.827;return s`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${C(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?s`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Cr(e.percentage,1)}</small>`:l}</div>${e.recommendation?s`<span class="recommendation">${e.recommendation}</span>`:l}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${c}" stroke-width="8" stroke-dasharray="${m},${g}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${o}</text></svg></div></div>${t.length>0?s`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${t.map(h=>{let y=h.score??0,S=h.maxScore??Ya(h.category),k=S?y/S*100:0;return s`<tr><td>${h.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${k}%"></span></div></td><td class="score">${C(y,1)} / ${S}</td></tr>`})}</tbody></table>`:l} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?s`<div class="tags">${e.doshas?.map(h=>s`<span class="dosha">${h}</span>`)} ${e.doshaCancellations?.map(h=>s`<span class="cancel" title="${h.reason}">${h.dosha} cancelled</span>`)}</div>`:l}</article>`}};ve.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],p([u({attribute:!1})],ve.prototype,"data",2),ve=p([b("roxy-guna-milan")],ve);function Ya(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var ae=class extends f{constructor(){super();this.data=null;this.mode="lookup";new $(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let r=e;return{hex:r.hexagram,lines:r.lines,changingLinePositions:r.changingLinePositions,resultingHexagram:r.resultingHexagram}}let t=e;return{hex:t.hexagram,dailyMessage:t.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return s`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:t,lines:r,changingLinePositions:o,dailyMessage:i,resultingHexagram:d}=e,c=r??this.derivedLines(t),m=new Set(o??[]);return s`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${t.symbol?s`<div class="symbol">${t.symbol}</div>`:l}<div class="lines" aria-hidden="true">${c.slice().reverse().map((g,h)=>{let y=c.length-1-h+1,S=m.has(y),k=g===6||g===8;return s`<div class="line ${`${k?"broken":"solid"}${S?" changing":""}`}">${k?w`<span class="seg"></span><span class="seg"></span>`:w`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${t.number?s`${t.number}.`:l}${t.english??t.chinese??"Hexagram"}</h2><p class="subtitle">${t.chinese?s`${t.chinese}`:l} ${t.pinyin?s`· ${t.pinyin}`:l}</p><div class="trigrams">${t.upperTrigram?s`<div>Upper <span class="tri-glyph">${Ot[t.upperTrigram]??""}</span>${t.upperTrigram}</div>`:l} ${t.lowerTrigram?s`<div>Lower <span class="tri-glyph">${Ot[t.lowerTrigram]??""}</span>${t.lowerTrigram}</div>`:l}</div>${t.judgment?s`<p class="judgment">${t.judgment}</p>`:l} ${t.image?s`<p class="image">${t.image}</p>`:l} ${i?s`<p class="message">${i}</p>`:l} ${t.interpretation?.general?s`<p>${t.interpretation.general}</p>`:l} ${m.size>0?s`<div class="changing">Changing lines: ${Array.from(m).sort((g,h)=>g-h).join(", ")}. ${d?.english?s`Becomes hexagram ${d.number} ${d.english}.`:l}</div>`:l}</div></article>`}derivedLines(e){let t=e.symbol.codePointAt(0)??0;if(t>=19904&&t<=19967){let r=t-19904,o=[];for(let i=0;i<6;i++){let d=r>>i&1;o.push(d?8:7)}return o}return Array.from({length:6},()=>7)}};ae.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],p([u({attribute:!1})],ae.prototype,"data",2),p([u({type:String,reflect:!0})],ae.prototype,"mode",2),ae=p([b("roxy-hexagram")],ae);var se=class extends f{constructor(){super();this.data=null;this.period="daily";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No horoscope data</div>`;let t=e.sign??"",r=t?G[A(t)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,i="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return s`<article class="card" aria-label="${`${this.period} horoscope for ${t}`}"><header class="head"><span class="glyph" aria-hidden="true">${r}</span><div><h2 class="title">${t} ${this.period}</h2>${i?s`<div class="date">${i}</div>`:l}</div>${o!==null?s`<span class="energy" aria-label="${`Energy ${o} of 10`}">Energy ${o}/10 <span class="energy-bar"><span style="width:${o/10*100}%"></span></span></span>`:l}</header>${e.overview?s`<p class="overview">${e.overview}</p>`:l}<div class="sections">${e.love?s`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:l} ${e.career?s`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:l} ${e.health?s`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:l} ${e.finance?s`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:l} ${"advice"in e&&e.advice?s`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:l}</div>${(()=>{let d="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,c="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],g="luckyDays"in e&&e.luckyDays?e.luckyDays:[],h=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&g.length===0&&h.length===0?l:s`<div class="lucky">${d!==void 0?s`<span>Lucky number <strong>${d}</strong></span>`:l} ${c?s`<span>Lucky color <strong>${c}</strong></span>`:l} ${m.length?s`<span>Lucky numbers <strong>${m.join(", ")}</strong></span>`:l} ${g.length?s`<span>Lucky days <strong>${g.join(", ")}</strong></span>`:l} ${h.length?s`<span class="compat-wrap">Best with <span class="compat">${h.map(y=>s`<span>${y}</span>`)}</span></span>`:l}</div>`})()}</article>`}};se.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],p([u({attribute:!1})],se.prototype,"data",2),p([u({type:String,reflect:!0})],se.prototype,"period",2),se=p([b("roxy-horoscope-card")],se);var oe=class extends f{constructor(){super();this.data=null;this.activeTab="planets";new $(this)}bodies(){let e=this.data;if(!e)return[];let t=(e.planets??[]).map(o=>({name:o.planet,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,kpNumber:o.kpNumber,retrograde:o.retrograde})),r=e.nodes;for(let[o,i]of[["Rahu",r?.rahu],["Ketu",r?.ketu]])i&&t.push({name:o,sign:i.sign,house:i.house,nakshatra:i.nakshatra,starLord:i.starLord,subLord:i.subLord,subSubLord:i.subSubLord,retrograde:!0});return t}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let t=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${t}`)?.focus()})}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,t=e.ascendant;return s`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${t?s`<div class="asc">Ascendant: <strong>${t.sign??""}</strong> ${t.nakshatra?s`· ${t.nakshatra}`:l} ${t.subLord?s`· sub lord ${t.subLord}`:l} ${typeof t.kpNumber=="number"?s`· KP ${t.kpNumber}`:l}</div>`:l} ${typeof e.meta?.ayanamsa=="number"?s`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${C(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?s`· ${e.meta.houseSystem} houses`:l}</div>`:l}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(r=>s`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${r==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?s`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(t=>s`<tr><td class="body">${t.name}${t.retrograde?s`<span class="retro">R</span>`:l}</td><td>${t.sign??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.nakshatra??""}</td><td>${t.starLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?s`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(t=>s`<tr><td class="body num">${t.house}</td><td>${t.sign??""}</td><td>${t.signLord??""}</td><td>${t.nakshatra??""}</td><td>${t.starLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No cusps</p>`}};oe.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],p([u({attribute:!1})],oe.prototype,"data",2),p([N()],oe.prototype,"activeTab",2),oe=p([b("roxy-kp-chart")],oe);var $e=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return s`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?s`<span class="ayanamsa">Ayanamsa: ${C(this.data.ayanamsa,2)}°</span>`:l}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(t=>s`<tr><td class="planet">${t.planet} ${t.retrograde?s`<span class="retro">R</span>`:l}</td><td>${t.sign??""}</td><td>${t.signLord??""}</td><td>${t.nakshatra??""}</td><td>${t.nakshatraLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td>${t.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};$e.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],p([u({attribute:!1})],$e.prototype,"data",2),$e=p([b("roxy-kp-planets-table")],$e);var we=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,t=e.significators??[];return s`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?s`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:l}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?s`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((r,o)=>s`<span class="rp" role="listitem"><span class="rank">${o+1}</span> ${r}</span>`)}</div>`:l} ${t.length?s`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${t.map(r=>s`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:l}</div>`}};we.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],p([u({attribute:!1})],we.prototype,"data",2),we=p([b("roxy-kp-ruling-planets")],we);function Lr(n,a){let e,t=((...r)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...r)},a)});return t.cancel=()=>{e&&(clearTimeout(e),e=void 0)},t}var D=class extends f{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=Lr(e=>{this.fetchResults(e)},300);this.onInput=e=>{let t=e.target.value;if(this.query=t,t.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(t)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let t=this.results[this.highlight]??this.results[0];t&&this.select(t)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let t=new AbortController;this.abortController=t,this.isLoading=!0;try{let r=new URL(this.endpoint);r.searchParams.set("q",e),r.searchParams.set("limit","8");let o={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let i=this.publishableKey??this.apiKey;i&&(o["X-API-Key"]=i);let d=await fetch(r,{headers:o,signal:t.signal});if(!d.ok)throw new Error(`HTTP ${d.status}`);let c=await d.json();if(t.signal.aborted)return;this.results=c.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(r){if(r?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===t&&(this.abortController=void 0),t.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return s`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?s`<span class="spinner" role="status" aria-label="Loading"></span>`:l} ${this.isOpen?s`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?s`<li class="empty" role="status">No cities found</li>`:this.results.map((e,t)=>s`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${t}`}" aria-selected="${this.highlight===t?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=t}}"><span class="city">${e.city}</span> <span class="where">${e.province?s`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:l}</div>`}};D.styles=[v,x`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],p([u({type:String,attribute:"api-key"})],D.prototype,"apiKey",2),p([u({type:String,attribute:"publishable-key"})],D.prototype,"publishableKey",2),p([u({type:String})],D.prototype,"endpoint",2),p([u({type:String})],D.prototype,"placeholder",2),p([u({type:String,attribute:"default-value"})],D.prototype,"defaultValue",2),p([N()],D.prototype,"query",2),p([N()],D.prototype,"results",2),p([N()],D.prototype,"isOpen",2),p([N()],D.prototype,"isLoading",2),p([N()],D.prototype,"highlight",2),D=p([b("roxy-location-search")],D);var ne=class extends f{constructor(){super();this.data=null;this.mode="current";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No moon phase data</div>`;let t="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&t.length>0){let r="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return s`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${r??"Moon phases"} ${o??""}</h2><div class="list" role="list">${t.map(i=>this.renderListItem(i))}</div></article>`}return"phase"in e?this.renderSingle(e):l}renderSingle(e){let t=Nr(e.phase);return s`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${t}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?s`<div class="date">${e.date}</div>`:l}</div></div><div class="stats">${typeof e.illumination=="number"?s`<div><span>Illumination</span> <strong>${Fa(e.illumination)}</strong></div>`:l} ${typeof e.age=="number"?s`<div><span>Age</span> <strong>${C(e.age,1)} days</strong></div>`:l} ${e.sign?s`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:l} ${typeof e.distance=="number"?s`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:l}</div>${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l} ${e.meaning?.keywords?.length?s`<div class="keywords">${e.meaning.keywords.map(r=>s`<span>${r}</span>`)}</div>`:l}</article>`}renderListItem(e){let t=Nr(e.phase);return s`<div class="list-item" role="listitem"><span aria-hidden="true">${t}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};ne.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],p([u({attribute:!1})],ne.prototype,"data",2),p([u({type:String,reflect:!0})],ne.prototype,"mode",2),ne=p([b("roxy-moon-phase")],ne);function Nr(n){return n?xr[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Fa(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var ke=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,t=e.remedies;return s`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?s`<span class="number">Nakshatra ${e.number} of 27</span>`:l} ${e.range?s`<span class="range">${e.range}</span>`:l}</header><dl class="facts">${e.lord?s`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:l} ${e.deity?s`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:l} ${e.symbol?s`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:l}</dl>${e.characteristics?s`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:l} ${t?s`<div class="section"><h3>Remedies</h3><div class="remedies">${t.mantras?s`<div class="remedy"><strong>Mantras:</strong> ${t.mantras}</div>`:l} ${t.gemstones?s`<div class="remedy"><strong>Gemstones:</strong> ${t.gemstones}</div>`:l} ${t.rituals?s`<div class="remedy"><strong>Rituals:</strong> ${t.rituals}</div>`:l}</div></div>`:l}</article>`}};ke.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],p([u({attribute:!1})],ke.prototype,"data",2),ke=p([b("roxy-nakshatra-card")],ke);function Y(){return s`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var je=x`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var Ft=420,P=Ft/2,Be=164,Yt=146,rt=120,Ke=96,Ua=178,Wa=196,F=class extends f{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new $(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),t=this.data.aspects??[],r=this.view;return s`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?s`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:l}</header>${Ie({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:r,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${r}" role="tabpanel" aria-labelledby="natal-tab-${r}">${r==="wheel"?this.renderWheel(e,t):this.renderAspectGrid(e,t)}</div><div class="legend"><span>${e.length} planets</span> <span>${t.length} aspects</span> ${this.data.houseSystem?s`<span>${this.data.houseSystem} houses</span>`:l} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,t){return s`<svg viewBox="0 0 ${Ft} ${Ft}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${P}" cy="${P}" r="${Be}" stroke-width="1.5"/><circle class="wheel-line" cx="${P}" cy="${P}" r="${Yt-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${P}" cy="${P}" r="${rt}" stroke-width="1"/><circle class="wheel-line" cx="${P}" cy="${P}" r="${Ke-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,t)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,t){let r=e.map(i=>A(i.name)),o=new Map;for(let i of t){let d=[A(i.planet1),A(i.planet2)].sort().join("|");o.set(d,i)}return r.length===0?s`<p class="roxy-empty" role="status">No planets to grid</p>`:s`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${r.slice(0,-1).map(i=>{let d=L[i]??i.slice(0,2);return s`<th scope="col" title="${i}">${d}</th>`})}</tr></thead><tbody>${r.slice(1).map((i,d)=>{let c=L[i]??i.slice(0,2);return s`<tr><th scope="row" title="${i}">${c}</th>${r.slice(0,d+1).map(m=>{let g=o.get([i,m].sort().join("|"));if(!g)return s`<td class="empty"></td>`;let h=Ge(g),y=et[h]??et[h.replace(/-/g,"")]??h.slice(0,3),S=_e[h]??"aspect-other",k=C(g.orb,1);return s`<td class="${`cell ${S}`}" title="${`${i} ${h} ${m}${k?` (orb ${k}\xB0)`:""}`}"><span class="asp">${y}</span></td>`})} ${r.slice(d+1,-1).map(()=>s`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),t=this.getMidheaven(),r=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Kt(e),"DSC")];t!==null&&(r.push(this.renderAngleMark(t,"MC")),r.push(this.renderAngleMark(Kt(t),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&r.push(this.renderAngleMark(q(o),"PoF"));let i=this.data?.vertex?.longitude;return typeof i=="number"&&r.push(this.renderAngleMark(q(i),"Vtx")),r}renderAngleMark(e,t){let r=this.toAngle(e),o=T(P,P,Be,r),i=T(P,P,Ua,r),d=T(P,P,Wa,r);return w`
|
|
75
|
+
`}function es(n){let a=n.lagnaSign.toLowerCase();return w`
|
|
76
|
+
${Za(n.divisionLabel)}
|
|
77
|
+
${D.map(e=>Qa(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,It(e,n.lagnaSign)))}
|
|
78
|
+
`}function Ar(n,a){switch(a){case"north":return Wa(n);case"east":return es(n);default:return qa(n)}}function Cr(n,a){return qe({items:_a,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var Er=u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var ae=class extends x{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new $(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Sr(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return s`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return s`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?s`<span class="division-meta">· ${r.sanskritName}</span>`:l}</h2>${r.significance?s`<p class="significance">${r.significance}</p>`:l}</div>${Cr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${r.number} ${r.name} divisional chart with twelve sign houses"><title>D${r.number} ${r.name}</title>${Ar(e,this.chartStyle)}</svg> ${t&&t.length>0?s`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(o=>s`<span class="vargottama-pill" role="listitem">${L[o]??""} ${o}</span>`)}</div>`:l}</div>`}};ae.styles=[v,Er,$e,u`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],p([h({attribute:!1})],ae.prototype,"data",2),p([h({type:String,reflect:!0,attribute:"chart-style"})],ae.prototype,"chartStyle",2),ae=p([b("roxy-divisional-chart")],ae);var rs={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},se=class extends x{constructor(){super();this.data=null;this.type="manglik";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=rs[this.type]??this.type,o=(e.severity??"").toLowerCase(),i=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=i*33,c=i===3?"var(--roxy-danger)":i===2?"var(--roxy-warning)":i===1?"var(--roxy-success)":"transparent";return s`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?s`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${i}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${d}%;background:${c}"></span></div>`:l} ${e.description?s`<p class="description">${e.description}</p>`:l} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?s`<div><h3>Remedies</h3><ul>${e.remedies.map(m=>s`<li>${m}</li>`)}</ul></div>`:l} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?s`<div><h3>Exceptions</h3><ul>${e.exceptions.map(m=>s`<li>${m}</li>`)}</ul></div>`:l}</article>`}renderEffects(e){if(!e.effects)return l;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?l:s`<div class="effects">${r.map(([t,o])=>s`<div><h3>${t}</h3><p>${o}</p></div>`)}</div>`}};se.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],p([h({attribute:!1})],se.prototype,"data",2),p([h({type:String,reflect:!0})],se.prototype,"type",2),se=p([b("roxy-dosha-card")],se);var we=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;return e?s`<article class="card" aria-label="${e.name??"Dream symbol"}"><header class="head">${e.letter?s`<span class="letter" aria-hidden="true">${e.letter}</span>`:l}<div><p class="label">Dream symbol</p>${e.name?s`<h2 class="name">${e.name}</h2>`:l}</div></header>${e.meaning?s`<p class="meaning">${e.meaning}</p>`:l}</article>`:s`<div class="roxy-empty" role="status">No dream symbol</div>`}};we.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:2.5rem;height:2.5rem;color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-variant-numeric:tabular-nums;flex:none;justify-content:center;align-items:center;display:inline-flex}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}`],p([h({attribute:!1})],we.prototype,"data",2),we=p([b("roxy-dream-card")],we);var Zr=new Map;async function ts(n){let a=Zr.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Zr.delete(n),e}),Zr.set(n,a)),a}var G=class extends x{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(t=>t.required).filter(t=>this.values[t.name]===void 0||this.values[t.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(t=>t.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await ts(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let o=e.components?.schemas??{},i=[],d;if(t.requestBody){let m=t.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[y,g]of Object.entries(d.properties)){let f=this.resolve(g,o)??{};i.push({name:y,type:this.fieldType(f),required:m.has(y),description:f.description,enum:f.enum,min:f.minimum,max:f.maximum,default:f.default})}}for(let m of t.parameters??[])if(m.in==="path"||m.in==="query"){let y=this.resolve(m.schema,o)??{};i.push({name:m.name,type:this.fieldType(y),required:!!m.required,description:y.description,enum:y.enum,default:y.default})}this.fields=i,this.hasLocation=i.some(m=>m.name==="latitude")&&i.some(m=>m.name==="longitude")&&i.some(m=>m.name==="timezone");let c={};for(let m of i)m.default!==void 0&&(c[m.name]=m.default);this.values=c,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return s`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return s`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return l;let t=`roxy-form-${r.name}`;return s`<div class="field"><label for="${t}">${j(r.name)}${r.required?s`<span class="req" aria-hidden="true">*</span>`:l}</label> ${r.enum?s`<select id="${t}" ?required="${r.required}" @change="${o=>this.setValue(r.name,o.target.value)}"><option value="">Choose</option>${r.enum.map(o=>s`<option value="${o}" ?selected="${this.values[r.name]===o}">${o}</option>`)}</select>`:s`<input id="${t}" type="${this.htmlType(r.type)}" ?required="${r.required}" min="${r.min??""}" max="${r.max??""}" step="${r.type==="number"?"any":""}" .value="${this.values[r.name]??""}" @input="${o=>this.setValue(r.name,this.coerce(r.type,o.target.value))}">`} ${r.description?s`<small class="help">${r.description}</small>`:l}</div>`};return s`<form @submit="${this.onSubmit}"><h2 class="title">${j(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?s`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:l}<div class="fields">${this.fields.map(r=>e(r))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};G.styles=[v,u`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],p([h({type:String,attribute:"data-endpoint"})],G.prototype,"endpoint",2),p([h({type:String})],G.prototype,"method",2),p([h({type:String,attribute:"spec-url"})],G.prototype,"specUrl",2),p([h({type:String,attribute:"submit-label"})],G.prototype,"submitLabel",2),p([N()],G.prototype,"fields",2),p([N()],G.prototype,"values",2),p([N()],G.prototype,"hasLocation",2),p([N()],G.prototype,"loaded",2),p([N()],G.prototype,"specError",2),G=p([b("roxy-endpoint-form")],G);var as={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},ss=["western","vedic","biorhythm"],ke=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No forecast data</div>`;let r=e.events??[],t=this.groupByDate(r),o=ss.filter(i=>r.some(d=>d.domain===i));return s`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?s`<div class="range">${ve(e.startDate)} - ${ve(e.endDate)} · ${e.count??r.length} events</div>`:l}</header>${o.length?s`<div class="legend">${o.map(i=>s`<span><span class="swatch swatch-${i}"></span>${as[i]}</span>`)}</div>`:l} ${t.length?s`<div class="days" role="list">${t.map(([i,d])=>this.renderDay(i,d))}</div>`:s`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(e){let r=new Map;for(let t of e){let o=t.date??"",i=r.get(o)??[];i.push(t),r.set(o,i)}return[...r.entries()]}renderDay(e,r){return s`<div class="day" role="listitem"><div class="day-date">${ve(e)}</div><div class="events">${r.map(t=>this.renderEvent(t))}</div></div>`}renderEvent(e){let r=typeof e.significance=="number"?e.significance:0,t=Math.max(0,Math.min(100,r));return s`<div class="event"><span class="dot dot-${e.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(e)}</div>${e.description?s`<p class="event-desc">${e.description}</p>`:l}<div class="sig" title="Significance ${t} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${e.domain}" style="width:${t}%"></span> </span><span class="sig-val">${t}</span></div></div></div>`}renderHeadline(e){let r=e.body?A(e.body):"",t=e.target?A(e.target):"",o=e.aspect?e.aspect.toLowerCase():"",i=He[o]??"",d=o?sr[o]??o:"",c=typeof e.orb=="number"?C(e.orb,1):"",m=this.typeQualifier(e);return o&&t?s`<strong>${r}</strong> <span class="${i}">${d}</span> <strong>${t}</strong>${c?s`<span class="kind">orb ${c}°</span>`:l}`:s`<strong>${r||j(e.type??"")}</strong>${m?s`<span class="kind">${m}</span>`:l}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${A(e.target)}`:e.type==="retrograde-station"&&e.station?e.station:e.type==="eclipse"?[e.kind,"eclipse"].filter(Boolean).join(" "):e.type==="critical-day"?"critical day":e.type==="dasha-change"&&e.target?`dasha ${A(e.target)}`:j(e.type??"")}};ke.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],p([h({attribute:!1})],ke.prototype,"data",2),ke=p([b("roxy-forecast-timeline")],ke);var Se=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(g=>g?.category!==void 0),t=e.total??0,o=e.maxScore??36,i=t/o*100,d="color-mix(in srgb, var(--roxy-border) 50%, transparent)",c=i>=70?"var(--roxy-success)":i>=50?"var(--roxy-warning)":"var(--roxy-danger)",m=i*2.827,y=(100-i)*2.827;return s`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${C(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?s`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Dt(e.percentage,1)}</small>`:l}</div>${e.recommendation?s`<span class="recommendation">${e.recommendation}</span>`:l}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${c}" stroke-width="8" stroke-dasharray="${m},${y}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${o}</text></svg></div></div>${r.length>0?s`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(g=>{let f=g.score??0,S=g.maxScore??os(g.category),k=S?f/S*100:0;return s`<tr><td>${g.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${k}%"></span></div></td><td class="score">${C(f,1)} / ${S}</td></tr>`})}</tbody></table>`:l} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?s`<div class="tags">${e.doshas?.map(g=>s`<span class="dosha">${g}</span>`)} ${e.doshaCancellations?.map(g=>s`<span class="cancel" title="${g.reason}">${g.dosha} cancelled</span>`)}</div>`:l}</article>`}};Se.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],p([h({attribute:!1})],Se.prototype,"data",2),Se=p([b("roxy-guna-milan")],Se);function os(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var oe=class extends x{constructor(){super();this.data=null;this.mode="lookup";new $(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return s`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:o,dailyMessage:i,resultingHexagram:d}=e,c=t??this.derivedLines(r),m=new Set(o??[]);return s`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?s`<div class="symbol">${r.symbol}</div>`:l}<div class="lines" aria-hidden="true">${c.slice().reverse().map((y,g)=>{let f=c.length-1-g+1,S=m.has(f),k=y===6||y===8;return s`<div class="line ${`${k?"broken":"solid"}${S?" changing":""}`}">${k?w`<span class="seg"></span><span class="seg"></span>`:w`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?s`${r.number}.`:l}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?s`${r.chinese}`:l} ${r.pinyin?s`· ${r.pinyin}`:l}</p><div class="trigrams">${r.upperTrigram?s`<div>Upper <span class="tri-glyph">${qr[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:l} ${r.lowerTrigram?s`<div>Lower <span class="tri-glyph">${qr[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:l}</div>${r.judgment?s`<p class="judgment">${r.judgment}</p>`:l} ${r.image?s`<p class="image">${r.image}</p>`:l} ${i?s`<p class="message">${i}</p>`:l} ${r.interpretation?.general?s`<p>${r.interpretation.general}</p>`:l} ${m.size>0?s`<div class="changing">Changing lines: ${Array.from(m).sort((y,g)=>y-g).join(", ")}. ${d?.english?s`Becomes hexagram ${d.number} ${d.english}.`:l}</div>`:l}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,o=[];for(let i=0;i<6;i++){let d=t>>i&1;o.push(d?8:7)}return o}return Array.from({length:6},()=>7)}};oe.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],p([h({attribute:!1})],oe.prototype,"data",2),p([h({type:String,reflect:!0})],oe.prototype,"mode",2),oe=p([b("roxy-hexagram")],oe);var ne=class extends x{constructor(){super();this.data=null;this.period="daily";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?H[A(r)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,i="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return s`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${i?s`<div class="date">${i}</div>`:l}</div>${o!==null?s`<span class="energy" aria-label="${`Energy ${o} of 10`}">Energy ${o}/10 <span class="energy-bar"><span style="width:${o/10*100}%"></span></span></span>`:l}</header>${e.overview?s`<p class="overview">${e.overview}</p>`:l}<div class="sections">${e.love?s`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:l} ${e.career?s`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:l} ${e.health?s`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:l} ${e.finance?s`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:l} ${"advice"in e&&e.advice?s`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:l}</div>${(()=>{let d="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,c="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],y="luckyDays"in e&&e.luckyDays?e.luckyDays:[],g=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&y.length===0&&g.length===0?l:s`<div class="lucky">${d!==void 0?s`<span>Lucky number <strong>${d}</strong></span>`:l} ${c?s`<span>Lucky color <strong>${c}</strong></span>`:l} ${m.length?s`<span>Lucky numbers <strong>${m.join(", ")}</strong></span>`:l} ${y.length?s`<span>Lucky days <strong>${y.join(", ")}</strong></span>`:l} ${g.length?s`<span class="compat-wrap">Best with <span class="compat">${g.map(f=>s`<span>${f}</span>`)}</span></span>`:l}</div>`})()}</article>`}};ne.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],p([h({attribute:!1})],ne.prototype,"data",2),p([h({type:String,reflect:!0})],ne.prototype,"period",2),ne=p([b("roxy-horoscope-card")],ne);var ie=class extends x{constructor(){super();this.data=null;this.activeTab="planets";new $(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(o=>({name:o.planet,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,kpNumber:o.kpNumber,retrograde:o.retrograde})),t=e.nodes;for(let[o,i]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])i&&r.push({name:o,sign:i.sign,house:i.house,nakshatra:i.nakshatra,starLord:i.starLord,subLord:i.subLord,subSubLord:i.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return s`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?s`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?s`· ${r.nakshatra}`:l} ${r.subLord?s`· sub lord ${r.subLord}`:l} ${typeof r.kpNumber=="number"?s`· KP ${r.kpNumber}`:l}</div>`:l} ${typeof e.meta?.ayanamsa=="number"?s`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${C(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?s`· ${e.meta.houseSystem} houses`:l}</div>`:l}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>s`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?s`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>s`<tr><td class="body">${r.name}${r.retrograde?s`<span class="retro">R</span>`:l}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?s`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>s`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No cusps</p>`}};ie.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],p([h({attribute:!1})],ie.prototype,"data",2),p([N()],ie.prototype,"activeTab",2),ie=p([b("roxy-kp-chart")],ie);var Ae=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return s`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?s`<span class="ayanamsa">Ayanamsa: ${C(this.data.ayanamsa,2)}°</span>`:l}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>s`<tr><td class="planet">${r.planet} ${r.retrograde?s`<span class="retro">R</span>`:l}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Ae.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],p([h({attribute:!1})],Ae.prototype,"data",2),Ae=p([b("roxy-kp-planets-table")],Ae);var Ce=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return s`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?s`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:l}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?s`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,o)=>s`<span class="rp" role="listitem"><span class="rank">${o+1}</span> ${t}</span>`)}</div>`:l} ${r.length?s`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>s`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:l}</div>`}};Ce.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],p([h({attribute:!1})],Ce.prototype,"data",2),Ce=p([b("roxy-kp-ruling-planets")],Ce);function jt(n,a){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...t)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var _=class extends x{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=jt(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let o={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let i=this.publishableKey??this.apiKey;i&&(o["X-API-Key"]=i);let d=await fetch(t,{headers:o,signal:r.signal});if(!d.ok)throw new Error(`HTTP ${d.status}`);let c=await d.json();if(r.signal.aborted)return;this.results=c.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return s`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?s`<span class="spinner" role="status" aria-label="Loading"></span>`:l} ${this.isOpen?s`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?s`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>s`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?s`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:l}</div>`}};_.styles=[v,u`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],p([h({type:String,attribute:"api-key"})],_.prototype,"apiKey",2),p([h({type:String,attribute:"publishable-key"})],_.prototype,"publishableKey",2),p([h({type:String})],_.prototype,"endpoint",2),p([h({type:String})],_.prototype,"placeholder",2),p([h({type:String,attribute:"default-value"})],_.prototype,"defaultValue",2),p([N()],_.prototype,"query",2),p([N()],_.prototype,"results",2),p([N()],_.prototype,"isOpen",2),p([N()],_.prototype,"isLoading",2),p([N()],_.prototype,"highlight",2),_=p([b("roxy-location-search")],_);var le=class extends x{constructor(){super();this.data=null;this.mode="current";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return s`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${o??""}</h2><div class="list" role="list">${r.map(i=>this.renderListItem(i))}</div></article>`}return"phase"in e?this.renderSingle(e):l}renderSingle(e){let r=Bt(e.phase);return s`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?s`<div class="date">${e.date}</div>`:l}</div></div><div class="stats">${typeof e.illumination=="number"?s`<div><span>Illumination</span> <strong>${ns(e.illumination)}</strong></div>`:l} ${typeof e.age=="number"?s`<div><span>Age</span> <strong>${C(e.age,1)} days</strong></div>`:l} ${e.sign?s`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:l} ${typeof e.distance=="number"?s`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:l}</div>${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l} ${e.meaning?.keywords?.length?s`<div class="keywords">${e.meaning.keywords.map(t=>s`<span>${t}</span>`)}</div>`:l}</article>`}renderListItem(e){let r=Bt(e.phase);return s`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};le.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],p([h({attribute:!1})],le.prototype,"data",2),p([h({type:String,reflect:!0})],le.prototype,"mode",2),le=p([b("roxy-moon-phase")],le);function Bt(n){return n?Ct[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function ns(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var Ee=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return s`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?s`<span class="number">Nakshatra ${e.number} of 27</span>`:l} ${e.range?s`<span class="range">${e.range}</span>`:l}</header><dl class="facts">${e.lord?s`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:l} ${e.deity?s`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:l} ${e.symbol?s`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:l}</dl>${e.characteristics?s`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:l} ${r?s`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?s`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:l} ${r.gemstones?s`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:l} ${r.rituals?s`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:l}</div></div>`:l}</article>`}};Ee.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],p([h({attribute:!1})],Ee.prototype,"data",2),Ee=p([b("roxy-nakshatra-card")],Ee);function V(){return s`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var Ye=u`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var et=420,E=et/2,Ue=164,Qr=146,nr=120,Ve=96,is=178,ls=196,F=class extends x{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new $(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return s`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?s`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:l}</header>${qe({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?s`<span>${this.data.houseSystem} houses</span>`:l} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return s`<svg viewBox="0 0 ${et} ${et}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${E}" cy="${E}" r="${Ue}" stroke-width="1.5"/><circle class="wheel-line" cx="${E}" cy="${E}" r="${Qr-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${E}" cy="${E}" r="${nr}" stroke-width="1"/><circle class="wheel-line" cx="${E}" cy="${E}" r="${Ve-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(i=>A(i.name)),o=new Map;for(let i of r){let d=[A(i.planet1),A(i.planet2)].sort().join("|");o.set(d,i)}return t.length===0?s`<p class="roxy-empty" role="status">No planets to grid</p>`:s`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(i=>{let d=L[i]??i.slice(0,2);return s`<th scope="col" title="${i}">${d}</th>`})}</tr></thead><tbody>${t.slice(1).map((i,d)=>{let c=L[i]??i.slice(0,2);return s`<tr><th scope="row" title="${i}">${c}</th>${t.slice(0,d+1).map(m=>{let y=o.get([i,m].sort().join("|"));if(!y)return s`<td class="empty"></td>`;let g=Ke(y),f=sr[g]??sr[g.replace(/-/g,"")]??g.slice(0,3),S=He[g]??"aspect-other",k=C(y.orb,1);return s`<td class="${`cell ${S}`}" title="${`${i} ${g} ${m}${k?` (orb ${k}\xB0)`:""}`}"><span class="asp">${f}</span></td>`})} ${t.slice(d+1,-1).map(()=>s`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Jr(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Jr(r),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&t.push(this.renderAngleMark(Y(o),"PoF"));let i=this.data?.vertex?.longitude;return typeof i=="number"&&t.push(this.renderAngleMark(Y(i),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),o=R(E,E,Ue,t),i=R(E,E,is,t),d=R(E,E,ls,t);return w`
|
|
79
79
|
<g>
|
|
80
80
|
<line class="angle-tick" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />
|
|
81
|
-
<text class="angle-marker" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${
|
|
81
|
+
<text class="angle-marker" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${r}</text>
|
|
82
82
|
</g>
|
|
83
|
-
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(
|
|
84
|
-
${
|
|
85
|
-
<text class="planet-glyph" x=${
|
|
86
|
-
<text class="planet-deg" x=${
|
|
87
|
-
</g>`})}renderDetails(){let e=this.data?.summary,t=this.data?.aspectsInterpretation;if(!e&&!t)return l;let r=e?.retrogradePlanets??[];return s`<div class="details">${e?.dominantElement||e?.dominantModality?s`<div class="pill-row">${e.dominantElement?s`<span class="pill">Dominant element: ${e.dominantElement}</span>`:l} ${e.dominantModality?s`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:l}</div>`:l} ${t?s`<div class="pill-row"><span class="pill pill--success">Harmonious ${t.harmonious}</span> <span class="pill pill--danger">Challenging ${t.challenging}</span> <span class="pill pill--muted">Neutral ${t.neutral}</span></div>`:l} ${r.length>0?s`<div class="pill-row">${r.map(o=>{let i=L[o]??o.slice(0,2);return s`<span class="pill pill--muted">${i} ${o} R</span>`})}</div>`:l} ${t?.summary?s`<p class="summary">${t.summary}</p>`:l} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return l;let t=["Fire","Earth","Air","Water"],r=["Cardinal","Fixed","Mutable"],o=_,i={};for(let d of t)i[d]={Cardinal:[],Fixed:[],Mutable:[]};for(let d of e){let c=o.indexOf(A(d.sign??""));if(c<0)continue;let m=t[c%4],g=r[c%3],h=L[A(d.name)]??A(d.name).slice(0,2);i[m]?.[g]?.push(h)}return s`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${r.map(d=>s`<th scope="col">${d.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${t.map(d=>{let c=r.reduce((m,g)=>m+(i[d]?.[g]?.length??0),0);return s`<tr><th scope="row">${d}</th>${r.map(m=>s`<td>${(i[d]?.[m]??[]).join(" ")}</td>`)}<td class="em-total">${c}</td></tr>`})}<tr><th scope="row">Total</th>${r.map(d=>s`<td class="em-total">${t.reduce((c,m)=>c+(i[m]?.[d]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(t=>t.interpretation);return e.length===0?l:s`<section class="interpretations"><h3>Planet readings</h3>${e.map((t,r)=>{let o=t.interpretation,i=L[A(t.name)]??"",d=C(t.degree??0,1);return s`<details class="interp-card" name="natal-planet-readings" ?open="${r===0}"><summary><span>${i} ${t.name}</span> <span class="interp-aside"><small>${t.sign??""} ${d}</small> ${Y()}</span></summary><div class="interp-body">${o.summary?s`<p class="interp-summary">${o.summary}</p>`:l} ${o.detailed?s`<p class="interp-detail">${o.detailed}</p>`:l} ${o.keywords?.length?s`<div class="interp-keywords">${o.keywords.map(c=>s`<span class="kw">${c}</span>`)}</div>`:l}</div></details>`})}</section>`}renderAspects(e,t){let r=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let i=A(o.name);i&&r.set(i,o.longitude)}return t.map(o=>{let i=r.get(A(o.planet1)),d=r.get(A(o.planet2));if(i===void 0||d===void 0)return l;let c=T(P,P,Ke-18,this.toAngle(i)),m=T(P,P,Ke-18,this.toAngle(d)),g=Ge(o),h=_e[g]??"aspect-other",y=C(o.orb,1);return w`<line class=${`aspect ${h}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${g||""} ${o.planet2}${y?` (orb ${y}\xB0)`:""}</title></line>`})}};F.styles=[v,fe,je,x`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],p([u({attribute:!1})],F.prototype,"data",2),p([u({type:String,attribute:"house-system",reflect:!0})],F.prototype,"houseSystem",2),p([N()],F.prototype,"view",2),F=p([b("roxy-natal-chart")],F);var ie=class extends f{constructor(){super();this.data=null;this.type="life-path";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No numerology data</div>`;let t=Ja[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,t):"personalYear"in e?this.renderPersonalYear(e,t):this.renderNumberCard(e,t)}renderNumberCard(e,t){let r=e.meaning?.keywords??[];return s`<article class="card" aria-label="${t}"><div class="hero">${typeof e.number=="number"?s`<div class="numeral">${e.number}</div>`:l}<div><p class="label">${t}</p>${e.meaning?.title?s`<h2 class="title">${e.meaning.title}</h2>`:l}</div></div>${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l} ${e.calculation?s`<pre class="calc">${e.calculation}</pre>`:l} ${r.length>0?s`<div class="chips">${r.map(o=>s`<span>${o}</span>`)}</div>`:l} ${e.hasKarmicDebt&&e.karmicDebtNumber?s`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Xa(e.karmicDebtMeaning)}</div>`:l}</article>`}renderPersonalYear(e,t){return s`<article class="card" aria-label="${t}"><div class="hero">${typeof e.personalYear=="number"?s`<div class="numeral">${e.personalYear}</div>`:l}<div><p class="label">${t}</p>${e.theme?s`<h2 class="title">${e.theme}</h2>`:l}</div></div>${e.forecast?s`<p class="meaning">${e.forecast}</p>`:l} ${e.advice?s`<p>${e.advice}</p>`:l}</article>`}renderChart(e,t){let r=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return s`<article class="card" aria-label="${t}"><div><p class="label">${t}</p>${e.profile?.name?s`<h2 class="title">${e.profile.name}</h2>`:l}</div>${r.length>0?s`<div class="cores">${r.map(([o,i])=>s`<div class="item"><span>${j(o)}</span> <strong>${i.number??""}</strong></div>`)}</div>`:l}</article>`}};ie.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],p([u({attribute:!1})],ie.prototype,"data",2),p([u({type:String,reflect:!0})],ie.prototype,"type",2),ie=p([b("roxy-numerology-card")],ie);var Ja={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Xa(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var le=class extends f{constructor(){super();this.data=null;this.detail="detailed";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No panchang data</div>`;let t="sunrise"in e?e:null,r=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];t&&r.push(["Vara",this.formatPart(t.vara)]);let o=t?[["Moon sign",this.formatRashi(t.moonSign)],["Sun sign",this.formatRashi(t.sunSign)],["Sun nakshatra",this.formatSunNakshatra(t.sunNakshatra)],["Hora",this.formatHora(t.hora)]].filter(h=>!!h[1]):[],i=t?[["Brahma Muhurta",t.brahmaMuhurta],["Abhijit Muhurta",t.abhijitMuhurta],["Vijaya Muhurta",t.vijayaMuhurta],["Godhuli Muhurta",t.godhuliMuhurta],["Nishita Muhurta",t.nishitaMuhurta],["Pratah Sandhya",t.pratahSandhya],["Sayahna Sandhya",t.sayahnaSandhya]]:[],d=t?this.expandWindows("Amrit Kalam",t.amritKalam):[],c=t?[["Rahu Kaal",t.rahuKaal],["Yamaganda",t.yamaganda],["Gulika",t.gulika]]:[],m=t?[...this.expandWindows("Dur Muhurta",t.durMuhurta),...this.expandWindows("Varjyam",t.varjyam)]:[],g=t&&"transitions"in t?t.transitions:void 0;return s`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${t?xe(t.date):""}</span></header><table><tbody>${r.map(([h,y])=>s`<tr><th>${h}</th><td>${y}</td></tr>`)} ${t?.sunrise?s`<tr><th>Sunrise</th><td>${K(t.sunrise)}</td></tr>`:l} ${t?.sunset?s`<tr><th>Sunset</th><td>${K(t.sunset)}</td></tr>`:l} ${t?.moonrise?s`<tr><th>Moonrise</th><td>${K(t.moonrise)}</td></tr>`:l} ${t?.moonset?s`<tr><th>Moonset</th><td>${K(t.moonset)}</td></tr>`:l} ${o.map(([h,y])=>s`<tr><th>${h}</th><td>${y}</td></tr>`)}</tbody></table>${g?s`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",g.tithi)} ${this.renderTransitionRow("Nakshatra",g.nakshatra)} ${this.renderTransitionRow("Yoga",g.yoga)} ${this.renderTransitionRow("Karana",g.karana)}</tbody></table>`:l} ${this.detail==="detailed"&&(i.some(h=>!!h[1])||d.length>0||c.some(h=>!!h[1])||m.length>0)?s`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...i.filter(h=>!!h[1]),...d])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...c.filter(h=>!!h[1]),...m])}</tbody></table>`:l}</div>`}renderPeriodRows(e){return e.map(([t,r])=>{let o=Bt(r);return o?s`<tr><th>${t}</th><td>${o}</td></tr>`:l})}expandWindows(e,t){return!t||t.length===0?[]:t.map((r,o)=>[t.length>1?`${e} ${o+1}`:e,r])}renderTransitionRow(e,t){if(!t?.endsAt)return l;let r=K(t.endsAt),o=t.next?` \u2192 ${t.next}`:"";return s`<tr><th>${e}</th><td>ends ${r}${o}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let t=e;return[t.name,t.paksha?`(${t.paksha} paksha)`:"",t.lord?`\xB7 ${t.lord}`:"",t.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let t=Bt(e);return t?`${e.current} (${t})`:e.current}};le.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],p([u({attribute:!1})],le.prototype,"data",2),p([u({type:String,reflect:!0})],le.prototype,"detail",2),le=p([b("roxy-panchang-table")],le);var Ut=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],Se=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data?.planets?.length)return s`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((t,r)=>t.relativeRank-r.relativeRank);return s`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(t=>this.renderPlanetRow(t))}</div><div class="legend" aria-label="Strength component legend">${Ut.map(t=>s`<div class="legend-row"><span class="legend-swatch" style="background:${t.color}" aria-hidden="true"></span> ${t.label}</div>`)}</div></div>`}renderPlanetRow(e){let t=L[A(e.planet)]??"",r=Ut.map(g=>Math.max(0,e[g.key])),o=r.reduce((g,h)=>g+h,0),i=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,d=i?"adequacy-badge--adequate":"adequacy-badge--weak",c=i?"adequate":"weak",m=C(e.totalRupas,2)&&C(e.minRequired,2)?`${C(e.totalRupas,2)} / ${C(e.minRequired,2)} R`:"";return s`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${t}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${o>0?Ut.map((g,h)=>{let y=r[h];if(y<=0)return l;let S=y/o*100;return s`<div class="bar-segment" style="flex-grow:${S};background:${g.color}" title="${g.label}: ${C(y,1)}"></div>`}):l}</div></div><div class="pills">${m?s`<span class="rupas-label">${m}</span>`:l} <span class="${`adequacy-badge ${d}`}">${c}</span></div></div>`}};Se.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],p([u({attribute:!1})],Se.prototype,"data",2),Se=p([b("roxy-shadbala-table")],Se);var Xt=360,M=Xt/2,Wt=170,Za=154,Jt=124,qe=96,Ae=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:t,compatibilityScore:r,analysis:o}=this.data,i=this.data.interAspects??[],d=e?.planets??[],c=t?.planets??[],m=typeof r=="number"?Math.round(r):void 0,g=o?.overall,h=o?.strengths??[],y=o?.challenges??[];return d.length>0&&c.length>0?s`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof m=="number"?s`<span class="score" aria-label="${`Score ${m} of 100`}">${m} / 100</span>`:l}</div><svg viewBox="0 0 ${Xt} ${Xt}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${M}" cy="${M}" r="${Wt}" stroke-width="1.5"/><circle class="wheel-line" cx="${M}" cy="${M}" r="${qe+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${M}" cy="${M}" r="${qe-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(d,c,i)} ${this.renderRing(d,Jt,"p1",1)} ${this.renderRing(c,qe,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${g?s`<p class="summary">${g}</p>`:l} ${i.length>0?this.renderAspects(i):l} ${h.length>0||y.length>0?s`<div class="lists">${h.length?s`<div><h3>Strengths</h3><ul>${h.map(k=>s`<li>${k}</li>`)}</ul></div>`:l} ${y.length?s`<div><h3>Challenges</h3><ul>${y.map(k=>s`<li>${k}</li>`)}</ul></div>`:l}</div>`:l}</div>`:s`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof m=="number"?s`<span class="score" aria-label="${`Score ${m} of 100`}">${m} / 100</span>`:l}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code><roxy-data></code> fallback.</div>${g?s`<p class="summary">${g}</p>`:l} ${i.length>0?this.renderAspects(i):l} ${h.length>0||y.length>0?s`<div class="lists">${h.length?s`<div><h3>Strengths</h3><ul>${h.map(k=>s`<li>${k}</li>`)}</ul></div>`:l} ${y.length?s`<div><h3>Challenges</h3><ul>${y.map(k=>s`<li>${k}</li>`)}</ul></div>`:l}</div>`:l}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,t)=>{let r=this.toAngle(t*30),o=T(M,M,qe-14,r),i=T(M,M,Wt,r);return w`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.6" />`})}renderSigns(){return _.map((e,t)=>{let r=this.toAngle(t*30+15),o=T(M,M,Za,r);return w`<text class="sign" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${G[e]}</text>`})}renderRing(e,t,r,o){return e.map(i=>{if(!Number.isFinite(i.longitude))return l;let d=this.toAngle(i.longitude),c=T(M,M,t,d),g=T(M,M,t+(o===1?-12:-10),d),h=L[A(i.name)]??i.name.slice(0,2),y=V(i.longitude),S=i.isRetrograde===!0,k=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,Ee=`${i.name}${S?" retrograde":""} - ${k} ${y.sign}`;return w`<g>
|
|
88
|
-
<text class=${
|
|
89
|
-
<text class="planet-deg" x=${
|
|
90
|
-
</g>`})}renderAscendants(e){let
|
|
91
|
-
<line class="asc-tick" x1=${
|
|
92
|
-
<text class="asc-label" x=${
|
|
93
|
-
</g>`)};return r(e.person1?.ascendant,1),r(e.person2?.ascendant,2),t}renderInterAspectLines(e,t,r){let o=(i,d)=>{let c=A(d);for(let m of i)if(A(m.name)===c&&typeof m.longitude=="number")return m.longitude};return r.map(i=>{let d=o(e,i.planet1),c=o(t,i.planet2);if(d===void 0||c===void 0)return l;let m=T(M,M,Jt-12,this.toAngle(d)),g=T(M,M,qe+8,this.toAngle(c)),h=Ge(i),y=_e[h]??"aspect-other",S=C(i.orb,1);return w`<line class=${`aspect ${y}`} x1=${m.x} y1=${m.y} x2=${g.x} y2=${g.y}><title>${i.planet1} ${h} ${i.planet2}${S?` (orb ${S}\xB0)`:""}</title></line>`})}renderAspects(e){return s`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(t=>s`<tr><td>${t.planet1}</td><td>${t.planet2}</td><td>${Ge(t)||""}</td><td class="orb">${C(t.orb,1)}</td><td>${Qa(t.strength)}</td></tr>`)}</tbody></table>`}};Ae.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],p([u({attribute:!1})],Ae.prototype,"data",2),Ae=p([b("roxy-synastry-chart")],Ae);function Qa(n){return typeof n=="number"?Math.round(n).toString():""}var de=class extends f{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new $(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):s`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let t=e.card,r=this.flipped!==!!t.reversed,o=t.keywords??[];return s`<article class="card" aria-label="${t.name??"Tarot card"}"><div class="image-wrap">${t.imageUrl?s`<img class="${`image ${r?"reversed":""}`}" src="${t.imageUrl}" alt="${t.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}">`:s`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${t.name??"?"}</div>`}</div><div><div class="meta">${t.arcana?s`${t.arcana} arcana`:l} ${r?s`· reversed`:l}</div><h2 class="title">${t.name??"Tarot card"}</h2>${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:l} ${t.meaning?s`<p>${t.meaning}</p>`:l} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:l} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let t=this.flipped,r=t?e.reversed:e.upright,o=t?e.keywords?.reversed??[]:e.keywords?.upright??[];return s`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?s`<img class="${`image ${t?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}">`:s`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?s`${e.arcana} arcana`:l} ${e.number!==void 0&&e.number!==null?s`· ${e.number}`:l} ${t?s`· reversed`:l}</div><h2 class="title">${e.name??"Tarot card"}</h2>${r?.description?s`<p>${r.description}</p>`:l} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:l} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};de.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],p([u({attribute:!1})],de.prototype,"data",2),p([N()],de.prototype,"flipped",2),de=p([b("roxy-tarot-card")],de);var ce=class extends f{constructor(){super();this.data=null;this.spread="three-card";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No tarot spread</div>`;let t="answer"in e,r="cards"in e&&!("spread"in e),o=r?[]:"positions"in e?e.positions??[]:[],i=r&&"cards"in e?e.cards:[],d=t?e.answer:void 0,c=t?e.strength:void 0,m="spread"in e?e.spread:this.spread.replace(/-/g," "),g="question"in e?e.question:void 0,h="summary"in e?e.summary:void 0,y=t?e.interpretation:void 0,S=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${m}</h2>${g?s`<span class="question">"${g}"</span>`:l}</header>${t?s`<div><span class="${`answer ${S}`}">${d}</span> ${c?s`<small>· ${c}</small>`:l}</div>`:l} ${o.length>0?s`<div class="grid">${o.map(k=>s`<div class="card"><p class="label">${k.name??""}</p><div class="image">${k.card?.imageUrl?s`<img src="${k.card.imageUrl}" alt="${k.card.name??"tarot card"}" class="${k.card.reversed?"reversed":""}">`:s`${k.card?.name??"?"}`}</div><p class="name">${k.card?.name??""} ${k.card?.reversed?s`<small>(reversed)</small>`:l}</p>${k.interpretation?s`<p class="interp">${k.interpretation}</p>`:l}</div>`)}</div>`:l} ${i.length>0?s`<div class="grid">${i.map(k=>s`<div class="card"><div class="image">${k.imageUrl?s`<img src="${k.imageUrl}" alt="${k.name??"tarot card"}" class="${k.reversed?"reversed":""}">`:s`${k.name??"?"}`}</div><p class="name">${k.name??""} ${k.reversed?s`<small>(reversed)</small>`:l}</p>${k.meaning?s`<p class="interp">${k.meaning}</p>`:l}</div>`)}</div>`:l} ${h?s`<p class="reading">${h}</p>`:l} ${y?s`<p class="reading">${y}</p>`:l}</article>`}};ce.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],p([u({attribute:!1})],ce.prototype,"data",2),p([u({type:String,reflect:!0})],ce.prototype,"spread",2),ce=p([b("roxy-tarot-spread")],ce);var pe=class extends f{constructor(){super();this.data=null;this.tab="positions";new $(this)}render(){if(!this.data?.transitPlanets?.length)return s`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:t,transitPlanets:r,transitAspects:o,summary:i}=this.data,d=[xe(e),K(t)].filter(Boolean).join(" "),c=o?.length??0,m=this.tab;return s`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${d?s`<p class="subtitle">${d}</p>`:l}</div>${c>0?s`${Ie({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:m,onSelect:g=>{this.tab=g},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${m}" role="tabpanel" aria-labelledby="transits-tab-${m}">${m==="positions"?s`<div class="overflow-scroll">${this.renderPlanetsTable(r)}</div>`:s`${i?this.renderSummaryPills(i):l}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:s`<div class="overflow-scroll">${this.renderPlanetsTable(r)}</div>`}</div>`}renderSummaryPills(e){return s`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return s`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(t=>{let r=L[A(t.name)]??"",o=G[A(t.sign)]??"",i=t.speed>=0?"\u2191":"\u2193";return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${r}</span> ${t.name} ${t.isRetrograde?s`<span class="retro-badge" aria-label="retrograde">R</span>`:l}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${o}</span> ${t.sign}</div></td><td class="num">${C(t.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${i}</span> ${C(Math.abs(t.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return s`<div role="list" aria-label="Transit aspects">${e.map((t,r)=>{let o=L[A(t.transitPlanet)]??"",i=L[A(t.natalPlanet)]??"",d=(t.nature??"neutral").toLowerCase(),c=t.interpretation,m=(t.type??"").toLowerCase(),g=t.isApplying?"Applying":"Separating";return s`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${r===0}"><summary><span aria-hidden="true">${o}</span> ${t.transitPlanet} <span class="nature-badge ${d}">${m}</span> <span aria-hidden="true">${i}</span> ${t.natalPlanet} <span class="meta">${g} · orb ${C(t.orb,2)}° · strength ${C(t.strength,1)} </span>${Y()}</summary><div class="interp-body">${c?.summary?s`<p>${c.summary}</p>`:l} ${c?.impact?s`<p><strong>Impact:</strong> ${c.impact}</p>`:l} ${c?.timing?s`<p><strong>Timing:</strong> ${c.timing}</p>`:l} ${c?.guidance?s`<p><strong>Guidance:</strong> ${c.guidance}</p>`:l} ${c?.keywords?.length?s`<div class="interp-keywords">${c.keywords.map(h=>s`<span class="kw">${h}</span>`)}</div>`:l}</div></details>`})}</div>`}};pe.styles=[v,fe,je,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],p([u({attribute:!1})],pe.prototype,"data",2),p([N()],pe.prototype,"tab",2),pe=p([b("roxy-transits-table")],pe);var me=class extends f{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new $(this)}viewModel(){return this.data?.meta?vt(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?s`<div class="wrap"><div class="header"><h2 class="title">Vedic kundli</h2>${wt(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${$t(e,this.chartStyle)}</svg></div>`:s`<div class="roxy-empty" role="status">No kundli data</div>`}};me.styles=[v,kt,fe],p([u({attribute:!1})],me.prototype,"data",2),p([u({type:String,reflect:!0,attribute:"chart-style"})],me.prototype,"chartStyle",2),me=p([b("roxy-vedic-kundli")],me);var es=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Ce=class extends f{constructor(){super();this.data=null;new $(this)}orderedRows(){let e=this.data?.meta??{},t=new Set,r=[];for(let o of es){let i=e[o];i&&(r.push([o,i]),t.add(o))}for(let[o,i]of Object.entries(e))t.has(o)||r.push([o,i]);return r}render(){if(!this.data?.meta)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return s`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([t,r])=>{let o=(r.graha??t)==="Lagna",i=L[A(r.graha??t)]??"",d=G[A(r.rashi??"")]??"";return s`<tr class="${o?"lagna":""}"><td class="graha">${i?s`<span class="glyph">${i}</span>`:l}${r.graha??t}</td><td>${d?s`<span class="glyph">${d}</span>`:l}${r.rashi??""}</td><td class="num">${typeof r.longitude=="number"?ft(r.longitude):""}</td><td>${r.nakshatra?.name??""}</td><td class="num">${r.nakshatra?.pada??""}</td><td>${r.nakshatra?.lord??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.awastha??""}</td><td>${r.isRetrograde?s`<span class="retro">R</span>`:l}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?l:s`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${Y()}</summary><div class="panel-body">${e.map(t=>{let r=L[A(t.planet)]??"",o=C(t.distanceFromSun,2),i=C(t.orb,1);return s`<div class="condition"><span class="planet">${r?`${r} `:""}${t.planet}</span> <span class="detail">${o} deg from Sun, within ${i} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?l:s`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${Y()}</summary><div class="panel-body">${e.map(t=>{let r=C(t.distance,2);return s`<div class="condition"><span class="planet">${t.planet1} vs ${t.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${t.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},t=this.orderedRows().map(([r,o])=>[o.graha??r,e[o.graha??r]]).filter(([,r])=>r!=null);return t.length===0?l:s`<details class="panel"><summary>Interpretations<span class="summary-count">${t.length}</span>${Y()}</summary><div class="panel-body">${t.map(([r,o])=>{let i=L[A(r)]??"";return s`<div class="interp"><span class="planet">${i?`${i} `:""}${r}</span> ${o.rashi?s`<p><span class="label">Rashi.</span> ${o.rashi}</p>`:l} ${o.nakshatra?s`<p><span class="label">Nakshatra.</span> ${o.nakshatra}</p>`:l}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(t=>t.name||t.description);return e.length===0?l:s`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${Y()}</summary><div class="panel-body">${e.map(t=>s`<div class="bhava"><span class="name">${t.number}. ${t.name??""}</span> ${t.description?s`<p class="desc">${t.description}</p>`:l}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(t=>t.present);return e.length===0?l:s`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${Y()}</summary><div class="panel-body">${e.map(t=>s`<div class="bhava"><span class="name">${t.name} ${t.quality?s`<span class="quality ${t.quality.toLowerCase()}">${t.quality}</span>`:l}</span> ${t.result?s`<p class="desc">${t.result}</p>`:l}</div>`)}</div></details>`}};Ce.styles=[v,je,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],p([u({attribute:!1})],Ce.prototype,"data",2),Ce=p([b("roxy-vedic-planets-table")],Ce);var Pe=class extends f{constructor(){super();this.data=null;new $(this)}rows(){let e=this.data;if(!e)return[];let t=(e.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,o]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])o&&t.push({name:r,sign:o.sign,longitude:o.longitude,isPoint:!0});return t}render(){if(!this.data?.planets)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return s`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(t=>{let r=L[A(t.name)]??"",o=G[A(t.sign??"")]??"",i=typeof t.speed=="number"?C(t.speed,3):"";return s`<tr class="${t.isPoint?"point":""}"><td class="body">${r?s`<span class="glyph">${r}</span>`:l}${t.name}</td><td>${o?s`<span class="glyph">${o}</span>`:l}${t.sign??""}</td><td class="num">${typeof t.longitude=="number"?ft(t.longitude):""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td class="num">${i?s`${i}°/day`:l} ${t.isRetrograde?s`<span class="retro">℞</span>`:l}</td></tr>`})}</tbody></table></div>`}};Pe.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],p([u({attribute:!1})],Pe.prototype,"data",2),Pe=p([b("roxy-western-planets-table")],Pe);var he=class extends f{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new $(this)}renderQualityChip(e){let t=`quality-chip quality-${e}`;return s`<span class="${t}">${e}</span>`}renderDetailCard(e){return s`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):l}</p>${e.description?s`<p class="description">${e.description}</p>`:l} ${e.result?s`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:l}</div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,t=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let r=e;return s`<div class="wrap">${this.renderDetailCard(r)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let r=e.yogas;if(r.length>0&&"description"in r[0]){let m=r,g=t?m.filter(y=>y.name.toLowerCase().includes(t)):m,h=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${h!==void 0?s`<span class="count">${h} total</span>`:l}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${g.length>0?g.map(y=>this.renderDetailCard(y)):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let i=r,d=t?i.filter(m=>m.name.toLowerCase().includes(t)):i,c=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${c!==void 0?s`<span class="count">${c} total</span>`:l}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${d.length>0?d.map(m=>s`<div class="yoga-chip">${m.name} <span class="yoga-id">${m.id}</span></div>`):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return s`<div class="roxy-empty" role="status">No yoga data</div>`}};he.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],p([u({attribute:!1})],he.prototype,"data",2),p([N()],he.prototype,"filter",2),he=p([b("roxy-yoga-list")],he);var St=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,personal-year,chart}",docsSummary:"Life path, expression, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Mr="0.8.1";var ts=St.map(n=>n.slug);return Hr(rs);})();
|
|
83
|
+
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,o)=>this.getAscendant()+o*30)).map(t=>{let o=this.toAngle(t),i=R(E,E,nr,o),d=R(E,E,Ue,o);return w`<line class="wheel-line" x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} stroke-width="0.8" />`})}renderSigns(){return D.map((e,r)=>{let t=this.toAngle(r*30+15),o=R(E,E,Qr,t);return w`<text class="sign-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${H[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,o)=>{let i=e[(o+1)%12],d=Ot(t.longitude,i?i.longitude:t.longitude+30),c=R(E,E,nr-12,this.toAngle(d));return w`<text class="house-num" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,o)=>{let i=this.toAngle(o*30+15),d=R(E,E,nr-12,i),c=(o-r+12)%12+1;return w`<text class="house-num" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${c}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),o=r%30===0,i=o?Qr-14:Ue-5,d=R(E,E,i,t),c=R(E,E,Ue,t);e.push(w`<line class=${o?"tick tick-major":"tick"} x1=${d.x} y1=${d.y} x2=${c.x} y2=${c.y} stroke-width=${o?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?l:e.map(r=>{let t=this.toAngle(r.longitude),o=R(E,E,nr+9,t),i=U(r.longitude);return w`<text class="cusp-deg" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${i.degree}°${String(i.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(i=>Number.isFinite(i.longitude)).map(i=>({p:i,trueLon:Y(i.longitude),displayLon:Y(i.longitude)})).sort((i,d)=>i.trueLon-d.trueLon);for(let i=1;i<t.length;i++){let d=t[i-1],c=t[i];if(!d||!c)continue;let m=d.displayLon+7;c.displayLon<m&&(c.displayLon=m)}let o=t[t.length-1];if(o&&o.displayLon>360){let i=o.displayLon-360;for(let d of t)d.displayLon-=i}return t.map(({p:i,trueLon:d,displayLon:c})=>{let m=this.toAngle(d),y=this.toAngle(c),g=R(E,E,Ve,y),f=R(E,E,Ve-13,y),S=R(E,E,Ue-4,m),k=R(E,E,Ve+8,y),Ne=L[A(i.name)]??i.name.slice(0,2),ir=U(i.longitude),We=i.isRetrograde===!0,lr=`${ir.degree}\xB0${String(ir.minute).padStart(2,"0")}'`,dr=Math.abs(c-d)>.5;return w`<g>
|
|
84
|
+
${dr?w`<line class="planet-leader" x1=${S.x} y1=${S.y} x2=${k.x} y2=${k.y} />`:l}
|
|
85
|
+
<text class="planet-glyph" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central"><title>${i.name}${We?" retrograde":""} - ${lr} ${i.sign??""}</title>${Ne}</text>
|
|
86
|
+
<text class="planet-deg" x=${f.x} y=${f.y} text-anchor="middle" dominant-baseline="central">${lr}${We?w`<tspan class="retro"> ℞</tspan>`:l}</text>
|
|
87
|
+
</g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return l;let t=e?.retrogradePlanets??[];return s`<div class="details">${e?.dominantElement||e?.dominantModality?s`<div class="pill-row">${e.dominantElement?s`<span class="pill">Dominant element: ${e.dominantElement}</span>`:l} ${e.dominantModality?s`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:l}</div>`:l} ${r?s`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:l} ${t.length>0?s`<div class="pill-row">${t.map(o=>{let i=L[o]??o.slice(0,2);return s`<span class="pill pill--muted">${i} ${o} R</span>`})}</div>`:l} ${r?.summary?s`<p class="summary">${r.summary}</p>`:l} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return l;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],o=D,i={};for(let d of r)i[d]={Cardinal:[],Fixed:[],Mutable:[]};for(let d of e){let c=o.indexOf(A(d.sign??""));if(c<0)continue;let m=r[c%4],y=t[c%3],g=L[A(d.name)]??A(d.name).slice(0,2);i[m]?.[y]?.push(g)}return s`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(d=>s`<th scope="col">${d.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(d=>{let c=t.reduce((m,y)=>m+(i[d]?.[y]?.length??0),0);return s`<tr><th scope="row">${d}</th>${t.map(m=>s`<td>${(i[d]?.[m]??[]).join(" ")}</td>`)}<td class="em-total">${c}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(d=>s`<td class="em-total">${r.reduce((c,m)=>c+(i[m]?.[d]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?l:s`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let o=r.interpretation,i=L[A(r.name)]??"",d=C(r.degree??0,1);return s`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${i} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${d}</small> ${V()}</span></summary><div class="interp-body">${o.summary?s`<p class="interp-summary">${o.summary}</p>`:l} ${o.detailed?s`<p class="interp-detail">${o.detailed}</p>`:l} ${o.keywords?.length?s`<div class="interp-keywords">${o.keywords.map(c=>s`<span class="kw">${c}</span>`)}</div>`:l}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let i=A(o.name);i&&t.set(i,o.longitude)}return r.map(o=>{let i=t.get(A(o.planet1)),d=t.get(A(o.planet2));if(i===void 0||d===void 0)return l;let c=R(E,E,Ve-18,this.toAngle(i)),m=R(E,E,Ve-18,this.toAngle(d)),y=Ke(o),g=He[y]??"aspect-other",f=C(o.orb,1);return w`<line class=${`aspect ${g}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${y||""} ${o.planet2}${f?` (orb ${f}\xB0)`:""}</title></line>`})}};F.styles=[v,$e,Ye,u`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],p([h({attribute:!1})],F.prototype,"data",2),p([h({type:String,attribute:"house-system",reflect:!0})],F.prototype,"houseSystem",2),p([N()],F.prototype,"view",2),F=p([b("roxy-natal-chart")],F);var de=class extends x{constructor(){super();this.data=null;this.type="life-path";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No numerology data</div>`;let r=ds[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return s`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?s`<div class="numeral">${e.number}</div>`:l}<div><p class="label">${r}</p>${e.meaning?.title?s`<h2 class="title">${e.meaning.title}</h2>`:l}</div></div>${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l} ${e.calculation?s`<pre class="calc">${e.calculation}</pre>`:l} ${t.length>0?s`<div class="chips">${t.map(o=>s`<span>${o}</span>`)}</div>`:l} ${e.hasKarmicDebt&&e.karmicDebtNumber?s`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${cs(e.karmicDebtMeaning)}</div>`:l}</article>`}renderPersonalYear(e,r){return s`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?s`<div class="numeral">${e.personalYear}</div>`:l}<div><p class="label">${r}</p>${e.theme?s`<h2 class="title">${e.theme}</h2>`:l}</div></div>${e.forecast?s`<p class="meaning">${e.forecast}</p>`:l} ${e.advice?s`<p>${e.advice}</p>`:l}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return s`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?s`<h2 class="title">${e.profile.name}</h2>`:l}</div>${t.length>0?s`<div class="cores">${t.map(([o,i])=>s`<div class="item"><span>${j(o)}</span> <strong>${i.number??""}</strong></div>`)}</div>`:l}</article>`}};de.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],p([h({attribute:!1})],de.prototype,"data",2),p([h({type:String,reflect:!0})],de.prototype,"type",2),de=p([b("roxy-numerology-card")],de);var ds={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","personal-year":"Personal Year",chart:"Numerology chart"};function cs(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var ce=class extends x{constructor(){super();this.data=null;this.detail="detailed";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let o=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(g=>!!g[1]):[],i=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],d=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],c=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],m=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],y=r&&"transitions"in r?r.transitions:void 0;return s`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?ve(r.date):""}</span></header><table><tbody>${t.map(([g,f])=>s`<tr><th>${g}</th><td>${f}</td></tr>`)} ${r?.sunrise?s`<tr><th>Sunrise</th><td>${q(r.sunrise)}</td></tr>`:l} ${r?.sunset?s`<tr><th>Sunset</th><td>${q(r.sunset)}</td></tr>`:l} ${r?.moonrise?s`<tr><th>Moonrise</th><td>${q(r.moonrise)}</td></tr>`:l} ${r?.moonset?s`<tr><th>Moonset</th><td>${q(r.moonset)}</td></tr>`:l} ${o.map(([g,f])=>s`<tr><th>${g}</th><td>${f}</td></tr>`)}</tbody></table>${y?s`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",y.tithi)} ${this.renderTransitionRow("Nakshatra",y.nakshatra)} ${this.renderTransitionRow("Yoga",y.yoga)} ${this.renderTransitionRow("Karana",y.karana)}</tbody></table>`:l} ${this.detail==="detailed"&&(i.some(g=>!!g[1])||d.length>0||c.some(g=>!!g[1])||m.length>0)?s`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...i.filter(g=>!!g[1]),...d])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...c.filter(g=>!!g[1]),...m])}</tbody></table>`:l}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let o=Wr(t);return o?s`<tr><th>${r}</th><td>${o}</td></tr>`:l})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,o)=>[r.length>1?`${e} ${o+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return l;let t=q(r.endsAt),o=r.next?` \u2192 ${r.next}`:"";return s`<tr><th>${e}</th><td>ends ${t}${o}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=Wr(e);return r?`${e.current} (${r})`:e.current}};ce.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],p([h({attribute:!1})],ce.prototype,"data",2),p([h({type:String,reflect:!0})],ce.prototype,"detail",2),ce=p([b("roxy-panchang-table")],ce);var rt=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],Te=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data?.planets?.length)return s`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return s`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${rt.map(r=>s`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=L[A(e.planet)]??"",t=rt.map(y=>Math.max(0,e[y.key])),o=t.reduce((y,g)=>y+g,0),i=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,d=i?"adequacy-badge--adequate":"adequacy-badge--weak",c=i?"adequate":"weak",m=C(e.totalRupas,2)&&C(e.minRequired,2)?`${C(e.totalRupas,2)} / ${C(e.minRequired,2)} R`:"";return s`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${r}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${o>0?rt.map((y,g)=>{let f=t[g];if(f<=0)return l;let S=f/o*100;return s`<div class="bar-segment" style="flex-grow:${S};background:${y.color}" title="${y.label}: ${C(f,1)}"></div>`}):l}</div></div><div class="pills">${m?s`<span class="rupas-label">${m}</span>`:l} <span class="${`adequacy-badge ${d}`}">${c}</span></div></div>`}};Te.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],p([h({attribute:!1})],Te.prototype,"data",2),Te=p([b("roxy-shadbala-table")],Te);var st=360,M=st/2,tt=170,ps=154,at=124,Fe=96,Re=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:o}=this.data,i=this.data.interAspects??[],d=e?.planets??[],c=r?.planets??[],m=typeof t=="number"?Math.round(t):void 0,y=o?.overall,g=o?.strengths??[],f=o?.challenges??[];return d.length>0&&c.length>0?s`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof m=="number"?s`<span class="score" aria-label="${`Score ${m} of 100`}">${m} / 100</span>`:l}</div><svg viewBox="0 0 ${st} ${st}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${M}" cy="${M}" r="${tt}" stroke-width="1.5"/><circle class="wheel-line" cx="${M}" cy="${M}" r="${Fe+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${M}" cy="${M}" r="${Fe-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(d,c,i)} ${this.renderRing(d,at,"p1",1)} ${this.renderRing(c,Fe,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${y?s`<p class="summary">${y}</p>`:l} ${i.length>0?this.renderAspects(i):l} ${g.length>0||f.length>0?s`<div class="lists">${g.length?s`<div><h3>Strengths</h3><ul>${g.map(k=>s`<li>${k}</li>`)}</ul></div>`:l} ${f.length?s`<div><h3>Challenges</h3><ul>${f.map(k=>s`<li>${k}</li>`)}</ul></div>`:l}</div>`:l}</div>`:s`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof m=="number"?s`<span class="score" aria-label="${`Score ${m} of 100`}">${m} / 100</span>`:l}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code><roxy-data></code> fallback.</div>${y?s`<p class="summary">${y}</p>`:l} ${i.length>0?this.renderAspects(i):l} ${g.length>0||f.length>0?s`<div class="lists">${g.length?s`<div><h3>Strengths</h3><ul>${g.map(k=>s`<li>${k}</li>`)}</ul></div>`:l} ${f.length?s`<div><h3>Challenges</h3><ul>${f.map(k=>s`<li>${k}</li>`)}</ul></div>`:l}</div>`:l}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),o=R(M,M,Fe-14,t),i=R(M,M,tt,t);return w`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.6" />`})}renderSigns(){return D.map((e,r)=>{let t=this.toAngle(r*30+15),o=R(M,M,ps,t);return w`<text class="sign" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${H[e]}</text>`})}renderRing(e,r,t,o){return e.map(i=>{if(!Number.isFinite(i.longitude))return l;let d=this.toAngle(i.longitude),c=R(M,M,r,d),y=R(M,M,r+(o===1?-12:-10),d),g=L[A(i.name)]??i.name.slice(0,2),f=U(i.longitude),S=i.isRetrograde===!0,k=`${f.degree}\xB0${String(f.minute).padStart(2,"0")}'`,Ne=`${i.name}${S?" retrograde":""} - ${k} ${f.sign}`;return w`<g>
|
|
88
|
+
<text class=${t} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central"><title>${Ne}</title>${g}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${o}</tspan></text>
|
|
89
|
+
<text class="planet-deg" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">${f.degree}°${S?w`<tspan class="retro"> ℞</tspan>`:l}</text>
|
|
90
|
+
</g>`})}renderAscendants(e){let r=[],t=(o,i)=>{if(!o)return;let d=D.findIndex(S=>S.toLowerCase()===o.sign.toLowerCase());if(d===-1)return;let c=d*30+o.degree,m=this.toAngle(c),y=i===1?at+14:Fe+14,g=R(M,M,y,m),f=R(M,M,tt+14,m);r.push(w`<g>
|
|
91
|
+
<line class="asc-tick" x1=${g.x} y1=${g.y} x2=${f.x} y2=${f.y} />
|
|
92
|
+
<text class="asc-label" x=${f.x} y=${f.y} text-anchor="middle" dominant-baseline="central">Asc${i}</text>
|
|
93
|
+
</g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let o=(i,d)=>{let c=A(d);for(let m of i)if(A(m.name)===c&&typeof m.longitude=="number")return m.longitude};return t.map(i=>{let d=o(e,i.planet1),c=o(r,i.planet2);if(d===void 0||c===void 0)return l;let m=R(M,M,at-12,this.toAngle(d)),y=R(M,M,Fe+8,this.toAngle(c)),g=Ke(i),f=He[g]??"aspect-other",S=C(i.orb,1);return w`<line class=${`aspect ${f}`} x1=${m.x} y1=${m.y} x2=${y.x} y2=${y.y}><title>${i.planet1} ${g} ${i.planet2}${S?` (orb ${S}\xB0)`:""}</title></line>`})}renderAspects(e){return s`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(r=>s`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${Ke(r)||""}</td><td class="orb">${C(r.orb,1)}</td><td>${ms(r.strength)}</td></tr>`)}</tbody></table>`}};Re.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],p([h({attribute:!1})],Re.prototype,"data",2),Re=p([b("roxy-synastry-chart")],Re);function ms(n){return typeof n=="number"?Math.round(n).toString():""}var pe=class extends x{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new $(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):s`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,o=r.keywords??[];return s`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?s`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}">`:s`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?s`${r.arcana} arcana`:l} ${t?s`· reversed`:l}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:l} ${r.meaning?s`<p>${r.meaning}</p>`:l} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:l} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,o=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return s`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?s`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}">`:s`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?s`${e.arcana} arcana`:l} ${e.number!==void 0&&e.number!==null?s`· ${e.number}`:l} ${r?s`· reversed`:l}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?s`<p>${t.description}</p>`:l} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:l} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};pe.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],p([h({attribute:!1})],pe.prototype,"data",2),p([N()],pe.prototype,"flipped",2),pe=p([b("roxy-tarot-card")],pe);var me=class extends x{constructor(){super();this.data=null;this.spread="three-card";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),o=t?[]:"positions"in e?e.positions??[]:[],i=t&&"cards"in e?e.cards:[],d=r?e.answer:void 0,c=r?e.strength:void 0,m="spread"in e?e.spread:this.spread.replace(/-/g," "),y="question"in e?e.question:void 0,g="summary"in e?e.summary:void 0,f=r?e.interpretation:void 0,S=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${m}</h2>${y?s`<span class="question">"${y}"</span>`:l}</header>${r?s`<div><span class="${`answer ${S}`}">${d}</span> ${c?s`<small>· ${c}</small>`:l}</div>`:l} ${o.length>0?s`<div class="grid">${o.map(k=>s`<div class="card"><p class="label">${k.name??""}</p><div class="image">${k.card?.imageUrl?s`<img src="${k.card.imageUrl}" alt="${k.card.name??"tarot card"}" class="${k.card.reversed?"reversed":""}">`:s`${k.card?.name??"?"}`}</div><p class="name">${k.card?.name??""} ${k.card?.reversed?s`<small>(reversed)</small>`:l}</p>${k.interpretation?s`<p class="interp">${k.interpretation}</p>`:l}</div>`)}</div>`:l} ${i.length>0?s`<div class="grid">${i.map(k=>s`<div class="card"><div class="image">${k.imageUrl?s`<img src="${k.imageUrl}" alt="${k.name??"tarot card"}" class="${k.reversed?"reversed":""}">`:s`${k.name??"?"}`}</div><p class="name">${k.name??""} ${k.reversed?s`<small>(reversed)</small>`:l}</p>${k.meaning?s`<p class="interp">${k.meaning}</p>`:l}</div>`)}</div>`:l} ${g?s`<p class="reading">${g}</p>`:l} ${f?s`<p class="reading">${f}</p>`:l}</article>`}};me.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],p([h({attribute:!1})],me.prototype,"data",2),p([h({type:String,reflect:!0})],me.prototype,"spread",2),me=p([b("roxy-tarot-spread")],me);var ge=class extends x{constructor(){super();this.data=null;this.tab="positions";new $(this)}render(){if(!this.data?.transitPlanets?.length)return s`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:o,summary:i}=this.data,d=[ve(e),q(r)].filter(Boolean).join(" "),c=o?.length??0,m=this.tab;return s`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${d?s`<p class="subtitle">${d}</p>`:l}</div>${c>0?s`${qe({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:m,onSelect:y=>{this.tab=y},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${m}" role="tabpanel" aria-labelledby="transits-tab-${m}">${m==="positions"?s`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:s`${i?this.renderSummaryPills(i):l}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:s`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return s`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return s`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=L[A(r.name)]??"",o=H[A(r.sign)]??"",i=r.speed>=0?"\u2191":"\u2193";return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?s`<span class="retro-badge" aria-label="retrograde">R</span>`:l}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${o}</span> ${r.sign}</div></td><td class="num">${C(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${i}</span> ${C(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return s`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let o=L[A(r.transitPlanet)]??"",i=L[A(r.natalPlanet)]??"",d=(r.nature??"neutral").toLowerCase(),c=r.interpretation,m=(r.type??"").toLowerCase(),y=r.isApplying?"Applying":"Separating";return s`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${o}</span> ${r.transitPlanet} <span class="nature-badge ${d}">${m}</span> <span aria-hidden="true">${i}</span> ${r.natalPlanet} <span class="meta">${y} · orb ${C(r.orb,2)}° · strength ${C(r.strength,1)} </span>${V()}</summary><div class="interp-body">${c?.summary?s`<p>${c.summary}</p>`:l} ${c?.impact?s`<p><strong>Impact:</strong> ${c.impact}</p>`:l} ${c?.timing?s`<p><strong>Timing:</strong> ${c.timing}</p>`:l} ${c?.guidance?s`<p><strong>Guidance:</strong> ${c.guidance}</p>`:l} ${c?.keywords?.length?s`<div class="interp-keywords">${c.keywords.map(g=>s`<span class="kw">${g}</span>`)}</div>`:l}</div></details>`})}</div>`}};ge.styles=[v,$e,Ye,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],p([h({attribute:!1})],ge.prototype,"data",2),p([N()],ge.prototype,"tab",2),ge=p([b("roxy-transits-table")],ge);var K=class extends x{constructor(){super();this.data=null;this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e};new $(this)}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?Sr(this.data.meta,"D1 Rashi",this.resolveReference()):null}render(){let e=this.viewModel();if(!e)return s`<div class="roxy-empty" role="status">No kundli data</div>`;let r=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return s`<div class="wrap"><div class="header"><h2 class="title">${r}</h2>${Cr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${Ar(e,this.chartStyle)}</svg></div>`}};K.styles=[v,Er,$e],p([h({attribute:!1})],K.prototype,"data",2),p([h({type:String,reflect:!0,attribute:"chart-style"})],K.prototype,"chartStyle",2),p([h({type:String,reflect:!0,attribute:"chart-reference"})],K.prototype,"chartReference",2),p([h({type:String,reflect:!0,attribute:"lagna-override"})],K.prototype,"lagnaOverride",2),K=p([b("roxy-vedic-kundli")],K);var gs=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Pe=class extends x{constructor(){super();this.data=null;new $(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let o of gs){let i=e[o];i&&(t.push([o,i]),r.add(o))}for(let[o,i]of Object.entries(e))r.has(o)||t.push([o,i]);return t}render(){if(!this.data?.meta)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return s`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let o=(t.graha??r)==="Lagna",i=L[A(t.graha??r)]??"",d=H[A(t.rashi??"")]??"";return s`<tr class="${o?"lagna":""}"><td class="graha">${i?s`<span class="glyph">${i}</span>`:l}${t.graha??r}</td><td>${d?s`<span class="glyph">${d}</span>`:l}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?wr(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?s`<span class="retro">R</span>`:l}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?l:s`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${V()}</summary><div class="panel-body">${e.map(r=>{let t=L[A(r.planet)]??"",o=C(r.distanceFromSun,2),i=C(r.orb,1);return s`<div class="condition"><span class="planet">${t?`${t} `:""}${r.planet}</span> <span class="detail">${o} deg from Sun, within ${i} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?l:s`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${V()}</summary><div class="panel-body">${e.map(r=>{let t=C(r.distance,2);return s`<div class="condition"><span class="planet">${r.planet1} vs ${r.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${r.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},r=this.orderedRows().map(([t,o])=>[o.graha??t,e[o.graha??t]]).filter(([,t])=>t!=null);return r.length===0?l:s`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${V()}</summary><div class="panel-body">${r.map(([t,o])=>{let i=L[A(t)]??"";return s`<div class="interp"><span class="planet">${i?`${i} `:""}${t}</span> ${o.rashi?s`<p><span class="label">Rashi.</span> ${o.rashi}</p>`:l} ${o.nakshatra?s`<p><span class="label">Nakshatra.</span> ${o.nakshatra}</p>`:l}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?l:s`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${V()}</summary><div class="panel-body">${e.map(r=>s`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?s`<p class="desc">${r.description}</p>`:l}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?l:s`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${V()}</summary><div class="panel-body">${e.map(r=>s`<div class="bhava"><span class="name">${r.name} ${r.quality?s`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:l}</span> ${r.result?s`<p class="desc">${r.result}</p>`:l}</div>`)}</div></details>`}};Pe.styles=[v,Ye,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],p([h({attribute:!1})],Pe.prototype,"data",2),Pe=p([b("roxy-vedic-planets-table")],Pe);var Le=class extends x{constructor(){super();this.data=null;new $(this)}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,o]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])o&&r.push({name:t,sign:o.sign,longitude:o.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return s`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=L[A(r.name)]??"",o=H[A(r.sign??"")]??"",i=typeof r.speed=="number"?C(r.speed,3):"";return s`<tr class="${r.isPoint?"point":""}"><td class="body">${t?s`<span class="glyph">${t}</span>`:l}${r.name}</td><td>${o?s`<span class="glyph">${o}</span>`:l}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?wr(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${i?s`${i}°/day`:l} ${r.isRetrograde?s`<span class="retro">℞</span>`:l}</td></tr>`})}</tbody></table></div>`}};Le.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],p([h({attribute:!1})],Le.prototype,"data",2),Le=p([b("roxy-western-planets-table")],Le);var he=class extends x{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new $(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return s`<span class="${r}">${e}</span>`}renderDetailCard(e){return s`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):l}</p>${e.description?s`<p class="description">${e.description}</p>`:l} ${e.result?s`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:l}</div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return s`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let m=t,y=r?m.filter(f=>f.name.toLowerCase().includes(r)):m,g=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${g!==void 0?s`<span class="count">${g} total</span>`:l}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${y.length>0?y.map(f=>this.renderDetailCard(f)):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let i=t,d=r?i.filter(m=>m.name.toLowerCase().includes(r)):i,c=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${c!==void 0?s`<span class="count">${c} total</span>`:l}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${d.length>0?d.map(m=>s`<div class="yoga-chip">${m.name} <span class="yoga-id">${m.id}</span></div>`):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return s`<div class="roxy-empty" role="status">No yoga data</div>`}};he.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],p([h({attribute:!1})],he.prototype,"data",2),p([N()],he.prototype,"filter",2),he=p([b("roxy-yoga-list")],he);var Tr=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, soul urge, personality, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,soul-urge,personality,personal-year,chart}",docsSummary:"Life path, expression, soul urge, personality, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyCrystalGrid",tag:"roxy-crystal-grid",slug:"crystal-grid",heading:"Crystal grid",description:"Responsive crystal gallery with photo, name, and colour swatches from any crystals list response",docsLabel:"Crystals",endpointLabel:"GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",docsSummary:"Crystal gallery tiles with photo, name, and colour swatches",topic:"Crystals"},{pascal:"RoxyDreamCard",tag:"roxy-dream-card",slug:"dream-card",heading:"Dream symbol",description:"Dream symbol card with the symbol name, full interpretation, and dictionary letter",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols/{id}",docsSummary:"Symbol name, interpretation body, and letter chip",topic:"Dreams"},{pascal:"RoxyAngelNumberCard",tag:"roxy-angel-number-card",slug:"angel-number-card",heading:"Angel number",description:"Angel number card with title, core message, badges, keywords, life-area interpretations, affirmation, and action steps",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/numbers/{number}",docsSummary:"Number meaning with spiritual, love, career, and twin flame sections",topic:"Angel Numbers"},{pascal:"RoxyAngelNumberLookup",tag:"roxy-angel-number-lookup",slug:"angel-number-lookup",heading:"Angel number lookup",description:"Angel number sequence analysis with pattern classification, the known meaning when present, and a digit-root fallback for any number",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/lookup",docsSummary:"Pattern analysis plus known meaning and digit-root fallback",topic:"Angel Numbers"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Kt="0.10.0";var hs=Tr.map(n=>n.slug);var qt=`/**
|
|
94
|
+
* Roxy UI design tokens. ~30 CSS custom properties that every component reads. Light + dark defaults. Host page overrides at :root or per element. No Tailwind, no class-name overrides, no JS theme switcher.
|
|
95
|
+
*
|
|
96
|
+
* Delivery model: this file ships as a global light-DOM stylesheet (linked, or auto-injected by the CDN bundle). Custom properties inherit through the shadow boundary, so tokens set on a light-DOM ancestor reach every component shadow. The explicit theme blocks therefore target light-DOM selectors (:root, .dark, [data-theme="dark"], a wrapper element), NOT :host (a :host rule in a global sheet matches nothing). The :host([data-theme]) selectors are kept only for the case where this CSS is ever adopted directly into a shadow root; they are inert in global delivery.
|
|
97
|
+
*
|
|
98
|
+
* Light is the default. Dark applies under any of:
|
|
99
|
+
* - prefers-color-scheme: dark
|
|
100
|
+
* - [data-theme="dark"] on the element itself or any ancestor (typically :root)
|
|
101
|
+
* - .dark class on the element itself or any ancestor (typically :root)
|
|
102
|
+
*
|
|
103
|
+
* Explicit choice wins over the OS: the [data-theme] / .dark blocks come after the @media (prefers-color-scheme: dark) block in source order, and a closer ancestor overrides a farther one through normal custom-property inheritance.
|
|
104
|
+
*
|
|
105
|
+
* Motion gating:
|
|
106
|
+
* - --roxy-motion-duration defaults to 200ms. Set to 0ms to disable.
|
|
107
|
+
* - prefers-reduced-motion: reduce forces 0ms regardless of host overrides.
|
|
108
|
+
*/
|
|
109
|
+
|
|
110
|
+
:root,
|
|
111
|
+
:host {
|
|
112
|
+
/* Color: brand */
|
|
113
|
+
--roxy-primary: #0f172a;
|
|
114
|
+
--roxy-secondary: #475569;
|
|
115
|
+
--roxy-accent: #f59e0b;
|
|
116
|
+
/* Text-safe accent variant. amber-500 hits 2.14:1 on white which fails
|
|
117
|
+
* WCAG AA for body text. amber-700 hits 4.5:1, used wherever the accent
|
|
118
|
+
* tone is applied to text. Fills (planet glyphs, chart accents, badges
|
|
119
|
+
* with non-text use) keep --roxy-accent. */
|
|
120
|
+
--roxy-accent-ink: #b45309;
|
|
121
|
+
|
|
122
|
+
/* Color: status. The base value (success, warning, danger, info) is for
|
|
123
|
+
* fills and tints. The -fg variant is darker so text on a light tint passes
|
|
124
|
+
* WCAG AA (>= 4.5:1 on white). Use -fg whenever status color hits text. */
|
|
125
|
+
--roxy-success: #16a34a;
|
|
126
|
+
--roxy-success-fg: #166534;
|
|
127
|
+
--roxy-warning: #ea580c;
|
|
128
|
+
--roxy-warning-fg: #9a3412;
|
|
129
|
+
--roxy-danger: #dc2626;
|
|
130
|
+
--roxy-danger-fg: #991b1b;
|
|
131
|
+
--roxy-info: #0284c7;
|
|
132
|
+
--roxy-info-fg: #075985;
|
|
133
|
+
|
|
134
|
+
/* Color: surface */
|
|
135
|
+
--roxy-bg: #ffffff;
|
|
136
|
+
--roxy-fg: #0a0a0a;
|
|
137
|
+
--roxy-muted: #71717a;
|
|
138
|
+
--roxy-border: #e4e4e7;
|
|
139
|
+
--roxy-ring: rgba(245, 158, 11, 0.4);
|
|
140
|
+
|
|
141
|
+
/* Typography */
|
|
142
|
+
--roxy-font-sans:
|
|
143
|
+
"Geist", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
|
144
|
+
sans-serif;
|
|
145
|
+
--roxy-font-mono:
|
|
146
|
+
"Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono",
|
|
147
|
+
monospace;
|
|
148
|
+
|
|
149
|
+
--roxy-text-xs: 0.75rem;
|
|
150
|
+
--roxy-text-sm: 0.875rem;
|
|
151
|
+
--roxy-text-base: 1rem;
|
|
152
|
+
--roxy-text-lg: 1.125rem;
|
|
153
|
+
--roxy-text-xl: 1.5rem;
|
|
154
|
+
|
|
155
|
+
--roxy-weight-normal: 400;
|
|
156
|
+
--roxy-weight-bold: 600;
|
|
157
|
+
|
|
158
|
+
--roxy-leading-tight: 1.2;
|
|
159
|
+
--roxy-leading-normal: 1.5;
|
|
160
|
+
|
|
161
|
+
--roxy-tracking-tight: -0.02em;
|
|
162
|
+
--roxy-tracking-normal: 0em;
|
|
163
|
+
|
|
164
|
+
/* Spacing */
|
|
165
|
+
--roxy-space-xs: 0.25rem;
|
|
166
|
+
--roxy-space-sm: 0.5rem;
|
|
167
|
+
--roxy-space-md: 1rem;
|
|
168
|
+
--roxy-space-lg: 1.5rem;
|
|
169
|
+
--roxy-space-xl: 2.5rem;
|
|
170
|
+
|
|
171
|
+
/* Radius */
|
|
172
|
+
--roxy-radius-sm: 4px;
|
|
173
|
+
--roxy-radius-md: 8px;
|
|
174
|
+
--roxy-radius-lg: 12px;
|
|
175
|
+
--roxy-radius-full: 9999px;
|
|
176
|
+
|
|
177
|
+
/* Shadow */
|
|
178
|
+
--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
179
|
+
--roxy-shadow-md:
|
|
180
|
+
0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06);
|
|
181
|
+
--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.14);
|
|
182
|
+
|
|
183
|
+
/* Motion */
|
|
184
|
+
--roxy-motion-duration: 200ms;
|
|
185
|
+
--roxy-motion-easing: cubic-bezier(0.4, 0, 0.2, 1);
|
|
186
|
+
|
|
187
|
+
/* Heat scale: a single base hue. Consumers mix it with \`transparent\` at
|
|
188
|
+
* increasing percentages to paint cooler-to-hotter tiers. The mix-with-
|
|
189
|
+
* transparent approach lets the page bg show through and keeps text
|
|
190
|
+
* colour stable (always --roxy-fg), so the cells read in both themes
|
|
191
|
+
* without per-tier text colours. */
|
|
192
|
+
--roxy-heat: var(--roxy-danger, #ef4444);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* Dark theme via system preference */
|
|
196
|
+
@media (prefers-color-scheme: dark) {
|
|
197
|
+
:root,
|
|
198
|
+
:host {
|
|
199
|
+
--roxy-primary: #f8fafc;
|
|
200
|
+
--roxy-secondary: #94a3b8;
|
|
201
|
+
--roxy-accent: #fbbf24;
|
|
202
|
+
--roxy-accent-ink: #fbbf24;
|
|
203
|
+
|
|
204
|
+
/* Status -fg overrides must mirror the explicit [data-theme="dark"] block
|
|
205
|
+
* below. Without these, a user on system dark with no data-theme attribute
|
|
206
|
+
* inherits the light-mode -fg values (e.g. #166534 success) which renders
|
|
207
|
+
* as near-invisible dark green on a near-black surface and fails WCAG AA. */
|
|
208
|
+
--roxy-success: #22c55e;
|
|
209
|
+
--roxy-success-fg: #86efac;
|
|
210
|
+
--roxy-warning: #fb923c;
|
|
211
|
+
--roxy-warning-fg: #fdba74;
|
|
212
|
+
--roxy-danger: #ef4444;
|
|
213
|
+
--roxy-danger-fg: #fca5a5;
|
|
214
|
+
--roxy-info: #38bdf8;
|
|
215
|
+
--roxy-info-fg: #7dd3fc;
|
|
216
|
+
|
|
217
|
+
--roxy-bg: #0a0a0a;
|
|
218
|
+
--roxy-fg: #fafafa;
|
|
219
|
+
--roxy-muted: #a1a1aa;
|
|
220
|
+
--roxy-border: #27272a;
|
|
221
|
+
--roxy-ring: rgba(251, 191, 36, 0.45);
|
|
222
|
+
|
|
223
|
+
--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);
|
|
224
|
+
--roxy-shadow-md:
|
|
225
|
+
0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);
|
|
226
|
+
--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
|
|
227
|
+
|
|
228
|
+
--roxy-heat: var(--roxy-danger, #ef4444);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/* Light theme override. Beats the @media (prefers-color-scheme: dark) block
|
|
233
|
+
* when the host explicitly opts back into light. Without this, a dark-mode OS
|
|
234
|
+
* pins the tokens to dark even after data-theme="light" is set. The light-DOM
|
|
235
|
+
* selectors (:root.light, .light, [data-theme="light"]) set the vars on the
|
|
236
|
+
* ancestor or the element itself so they inherit into every component shadow;
|
|
237
|
+
* :host([data-theme="light"]) is inert in global delivery and kept only for
|
|
238
|
+
* shadow-adopted use. */
|
|
239
|
+
:root[data-theme="light"],
|
|
240
|
+
[data-theme="light"],
|
|
241
|
+
:root.light,
|
|
242
|
+
.light,
|
|
243
|
+
:host([data-theme="light"]) {
|
|
244
|
+
--roxy-primary: #0f172a;
|
|
245
|
+
--roxy-secondary: #475569;
|
|
246
|
+
--roxy-accent: #f59e0b;
|
|
247
|
+
--roxy-accent-ink: #b45309;
|
|
248
|
+
|
|
249
|
+
--roxy-success: #16a34a;
|
|
250
|
+
--roxy-success-fg: #166534;
|
|
251
|
+
--roxy-warning: #ea580c;
|
|
252
|
+
--roxy-warning-fg: #9a3412;
|
|
253
|
+
--roxy-danger: #dc2626;
|
|
254
|
+
--roxy-danger-fg: #991b1b;
|
|
255
|
+
--roxy-info: #0284c7;
|
|
256
|
+
--roxy-info-fg: #075985;
|
|
257
|
+
|
|
258
|
+
--roxy-bg: #ffffff;
|
|
259
|
+
--roxy-fg: #0a0a0a;
|
|
260
|
+
--roxy-muted: #71717a;
|
|
261
|
+
--roxy-border: #e4e4e7;
|
|
262
|
+
--roxy-ring: rgba(245, 158, 11, 0.4);
|
|
263
|
+
|
|
264
|
+
--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
265
|
+
--roxy-shadow-md:
|
|
266
|
+
0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06);
|
|
267
|
+
--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.14);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* Dark theme via explicit opt-in. The light-DOM selectors (:root.dark, .dark,
|
|
271
|
+
* [data-theme="dark"]) set the vars on the ancestor or the element itself so
|
|
272
|
+
* they inherit into every component shadow; this is what makes a .dark class on
|
|
273
|
+
* any ancestor (Tailwind, shadcn) actually theme the components in global
|
|
274
|
+
* delivery. :host([data-theme="dark"]) is inert in global delivery and kept
|
|
275
|
+
* only for shadow-adopted use. */
|
|
276
|
+
:root[data-theme="dark"],
|
|
277
|
+
[data-theme="dark"],
|
|
278
|
+
:root.dark,
|
|
279
|
+
.dark,
|
|
280
|
+
:host([data-theme="dark"]) {
|
|
281
|
+
--roxy-primary: #f8fafc;
|
|
282
|
+
--roxy-secondary: #94a3b8;
|
|
283
|
+
--roxy-accent: #fbbf24;
|
|
284
|
+
--roxy-accent-ink: #fbbf24;
|
|
285
|
+
|
|
286
|
+
--roxy-success: #22c55e;
|
|
287
|
+
--roxy-success-fg: #86efac;
|
|
288
|
+
--roxy-warning: #fb923c;
|
|
289
|
+
--roxy-warning-fg: #fdba74;
|
|
290
|
+
--roxy-danger: #ef4444;
|
|
291
|
+
--roxy-danger-fg: #fca5a5;
|
|
292
|
+
--roxy-info: #38bdf8;
|
|
293
|
+
--roxy-info-fg: #7dd3fc;
|
|
294
|
+
|
|
295
|
+
--roxy-bg: #0a0a0a;
|
|
296
|
+
--roxy-fg: #fafafa;
|
|
297
|
+
--roxy-muted: #a1a1aa;
|
|
298
|
+
--roxy-border: #27272a;
|
|
299
|
+
--roxy-ring: rgba(251, 191, 36, 0.45);
|
|
300
|
+
|
|
301
|
+
--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);
|
|
302
|
+
--roxy-shadow-md:
|
|
303
|
+
0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);
|
|
304
|
+
--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
|
|
305
|
+
|
|
306
|
+
--roxy-heat: var(--roxy-danger, #ef4444);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* Reduced motion override */
|
|
310
|
+
@media (prefers-reduced-motion: reduce) {
|
|
311
|
+
:root,
|
|
312
|
+
:host {
|
|
313
|
+
--roxy-motion-duration: 0ms;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
`;var Rr="roxy-ui-tokens";function Pr(){if(typeof document>"u")return null;let n=document.getElementById(Rr);if(n)return n;let a=document.createElement("style");return a.id=Rr,a.textContent=qt,document.head.prepend(a),a}Pr();return Wt(ys);})();
|
|
94
317
|
/*! Bundled license information:
|
|
95
318
|
|
|
96
319
|
@lit/reactive-element/css-tag.js:
|