@roxyapi/ui 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/AGENTS.md +15 -10
  2. package/README.md +18 -13
  3. package/dist/cdn/components/compatibility-card.js.map +1 -1
  4. package/dist/cdn/components/dasha-timeline.js +8 -8
  5. package/dist/cdn/components/dasha-timeline.js.map +2 -2
  6. package/dist/cdn/components/divisional-chart.js +35 -23
  7. package/dist/cdn/components/divisional-chart.js.map +4 -4
  8. package/dist/cdn/components/guna-milan.js.map +1 -1
  9. package/dist/cdn/components/kp-chart.js +306 -0
  10. package/dist/cdn/components/kp-chart.js.map +7 -0
  11. package/dist/cdn/components/kp-planets-table.js.map +1 -1
  12. package/dist/cdn/components/kp-ruling-planets.js +269 -0
  13. package/dist/cdn/components/kp-ruling-planets.js.map +7 -0
  14. package/dist/cdn/components/location-search.js +7 -5
  15. package/dist/cdn/components/location-search.js.map +3 -3
  16. package/dist/cdn/components/moon-phase.js.map +1 -1
  17. package/dist/cdn/components/nakshatra-card.js +229 -0
  18. package/dist/cdn/components/nakshatra-card.js.map +7 -0
  19. package/dist/cdn/components/natal-chart.js +228 -115
  20. package/dist/cdn/components/natal-chart.js.map +4 -4
  21. package/dist/cdn/components/numerology-card.js +3 -3
  22. package/dist/cdn/components/numerology-card.js.map +2 -2
  23. package/dist/cdn/components/panchang-table.js.map +1 -1
  24. package/dist/cdn/components/shadbala-table.js.map +1 -1
  25. package/dist/cdn/components/synastry-chart.js +3 -3
  26. package/dist/cdn/components/synastry-chart.js.map +2 -2
  27. package/dist/cdn/components/transits-table.js.map +1 -1
  28. package/dist/cdn/components/vedic-kundli.js +34 -22
  29. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  30. package/dist/cdn/components/vedic-planets-table.js +231 -0
  31. package/dist/cdn/components/vedic-planets-table.js.map +7 -0
  32. package/dist/cdn/components/western-planets-table.js +220 -0
  33. package/dist/cdn/components/western-planets-table.js.map +7 -0
  34. package/dist/cdn/roxy-ui.js +1078 -331
  35. package/dist/cdn/roxy-ui.js.map +4 -4
  36. package/dist/components/compatibility-card.js.map +1 -1
  37. package/dist/components/dasha-timeline.d.ts.map +1 -1
  38. package/dist/components/dasha-timeline.js.map +2 -2
  39. package/dist/components/divisional-chart.d.ts +5 -3
  40. package/dist/components/divisional-chart.d.ts.map +1 -1
  41. package/dist/components/divisional-chart.js +159 -38
  42. package/dist/components/divisional-chart.js.map +3 -3
  43. package/dist/components/guna-milan.js.map +1 -1
  44. package/dist/components/kp-chart.d.ts +26 -0
  45. package/dist/components/kp-chart.d.ts.map +1 -0
  46. package/dist/components/kp-chart.js +382 -0
  47. package/dist/components/kp-chart.js.map +7 -0
  48. package/dist/components/kp-planets-table.js.map +1 -1
  49. package/dist/components/kp-ruling-planets.d.ts +20 -0
  50. package/dist/components/kp-ruling-planets.d.ts.map +1 -0
  51. package/dist/components/kp-ruling-planets.js +275 -0
  52. package/dist/components/kp-ruling-planets.js.map +7 -0
  53. package/dist/components/location-search.d.ts.map +1 -1
  54. package/dist/components/location-search.js +9 -2
  55. package/dist/components/location-search.js.map +2 -2
  56. package/dist/components/moon-phase.js.map +1 -1
  57. package/dist/components/nakshatra-card.d.ts +18 -0
  58. package/dist/components/nakshatra-card.d.ts.map +1 -0
  59. package/dist/components/nakshatra-card.js +231 -0
  60. package/dist/components/nakshatra-card.js.map +7 -0
  61. package/dist/components/natal-chart.d.ts +28 -0
  62. package/dist/components/natal-chart.d.ts.map +1 -1
  63. package/dist/components/natal-chart.js +401 -104
  64. package/dist/components/natal-chart.js.map +2 -2
  65. package/dist/components/numerology-card.d.ts.map +1 -1
  66. package/dist/components/numerology-card.js.map +2 -2
  67. package/dist/components/panchang-table.js.map +1 -1
  68. package/dist/components/shadbala-table.js.map +1 -1
  69. package/dist/components/synastry-chart.js.map +2 -2
  70. package/dist/components/transits-table.js.map +1 -1
  71. package/dist/components/vedic-kundli.d.ts +7 -3
  72. package/dist/components/vedic-kundli.d.ts.map +1 -1
  73. package/dist/components/vedic-kundli.js +209 -87
  74. package/dist/components/vedic-kundli.js.map +3 -3
  75. package/dist/components/vedic-planets-table.d.ts +21 -0
  76. package/dist/components/vedic-planets-table.d.ts.map +1 -0
  77. package/dist/components/vedic-planets-table.js +355 -0
  78. package/dist/components/vedic-planets-table.js.map +7 -0
  79. package/dist/components/western-planets-table.d.ts +21 -0
  80. package/dist/components/western-planets-table.d.ts.map +1 -0
  81. package/dist/components/western-planets-table.js +350 -0
  82. package/dist/components/western-planets-table.js.map +7 -0
  83. package/dist/index.cjs +2042 -695
  84. package/dist/index.cjs.map +4 -4
  85. package/dist/index.d.ts +5 -0
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2029 -682
  88. package/dist/index.js.map +4 -4
  89. package/dist/manifest.d.ts.map +1 -1
  90. package/dist/manifest.json +23 -18
  91. package/dist/styles/tokens.css +4 -0
  92. package/dist/types/types.gen.d.ts +343 -49
  93. package/dist/types/types.gen.d.ts.map +1 -1
  94. package/dist/utils/degree.d.ts +12 -0
  95. package/dist/utils/degree.d.ts.map +1 -1
  96. package/dist/utils/format.d.ts +1 -1
  97. package/dist/utils/kundli-render.d.ts +85 -12
  98. package/dist/utils/kundli-render.d.ts.map +1 -1
  99. package/dist/version.d.ts +1 -1
  100. package/package.json +1 -1
  101. package/src/components/dasha-timeline.ts +1 -7
  102. package/src/components/divisional-chart.ts +27 -41
  103. package/src/components/kp-chart.ts +313 -0
  104. package/src/components/kp-ruling-planets.ts +196 -0
  105. package/src/components/location-search.ts +16 -2
  106. package/src/components/nakshatra-card.ts +149 -0
  107. package/src/components/natal-chart.ts +408 -119
  108. package/src/components/numerology-card.ts +1 -5
  109. package/src/components/vedic-kundli.ts +30 -40
  110. package/src/components/vedic-planets-table.ts +184 -0
  111. package/src/components/western-planets-table.ts +180 -0
  112. package/src/index.ts +5 -0
  113. package/src/manifest.ts +146 -84
  114. package/src/styles/tokens.css +4 -0
  115. package/src/types/types.gen.ts +343 -49
  116. package/src/utils/degree.ts +21 -0
  117. package/src/utils/format.ts +1 -1
  118. package/src/utils/kundli-render.ts +234 -29
  119. package/src/version.ts +1 -1
@@ -1,6 +1,6 @@
1
- "use strict";var RoxyUI=(()=>{var Ae=Object.defineProperty;var pr=Object.getOwnPropertyDescriptor;var Gr=Object.getOwnPropertyNames;var jr=Object.prototype.hasOwnProperty;var Ir=(i,a)=>{for(var e in a)Ae(i,e,{get:a[e],enumerable:!0})},Br=(i,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let s of Gr(a))!jr.call(i,s)&&s!==e&&Ae(i,s,{get:()=>a[s],enumerable:!(r=pr(a,s))||r.enumerable});return i};var qr=i=>Br(Ae({},"__esModule",{value:!0}),i),p=(i,a,e,r)=>{for(var s=r>1?void 0:r?pr(a,e):a,o=i.length-1,l;o>=0;o--)(l=i[o])&&(s=(r?l(a,e,s):l(s))||s);return r&&s&&Ae(a,e,s),s};var Ct={};Ir(Ct,{ROXY_COMPONENTS:()=>Ie,ROXY_UI_COMPONENTS:()=>At,ROXY_UI_VERSION:()=>Hr,RoxyAshtakavargaGrid:()=>M,RoxyBiorhythmChart:()=>D,RoxyChoghadiyaGrid:()=>re,RoxyCompatibilityCard:()=>H,RoxyDashaTimeline:()=>G,RoxyData:()=>j,RoxyDivisionalChart:()=>I,RoxyDoshaCard:()=>B,RoxyEndpointForm:()=>_,RoxyGunaMilan:()=>te,RoxyHexagram:()=>q,RoxyHoroscopeCard:()=>U,RoxyKpPlanetsTable:()=>ae,RoxyLocationSearch:()=>T,RoxyMoonPhase:()=>Y,RoxyNatalChart:()=>K,RoxyNumerologyCard:()=>V,RoxyPanchangTable:()=>F,RoxyShadbalaTable:()=>se,RoxySynastryChart:()=>oe,RoxyTarotCard:()=>W,RoxyTarotSpread:()=>J,RoxyTransitsTable:()=>ie,RoxyVedicKundli:()=>X,RoxyYogaList:()=>Z});var Ce=globalThis,Ee=Ce.ShadowRoot&&(Ce.ShadyCSS===void 0||Ce.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Be=Symbol(),mr=new WeakMap,ye=class{constructor(a,e,r){if(this._$cssResult$=!0,r!==Be)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(Ee&&a===void 0){let r=e!==void 0&&e.length===1;r&&(a=mr.get(e)),a===void 0&&((this.o=a=new CSSStyleSheet).replaceSync(this.cssText),r&&mr.set(e,a))}return a}toString(){return this.cssText}},hr=i=>new ye(typeof i=="string"?i:i+"",void 0,Be),x=(i,...a)=>{let e=i.length===1?i[0]:a.reduce((r,s,o)=>r+(l=>{if(l._$cssResult$===!0)return l.cssText;if(typeof l=="number")return l;throw Error("Value passed to 'css' function must be a 'css' function result: "+l+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(s)+i[o+1],i[0]);return new ye(e,i,Be)},gr=(i,a)=>{if(Ee)i.adoptedStyleSheets=a.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of a){let r=document.createElement("style"),s=Ce.litNonce;s!==void 0&&r.setAttribute("nonce",s),r.textContent=e.cssText,i.appendChild(r)}},qe=Ee?i=>i:i=>i instanceof CSSStyleSheet?(a=>{let e="";for(let r of a.cssRules)e+=r.cssText;return hr(e)})(i):i;var{is:Ur,defineProperty:Yr,getOwnPropertyDescriptor:Kr,getOwnPropertyNames:Vr,getOwnPropertySymbols:Fr,getPrototypeOf:Wr}=Object,Re=globalThis,yr=Re.trustedTypes,Jr=yr?yr.emptyScript:"",Xr=Re.reactiveElementPolyfillSupport,ue=(i,a)=>i,xe={toAttribute(i,a){switch(a){case Boolean:i=i?Jr:null;break;case Object:case Array:i=i==null?i:JSON.stringify(i)}return i},fromAttribute(i,a){let e=i;switch(a){case Boolean:e=i!==null;break;case Number:e=i===null?null:Number(i);break;case Object:case Array:try{e=JSON.parse(i)}catch{e=null}}return e}},Pe=(i,a)=>!Ur(i,a),ur={attribute:!0,type:String,converter:xe,reflect:!1,useDefault:!1,hasChanged:Pe};Symbol.metadata??=Symbol("metadata"),Re.litPropertyMetadata??=new WeakMap;var N=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=ur){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(),s=this.getPropertyDescriptor(a,r,e);s!==void 0&&Yr(this.prototype,a,s)}}static getPropertyDescriptor(a,e,r){let{get:s,set:o}=Kr(this.prototype,a)??{get(){return this[e]},set(l){this[e]=l}};return{get:s,set(l){let d=s?.call(this);o?.call(this,l),this.requestUpdate(a,d,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(a){return this.elementProperties.get(a)??ur}static _$Ei(){if(this.hasOwnProperty(ue("elementProperties")))return;let a=Wr(this);a.finalize(),a.l!==void 0&&(this.l=[...a.l]),this.elementProperties=new Map(a.elementProperties)}static finalize(){if(this.hasOwnProperty(ue("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(ue("properties"))){let e=this.properties,r=[...Vr(e),...Fr(e)];for(let s of r)this.createProperty(s,e[s])}let a=this[Symbol.metadata];if(a!==null){let e=litPropertyMetadata.get(a);if(e!==void 0)for(let[r,s]of e)this.elementProperties.set(r,s)}this._$Eh=new Map;for(let[e,r]of this.elementProperties){let s=this._$Eu(e,r);s!==void 0&&this._$Eh.set(s,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 s of r)e.unshift(qe(s))}else a!==void 0&&e.push(qe(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 gr(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),s=this.constructor._$Eu(a,r);if(s!==void 0&&r.reflect===!0){let o=(r.converter?.toAttribute!==void 0?r.converter:xe).toAttribute(e,r.type);this._$Em=a,o==null?this.removeAttribute(s):this.setAttribute(s,o),this._$Em=null}}_$AK(a,e){let r=this.constructor,s=r._$Eh.get(a);if(s!==void 0&&this._$Em!==s){let o=r.getPropertyOptions(s),l=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:xe;this._$Em=s;let d=l.fromAttribute(e,o.type);this[s]=d??this._$Ej?.get(s)??d,this._$Em=null}}requestUpdate(a,e,r,s=!1,o){if(a!==void 0){let l=this.constructor;if(s===!1&&(o=this[a]),r??=l.getPropertyOptions(a),!((r.hasChanged??Pe)(o,e)||r.useDefault&&r.reflect&&o===this._$Ej?.get(a)&&!this.hasAttribute(l._$Eu(a,r))))return;this.C(a,e,r)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(a,e,{useDefault:r,reflect:s,wrapped:o},l){r&&!(this._$Ej??=new Map).has(a)&&(this._$Ej.set(a,l??e??this[a]),o!==!0||l!==void 0)||(this._$AL.has(a)||(this.hasUpdated||r||(e=void 0),this._$AL.set(a,e)),s===!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[s,o]of this._$Ep)this[s]=o;this._$Ep=void 0}let r=this.constructor.elementProperties;if(r.size>0)for(let[s,o]of r){let{wrapped:l}=o,d=this[s];l!==!0||this._$AL.has(s)||d===void 0||this.C(s,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){}};N.elementStyles=[],N.shadowRootOptions={mode:"open"},N[ue("elementProperties")]=new Map,N[ue("finalized")]=new Map,Xr?.({ReactiveElement:N}),(Re.reactiveElementVersions??=[]).push("2.1.2");var Je=globalThis,xr=i=>i,Te=Je.trustedTypes,fr=Te?Te.createPolicy("lit-html",{createHTML:i=>i}):void 0,Sr="$lit$",Q=`lit$${Math.random().toFixed(9).slice(2)}$`,Ar="?"+Q,Zr=`<${Ar}>`,de=document,ve=()=>de.createComment(""),be=i=>i===null||typeof i!="object"&&typeof i!="function",Xe=Array.isArray,Qr=i=>Xe(i)||typeof i?.[Symbol.iterator]=="function",Ue=`[
2
- \f\r]`,fe=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,vr=/-->/g,br=/>/g,ne=RegExp(`>|${Ue}(?:([^\\s"'>=/]+)(${Ue}*=${Ue}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),$r=/'/g,wr=/"/g,Cr=/^(?:script|style|textarea|title)$/i,Ze=i=>(a,...e)=>({_$litType$:i,strings:a,values:e}),t=Ze(1),S=Ze(2),_t=Ze(3),ce=Symbol.for("lit-noChange"),n=Symbol.for("lit-nothing"),kr=new WeakMap,le=de.createTreeWalker(de,129);function Er(i,a){if(!Xe(i)||!i.hasOwnProperty("raw"))throw Error("invalid template strings array");return fr!==void 0?fr.createHTML(a):a}var et=(i,a)=>{let e=i.length-1,r=[],s,o=a===2?"<svg>":a===3?"<math>":"",l=fe;for(let d=0;d<e;d++){let c=i[d],m,h,g=-1,f=0;for(;f<c.length&&(l.lastIndex=f,h=l.exec(c),h!==null);)f=l.lastIndex,l===fe?h[1]==="!--"?l=vr:h[1]!==void 0?l=br:h[2]!==void 0?(Cr.test(h[2])&&(s=RegExp("</"+h[2],"g")),l=ne):h[3]!==void 0&&(l=ne):l===ne?h[0]===">"?(l=s??fe,g=-1):h[1]===void 0?g=-2:(g=l.lastIndex-h[2].length,m=h[1],l=h[3]===void 0?ne:h[3]==='"'?wr:$r):l===wr||l===$r?l=ne:l===vr||l===br?l=fe:(l=ne,s=void 0);let k=l===ne&&i[d+1].startsWith("/>")?" ":"";o+=l===fe?c+Zr:g>=0?(r.push(m),c.slice(0,g)+Sr+c.slice(g)+Q+k):c+Q+(g===-2?d:k)}return[Er(i,o+(i[e]||"<?>")+(a===2?"</svg>":a===3?"</math>":"")),r]},$e=class i{constructor({strings:a,_$litType$:e},r){let s;this.parts=[];let o=0,l=0,d=a.length-1,c=this.parts,[m,h]=et(a,e);if(this.el=i.createElement(m,r),le.currentNode=this.el.content,e===2||e===3){let g=this.el.content.firstChild;g.replaceWith(...g.childNodes)}for(;(s=le.nextNode())!==null&&c.length<d;){if(s.nodeType===1){if(s.hasAttributes())for(let g of s.getAttributeNames())if(g.endsWith(Sr)){let f=h[l++],k=s.getAttribute(g).split(Q),$=/([.?@])?(.*)/.exec(f);c.push({type:1,index:o,name:$[2],strings:k,ctor:$[1]==="."?Ke:$[1]==="?"?Ve:$[1]==="@"?Fe:ge}),s.removeAttribute(g)}else g.startsWith(Q)&&(c.push({type:6,index:o}),s.removeAttribute(g));if(Cr.test(s.tagName)){let g=s.textContent.split(Q),f=g.length-1;if(f>0){s.textContent=Te?Te.emptyScript:"";for(let k=0;k<f;k++)s.append(g[k],ve()),le.nextNode(),c.push({type:2,index:++o});s.append(g[f],ve())}}}else if(s.nodeType===8)if(s.data===Ar)c.push({type:2,index:o});else{let g=-1;for(;(g=s.data.indexOf(Q,g+1))!==-1;)c.push({type:7,index:o}),g+=Q.length-1}o++}}static createElement(a,e){let r=de.createElement("template");return r.innerHTML=a,r}};function he(i,a,e=i,r){if(a===ce)return a;let s=r!==void 0?e._$Co?.[r]:e._$Cl,o=be(a)?void 0:a._$litDirective$;return s?.constructor!==o&&(s?._$AO?.(!1),o===void 0?s=void 0:(s=new o(i),s._$AT(i,e,r)),r!==void 0?(e._$Co??=[])[r]=s:e._$Cl=s),s!==void 0&&(a=he(i,s._$AS(i,a.values),s,r)),a}var Ye=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,s=(a?.creationScope??de).importNode(e,!0);le.currentNode=s;let o=le.nextNode(),l=0,d=0,c=r[0];for(;c!==void 0;){if(l===c.index){let m;c.type===2?m=new we(o,o.nextSibling,this,a):c.type===1?m=new c.ctor(o,c.name,c.strings,this,a):c.type===6&&(m=new We(o,this,a)),this._$AV.push(m),c=r[++d]}l!==c?.index&&(o=le.nextNode(),l++)}return le.currentNode=de,s}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++}},we=class i{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(a,e,r,s){this.type=2,this._$AH=n,this._$AN=void 0,this._$AA=a,this._$AB=e,this._$AM=r,this.options=s,this._$Cv=s?.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=he(this,a,e),be(a)?a===n||a==null||a===""?(this._$AH!==n&&this._$AR(),this._$AH=n):a!==this._$AH&&a!==ce&&this._(a):a._$litType$!==void 0?this.$(a):a.nodeType!==void 0?this.T(a):Qr(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!==n&&be(this._$AH)?this._$AA.nextSibling.data=a:this.T(de.createTextNode(a)),this._$AH=a}$(a){let{values:e,_$litType$:r}=a,s=typeof r=="number"?this._$AC(a):(r.el===void 0&&(r.el=$e.createElement(Er(r.h,r.h[0]),this.options)),r);if(this._$AH?._$AD===s)this._$AH.p(e);else{let o=new Ye(s,this),l=o.u(this.options);o.p(e),this.T(l),this._$AH=o}}_$AC(a){let e=kr.get(a.strings);return e===void 0&&kr.set(a.strings,e=new $e(a)),e}k(a){Xe(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,r,s=0;for(let o of a)s===e.length?e.push(r=new i(this.O(ve()),this.O(ve()),this,this.options)):r=e[s],r._$AI(o),s++;s<e.length&&(this._$AR(r&&r._$AB.nextSibling,s),e.length=s)}_$AR(a=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);a!==this._$AB;){let r=xr(a).nextSibling;xr(a).remove(),a=r}}setConnected(a){this._$AM===void 0&&(this._$Cv=a,this._$AP?.(a))}},ge=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(a,e,r,s,o){this.type=1,this._$AH=n,this._$AN=void 0,this.element=a,this.name=e,this._$AM=s,this.options=o,r.length>2||r[0]!==""||r[1]!==""?(this._$AH=Array(r.length-1).fill(new String),this.strings=r):this._$AH=n}_$AI(a,e=this,r,s){let o=this.strings,l=!1;if(o===void 0)a=he(this,a,e,0),l=!be(a)||a!==this._$AH&&a!==ce,l&&(this._$AH=a);else{let d=a,c,m;for(a=o[0],c=0;c<o.length-1;c++)m=he(this,d[r+c],e,c),m===ce&&(m=this._$AH[c]),l||=!be(m)||m!==this._$AH[c],m===n?a=n:a!==n&&(a+=(m??"")+o[c+1]),this._$AH[c]=m}l&&!s&&this.j(a)}j(a){a===n?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,a??"")}},Ke=class extends ge{constructor(){super(...arguments),this.type=3}j(a){this.element[this.name]=a===n?void 0:a}},Ve=class extends ge{constructor(){super(...arguments),this.type=4}j(a){this.element.toggleAttribute(this.name,!!a&&a!==n)}},Fe=class extends ge{constructor(a,e,r,s,o){super(a,e,r,s,o),this.type=5}_$AI(a,e=this){if((a=he(this,a,e,0)??n)===ce)return;let r=this._$AH,s=a===n&&r!==n||a.capture!==r.capture||a.once!==r.once||a.passive!==r.passive,o=a!==n&&(r===n||s);s&&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)}},We=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){he(this,a)}};var rt=Je.litHtmlPolyfillSupport;rt?.($e,we),(Je.litHtmlVersions??=[]).push("3.3.2");var Rr=(i,a,e)=>{let r=e?.renderBefore??a,s=r._$litPart$;if(s===void 0){let o=e?.renderBefore??null;r._$litPart$=s=new we(a.insertBefore(ve(),o),o,void 0,e??{})}return s._$AI(i),s};var Qe=globalThis,u=class extends N{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=Rr(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return ce}};u._$litElement$=!0,u.finalized=!0,Qe.litElementHydrateSupport?.({LitElement:u});var tt=Qe.litElementPolyfillSupport;tt?.({LitElement:u});(Qe.litElementVersions??=[]).push("4.2.2");var v=i=>(a,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(i,a)}):customElements.define(i,a)};var at={attribute:!0,type:String,converter:xe,reflect:!1,hasChanged:Pe},st=(i=at,a,e)=>{let{kind:r,metadata:s}=e,o=globalThis.litPropertyMetadata.get(s);if(o===void 0&&globalThis.litPropertyMetadata.set(s,o=new Map),r==="setter"&&((i=Object.create(i)).wrapped=!0),o.set(e.name,i),r==="accessor"){let{name:l}=e;return{set(d){let c=a.get.call(this);a.set.call(this,d),this.requestUpdate(l,c,i,!0,d)},init(d){return d!==void 0&&this.C(l,void 0,i,d),d}}}if(r==="setter"){let{name:l}=e;return function(d){let c=this[l];a.call(this,d),this.requestUpdate(l,c,i,!0,d)}}throw Error("Unsupported decorator location: "+r)};function y(i){return(a,e)=>typeof e=="object"?st(i,a,e):((r,s,o)=>{let l=s.hasOwnProperty(o);return s.constructor.createProperty(o,r),l?Object.getOwnPropertyDescriptor(s,o):void 0})(i,a,e)}function E(i){return y({...i,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"},er={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"},z={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},rr={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},pe=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],_e=pe.map(i=>i.toLowerCase());var tr={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"},Pr={"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 b=x`
1
+ "use strict";var RoxyUI=(()=>{var De=Object.defineProperty;var kr=Object.getOwnPropertyDescriptor;var Qr=Object.getOwnPropertyNames;var et=Object.prototype.hasOwnProperty;var rt=(i,s)=>{for(var e in s)De(i,e,{get:s[e],enumerable:!0})},tt=(i,s,e,r)=>{if(s&&typeof s=="object"||typeof s=="function")for(let a of Qr(s))!et.call(i,a)&&a!==e&&De(i,a,{get:()=>s[a],enumerable:!(r=kr(s,a))||r.enumerable});return i};var at=i=>tt(De({},"__esModule",{value:!0}),i),p=(i,s,e,r)=>{for(var a=r>1?void 0:r?kr(s,e):s,o=i.length-1,l;o>=0;o--)(l=i[o])&&(a=(r?l(s,e,a):l(a))||a);return r&&a&&De(s,e,a),a};var Ut={};rt(Ut,{ROXY_COMPONENTS:()=>Qe,ROXY_UI_COMPONENTS:()=>Kt,ROXY_UI_VERSION:()=>Zr,RoxyAshtakavargaGrid:()=>O,RoxyBiorhythmChart:()=>H,RoxyChoghadiyaGrid:()=>ae,RoxyCompatibilityCard:()=>j,RoxyDashaTimeline:()=>I,RoxyData:()=>B,RoxyDivisionalChart:()=>q,RoxyDoshaCard:()=>K,RoxyEndpointForm:()=>z,RoxyGunaMilan:()=>oe,RoxyHexagram:()=>U,RoxyHoroscopeCard:()=>Y,RoxyKpChart:()=>F,RoxyKpPlanetsTable:()=>ie,RoxyKpRulingPlanets:()=>ne,RoxyLocationSearch:()=>R,RoxyMoonPhase:()=>V,RoxyNakshatraCard:()=>le,RoxyNatalChart:()=>M,RoxyNumerologyCard:()=>W,RoxyPanchangTable:()=>J,RoxyShadbalaTable:()=>de,RoxySynastryChart:()=>ce,RoxyTarotCard:()=>X,RoxyTarotSpread:()=>Z,RoxyTransitsTable:()=>pe,RoxyVedicKundli:()=>Q,RoxyVedicPlanetsTable:()=>me,RoxyWesternPlanetsTable:()=>he,RoxyYogaList:()=>ee});var Oe=globalThis,He=Oe.ShadowRoot&&(Oe.ShadyCSS===void 0||Oe.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,er=Symbol(),Sr=new WeakMap,ke=class{constructor(s,e,r){if(this._$cssResult$=!0,r!==er)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=s,this.t=e}get styleSheet(){let s=this.o,e=this.t;if(He&&s===void 0){let r=e!==void 0&&e.length===1;r&&(s=Sr.get(e)),s===void 0&&((this.o=s=new CSSStyleSheet).replaceSync(this.cssText),r&&Sr.set(e,s))}return s}toString(){return this.cssText}},Ar=i=>new ke(typeof i=="string"?i:i+"",void 0,er),x=(i,...s)=>{let e=i.length===1?i[0]:s.reduce((r,a,o)=>r+(l=>{if(l._$cssResult$===!0)return l.cssText;if(typeof l=="number")return l;throw Error("Value passed to 'css' function must be a 'css' function result: "+l+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(a)+i[o+1],i[0]);return new ke(e,i,er)},Er=(i,s)=>{if(He)i.adoptedStyleSheets=s.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of s){let r=document.createElement("style"),a=Oe.litNonce;a!==void 0&&r.setAttribute("nonce",a),r.textContent=e.cssText,i.appendChild(r)}},rr=He?i=>i:i=>i instanceof CSSStyleSheet?(s=>{let e="";for(let r of s.cssRules)e+=r.cssText;return Ar(e)})(i):i;var{is:st,defineProperty:ot,getOwnPropertyDescriptor:it,getOwnPropertyNames:nt,getOwnPropertySymbols:lt,getPrototypeOf:dt}=Object,Ge=globalThis,Lr=Ge.trustedTypes,ct=Lr?Lr.emptyScript:"",pt=Ge.reactiveElementPolyfillSupport,Se=(i,s)=>i,Ae={toAttribute(i,s){switch(s){case Boolean:i=i?ct:null;break;case Object:case Array:i=i==null?i:JSON.stringify(i)}return i},fromAttribute(i,s){let e=i;switch(s){case Boolean:e=i!==null;break;case Number:e=i===null?null:Number(i);break;case Object:case Array:try{e=JSON.parse(i)}catch{e=null}}return e}},je=(i,s)=>!st(i,s),Pr={attribute:!0,type:String,converter:Ae,reflect:!1,useDefault:!1,hasChanged:je};Symbol.metadata??=Symbol("metadata"),Ge.litPropertyMetadata??=new WeakMap;var D=class extends HTMLElement{static addInitializer(s){this._$Ei(),(this.l??=[]).push(s)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(s,e=Pr){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(s)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(s,e),!e.noAccessor){let r=Symbol(),a=this.getPropertyDescriptor(s,r,e);a!==void 0&&ot(this.prototype,s,a)}}static getPropertyDescriptor(s,e,r){let{get:a,set:o}=it(this.prototype,s)??{get(){return this[e]},set(l){this[e]=l}};return{get:a,set(l){let d=a?.call(this);o?.call(this,l),this.requestUpdate(s,d,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(s){return this.elementProperties.get(s)??Pr}static _$Ei(){if(this.hasOwnProperty(Se("elementProperties")))return;let s=dt(this);s.finalize(),s.l!==void 0&&(this.l=[...s.l]),this.elementProperties=new Map(s.elementProperties)}static finalize(){if(this.hasOwnProperty(Se("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(Se("properties"))){let e=this.properties,r=[...nt(e),...lt(e)];for(let a of r)this.createProperty(a,e[a])}let s=this[Symbol.metadata];if(s!==null){let e=litPropertyMetadata.get(s);if(e!==void 0)for(let[r,a]of e)this.elementProperties.set(r,a)}this._$Eh=new Map;for(let[e,r]of this.elementProperties){let a=this._$Eu(e,r);a!==void 0&&this._$Eh.set(a,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){let e=[];if(Array.isArray(s)){let r=new Set(s.flat(1/0).reverse());for(let a of r)e.unshift(rr(a))}else s!==void 0&&e.push(rr(s));return e}static _$Eu(s,e){let r=e.attribute;return r===!1?void 0:typeof r=="string"?r:typeof s=="string"?s.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(s=>this.enableUpdating=s),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(s=>s(this))}addController(s){(this._$EO??=new Set).add(s),this.renderRoot!==void 0&&this.isConnected&&s.hostConnected?.()}removeController(s){this._$EO?.delete(s)}_$E_(){let s=new Map,e=this.constructor.elementProperties;for(let r of e.keys())this.hasOwnProperty(r)&&(s.set(r,this[r]),delete this[r]);s.size>0&&(this._$Ep=s)}createRenderRoot(){let s=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Er(s,this.constructor.elementStyles),s}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(s=>s.hostConnected?.())}enableUpdating(s){}disconnectedCallback(){this._$EO?.forEach(s=>s.hostDisconnected?.())}attributeChangedCallback(s,e,r){this._$AK(s,r)}_$ET(s,e){let r=this.constructor.elementProperties.get(s),a=this.constructor._$Eu(s,r);if(a!==void 0&&r.reflect===!0){let o=(r.converter?.toAttribute!==void 0?r.converter:Ae).toAttribute(e,r.type);this._$Em=s,o==null?this.removeAttribute(a):this.setAttribute(a,o),this._$Em=null}}_$AK(s,e){let r=this.constructor,a=r._$Eh.get(s);if(a!==void 0&&this._$Em!==a){let o=r.getPropertyOptions(a),l=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:Ae;this._$Em=a;let d=l.fromAttribute(e,o.type);this[a]=d??this._$Ej?.get(a)??d,this._$Em=null}}requestUpdate(s,e,r,a=!1,o){if(s!==void 0){let l=this.constructor;if(a===!1&&(o=this[s]),r??=l.getPropertyOptions(s),!((r.hasChanged??je)(o,e)||r.useDefault&&r.reflect&&o===this._$Ej?.get(s)&&!this.hasAttribute(l._$Eu(s,r))))return;this.C(s,e,r)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(s,e,{useDefault:r,reflect:a,wrapped:o},l){r&&!(this._$Ej??=new Map).has(s)&&(this._$Ej.set(s,l??e??this[s]),o!==!0||l!==void 0)||(this._$AL.has(s)||(this.hasUpdated||r||(e=void 0),this._$AL.set(s,e)),a===!0&&this._$Em!==s&&(this._$Eq??=new Set).add(s))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let s=this.scheduleUpdate();return s!=null&&await s,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[a,o]of this._$Ep)this[a]=o;this._$Ep=void 0}let r=this.constructor.elementProperties;if(r.size>0)for(let[a,o]of r){let{wrapped:l}=o,d=this[a];l!==!0||this._$AL.has(a)||d===void 0||this.C(a,void 0,o,d)}}let s=!1,e=this._$AL;try{s=this.shouldUpdate(e),s?(this.willUpdate(e),this._$EO?.forEach(r=>r.hostUpdate?.()),this.update(e)):this._$EM()}catch(r){throw s=!1,this._$EM(),r}s&&this._$AE(e)}willUpdate(s){}_$AE(s){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(s)),this.updated(s)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(s){return!0}update(s){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(s){}firstUpdated(s){}};D.elementStyles=[],D.shadowRootOptions={mode:"open"},D[Se("elementProperties")]=new Map,D[Se("finalized")]=new Map,pt?.({ReactiveElement:D}),(Ge.reactiveElementVersions??=[]).push("2.1.2");var lr=globalThis,Cr=i=>i,Ie=lr.trustedTypes,Tr=Ie?Ie.createPolicy("lit-html",{createHTML:i=>i}):void 0,Dr="$lit$",re=`lit$${Math.random().toFixed(9).slice(2)}$`,Or="?"+re,mt=`<${Or}>`,ue=document,Le=()=>ue.createComment(""),Pe=i=>i===null||typeof i!="object"&&typeof i!="function",dr=Array.isArray,ht=i=>dr(i)||typeof i?.[Symbol.iterator]=="function",tr=`[
2
+ \f\r]`,Ee=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Rr=/-->/g,zr=/>/g,ge=RegExp(`>|${tr}(?:([^\\s"'>=/]+)(${tr}*=${tr}*(?:[^
3
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),Nr=/'/g,_r=/"/g,Hr=/^(?:script|style|textarea|title)$/i,cr=i=>(s,...e)=>({_$litType$:i,strings:s,values:e}),t=cr(1),S=cr(2),Xt=cr(3),xe=Symbol.for("lit-noChange"),n=Symbol.for("lit-nothing"),Mr=new WeakMap,ye=ue.createTreeWalker(ue,129);function Gr(i,s){if(!dr(i)||!i.hasOwnProperty("raw"))throw Error("invalid template strings array");return Tr!==void 0?Tr.createHTML(s):s}var gt=(i,s)=>{let e=i.length-1,r=[],a,o=s===2?"<svg>":s===3?"<math>":"",l=Ee;for(let d=0;d<e;d++){let c=i[d],m,y,h=-1,b=0;for(;b<c.length&&(l.lastIndex=b,y=l.exec(c),y!==null);)b=l.lastIndex,l===Ee?y[1]==="!--"?l=Rr:y[1]!==void 0?l=zr:y[2]!==void 0?(Hr.test(y[2])&&(a=RegExp("</"+y[2],"g")),l=ge):y[3]!==void 0&&(l=ge):l===ge?y[0]===">"?(l=a??Ee,h=-1):y[1]===void 0?h=-2:(h=l.lastIndex-y[2].length,m=y[1],l=y[3]===void 0?ge:y[3]==='"'?_r:Nr):l===_r||l===Nr?l=ge:l===Rr||l===zr?l=Ee:(l=ge,a=void 0);let E=l===ge&&i[d+1].startsWith("/>")?" ":"";o+=l===Ee?c+mt:h>=0?(r.push(m),c.slice(0,h)+Dr+c.slice(h)+re+E):c+re+(h===-2?d:E)}return[Gr(i,o+(i[e]||"<?>")+(s===2?"</svg>":s===3?"</math>":"")),r]},Ce=class i{constructor({strings:s,_$litType$:e},r){let a;this.parts=[];let o=0,l=0,d=s.length-1,c=this.parts,[m,y]=gt(s,e);if(this.el=i.createElement(m,r),ye.currentNode=this.el.content,e===2||e===3){let h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(a=ye.nextNode())!==null&&c.length<d;){if(a.nodeType===1){if(a.hasAttributes())for(let h of a.getAttributeNames())if(h.endsWith(Dr)){let b=y[l++],E=a.getAttribute(h).split(re),$=/([.?@])?(.*)/.exec(b);c.push({type:1,index:o,name:$[2],strings:E,ctor:$[1]==="."?sr:$[1]==="?"?or:$[1]==="@"?ir:$e}),a.removeAttribute(h)}else h.startsWith(re)&&(c.push({type:6,index:o}),a.removeAttribute(h));if(Hr.test(a.tagName)){let h=a.textContent.split(re),b=h.length-1;if(b>0){a.textContent=Ie?Ie.emptyScript:"";for(let E=0;E<b;E++)a.append(h[E],Le()),ye.nextNode(),c.push({type:2,index:++o});a.append(h[b],Le())}}}else if(a.nodeType===8)if(a.data===Or)c.push({type:2,index:o});else{let h=-1;for(;(h=a.data.indexOf(re,h+1))!==-1;)c.push({type:7,index:o}),h+=re.length-1}o++}}static createElement(s,e){let r=ue.createElement("template");return r.innerHTML=s,r}};function be(i,s,e=i,r){if(s===xe)return s;let a=r!==void 0?e._$Co?.[r]:e._$Cl,o=Pe(s)?void 0:s._$litDirective$;return a?.constructor!==o&&(a?._$AO?.(!1),o===void 0?a=void 0:(a=new o(i),a._$AT(i,e,r)),r!==void 0?(e._$Co??=[])[r]=a:e._$Cl=a),a!==void 0&&(s=be(i,a._$AS(i,s.values),a,r)),s}var ar=class{constructor(s,e){this._$AV=[],this._$AN=void 0,this._$AD=s,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(s){let{el:{content:e},parts:r}=this._$AD,a=(s?.creationScope??ue).importNode(e,!0);ye.currentNode=a;let o=ye.nextNode(),l=0,d=0,c=r[0];for(;c!==void 0;){if(l===c.index){let m;c.type===2?m=new Te(o,o.nextSibling,this,s):c.type===1?m=new c.ctor(o,c.name,c.strings,this,s):c.type===6&&(m=new nr(o,this,s)),this._$AV.push(m),c=r[++d]}l!==c?.index&&(o=ye.nextNode(),l++)}return ye.currentNode=ue,a}p(s){let e=0;for(let r of this._$AV)r!==void 0&&(r.strings!==void 0?(r._$AI(s,r,e),e+=r.strings.length-2):r._$AI(s[e])),e++}},Te=class i{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(s,e,r,a){this.type=2,this._$AH=n,this._$AN=void 0,this._$AA=s,this._$AB=e,this._$AM=r,this.options=a,this._$Cv=a?.isConnected??!0}get parentNode(){let s=this._$AA.parentNode,e=this._$AM;return e!==void 0&&s?.nodeType===11&&(s=e.parentNode),s}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(s,e=this){s=be(this,s,e),Pe(s)?s===n||s==null||s===""?(this._$AH!==n&&this._$AR(),this._$AH=n):s!==this._$AH&&s!==xe&&this._(s):s._$litType$!==void 0?this.$(s):s.nodeType!==void 0?this.T(s):ht(s)?this.k(s):this._(s)}O(s){return this._$AA.parentNode.insertBefore(s,this._$AB)}T(s){this._$AH!==s&&(this._$AR(),this._$AH=this.O(s))}_(s){this._$AH!==n&&Pe(this._$AH)?this._$AA.nextSibling.data=s:this.T(ue.createTextNode(s)),this._$AH=s}$(s){let{values:e,_$litType$:r}=s,a=typeof r=="number"?this._$AC(s):(r.el===void 0&&(r.el=Ce.createElement(Gr(r.h,r.h[0]),this.options)),r);if(this._$AH?._$AD===a)this._$AH.p(e);else{let o=new ar(a,this),l=o.u(this.options);o.p(e),this.T(l),this._$AH=o}}_$AC(s){let e=Mr.get(s.strings);return e===void 0&&Mr.set(s.strings,e=new Ce(s)),e}k(s){dr(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,r,a=0;for(let o of s)a===e.length?e.push(r=new i(this.O(Le()),this.O(Le()),this,this.options)):r=e[a],r._$AI(o),a++;a<e.length&&(this._$AR(r&&r._$AB.nextSibling,a),e.length=a)}_$AR(s=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);s!==this._$AB;){let r=Cr(s).nextSibling;Cr(s).remove(),s=r}}setConnected(s){this._$AM===void 0&&(this._$Cv=s,this._$AP?.(s))}},$e=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(s,e,r,a,o){this.type=1,this._$AH=n,this._$AN=void 0,this.element=s,this.name=e,this._$AM=a,this.options=o,r.length>2||r[0]!==""||r[1]!==""?(this._$AH=Array(r.length-1).fill(new String),this.strings=r):this._$AH=n}_$AI(s,e=this,r,a){let o=this.strings,l=!1;if(o===void 0)s=be(this,s,e,0),l=!Pe(s)||s!==this._$AH&&s!==xe,l&&(this._$AH=s);else{let d=s,c,m;for(s=o[0],c=0;c<o.length-1;c++)m=be(this,d[r+c],e,c),m===xe&&(m=this._$AH[c]),l||=!Pe(m)||m!==this._$AH[c],m===n?s=n:s!==n&&(s+=(m??"")+o[c+1]),this._$AH[c]=m}l&&!a&&this.j(s)}j(s){s===n?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,s??"")}},sr=class extends $e{constructor(){super(...arguments),this.type=3}j(s){this.element[this.name]=s===n?void 0:s}},or=class extends $e{constructor(){super(...arguments),this.type=4}j(s){this.element.toggleAttribute(this.name,!!s&&s!==n)}},ir=class extends $e{constructor(s,e,r,a,o){super(s,e,r,a,o),this.type=5}_$AI(s,e=this){if((s=be(this,s,e,0)??n)===xe)return;let r=this._$AH,a=s===n&&r!==n||s.capture!==r.capture||s.once!==r.once||s.passive!==r.passive,o=s!==n&&(r===n||a);a&&this.element.removeEventListener(this.name,this,r),o&&this.element.addEventListener(this.name,this,s),this._$AH=s}handleEvent(s){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,s):this._$AH.handleEvent(s)}},nr=class{constructor(s,e,r){this.element=s,this.type=6,this._$AN=void 0,this._$AM=e,this.options=r}get _$AU(){return this._$AM._$AU}_$AI(s){be(this,s)}};var yt=lr.litHtmlPolyfillSupport;yt?.(Ce,Te),(lr.litHtmlVersions??=[]).push("3.3.2");var jr=(i,s,e)=>{let r=e?.renderBefore??s,a=r._$litPart$;if(a===void 0){let o=e?.renderBefore??null;r._$litPart$=a=new Te(s.insertBefore(Le(),o),o,void 0,e??{})}return a._$AI(i),a};var pr=globalThis,u=class extends D{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let s=super.createRenderRoot();return this.renderOptions.renderBefore??=s.firstChild,s}update(s){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(s),this._$Do=jr(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return xe}};u._$litElement$=!0,u.finalized=!0,pr.litElementHydrateSupport?.({LitElement:u});var ut=pr.litElementPolyfillSupport;ut?.({LitElement:u});(pr.litElementVersions??=[]).push("4.2.2");var f=i=>(s,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(i,s)}):customElements.define(i,s)};var xt={attribute:!0,type:String,converter:Ae,reflect:!1,hasChanged:je},ft=(i=xt,s,e)=>{let{kind:r,metadata:a}=e,o=globalThis.litPropertyMetadata.get(a);if(o===void 0&&globalThis.litPropertyMetadata.set(a,o=new Map),r==="setter"&&((i=Object.create(i)).wrapped=!0),o.set(e.name,i),r==="accessor"){let{name:l}=e;return{set(d){let c=s.get.call(this);s.set.call(this,d),this.requestUpdate(l,c,i,!0,d)},init(d){return d!==void 0&&this.C(l,void 0,i,d),d}}}if(r==="setter"){let{name:l}=e;return function(d){let c=this[l];s.call(this,d),this.requestUpdate(l,c,i,!0,d)}}throw Error("Unsupported decorator location: "+r)};function g(i){return(s,e)=>typeof e=="object"?ft(i,s,e):((r,a,o)=>{let l=a.hasOwnProperty(o);return a.constructor.createProperty(o,r),l?Object.getOwnPropertyDescriptor(a,o):void 0})(i,s,e)}function C(i){return g({...i,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"},Ir={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"},N={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},qe={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"],Oa=_.map(i=>i.toLowerCase()),mr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},hr={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"},Br={"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`
4
4
  :host {
5
5
  display: block;
6
6
  container-type: inline-size;
@@ -82,7 +82,7 @@
82
82
  outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
83
83
  outline-offset: 2px;
84
84
  }
85
- `;var ot={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},me=["sarva","bhinna","pinda"],M=class extends u{constructor(){super(...arguments);this.data=null;this.activeTab="sarva"}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return t`<div class="wrap" aria-label="Ashtakavarga grid">
85
+ `;var vt={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},fe=["sarva","bhinna","pinda"],O=class extends u{constructor(){super(...arguments);this.data=null;this.activeTab="sarva"}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return t`<div class="wrap" aria-label="Ashtakavarga grid">
86
86
  <div class="head">
87
87
  <h2 class="title">Ashtakavarga</h2>
88
88
  ${e.length?t`<p class="subtitle">${e.length} signs</p>`:n}
@@ -94,7 +94,7 @@
94
94
  aria-label="Ashtakavarga views"
95
95
  @keydown=${this.onTabKeyDown}
96
96
  >
97
- ${me.map(r=>t`<button
97
+ ${fe.map(r=>t`<button
98
98
  class="tab"
99
99
  role="tab"
100
100
  id="tab-${r}"
@@ -103,7 +103,7 @@
103
103
  tabindex=${this.activeTab===r?"0":"-1"}
104
104
  @click=${()=>{this.activeTab=r}}
105
105
  >
106
- ${ot[r]}
106
+ ${vt[r]}
107
107
  </button>`)}
108
108
  </div>
109
109
 
@@ -114,7 +114,7 @@
114
114
  >
115
115
  ${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}
116
116
  </div>
117
- </div>`}onTabKeyDown(e){let r=me.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=me[(r+1)%me.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=me[(r-1+me.length)%me.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}heatClass(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"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?t`<div class="overflow-scroll">
117
+ </div>`}onTabKeyDown(e){let r=fe.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=fe[(r+1)%fe.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=fe[(r-1+fe.length)%fe.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}heatClass(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"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?t`<div class="overflow-scroll">
118
118
  <table aria-label="Sarvashtakavarga bindu counts per sign">
119
119
  <thead>
120
120
  <tr>
@@ -123,11 +123,11 @@
123
123
  </tr>
124
124
  </thead>
125
125
  <tbody>
126
- ${e.map((s,o)=>{let l=r.bindus[o]??0,d=this.heatClass(l);return t`<tr>
126
+ ${e.map((a,o)=>{let l=r.bindus[o]??0,d=this.heatClass(l);return t`<tr>
127
127
  <td>
128
128
  <div class="planet-cell">
129
- <span class="glyph" aria-hidden="true">${z[s]??""}</span>
130
- ${s}
129
+ <span class="glyph" aria-hidden="true">${N[a]??""}</span>
130
+ ${a}
131
131
  </div>
132
132
  </td>
133
133
  <td class="${`heat-cell ${d}`}">${l}</td>
@@ -145,15 +145,15 @@
145
145
  <thead>
146
146
  <tr>
147
147
  <th scope="col">Planet</th>
148
- ${e.map(s=>t`<th scope="col" title=${s}>${z[s]??s.slice(0,2)}</th>`)}
148
+ ${e.map(a=>t`<th scope="col" title=${a}>${N[a]??a.slice(0,2)}</th>`)}
149
149
  <th scope="col">Total</th>
150
150
  </tr>
151
151
  </thead>
152
152
  <tbody>
153
- ${r.map(s=>t`<tr>
154
- <td>${s.planet}</td>
155
- ${s.bindus.map(o=>{let l=this.heatClass(o);return t`<td class="${`heat-cell ${l}`}">${o}</td>`})}
156
- <td>${s.total}</td>
153
+ ${r.map(a=>t`<tr>
154
+ <td>${a.planet}</td>
155
+ ${a.bindus.map(o=>{let l=this.heatClass(o);return t`<td class="${`heat-cell ${l}`}">${o}</td>`})}
156
+ <td>${a.total}</td>
157
157
  </tr>`)}
158
158
  </tbody>
159
159
  </table>
@@ -176,7 +176,7 @@
176
176
  </tr>`)}
177
177
  </tbody>
178
178
  </table>
179
- </div>`:t`<p class="roxy-empty">No shodhya pinda data</p>`}};M.styles=[b,x`
179
+ </div>`:t`<p class="roxy-empty">No shodhya pinda data</p>`}};O.styles=[v,x`
180
180
  .wrap {
181
181
  display: grid;
182
182
  gap: var(--roxy-space-md, 1rem);
@@ -304,13 +304,13 @@
304
304
  .bhinna-table td:first-child {
305
305
  min-width: 5rem;
306
306
  }
307
- `],p([y({attribute:!1})],M.prototype,"data",2),p([E()],M.prototype,"activeTab",2),M=p([v("roxy-ashtakavarga-grid")],M);var Tr={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},D=class extends u{constructor(){super(...arguments);this.data=null;this.mode="daily"}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):t`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},s=Object.entries(r).map(([o,l])=>{let d=typeof l=="number"?l:0,c=Math.abs(d)>1?d/100:d;return[o,c]});return t`<section class="wrap" aria-label="Daily biorhythm">
307
+ `],p([g({attribute:!1})],O.prototype,"data",2),p([C()],O.prototype,"activeTab",2),O=p([f("roxy-ashtakavarga-grid")],O);var qr={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},H=class extends u{constructor(){super(...arguments);this.data=null;this.mode="daily"}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):t`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},a=Object.entries(r).map(([o,l])=>{let d=typeof l=="number"?l:0,c=Math.abs(d)>1?d/100:d;return[o,c]});return t`<section class="wrap" aria-label="Daily biorhythm">
308
308
  <header class="head">
309
309
  <h2 class="title">Biorhythm</h2>
310
310
  ${typeof e.energyRating=="number"?t`<span class="energy">Energy ${e.energyRating}/10</span>`:n}
311
311
  </header>
312
312
  <div class="bars" role="list">
313
- ${s.map(([o,l])=>{let d=(l+1)/2*100,c=Tr[o]??"var(--roxy-accent, #f59e0b)";return t`<div class="bar" role="listitem">
313
+ ${a.map(([o,l])=>{let d=(l+1)/2*100,c=qr[o]??"var(--roxy-accent, #f59e0b)";return t`<div class="bar" role="listitem">
314
314
  <span style="text-transform: capitalize">${o}</span>
315
315
  <span class="track">
316
316
  <span
@@ -323,13 +323,13 @@
323
323
  </div>
324
324
  ${e.dailyMessage?t`<p class="advice">${e.dailyMessage}</p>`:n}
325
325
  ${e.advice?t`<p class="advice">${e.advice}</p>`:n}
326
- </section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return t`<div class="roxy-empty" role="status">No forecast</div>`;let s=600,o=160,l=s/Math.max(r.length-1,1),d=["physical","emotional","intellectual","intuitive"];return t`<section class="wrap" aria-label="Biorhythm forecast">
326
+ </section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return t`<div class="roxy-empty" role="status">No forecast</div>`;let a=600,o=160,l=a/Math.max(r.length-1,1),d=["physical","emotional","intellectual","intuitive"];return t`<section class="wrap" aria-label="Biorhythm forecast">
327
327
  <header class="head">
328
328
  <h2 class="title">Forecast</h2>
329
329
  <span class="energy">${e.startDate} - ${e.endDate}</span>
330
330
  </header>
331
331
  <svg
332
- viewBox="0 0 ${s} ${o}"
332
+ viewBox="0 0 ${a} ${o}"
333
333
  role="img"
334
334
  aria-label="Biorhythm cycle lines across the forecast window"
335
335
  >
@@ -337,12 +337,12 @@
337
337
  <line
338
338
  x1="0"
339
339
  y1=${o/2}
340
- x2=${s}
340
+ x2=${a}
341
341
  y2=${o/2}
342
342
  stroke="var(--roxy-border, #e4e4e7)"
343
343
  stroke-width="1"
344
344
  />
345
- ${d.map(c=>{let m=r.map((g,f)=>{let k=g[c]??0,$=f*l,cr=o/2-k/100*(o/2-8);return`${$.toFixed(2)},${cr.toFixed(2)}`}).join(" "),h=Tr[c]??"#475569";return S`<polyline points=${m} fill="none" stroke=${h} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}
345
+ ${d.map(c=>{let m=r.map((h,b)=>{let E=h[c]??0,$=b*l,wr=o/2-E/100*(o/2-8);return`${$.toFixed(2)},${wr.toFixed(2)}`}).join(" "),y=qr[c]??"#475569";return S`<polyline points=${m} fill="none" stroke=${y} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}
346
346
  </svg>
347
347
  ${e.summary?.periodAdvice?t`<p class="advice">${e.summary.periodAdvice}</p>`:n}
348
348
  </section>`}renderCritical(e){return t`<section class="wrap" aria-label="Critical days">
@@ -355,7 +355,7 @@
355
355
  >${r.date} · ${r.cycle} ${r.severity}</span
356
356
  >`)}
357
357
  </div>
358
- </section>`}};D.styles=[b,x`
358
+ </section>`}};H.styles=[v,x`
359
359
  .wrap {
360
360
  display: grid;
361
361
  gap: var(--roxy-space-md, 1rem);
@@ -431,14 +431,14 @@
431
431
  display: inline-block;
432
432
  margin: 2px;
433
433
  }
434
- `],p([y({attribute:!1})],D.prototype,"data",2),p([y({type:String,reflect:!0})],D.prototype,"mode",2),D=p([v("roxy-biorhythm-chart")],D);function C(i){return i?i.charAt(0).toUpperCase()+i.slice(1).toLowerCase():""}function ee(i){return i.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}function Lr(i){try{let a=new Date(i);return Number.isNaN(a.getTime())?i:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return i}}var re=class extends u{constructor(){super(...arguments);this.data=null}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",s=L[C(e.lord)]??"",o=`${Lr(e.start)} - ${Lr(e.end)}`;return t`<div class="cho-tile ${r}" role="listitem">
434
+ `],p([g({attribute:!1})],H.prototype,"data",2),p([g({type:String,reflect:!0})],H.prototype,"mode",2),H=p([f("roxy-biorhythm-chart")],H);function A(i){return i?i.charAt(0).toUpperCase()+i.slice(1).toLowerCase():""}function te(i){return i.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,s=>s.toUpperCase())}function Kr(i){try{let s=new Date(i);return Number.isNaN(s.getTime())?i:s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return i}}var ae=class extends u{constructor(){super(...arguments);this.data=null}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",a=L[A(e.lord)]??"",o=`${Kr(e.start)} - ${Kr(e.end)}`;return t`<div class="cho-tile ${r}" role="listitem">
435
435
  <span class="tile-name">${e.name}</span>
436
436
  <span class="tile-time" aria-label="Time range">${o}</span>
437
437
  <span class="tile-lord">
438
- ${s?t`<span aria-hidden="true">${s}</span>`:n}
438
+ ${a?t`<span aria-hidden="true">${a}</span>`:n}
439
439
  ${e.lord}
440
440
  </span>
441
- </div>`}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:s}=this.data;return t`<div class="wrap">
441
+ </div>`}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:a}=this.data;return t`<div class="wrap">
442
442
  <div class="header">
443
443
  <h2 class="title">Choghadiya</h2>
444
444
  ${e?t`<p class="subtitle">${e}</p>`:n}
@@ -455,11 +455,11 @@
455
455
  <section class="period-col" aria-label="Night muhurta periods">
456
456
  <h3 class="period-heading">Night</h3>
457
457
  <div role="list" aria-label="Nighttime choghadiya">
458
- ${s&&s.length>0?s.map(o=>this.renderTile(o)):t`<p class="roxy-empty" role="status">No nighttime periods</p>`}
458
+ ${a&&a.length>0?a.map(o=>this.renderTile(o)):t`<p class="roxy-empty" role="status">No nighttime periods</p>`}
459
459
  </div>
460
460
  </section>
461
461
  </div>
462
- </div>`}};re.styles=[b,x`
462
+ </div>`}};ae.styles=[v,x`
463
463
  .wrap {
464
464
  display: grid;
465
465
  gap: var(--roxy-space-md, 1rem);
@@ -543,7 +543,7 @@
543
543
  align-items: center;
544
544
  gap: 0.25em;
545
545
  }
546
- `],p([y({attribute:!1})],re.prototype,"data",2),re=p([v("roxy-choghadiya-grid")],re);function O(i){if(typeof i!="string"||i.length===0||/^\d{4}-\d{2}-\d{2}$/.test(i))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(i)?`1970-01-01T${i}`:i,r=new Date(e);return Number.isNaN(r.getTime())?i:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function ze(i){if(typeof i!="string"||i.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(i)?`${i}T00:00:00`:i);return Number.isNaN(a.getTime())?i:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function ar(i){if(!i)return"";let a=O(i.start),e=O(i.end);return a&&e?`${a} - ${e}`:a||e||""}function w(i,a=1){return typeof i!="number"||!Number.isFinite(i)?"":i.toFixed(a).replace(/\.?0+$/,"")}function _r(i,a=1){let e=w(i,a);return e?`${e}%`:""}var Ne={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function ke(i){return(i.type??"").toLowerCase().replace(/_/g,"-")}var H=class extends u{constructor(){super(...arguments);this.data=null;this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[s,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(r[s]=o);return r}return{}}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,s=this.getBreakdown(),o="rating"in e?e.rating:void 0,l="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,h="strengths"in e?e.strengths:void 0,g="challenges"in e?e.challenges:void 0,f="keyAspects"in e?e.keyAspects:void 0;return t`<article
546
+ `],p([g({attribute:!1})],ae.prototype,"data",2),ae=p([f("roxy-choghadiya-grid")],ae);function G(i){if(typeof i!="string"||i.length===0||/^\d{4}-\d{2}-\d{2}$/.test(i))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(i)?`1970-01-01T${i}`:i,r=new Date(e);return Number.isNaN(r.getTime())?i:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Ke(i){if(typeof i!="string"||i.length===0)return"";let s=new Date(/^\d{4}-\d{2}-\d{2}$/.test(i)?`${i}T00:00:00`:i);return Number.isNaN(s.getTime())?i:s.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function gr(i){if(!i)return"";let s=G(i.start),e=G(i.end);return s&&e?`${s} - ${e}`:s||e||""}function w(i,s=1){return typeof i!="number"||!Number.isFinite(i)?"":i.toFixed(s).replace(/\.?0+$/,"")}function Ur(i,s=1){let e=w(i,s);return e?`${e}%`:""}var Re={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function we(i){return(i.type??"").toLowerCase().replace(/_/g,"-")}var j=class extends u{constructor(){super(...arguments);this.data=null;this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[a,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(r[a]=o);return r}return{}}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,a=this.getBreakdown(),o="rating"in e?e.rating:void 0,l="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,h="challenges"in e?e.challenges:void 0,b="keyAspects"in e?e.keyAspects:void 0;return t`<article
547
547
  class="card"
548
548
  aria-label=${`Compatibility (${this.mode})`}
549
549
  >
@@ -555,9 +555,9 @@
555
555
  </div>
556
556
  </div>
557
557
 
558
- ${Object.keys(s).length>0?t`<div role="list">
559
- ${Object.entries(s).map(([k,$])=>t`<div class="bar-row" role="listitem">
560
- <span style="text-transform: capitalize">${k}</span>
558
+ ${Object.keys(a).length>0?t`<div role="list">
559
+ ${Object.entries(a).map(([E,$])=>t`<div class="bar-row" role="listitem">
560
+ <span style="text-transform: capitalize">${E}</span>
561
561
  <span class="bar"
562
562
  ><span style="width: ${Math.max(0,Math.min(100,$))}%"></span
563
563
  ></span>
@@ -571,27 +571,27 @@
571
571
  ${c?t`<p>${c}</p>`:n}
572
572
  ${m&&!c?t`<p>${m}</p>`:n}
573
573
  ${d?t`<p>${d}</p>`:n}
574
- ${(h?.length??0)>0||(g?.length??0)>0?t`<div class="lists">
575
- ${h?.length?t`<div>
574
+ ${(y?.length??0)>0||(h?.length??0)>0?t`<div class="lists">
575
+ ${y?.length?t`<div>
576
576
  <h3>Strengths</h3>
577
577
  <ul>
578
- ${h.map(k=>t`<li>${k}</li>`)}
578
+ ${y.map(E=>t`<li>${E}</li>`)}
579
579
  </ul>
580
580
  </div>`:n}
581
- ${g?.length?t`<div>
581
+ ${h?.length?t`<div>
582
582
  <h3>Challenges</h3>
583
583
  <ul>
584
- ${g.map(k=>t`<li>${k}</li>`)}
584
+ ${h.map(E=>t`<li>${E}</li>`)}
585
585
  </ul>
586
586
  </div>`:n}
587
587
  </div>`:n}
588
- ${f?.length?t`<div>
588
+ ${b?.length?t`<div>
589
589
  <h3 style="margin: 0 0 0.25rem; font-size: var(--roxy-text-xs); color: var(--roxy-muted); text-transform: uppercase; letter-spacing: 0.06em;">Key aspects</h3>
590
590
  <ul style="margin: 0; padding-left: 1rem; font-size: var(--roxy-text-sm);">
591
- ${f.slice(0,6).map(k=>t`<li>${it(k)}</li>`)}
591
+ ${b.slice(0,6).map(E=>t`<li>${bt(E)}</li>`)}
592
592
  </ul>
593
593
  </div>`:n}
594
- </article>`}};H.styles=[b,x`
594
+ </article>`}};j.styles=[v,x`
595
595
  .card {
596
596
  background: var(--roxy-bg, #fff);
597
597
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -675,7 +675,7 @@
675
675
  margin: 0;
676
676
  padding-left: var(--roxy-space-md, 1rem);
677
677
  }
678
- `],p([y({attribute:!1})],H.prototype,"data",2),p([y({type:String,reflect:!0})],H.prototype,"mode",2),H=p([v("roxy-compatibility-card")],H);function it(i){let a=i.type.toLowerCase().replace(/_/g,"-"),e=typeof i.orb=="number"?` (orb ${w(i.orb,1)}\xB0)`:"",r=[i.planet1,a,i.planet2].filter(Boolean).join(" ");return i.description?`${r}${e} \xB7 ${i.description}`:`${r}${e}`}var G=class extends u{constructor(){super(...arguments);this.data=null;this.period="current"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),s=r.length?Math.max(...r.map(o=>o.durationYears)):0;return t`<div class="wrap" aria-label="Dasha timeline">
678
+ `],p([g({attribute:!1})],j.prototype,"data",2),p([g({type:String,reflect:!0})],j.prototype,"mode",2),j=p([f("roxy-compatibility-card")],j);function bt(i){let s=i.type.toLowerCase().replace(/_/g,"-"),e=typeof i.orb=="number"?` (orb ${w(i.orb,1)}\xB0)`:"",r=[i.planet1,s,i.planet2].filter(Boolean).join(" ");return i.description?`${r}${e} \xB7 ${i.description}`:`${r}${e}`}var I=class extends u{constructor(){super(...arguments);this.data=null;this.period="current"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),a=r.length?Math.max(...r.map(o=>o.durationYears)):0;return t`<div class="wrap" aria-label="Dasha timeline">
679
679
  <header class="head">
680
680
  <h2 class="title">
681
681
  ${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}
@@ -688,7 +688,7 @@
688
688
 
689
689
  ${this.period==="current"?this.renderCurrent(e):n}
690
690
  ${r.length>0?t`<div class="timeline" role="list">
691
- ${r.map(o=>this.renderBar(o,s))}
691
+ ${r.map(o=>this.renderBar(o,a))}
692
692
  </div>`:n}
693
693
  </div>`}renderCurrent(e){return"mahadasha"in e?t`<div class="current">
694
694
  ${"mahadasha"in e&&e.mahadasha?t`<div>
@@ -706,14 +706,14 @@
706
706
  <strong>${e.pratyantardasha.planet}</strong>
707
707
  ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?t`<small>${w(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:n}
708
708
  </div>`:n}
709
- </div>`:n}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}renderBar(e,r){let s=e.durationYears,o=r>0?s/r*100:0;return t`<div class="bar" role="listitem">
709
+ </div>`:n}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}renderBar(e,r){let a=e.durationYears,o=r>0?a/r*100:0;return t`<div class="bar" role="listitem">
710
710
  <span>${e.planet}</span>
711
711
  <span class="bar-track"><span style="width: ${o}%"></span></span>
712
712
  <span class="dates">
713
- ${e.startDate?zr(e.startDate):""}
714
- ${e.endDate?t`- ${zr(e.endDate)}`:""}
713
+ ${e.startDate?Yr(e.startDate):""}
714
+ ${e.endDate?t`- ${Yr(e.endDate)}`:""}
715
715
  </span>
716
- </div>`}};G.styles=[b,x`
716
+ </div>`}};I.styles=[v,x`
717
717
  .wrap {
718
718
  display: grid;
719
719
  gap: var(--roxy-space-md, 1rem);
@@ -788,7 +788,7 @@
788
788
  font-variant-numeric: tabular-nums;
789
789
  text-align: right;
790
790
  }
791
- `],p([y({attribute:!1})],G.prototype,"data",2),p([y({type:String,reflect:!0})],G.prototype,"period",2),G=p([v("roxy-dasha-timeline")],G);function zr(i){let a=i.match(/^(\d{4})/);return a?a[1]:i}var nt=["title","name","label","heading","overview","summary"],lt=["imageUrl","image","icon","symbol"],dt=["imageUrl","image"],ct=6,j=class extends u{constructor(){super(...arguments);this.data=null;this.depth=0}render(){return this.data==null?t`<div class="roxy-empty" role="status">No data</div>`:this.depth>=ct?t`<div class="roxy-empty" role="status">…</div>`:t`<div
791
+ `],p([g({attribute:!1})],I.prototype,"data",2),p([g({type:String,reflect:!0})],I.prototype,"period",2),I=p([f("roxy-dasha-timeline")],I);function Yr(i){let s=i.match(/^(\d{4})/);return s?s[1]:i}var $t=["title","name","label","heading","overview","summary"],wt=["imageUrl","image","icon","symbol"],kt=["imageUrl","image"],St=6,B=class extends u{constructor(){super(...arguments);this.data=null;this.depth=0}render(){return this.data==null?t`<div class="roxy-empty" role="status">No data</div>`:this.depth>=St?t`<div class="roxy-empty" role="status">…</div>`:t`<div
792
792
  class="roxy-card"
793
793
  aria-label="Generic data display"
794
794
  >
@@ -800,18 +800,18 @@
800
800
  </ol>`}renderTable(e){let r=this.collectKeys(e);return t`<table class="roxy-table" role="table">
801
801
  <thead>
802
802
  <tr>
803
- ${r.map(s=>t`<th>${ee(s)}</th>`)}
803
+ ${r.map(a=>t`<th>${te(a)}</th>`)}
804
804
  </tr>
805
805
  </thead>
806
806
  <tbody>
807
- ${e.map(s=>t`<tr>
808
- ${r.map(o=>t`<td>${this.formatPrimitive(s[o])}</td>`)}
807
+ ${e.map(a=>t`<tr>
808
+ ${r.map(o=>t`<td>${this.formatPrimitive(a[o])}</td>`)}
809
809
  </tr>`)}
810
810
  </tbody>
811
- </table>`}renderObject(e){let r=nt.find(d=>typeof e[d]=="string"),s=lt.find(d=>typeof e[d]=="string"&&e[d].startsWith("http")),o=r!=="summary"&&typeof e.summary=="string"?"summary":null,l=Object.entries(e).filter(([d,c])=>d!==r&&d!==o&&!dt.includes(d)&&c!==null&&c!==void 0);return t`
812
- ${s?t`<img
811
+ </table>`}renderObject(e){let r=$t.find(d=>typeof e[d]=="string"),a=wt.find(d=>typeof e[d]=="string"&&e[d].startsWith("http")),o=r!=="summary"&&typeof e.summary=="string"?"summary":null,l=Object.entries(e).filter(([d,c])=>d!==r&&d!==o&&!kt.includes(d)&&c!==null&&c!==void 0);return t`
812
+ ${a?t`<img
813
813
  class="roxy-image"
814
- src=${String(e[s])}
814
+ src=${String(e[a])}
815
815
  alt=${r?String(e[r]):"illustration"}
816
816
  loading="lazy"
817
817
  />`:n}
@@ -819,13 +819,13 @@
819
819
  ${o?t`<p class="roxy-summary">${e[o]}</p>`:n}
820
820
  ${l.length>0?t`<dl class="roxy-rows">
821
821
  ${l.map(([d,c])=>t`
822
- <dt>${ee(d)}</dt>
822
+ <dt>${te(d)}</dt>
823
823
  <dd>${this.renderField(c)}</dd>
824
824
  `)}
825
825
  </dl>`:n}
826
- `}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(s=>["string","number","boolean"].includes(typeof s))?t`<ul class="roxy-chips">
827
- ${e.map(s=>t`<li>${String(s)}</li>`)}
828
- </ul>`:t`<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 s of e)for(let o of Object.keys(s))r.add(o);return Array.from(r)}};j.styles=[b,x`
826
+ `}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(a=>["string","number","boolean"].includes(typeof a))?t`<ul class="roxy-chips">
827
+ ${e.map(a=>t`<li>${String(a)}</li>`)}
828
+ </ul>`:t`<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 a of e)for(let o of Object.keys(a))r.add(o);return Array.from(r)}};B.styles=[v,x`
829
829
  .roxy-card {
830
830
  background: var(--roxy-bg, #fff);
831
831
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -919,18 +919,18 @@
919
919
  margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
920
920
  text-transform: capitalize;
921
921
  }
922
- `],p([y({attribute:!1})],j.prototype,"data",2),p([y({attribute:!1})],j.prototype,"depth",2),j=p([v("roxy-data")],j);var Me=Object.fromEntries(pe.map(i=>[i.toLowerCase(),i])),pt={1:{x:150,y:58},2:{x:205,y:52},3:{x:253,y:112},4:{x:243,y:150},5:{x:253,y:188},6:{x:205,y:248},7:{x:150,y:242},8:{x:95,y:248},9:{x:47,y:188},10:{x:57,y:150},11:{x:47,y:112},12:{x:95,y:52}},mt={1:{x:150,y:35},2:{x:222,y:40},3:{x:265,y:100},4:{x:265,y:150},5:{x:265,y:200},6:{x:222,y:260},7:{x:150,y:265},8:{x:78,y:260},9:{x:35,y:200},10:{x:35,y:150},11:{x:35,y:100},12:{x:78,y:40}},ht={1:{x:150,y:60},2:{x:225,y:100},3:{x:255,y:150},4:{x:225,y:200},5:{x:150,y:240},6:{x:75,y:200},7:{x:45,y:150},8:{x:75,y:100},9:{x:100,y:80},10:{x:150,y:108},11:{x:200,y:80},12:{x:200,y:220}};function De(i){let a=pt[i.number],e=mt[i.number];if(!a||!e)return n;let r=rr[i.sign]??"",s=i.planets;return S`
922
+ `],p([g({attribute:!1})],B.prototype,"data",2),p([g({attribute:!1})],B.prototype,"depth",2),B=p([f("roxy-data")],B);function se(i){let s=i%360;return s<0?s+360:s}function ve(i){let s=se(i),e=Math.floor(s/30)%12,r=s%30,a=Math.floor(r),o=(r-a)*60,l=Math.floor(o),d=Math.round((o-l)*60);return{sign:_[e]??"Aries",signIndex:e,degree:a,minute:l,second:d}}function Ue(i){let{sign:s,degree:e,minute:r}=ve(i);return`${e}\xB0 ${s} ${String(r).padStart(2,"0")}'`}function yr(i){return se(i+180)}function Fr(i,s){let e=se(i),r=se(s)-e;return r<0&&(r+=360),se(e+r/2)}function P(i,s,e,r){let a=r*Math.PI/180;return{x:i+e*Math.cos(a),y:s+e*Math.sin(a)}}var Rs=Object.fromEntries(_.map(i=>[i.toLowerCase(),i])),At="\u02B3";function Et(i){let s=Ir[A(i.graha)]??i.graha.slice(0,2),e=i.isRetrograde?At:"";if(typeof i.longitude!="number"||!Number.isFinite(i.longitude))return`${s}${e}`;let{degree:r}=ve(i.longitude);return`${s} ${r}\xB0${e}`}function Lt(i){let s=[A(i.graha)];if(typeof i.longitude=="number"&&Number.isFinite(i.longitude)){let e=ve(i.longitude);s.push(`${e.degree}\xB0${String(e.minute).padStart(2,"0")}' ${e.sign}`)}if(i.nakshatra?.name){let e=i.nakshatra.pada?` pada ${i.nakshatra.pada}`:"";s.push(`${i.nakshatra.name}${e}`)}return i.awastha&&s.push(i.awastha),i.isRetrograde&&s.push("retrograde"),s.join(" \xB7 ")}function ur(i,s,e,r){let a=e-(i.length-1)*r/2;return i.map((o,l)=>{let d=a+l*r;return S`<text class="planet-text" x=${s} y=${d} text-anchor="middle" dominant-baseline="central">${Et(o)}<title>${Lt(o)}</title></text>`})}var Pt={1:{x:150,y:58},2:{x:205,y:52},3:{x:253,y:112},4:{x:243,y:150},5:{x:253,y:188},6:{x:205,y:248},7:{x:150,y:242},8:{x:95,y:248},9:{x:47,y:188},10:{x:57,y:150},11:{x:47,y:112},12:{x:95,y:52}},Ct={1:{x:150,y:35},2:{x:222,y:40},3:{x:265,y:100},4:{x:265,y:150},5:{x:265,y:200},6:{x:222,y:260},7:{x:150,y:265},8:{x:78,y:260},9:{x:35,y:200},10:{x:35,y:150},11:{x:35,y:100},12:{x:78,y:40}},Tt={1:{x:150,y:60},2:{x:225,y:100},3:{x:255,y:150},4:{x:225,y:200},5:{x:150,y:240},6:{x:75,y:200},7:{x:45,y:150},8:{x:75,y:100},9:{x:100,y:80},10:{x:150,y:108},11:{x:200,y:80},12:{x:200,y:220}},Rt={1:{x:150,y:80},2:{x:220,y:33},3:{x:267,y:80},4:{x:220,y:150},5:{x:267,y:220},6:{x:220,y:267},7:{x:150,y:220},8:{x:80,y:267},9:{x:33,y:220},10:{x:80,y:150},11:{x:33,y:80},12:{x:80,y:33}},zt={1:{x:150,y:55},2:{x:235,y:24},3:{x:276,y:62},4:{x:242,y:150},5:{x:276,y:238},6:{x:235,y:276},7:{x:150,y:245},8:{x:65,y:276},9:{x:24,y:238},10:{x:58,y:150},11:{x:24,y:62},12:{x:65,y:24}};function Ye(i){let s=Pt[i.number],e=Ct[i.number];if(!s||!e)return n;let r=qe[i.sign]??"",a=i.isLagna?s.y+8:s.y;return S`
923
923
  <g>
924
924
  ${i.isLagna?S`<rect
925
925
  class="lagna-bg"
926
- x=${a.x-30} y=${a.y-28}
926
+ x=${s.x-30} y=${s.y-28}
927
927
  width="60" height="56" rx="6"
928
928
  />`:n}
929
929
  ${r?S`<text class="sign-text" x=${e.x} y=${e.y} text-anchor="middle" dominant-baseline="central">${r}</text>`:n}
930
- ${i.isLagna?S`<text class="lagna-marker" x=${a.x} y=${a.y-18} text-anchor="middle" dominant-baseline="central">LAGNA</text>`:n}
931
- ${s.map((o,l)=>{let d=er[C(o)]??o.slice(0,2),c=13,g=(i.isLagna?a.y+8:a.y)-(s.length-1)*c/2+l*c;return S`<text class="planet-text" x=${a.x} y=${g} text-anchor="middle" dominant-baseline="central">${d}</text>`})}
930
+ ${i.isLagna?S`<text class="lagna-marker" x=${s.x} y=${s.y-18} text-anchor="middle" dominant-baseline="central">LAGNA</text>`:n}
931
+ ${ur(i.planets,s.x,a,13)}
932
932
  </g>
933
- `}function Oe(){return S`
933
+ `}function Fe(){return S`
934
934
  <polygon class="line" points="150,10 290,150 150,290 10,150" stroke-width="1.5" />
935
935
  <line class="line" x1="150" y1="10" x2="150" y2="290" stroke-width="1" />
936
936
  <line class="line" x1="10" y1="150" x2="290" y2="150" stroke-width="1" />
@@ -938,14 +938,14 @@
938
938
  <line class="line" x1="150" y1="10" x2="290" y2="150" stroke-width="0.6" stroke-dasharray="3,3" />
939
939
  <line class="line" x1="150" y1="290" x2="10" y2="150" stroke-width="0.6" stroke-dasharray="3,3" />
940
940
  <line class="line" x1="150" y1="290" x2="290" y2="150" stroke-width="0.6" stroke-dasharray="3,3" />
941
- `}function He(i){let a=ht[i.number];if(!a)return n;let e=rr[i.sign]??"",r=i.planets;return S`
941
+ `}function Ve(i){let s=Tt[i.number];if(!s)return n;let e=qe[i.sign]??"";return S`
942
942
  <g>
943
- ${i.isLagna?S`<circle class="lagna-bg" cx=${a.x} cy=${a.y} r="22" />`:n}
944
- ${e?S`<text class="sign-text" x=${a.x} y=${a.y-10} text-anchor="middle" dominant-baseline="central">${e}</text>`:n}
945
- <text class="house-num" x=${a.x} y=${a.y+2} text-anchor="middle" dominant-baseline="central">${i.number}</text>
946
- ${r.map((s,o)=>{let l=er[C(s)]??s.slice(0,2),d=11,m=a.y+14-(r.length-1)*d/2+o*d;return S`<text class="planet-text" x=${a.x} y=${m} text-anchor="middle" dominant-baseline="central">${l}</text>`})}
943
+ ${i.isLagna?S`<circle class="lagna-bg" cx=${s.x} cy=${s.y} r="22" />`:n}
944
+ ${e?S`<text class="sign-text" x=${s.x} y=${s.y-10} text-anchor="middle" dominant-baseline="central">${e}</text>`:n}
945
+ <text class="house-num" x=${s.x} y=${s.y+2} text-anchor="middle" dominant-baseline="central">${i.number}</text>
946
+ ${ur(i.planets,s.x,s.y+14,11)}
947
947
  </g>
948
- `}function Ge(){return S`
948
+ `}function We(){return S`
949
949
  <polygon class="line" points="150,10 290,150 150,290 10,150" stroke-width="1.5" />
950
950
  <polygon class="line" points="220,80 220,220 80,220 80,80" stroke-width="1" fill="none" />
951
951
  <line class="line" x1="150" y1="10" x2="80" y2="80" stroke-width="1" />
@@ -956,7 +956,19 @@
956
956
  <line class="line" x1="150" y1="290" x2="80" y2="220" stroke-width="1" />
957
957
  <line class="line" x1="10" y1="150" x2="80" y2="220" stroke-width="1" />
958
958
  <line class="line" x1="10" y1="150" x2="80" y2="80" stroke-width="1" />
959
- `}var I=class extends u{constructor(){super(...arguments);this.data=null;this.chartStyle="south"}buildHouses(){if(!this.data)return[];let e=this.data.chart,s=(this.data.chart.meta??{}).Lagna?.rashi??"",o=[];for(let l=0;l<12;l++){let d=_e[l],m=(e[d]?.signs??[]).map(g=>g.graha).filter(Boolean),h=Me[d]??"";o.push({number:l+1,sign:h,planets:m,isLagna:s?s.toLowerCase()===h.toLowerCase():!1})}return o}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:e,vargottama:r}=this.data,s=this.buildHouses(),o=this.chartStyle==="north";return t`<div class="wrap">
959
+ `}function Je(){return S`
960
+ <rect class="line" x="10" y="10" width="280" height="280" stroke-width="1.5" fill="none" />
961
+ <line class="line" x1="10" y1="10" x2="290" y2="290" stroke-width="1" />
962
+ <line class="line" x1="290" y1="10" x2="10" y2="290" stroke-width="1" />
963
+ <polygon class="line" points="150,10 290,150 150,290 10,150" stroke-width="1" fill="none" />
964
+ `}function Xe(i){let s=Rt[i.number],e=zt[i.number];if(!s||!e)return n;let r=qe[i.sign]??"";return S`
965
+ <g>
966
+ ${i.isLagna?S`<circle class="lagna-bg" cx=${s.x} cy=${s.y} r="20" />`:n}
967
+ ${r?S`<text class="sign-text" x=${e.x} y=${e.y} text-anchor="middle" dominant-baseline="central">${r}</text>`:n}
968
+ ${i.isLagna?S`<text class="lagna-marker" x=${s.x} y=${s.y-14} text-anchor="middle" dominant-baseline="central">LAGNA</text>`:n}
969
+ ${ur(i.planets,s.x,s.y+2,11)}
970
+ </g>
971
+ `}function Ze(i){let s=new Map,e="";for(let[r,a]of Object.entries(i)){let o=(a?.rashi??"").toLowerCase();if(r==="Lagna"||a?.graha==="Lagna"){e=o;continue}if(!o)continue;let l=s.get(o)??[];l.push({graha:a.graha??r,longitude:a.longitude,nakshatra:a.nakshatra,isRetrograde:a.isRetrograde,awastha:a.awastha}),s.set(o,l)}return _.map((r,a)=>{let o=r.toLowerCase();return{number:a+1,sign:r,planets:s.get(o)??[],isLagna:e===o}})}var q=class extends u{constructor(){super(...arguments);this.data=null;this.chartStyle="south"}buildHouses(){return this.data?.chart?.meta?Ze(this.data.chart.meta):[]}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:e,vargottama:r}=this.data,a=this.buildHouses(),o=this.chartStyle,l=o==="north"?Fe():o==="east"?Je():We(),d=o==="north"?Ve:o==="east"?Xe:Ye;return t`<div class="wrap">
960
972
  <div class="header">
961
973
  <h2 class="title">
962
974
  D${e.number} ${e.name}
@@ -971,17 +983,17 @@
971
983
  aria-label="D${e.number} ${e.name} divisional chart with twelve sign houses"
972
984
  >
973
985
  <title>D${e.number} ${e.name}</title>
974
- ${o?Oe():Ge()}
975
- ${o?s.map(l=>He(l)):s.map(l=>De(l))}
986
+ ${l}
987
+ ${a.map(c=>d(c))}
976
988
  </svg>
977
989
 
978
990
  ${r&&r.length>0?t`<div class="vargottama-row" role="list" aria-label="Vargottama planets">
979
991
  <span class="vargottama-label">Vargottama:</span>
980
- ${r.map(l=>t`<span class="vargottama-pill" role="listitem">
981
- ${L[l]??""} ${l}
992
+ ${r.map(c=>t`<span class="vargottama-pill" role="listitem">
993
+ ${L[c]??""} ${c}
982
994
  </span>`)}
983
995
  </div>`:n}
984
- </div>`}};I.styles=[b,x`
996
+ </div>`}};q.styles=[v,x`
985
997
  .wrap {
986
998
  display: grid;
987
999
  gap: var(--roxy-space-md, 1rem);
@@ -1071,12 +1083,12 @@
1071
1083
  color: var(--roxy-fg, #0a0a0a);
1072
1084
  border: 1px solid color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
1073
1085
  }
1074
- `],p([y({attribute:!1})],I.prototype,"data",2),p([y({type:String,reflect:!0,attribute:"chart-style"})],I.prototype,"chartStyle",2),I=p([v("roxy-divisional-chart")],I);var gt={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},B=class extends u{constructor(){super(...arguments);this.data=null;this.type="manglik"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,s=gt[this.type]??this.type,o=(e.severity??"").toLowerCase(),l=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=l*33,c=l===3?"var(--roxy-danger)":l===2?"var(--roxy-warning)":l===1?"var(--roxy-success)":"transparent";return t`<article
1086
+ `],p([g({attribute:!1})],q.prototype,"data",2),p([g({type:String,reflect:!0,attribute:"chart-style"})],q.prototype,"chartStyle",2),q=p([f("roxy-divisional-chart")],q);var Nt={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},K=class extends u{constructor(){super(...arguments);this.data=null;this.type="manglik"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,a=Nt[this.type]??this.type,o=(e.severity??"").toLowerCase(),l=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=l*33,c=l===3?"var(--roxy-danger)":l===2?"var(--roxy-warning)":l===1?"var(--roxy-success)":"transparent";return t`<article
1075
1087
  class="card"
1076
- aria-label=${s}
1088
+ aria-label=${a}
1077
1089
  >
1078
1090
  <header class="head">
1079
- <h2 class="title">${s}</h2>
1091
+ <h2 class="title">${a}</h2>
1080
1092
  <span class=${`badge ${r?"present":"absent"}`}>
1081
1093
  ${r?"Present":"Absent"}
1082
1094
  </span>
@@ -1105,12 +1117,12 @@
1105
1117
  ${e.exceptions.map(m=>t`<li>${m}</li>`)}
1106
1118
  </ul>
1107
1119
  </div>`:n}
1108
- </article>`}renderEffects(e){if(!e.effects)return n;let r=Object.entries(e.effects).filter(([,s])=>typeof s=="string"&&s.length>0);return r.length===0?n:t`<div class="effects">
1109
- ${r.map(([s,o])=>t`<div>
1110
- <h3>${s}</h3>
1120
+ </article>`}renderEffects(e){if(!e.effects)return n;let r=Object.entries(e.effects).filter(([,a])=>typeof a=="string"&&a.length>0);return r.length===0?n:t`<div class="effects">
1121
+ ${r.map(([a,o])=>t`<div>
1122
+ <h3>${a}</h3>
1111
1123
  <p>${o}</p>
1112
1124
  </div>`)}
1113
- </div>`}};B.styles=[b,x`
1125
+ </div>`}};K.styles=[v,x`
1114
1126
  .card {
1115
1127
  background: var(--roxy-bg, #fff);
1116
1128
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1198,15 +1210,15 @@
1198
1210
  margin: 0;
1199
1211
  font-size: var(--roxy-text-sm, 0.875rem);
1200
1212
  }
1201
- `],p([y({attribute:!1})],B.prototype,"data",2),p([y({type:String,reflect:!0})],B.prototype,"type",2),B=p([v("roxy-dosha-card")],B);var sr=new Map;async function yt(i){let a=sr.get(i);return a||(a=fetch(i).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw sr.delete(i),e}),sr.set(i,a)),a}var _=class extends u{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(s=>s.required).filter(s=>this.values[s.name]===void 0||this.values[s.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.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 yt(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,s=e.paths?.[r]?.[this.method.toLowerCase()];if(!s)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let o=e.components?.schemas??{},l=[],d;if(s.requestBody){let m=s.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[h,g]of Object.entries(d.properties)){let f=this.resolve(g,o)??{};l.push({name:h,type:this.fieldType(f),required:m.has(h),description:f.description,enum:f.enum,min:f.minimum,max:f.maximum,default:f.default})}}for(let m of s.parameters??[])if(m.in==="path"||m.in==="query"){let h=this.resolve(m.schema,o)??{};l.push({name:m.name,type:this.fieldType(h),required:!!m.required,description:h.description,enum:h.enum,default:h.default})}this.fields=l,this.hasLocation=l.some(m=>m.name==="latitude")&&l.some(m=>m.name==="longitude")&&l.some(m=>m.name==="timezone");let c={};for(let m of l)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 s=e.$ref.split("/").pop();return s?r[s]: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 t`<form><div class="roxy-skeleton" style="height: 8rem"></div></form>`;if(this.specError)return t`<div class="spec-error" role="alert">
1213
+ `],p([g({attribute:!1})],K.prototype,"data",2),p([g({type:String,reflect:!0})],K.prototype,"type",2),K=p([f("roxy-dosha-card")],K);var xr=new Map;async function _t(i){let s=xr.get(i);return s||(s=fetch(i).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw xr.delete(i),e}),xr.set(i,s)),s}var z=class extends u{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(a=>a.required).filter(a=>this.values[a.name]===void 0||this.values[a.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(a=>a.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 _t(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,a=e.paths?.[r]?.[this.method.toLowerCase()];if(!a)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let o=e.components?.schemas??{},l=[],d;if(a.requestBody){let m=a.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[y,h]of Object.entries(d.properties)){let b=this.resolve(h,o)??{};l.push({name:y,type:this.fieldType(b),required:m.has(y),description:b.description,enum:b.enum,min:b.minimum,max:b.maximum,default:b.default})}}for(let m of a.parameters??[])if(m.in==="path"||m.in==="query"){let y=this.resolve(m.schema,o)??{};l.push({name:m.name,type:this.fieldType(y),required:!!m.required,description:y.description,enum:y.enum,default:y.default})}this.fields=l,this.hasLocation=l.some(m=>m.name==="latitude")&&l.some(m=>m.name==="longitude")&&l.some(m=>m.name==="timezone");let c={};for(let m of l)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 a=e.$ref.split("/").pop();return a?r[a]: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 t`<form><div class="roxy-skeleton" style="height: 8rem"></div></form>`;if(this.specError)return t`<div class="spec-error" role="alert">
1202
1214
  Schema load failed: ${this.specError}
1203
1215
  <button type="button" class="submit" @click=${this.retryLoadSchema}>Retry</button>
1204
- </div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return n;let s=`roxy-form-${r.name}`;return t`<div class="field">
1205
- <label for=${s}>
1206
- ${ee(r.name)}${r.required?t`<span class="req" aria-hidden="true">*</span>`:n}
1216
+ </div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return n;let a=`roxy-form-${r.name}`;return t`<div class="field">
1217
+ <label for=${a}>
1218
+ ${te(r.name)}${r.required?t`<span class="req" aria-hidden="true">*</span>`:n}
1207
1219
  </label>
1208
1220
  ${r.enum?t`<select
1209
- id=${s}
1221
+ id=${a}
1210
1222
  ?required=${r.required}
1211
1223
  @change=${o=>this.setValue(r.name,o.target.value)}
1212
1224
  >
@@ -1215,7 +1227,7 @@
1215
1227
  ${o}
1216
1228
  </option>`)}
1217
1229
  </select>`:t`<input
1218
- id=${s}
1230
+ id=${a}
1219
1231
  type=${this.htmlType(r.type)}
1220
1232
  ?required=${r.required}
1221
1233
  min=${r.min??""}
@@ -1226,7 +1238,7 @@
1226
1238
  />`}
1227
1239
  ${r.description?t`<small class="help">${r.description}</small>`:n}
1228
1240
  </div>`};return t`<form @submit=${this.onSubmit}>
1229
- <h2 class="title">${ee(this.endpoint.split("/").pop()??"")}</h2>
1241
+ <h2 class="title">${te(this.endpoint.split("/").pop()??"")}</h2>
1230
1242
  ${this.hasLocation?t`<div class="location-block">
1231
1243
  <label>Birth location</label>
1232
1244
  <roxy-location-search
@@ -1241,7 +1253,7 @@
1241
1253
  ${this.fields.map(r=>e(r))}
1242
1254
  </div>
1243
1255
  <button class="submit" type="submit">${this.submitLabel}</button>
1244
- </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 s=Number(r);return Number.isFinite(s)?s:void 0}return r}}};_.styles=[b,x`
1256
+ </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 a=Number(r);return Number.isFinite(a)?a:void 0}return r}}};z.styles=[v,x`
1245
1257
  form {
1246
1258
  display: grid;
1247
1259
  gap: var(--roxy-space-md, 1rem);
@@ -1343,7 +1355,7 @@
1343
1355
  color: var(--roxy-danger-fg, #991b1b);
1344
1356
  font-size: var(--roxy-text-sm, 0.875rem);
1345
1357
  }
1346
- `],p([y({type:String,attribute:"data-endpoint"})],_.prototype,"endpoint",2),p([y({type:String})],_.prototype,"method",2),p([y({type:String,attribute:"spec-url"})],_.prototype,"specUrl",2),p([y({type:String,attribute:"submit-label"})],_.prototype,"submitLabel",2),p([E()],_.prototype,"fields",2),p([E()],_.prototype,"values",2),p([E()],_.prototype,"hasLocation",2),p([E()],_.prototype,"loaded",2),p([E()],_.prototype,"specError",2),_=p([v("roxy-endpoint-form")],_);var te=class extends u{constructor(){super(...arguments);this.data=null}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(g=>g?.category!==void 0),s=e.total??0,o=e.maxScore??36,l=s/o*100,d="color-mix(in srgb, var(--roxy-border) 50%, transparent)",c=l>=70?"var(--roxy-success)":l>=50?"var(--roxy-warning)":"var(--roxy-danger)",m=l*2.827,h=(100-l)*2.827;return t`<article class="card" aria-label="Guna Milan score">
1358
+ `],p([g({type:String,attribute:"data-endpoint"})],z.prototype,"endpoint",2),p([g({type:String})],z.prototype,"method",2),p([g({type:String,attribute:"spec-url"})],z.prototype,"specUrl",2),p([g({type:String,attribute:"submit-label"})],z.prototype,"submitLabel",2),p([C()],z.prototype,"fields",2),p([C()],z.prototype,"values",2),p([C()],z.prototype,"hasLocation",2),p([C()],z.prototype,"loaded",2),p([C()],z.prototype,"specError",2),z=p([f("roxy-endpoint-form")],z);var oe=class extends u{constructor(){super(...arguments);this.data=null}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(h=>h?.category!==void 0),a=e.total??0,o=e.maxScore??36,l=a/o*100,d="color-mix(in srgb, var(--roxy-border) 50%, transparent)",c=l>=70?"var(--roxy-success)":l>=50?"var(--roxy-warning)":"var(--roxy-danger)",m=l*2.827,y=(100-l)*2.827;return t`<article class="card" aria-label="Guna Milan score">
1347
1359
  <div class="score-header">
1348
1360
  <div class="score-info">
1349
1361
  <div class="score-bar">
@@ -1351,19 +1363,19 @@
1351
1363
  <span class="total">${w(e.total,1)}</span>
1352
1364
  <span class="over"> / ${e.maxScore}</span>
1353
1365
  ${typeof e.percentage=="number"?t`<small style="margin-left: 0.5rem; color: var(--roxy-muted)">
1354
- ${_r(e.percentage,1)}
1366
+ ${Ur(e.percentage,1)}
1355
1367
  </small>`:n}
1356
1368
  </div>
1357
1369
  ${e.recommendation?t`<span class="recommendation">${e.recommendation}</span>`:n}
1358
1370
  </div>
1359
1371
  </div>
1360
- <div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${s}">
1372
+ <div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${a}">
1361
1373
  <svg viewBox="0 0 100 100" aria-hidden="true">
1362
1374
  <circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8"/>
1363
1375
  <circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${c}" stroke-width="8"
1364
- stroke-dasharray="${m},${h}" stroke-linecap="round"
1376
+ stroke-dasharray="${m},${y}" stroke-linecap="round"
1365
1377
  transform="rotate(-90 50 50)"/>
1366
- <text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${s}</text>
1378
+ <text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${a}</text>
1367
1379
  <text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${o}</text>
1368
1380
  </svg>
1369
1381
  </div>
@@ -1378,22 +1390,22 @@
1378
1390
  </tr>
1379
1391
  </thead>
1380
1392
  <tbody>
1381
- ${r.map(g=>{let f=g.score??0,k=g.maxScore??ut(g.category),$=k?f/k*100:0;return t`<tr>
1382
- <td>${g.category}</td>
1393
+ ${r.map(h=>{let b=h.score??0,E=h.maxScore??Mt(h.category),$=E?b/E*100:0;return t`<tr>
1394
+ <td>${h.category}</td>
1383
1395
  <td class="bar-cell">
1384
1396
  <div class="mini-bar">
1385
1397
  <span style="width: ${$}%"></span>
1386
1398
  </div>
1387
1399
  </td>
1388
- <td class="score">${w(f,1)} / ${k}</td>
1400
+ <td class="score">${w(b,1)} / ${E}</td>
1389
1401
  </tr>`})}
1390
1402
  </tbody>
1391
1403
  </table>`:n}
1392
1404
  ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?t`<div class="tags">
1393
- ${e.doshas?.map(g=>t`<span class="dosha">${g}</span>`)}
1394
- ${e.doshaCancellations?.map(g=>t`<span class="cancel" title=${g.reason}>${g.dosha} cancelled</span>`)}
1405
+ ${e.doshas?.map(h=>t`<span class="dosha">${h}</span>`)}
1406
+ ${e.doshaCancellations?.map(h=>t`<span class="cancel" title=${h.reason}>${h.dosha} cancelled</span>`)}
1395
1407
  </div>`:n}
1396
- </article>`}};te.styles=[b,x`
1408
+ </article>`}};oe.styles=[v,x`
1397
1409
  .card {
1398
1410
  background: var(--roxy-bg, #fff);
1399
1411
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1514,11 +1526,11 @@
1514
1526
  background: color-mix(in srgb, var(--roxy-success, #16a34a) 18%, transparent);
1515
1527
  color: var(--roxy-success-fg, #166534);
1516
1528
  }
1517
- `],p([y({attribute:!1})],te.prototype,"data",2),te=p([v("roxy-guna-milan")],te);function ut(i){if(!i)return 1;switch(i.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 q=class extends u{constructor(){super(...arguments);this.data=null;this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let s=e;return{hex:s.hexagram,lines:s.lines,changingLinePositions:s.changingLinePositions,resultingHexagram:s.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return t`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:s,changingLinePositions:o,dailyMessage:l,resultingHexagram:d}=e,c=s??this.derivedLines(r),m=new Set(o??[]);return t`<article class="card" aria-label="I Ching hexagram">
1529
+ `],p([g({attribute:!1})],oe.prototype,"data",2),oe=p([f("roxy-guna-milan")],oe);function Mt(i){if(!i)return 1;switch(i.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 U=class extends u{constructor(){super(...arguments);this.data=null;this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let a=e;return{hex:a.hexagram,lines:a.lines,changingLinePositions:a.changingLinePositions,resultingHexagram:a.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return t`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:a,changingLinePositions:o,dailyMessage:l,resultingHexagram:d}=e,c=a??this.derivedLines(r),m=new Set(o??[]);return t`<article class="card" aria-label="I Ching hexagram">
1518
1530
  <div class="glyphs">
1519
1531
  ${r.symbol?t`<div class="symbol">${r.symbol}</div>`:n}
1520
1532
  <div class="lines" aria-hidden="true">
1521
- ${c.slice().reverse().map((h,g)=>{let f=c.length-1-g+1,k=m.has(f),$=h===6||h===8;return t`<div class="line ${`${$?"broken":"solid"}${k?" changing":""}`}">
1533
+ ${c.slice().reverse().map((y,h)=>{let b=c.length-1-h+1,E=m.has(b),$=y===6||y===8;return t`<div class="line ${`${$?"broken":"solid"}${E?" changing":""}`}">
1522
1534
  ${$?S`<span class="seg"></span><span class="seg"></span>`:S`<span class="seg"></span>`}
1523
1535
  </div>`})}
1524
1536
  </div>
@@ -1535,13 +1547,13 @@
1535
1547
  ${r.upperTrigram?t`<div>
1536
1548
  Upper
1537
1549
  <span class="tri-glyph"
1538
- >${tr[r.upperTrigram]??""}</span
1550
+ >${hr[r.upperTrigram]??""}</span
1539
1551
  >${r.upperTrigram}
1540
1552
  </div>`:n}
1541
1553
  ${r.lowerTrigram?t`<div>
1542
1554
  Lower
1543
1555
  <span class="tri-glyph"
1544
- >${tr[r.lowerTrigram]??""}</span
1556
+ >${hr[r.lowerTrigram]??""}</span
1545
1557
  >${r.lowerTrigram}
1546
1558
  </div>`:n}
1547
1559
  </div>
@@ -1550,12 +1562,12 @@
1550
1562
  ${l?t`<p class="message">${l}</p>`:n}
1551
1563
  ${r.interpretation?.general?t`<p>${r.interpretation.general}</p>`:n}
1552
1564
  ${m.size>0?t`<div class="changing">
1553
- Changing lines: ${Array.from(m).sort((h,g)=>h-g).join(", ")}.
1565
+ Changing lines: ${Array.from(m).sort((y,h)=>y-h).join(", ")}.
1554
1566
  ${d?.english?t` Becomes hexagram ${d.number}
1555
1567
  ${d.english}.`:n}
1556
1568
  </div>`:n}
1557
1569
  </div>
1558
- </article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let s=r-19904,o=[];for(let l=0;l<6;l++){let d=s>>l&1;o.push(d?8:7)}return o}return Array.from({length:6},()=>7)}};q.styles=[b,x`
1570
+ </article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let a=r-19904,o=[];for(let l=0;l<6;l++){let d=a>>l&1;o.push(d?8:7)}return o}return Array.from({length:6},()=>7)}};U.styles=[v,x`
1559
1571
  .card {
1560
1572
  background: var(--roxy-bg, #fff);
1561
1573
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1662,12 +1674,12 @@
1662
1674
  color: var(--roxy-accent-fg, #b45309);
1663
1675
  font-size: var(--roxy-text-sm, 0.875rem);
1664
1676
  }
1665
- `],p([y({attribute:!1})],q.prototype,"data",2),p([y({type:String,reflect:!0})],q.prototype,"mode",2),q=p([v("roxy-hexagram")],q);var U=class extends u{constructor(){super(...arguments);this.data=null;this.period="daily"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",s=r?z[C(r)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,l="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return t`<article
1677
+ `],p([g({attribute:!1})],U.prototype,"data",2),p([g({type:String,reflect:!0})],U.prototype,"mode",2),U=p([f("roxy-hexagram")],U);var Y=class extends u{constructor(){super(...arguments);this.data=null;this.period="daily"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",a=r?N[A(r)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,l="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return t`<article
1666
1678
  class="card"
1667
1679
  aria-label=${`${this.period} horoscope for ${r}`}
1668
1680
  >
1669
1681
  <header class="head">
1670
- <span class="glyph" aria-hidden="true">${s}</span>
1682
+ <span class="glyph" aria-hidden="true">${a}</span>
1671
1683
  <div>
1672
1684
  <h2 class="title">${r} ${this.period}</h2>
1673
1685
  ${l?t`<div class="date">${l}</div>`:n}
@@ -1705,24 +1717,24 @@
1705
1717
  </div>`:n}
1706
1718
  </div>
1707
1719
 
1708
- ${(()=>{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:[],h="luckyDays"in e&&e.luckyDays?e.luckyDays:[],g=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&h.length===0&&g.length===0?n:t`<div class="lucky">
1720
+ ${(()=>{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:[],h=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&y.length===0&&h.length===0?n:t`<div class="lucky">
1709
1721
  ${d!==void 0?t`<span>Lucky number <strong>${d}</strong></span>`:n}
1710
1722
  ${c?t`<span>Lucky color <strong>${c}</strong></span>`:n}
1711
1723
  ${m.length?t`<span
1712
1724
  >Lucky numbers
1713
1725
  <strong>${m.join(", ")}</strong></span
1714
1726
  >`:n}
1715
- ${h.length?t`<span
1716
- >Lucky days <strong>${h.join(", ")}</strong></span
1727
+ ${y.length?t`<span
1728
+ >Lucky days <strong>${y.join(", ")}</strong></span
1717
1729
  >`:n}
1718
- ${g.length?t`<span class="compat-wrap">
1730
+ ${h.length?t`<span class="compat-wrap">
1719
1731
  Best with
1720
1732
  <span class="compat"
1721
- >${g.map(f=>t`<span>${f}</span>`)}</span
1733
+ >${h.map(b=>t`<span>${b}</span>`)}</span
1722
1734
  >
1723
1735
  </span>`:n}
1724
1736
  </div>`})()}
1725
- </article>`}};U.styles=[b,x`
1737
+ </article>`}};Y.styles=[v,x`
1726
1738
  .card {
1727
1739
  background: var(--roxy-bg, #fff);
1728
1740
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1844,7 +1856,186 @@
1844
1856
  font-size: var(--roxy-text-xs, 0.75rem);
1845
1857
  text-transform: capitalize;
1846
1858
  }
1847
- `],p([y({attribute:!1})],U.prototype,"data",2),p([y({type:String,reflect:!0})],U.prototype,"period",2),U=p([v("roxy-horoscope-card")],U);var ae=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return t`<div
1859
+ `],p([g({attribute:!1})],Y.prototype,"data",2),p([g({type:String,reflect:!0})],Y.prototype,"period",2),Y=p([f("roxy-horoscope-card")],Y);var F=class extends u{constructor(){super(...arguments);this.data=null;this.activeTab="planets"}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})),a=e.nodes;for(let[o,l]of[["Rahu",a?.rahu],["Ketu",a?.ketu]])l&&r.push({name:o,sign:l.sign,house:l.house,nakshatra:l.nakshatra,starLord:l.starLord,subLord:l.subLord,subSubLord:l.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 t`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return t`<div class="wrap" aria-label="KP chart" tabindex="0">
1860
+ <header class="head">
1861
+ <h2 class="title">KP chart</h2>
1862
+ ${r?t`<div class="asc">
1863
+ Ascendant: <strong>${r.sign??""}</strong>
1864
+ ${r.nakshatra?t`· ${r.nakshatra}`:n}
1865
+ ${r.subLord?t`· sub lord ${r.subLord}`:n}
1866
+ ${typeof r.kpNumber=="number"?t`· KP ${r.kpNumber}`:n}
1867
+ </div>`:n}
1868
+ ${typeof e.meta?.ayanamsa=="number"?t`<div class="ayan">
1869
+ ${e.meta.ayanamsaType??"Ayanamsa"}: ${w(e.meta.ayanamsa,4)}°
1870
+ ${e.meta.houseSystem?t`· ${e.meta.houseSystem} houses`:n}
1871
+ </div>`:n}
1872
+ </header>
1873
+
1874
+ <div
1875
+ class="tablist"
1876
+ role="tablist"
1877
+ aria-label="KP chart views"
1878
+ @keydown=${this.onTabKeyDown}
1879
+ >
1880
+ ${["planets","cusps"].map(a=>t`<button
1881
+ class="tab"
1882
+ role="tab"
1883
+ id="tab-${a}"
1884
+ aria-selected=${this.activeTab===a?"true":"false"}
1885
+ aria-controls="panel-${a}"
1886
+ tabindex=${this.activeTab===a?"0":"-1"}
1887
+ @click=${()=>{this.activeTab=a}}
1888
+ >
1889
+ ${a==="planets"?"Planets":"Cusps"}
1890
+ </button>`)}
1891
+ </div>
1892
+
1893
+ <div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">
1894
+ ${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}
1895
+ </div>
1896
+ </div>`}renderPlanets(){let e=this.bodies();return e.length?t`<table role="table" aria-label="KP planets and nodes">
1897
+ <thead>
1898
+ <tr>
1899
+ <th scope="col">Body</th>
1900
+ <th scope="col">Sign</th>
1901
+ <th scope="col">House</th>
1902
+ <th scope="col">Nakshatra</th>
1903
+ <th scope="col">Star lord</th>
1904
+ <th scope="col">Sub lord</th>
1905
+ <th scope="col">Sub sub lord</th>
1906
+ <th scope="col">KP no.</th>
1907
+ </tr>
1908
+ </thead>
1909
+ <tbody>
1910
+ ${e.map(r=>t`<tr>
1911
+ <td class="body">
1912
+ ${r.name}${r.retrograde?t`<span class="retro">R</span>`:n}
1913
+ </td>
1914
+ <td>${r.sign??""}</td>
1915
+ <td class="num">${typeof r.house=="number"?r.house:""}</td>
1916
+ <td>${r.nakshatra??""}</td>
1917
+ <td>${r.starLord??""}</td>
1918
+ <td>${r.subLord??""}</td>
1919
+ <td>${r.subSubLord??""}</td>
1920
+ <td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td>
1921
+ </tr>`)}
1922
+ </tbody>
1923
+ </table>`:t`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?t`<table role="table" aria-label="KP Placidus cusps">
1924
+ <thead>
1925
+ <tr>
1926
+ <th scope="col">House</th>
1927
+ <th scope="col">Sign</th>
1928
+ <th scope="col">Sign lord</th>
1929
+ <th scope="col">Nakshatra</th>
1930
+ <th scope="col">Star lord</th>
1931
+ <th scope="col">Sub lord</th>
1932
+ <th scope="col">Sub sub lord</th>
1933
+ <th scope="col">KP no.</th>
1934
+ </tr>
1935
+ </thead>
1936
+ <tbody>
1937
+ ${e.map(r=>t`<tr>
1938
+ <td class="body num">${r.house}</td>
1939
+ <td>${r.sign??""}</td>
1940
+ <td>${r.signLord??""}</td>
1941
+ <td>${r.nakshatra??""}</td>
1942
+ <td>${r.starLord??""}</td>
1943
+ <td>${r.subLord??""}</td>
1944
+ <td>${r.subSubLord??""}</td>
1945
+ <td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td>
1946
+ </tr>`)}
1947
+ </tbody>
1948
+ </table>`:t`<p class="roxy-empty" role="status">No cusps</p>`}};F.styles=[v,x`
1949
+ .wrap {
1950
+ border: 1px solid var(--roxy-border, #e4e4e7);
1951
+ border-radius: var(--roxy-radius-md, 8px);
1952
+ background: var(--roxy-bg, #fff);
1953
+ overflow: auto;
1954
+ box-shadow: var(--roxy-shadow-sm);
1955
+ }
1956
+ .head {
1957
+ padding: var(--roxy-space-md, 1rem);
1958
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
1959
+ display: grid;
1960
+ gap: var(--roxy-space-xs, 0.25rem);
1961
+ }
1962
+ .title {
1963
+ margin: 0;
1964
+ font-size: var(--roxy-text-lg, 1.125rem);
1965
+ font-weight: var(--roxy-weight-bold, 600);
1966
+ }
1967
+ .asc,
1968
+ .ayan {
1969
+ color: var(--roxy-muted, #71717a);
1970
+ font-size: var(--roxy-text-sm, 0.875rem);
1971
+ }
1972
+ .asc strong {
1973
+ color: var(--roxy-fg, #0a0a0a);
1974
+ }
1975
+ .tablist {
1976
+ display: flex;
1977
+ gap: 2px;
1978
+ padding: 0 var(--roxy-space-md, 1rem);
1979
+ border-bottom: 2px solid var(--roxy-border, #e4e4e7);
1980
+ }
1981
+ .tab {
1982
+ padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
1983
+ font-size: var(--roxy-text-sm, 0.875rem);
1984
+ background: none;
1985
+ border: none;
1986
+ border-bottom: 2px solid transparent;
1987
+ margin-bottom: -2px;
1988
+ cursor: pointer;
1989
+ color: var(--roxy-muted, #71717a);
1990
+ font-family: inherit;
1991
+ }
1992
+ .tab[aria-selected='true'] {
1993
+ color: var(--roxy-accent-fg, #b45309);
1994
+ border-bottom-color: var(--roxy-accent, #f59e0b);
1995
+ font-weight: var(--roxy-weight-bold, 600);
1996
+ }
1997
+ .tab:hover:not([aria-selected='true']) {
1998
+ color: var(--roxy-fg, #0a0a0a);
1999
+ }
2000
+ table {
2001
+ width: 100%;
2002
+ border-collapse: collapse;
2003
+ font-size: var(--roxy-text-sm, 0.875rem);
2004
+ min-width: 620px;
2005
+ }
2006
+ thead {
2007
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 20%, transparent);
2008
+ }
2009
+ th,
2010
+ td {
2011
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
2012
+ text-align: left;
2013
+ white-space: nowrap;
2014
+ }
2015
+ th {
2016
+ color: var(--roxy-muted, #71717a);
2017
+ font-weight: var(--roxy-weight-bold, 600);
2018
+ text-transform: uppercase;
2019
+ font-size: var(--roxy-text-xs, 0.75rem);
2020
+ letter-spacing: 0.04em;
2021
+ }
2022
+ tbody tr {
2023
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
2024
+ }
2025
+ td.body {
2026
+ font-weight: var(--roxy-weight-bold, 600);
2027
+ color: var(--roxy-fg, #0a0a0a);
2028
+ }
2029
+ .retro {
2030
+ color: var(--roxy-warning-fg, #9a3412);
2031
+ font-size: var(--roxy-text-xs, 0.75rem);
2032
+ font-weight: var(--roxy-weight-bold, 600);
2033
+ margin-left: 4px;
2034
+ }
2035
+ .num {
2036
+ font-variant-numeric: tabular-nums;
2037
+ }
2038
+ `],p([g({attribute:!1})],F.prototype,"data",2),p([C()],F.prototype,"activeTab",2),F=p([f("roxy-kp-chart")],F);var ie=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return t`<div
1848
2039
  class="wrap"
1849
2040
  aria-label="KP planets table"
1850
2041
  tabindex="0"
@@ -1882,7 +2073,7 @@
1882
2073
  </tr>`)}
1883
2074
  </tbody>
1884
2075
  </table>
1885
- </div>`}};ae.styles=[b,x`
2076
+ </div>`}};ie.styles=[v,x`
1886
2077
  .wrap {
1887
2078
  border: 1px solid var(--roxy-border, #e4e4e7);
1888
2079
  border-radius: var(--roxy-radius-md, 8px);
@@ -1941,12 +2132,155 @@
1941
2132
  font-size: var(--roxy-text-xs, 0.75rem);
1942
2133
  margin-left: 4px;
1943
2134
  }
1944
- `],p([y({attribute:!1})],ae.prototype,"data",2),ae=p([v("roxy-kp-planets-table")],ae);function Nr(i,a){let e,r=((...s)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,i(...s)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var T=class extends u{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=Nr(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 s=new URL(this.endpoint);s.searchParams.set("q",e),s.searchParams.set("limit","8");let o={Accept:"application/json"};this.apiKey&&(o["X-API-Key"]=this.apiKey),this.publishableKey&&(o["X-API-Key"]=this.publishableKey);let l=await fetch(s,{headers:o,signal:r.signal});if(!l.ok)throw new Error(`HTTP ${l.status}`);let d=await l.json();if(r.signal.aborted)return;this.results=d.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(s){if(s?.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 t`<div class="field">
2135
+ `],p([g({attribute:!1})],ie.prototype,"data",2),ie=p([f("roxy-kp-planets-table")],ie);var ne=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return t`<div class="wrap" aria-label="KP ruling planets">
2136
+ <header>
2137
+ <h2 class="title">KP ruling planets</h2>
2138
+ ${e.dayLord?t`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:n}
2139
+ </header>
2140
+
2141
+ <div class="groups">
2142
+ <div class="group">
2143
+ <h3>Moon</h3>
2144
+ <dl>
2145
+ <dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd>
2146
+ <dt>Star lord</dt><dd>${e.moonStarLord??""}</dd>
2147
+ <dt>Sub lord</dt><dd>${e.moonSublord??""}</dd>
2148
+ <dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd>
2149
+ </dl>
2150
+ </div>
2151
+ <div class="group">
2152
+ <h3>Lagna</h3>
2153
+ <dl>
2154
+ <dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd>
2155
+ <dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd>
2156
+ <dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd>
2157
+ <dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd>
2158
+ </dl>
2159
+ </div>
2160
+ </div>
2161
+
2162
+ ${e.rulingPlanets?.length?t`<div class="rp-list" role="list" aria-label="Ruling planets by strength">
2163
+ <span class="rp-label">Ruling planets</span>
2164
+ ${e.rulingPlanets.map((a,o)=>t`<span class="rp" role="listitem"><span class="rank">${o+1}</span> ${a}</span>`)}
2165
+ </div>`:n}
2166
+
2167
+ ${r.length?t`<table aria-label="House significators">
2168
+ <thead>
2169
+ <tr>
2170
+ <th scope="col">Planet</th>
2171
+ <th scope="col">Signifies houses</th>
2172
+ </tr>
2173
+ </thead>
2174
+ <tbody>
2175
+ ${r.map(a=>t`<tr>
2176
+ <td>${a.planet}</td>
2177
+ <td>${(a.signifies??[]).join(", ")}</td>
2178
+ </tr>`)}
2179
+ </tbody>
2180
+ </table>`:n}
2181
+ </div>`}};ne.styles=[v,x`
2182
+ .wrap {
2183
+ border: 1px solid var(--roxy-border, #e4e4e7);
2184
+ border-radius: var(--roxy-radius-md, 8px);
2185
+ background: var(--roxy-bg, #fff);
2186
+ padding: var(--roxy-space-md, 1rem);
2187
+ display: grid;
2188
+ gap: var(--roxy-space-md, 1rem);
2189
+ box-shadow: var(--roxy-shadow-sm);
2190
+ }
2191
+ .title {
2192
+ margin: 0;
2193
+ font-size: var(--roxy-text-lg, 1.125rem);
2194
+ font-weight: var(--roxy-weight-bold, 600);
2195
+ }
2196
+ .day-lord {
2197
+ color: var(--roxy-muted, #71717a);
2198
+ font-size: var(--roxy-text-sm, 0.875rem);
2199
+ }
2200
+ .day-lord strong {
2201
+ color: var(--roxy-fg, #0a0a0a);
2202
+ }
2203
+ .groups {
2204
+ display: grid;
2205
+ grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
2206
+ gap: var(--roxy-space-md, 1rem);
2207
+ }
2208
+ .group h3 {
2209
+ margin: 0 0 var(--roxy-space-xs, 0.25rem);
2210
+ font-size: var(--roxy-text-xs, 0.75rem);
2211
+ font-weight: var(--roxy-weight-bold, 600);
2212
+ color: var(--roxy-muted, #71717a);
2213
+ text-transform: uppercase;
2214
+ letter-spacing: 0.05em;
2215
+ }
2216
+ .group dl {
2217
+ margin: 0;
2218
+ display: grid;
2219
+ grid-template-columns: auto 1fr;
2220
+ gap: 2px var(--roxy-space-sm, 0.5rem);
2221
+ font-size: var(--roxy-text-sm, 0.875rem);
2222
+ }
2223
+ .group dt {
2224
+ color: var(--roxy-muted, #71717a);
2225
+ }
2226
+ .group dd {
2227
+ margin: 0;
2228
+ color: var(--roxy-fg, #0a0a0a);
2229
+ font-weight: var(--roxy-weight-bold, 600);
2230
+ }
2231
+ .rp-list {
2232
+ display: flex;
2233
+ flex-wrap: wrap;
2234
+ gap: var(--roxy-space-xs, 0.25rem);
2235
+ align-items: center;
2236
+ }
2237
+ .rp-label {
2238
+ font-size: var(--roxy-text-xs, 0.75rem);
2239
+ color: var(--roxy-muted, #71717a);
2240
+ text-transform: uppercase;
2241
+ letter-spacing: 0.05em;
2242
+ margin-right: var(--roxy-space-xs, 0.25rem);
2243
+ }
2244
+ .rp {
2245
+ display: inline-flex;
2246
+ align-items: center;
2247
+ gap: 0.3em;
2248
+ font-size: var(--roxy-text-sm, 0.875rem);
2249
+ font-weight: var(--roxy-weight-bold, 600);
2250
+ padding: 0.15em 0.6em;
2251
+ border-radius: 999px;
2252
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 18%, transparent);
2253
+ color: var(--roxy-fg, #0a0a0a);
2254
+ }
2255
+ .rp .rank {
2256
+ font-size: var(--roxy-text-xs, 0.75rem);
2257
+ color: var(--roxy-accent-fg, #b45309);
2258
+ }
2259
+ table {
2260
+ width: 100%;
2261
+ border-collapse: collapse;
2262
+ font-size: var(--roxy-text-sm, 0.875rem);
2263
+ }
2264
+ th,
2265
+ td {
2266
+ padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-sm, 0.5rem);
2267
+ text-align: left;
2268
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
2269
+ }
2270
+ th {
2271
+ color: var(--roxy-muted, #71717a);
2272
+ font-weight: var(--roxy-weight-bold, 600);
2273
+ text-transform: uppercase;
2274
+ font-size: var(--roxy-text-xs, 0.75rem);
2275
+ letter-spacing: 0.04em;
2276
+ }
2277
+ `],p([g({attribute:!1})],ne.prototype,"data",2),ne=p([f("roxy-kp-ruling-planets")],ne);function Vr(i,s){let e,r=((...a)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,i(...a)},s)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var R=class extends u{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=Vr(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 a=new URL(this.endpoint);a.searchParams.set("q",e),a.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 l=this.publishableKey??this.apiKey;l&&(o["X-API-Key"]=l);let d=await fetch(a,{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(a){if(a?.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 t`<div class="field">
1945
2278
  <input
1946
2279
  type="text"
1947
2280
  role="combobox"
1948
2281
  aria-expanded=${this.isOpen?"true":"false"}
1949
2282
  aria-controls="roxy-location-listbox"
2283
+ aria-activedescendant=${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}
1950
2284
  aria-autocomplete="list"
1951
2285
  autocomplete="off"
1952
2286
  placeholder=${this.placeholder}
@@ -1966,6 +2300,7 @@
1966
2300
  type="button"
1967
2301
  class="option"
1968
2302
  role="option"
2303
+ id=${`roxy-location-option-${r}`}
1969
2304
  aria-selected=${this.highlight===r?"true":"false"}
1970
2305
  @click=${()=>this.select(e)}
1971
2306
  @mouseenter=${()=>{this.highlight=r}}
@@ -1980,7 +2315,7 @@
1980
2315
  </button>
1981
2316
  </li>`)}
1982
2317
  </ul>`:n}
1983
- </div>`}};T.styles=[b,x`
2318
+ </div>`}};R.styles=[v,x`
1984
2319
  :host {
1985
2320
  display: block;
1986
2321
  position: relative;
@@ -2081,15 +2416,15 @@
2081
2416
  color: var(--roxy-muted, #71717a);
2082
2417
  font-size: var(--roxy-text-sm, 0.875rem);
2083
2418
  }
2084
- `],p([y({type:String,attribute:"api-key"})],T.prototype,"apiKey",2),p([y({type:String,attribute:"publishable-key"})],T.prototype,"publishableKey",2),p([y({type:String})],T.prototype,"endpoint",2),p([y({type:String})],T.prototype,"placeholder",2),p([y({type:String,attribute:"default-value"})],T.prototype,"defaultValue",2),p([E()],T.prototype,"query",2),p([E()],T.prototype,"results",2),p([E()],T.prototype,"isOpen",2),p([E()],T.prototype,"isLoading",2),p([E()],T.prototype,"highlight",2),T=p([v("roxy-location-search")],T);var Y=class extends u{constructor(){super(...arguments);this.data=null;this.mode="current"}render(){let e=this.data;if(!e)return t`<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 s="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return t`<article
2419
+ `],p([g({type:String,attribute:"api-key"})],R.prototype,"apiKey",2),p([g({type:String,attribute:"publishable-key"})],R.prototype,"publishableKey",2),p([g({type:String})],R.prototype,"endpoint",2),p([g({type:String})],R.prototype,"placeholder",2),p([g({type:String,attribute:"default-value"})],R.prototype,"defaultValue",2),p([C()],R.prototype,"query",2),p([C()],R.prototype,"results",2),p([C()],R.prototype,"isOpen",2),p([C()],R.prototype,"isLoading",2),p([C()],R.prototype,"highlight",2),R=p([f("roxy-location-search")],R);var V=class extends u{constructor(){super(...arguments);this.data=null;this.mode="current"}render(){let e=this.data;if(!e)return t`<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 a="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return t`<article
2085
2420
  class="card"
2086
2421
  aria-label="Moon phase calendar"
2087
2422
  >
2088
- <h2 class="label">${s??"Moon phases"} ${o??""}</h2>
2423
+ <h2 class="label">${a??"Moon phases"} ${o??""}</h2>
2089
2424
  <div class="list" role="list">
2090
2425
  ${r.map(l=>this.renderListItem(l))}
2091
2426
  </div>
2092
- </article>`}return"phase"in e?this.renderSingle(e):n}renderSingle(e){let r=Mr(e.phase);return t`<article class="card" aria-label="Current moon phase">
2427
+ </article>`}return"phase"in e?this.renderSingle(e):n}renderSingle(e){let r=Wr(e.phase);return t`<article class="card" aria-label="Current moon phase">
2093
2428
  <div class="hero">
2094
2429
  <span class="emoji" aria-hidden="true">${r}</span>
2095
2430
  <div>
@@ -2100,7 +2435,7 @@
2100
2435
  <div class="stats">
2101
2436
  ${typeof e.illumination=="number"?t`<div>
2102
2437
  <span>Illumination</span>
2103
- <strong>${xt(e.illumination)}</strong>
2438
+ <strong>${Dt(e.illumination)}</strong>
2104
2439
  </div>`:n}
2105
2440
  ${typeof e.age=="number"?t`<div>
2106
2441
  <span>Age</span>
@@ -2117,13 +2452,13 @@
2117
2452
  </div>
2118
2453
  ${e.meaning?.description?t`<p class="meaning">${e.meaning.description}</p>`:n}
2119
2454
  ${e.meaning?.keywords?.length?t`<div class="keywords">
2120
- ${e.meaning.keywords.map(s=>t`<span>${s}</span>`)}
2455
+ ${e.meaning.keywords.map(a=>t`<span>${a}</span>`)}
2121
2456
  </div>`:n}
2122
- </article>`}renderListItem(e){let r=Mr(e.phase);return t`<div class="list-item" role="listitem">
2457
+ </article>`}renderListItem(e){let r=Wr(e.phase);return t`<div class="list-item" role="listitem">
2123
2458
  <span aria-hidden="true">${r}</span>
2124
2459
  <span>${e.phase}</span>
2125
2460
  <span>${e.date??""}</span>
2126
- </div>`}};Y.styles=[b,x`
2461
+ </div>`}};V.styles=[v,x`
2127
2462
  .card {
2128
2463
  background: var(--roxy-bg, #fff);
2129
2464
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -2205,96 +2540,227 @@
2205
2540
  .list-item:last-child {
2206
2541
  border-bottom: none;
2207
2542
  }
2208
- `],p([y({attribute:!1})],Y.prototype,"data",2),p([y({type:String,reflect:!0})],Y.prototype,"mode",2),Y=p([v("roxy-moon-phase")],Y);function Mr(i){return i?Pr[i.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function xt(i){let a=i<=1?i*100:i;return`${Math.round(a)}%`}function R(i,a,e,r){let s=r*Math.PI/180;return{x:i+e*Math.cos(s),y:a+e*Math.sin(s)}}var nr=420,A=nr/2,or=164,ft=146,ir=120,je=96,vt=178,bt=196,K=class extends u{constructor(){super(...arguments);this.data=null;this.houseSystem="placidus"}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 t`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[];return t`<div class="wrap">
2209
- <header>
2210
- <h2 class="title">Natal chart</h2>
2211
- ${this.data.birthDetails?t`<div class="meta">
2212
- ${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}
2213
- </div>`:n}
2543
+ `],p([g({attribute:!1})],V.prototype,"data",2),p([g({type:String,reflect:!0})],V.prototype,"mode",2),V=p([f("roxy-moon-phase")],V);function Wr(i){return i?Br[i.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Dt(i){let s=i<=1?i*100:i;return`${Math.round(s)}%`}var le=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return t`<article class="wrap" aria-label=${`Nakshatra ${e.name}`}>
2544
+ <header class="head">
2545
+ <h2 class="name">${e.name}</h2>
2546
+ ${typeof e.number=="number"?t`<span class="number">Nakshatra ${e.number} of 27</span>`:n}
2547
+ ${e.range?t`<span class="range">${e.range}</span>`:n}
2214
2548
  </header>
2215
- <svg
2216
- viewBox="0 0 ${nr} ${nr}"
2217
- role="img"
2218
- aria-label="Natal chart wheel with twelve houses, planets, and aspects"
2219
- >
2220
- <title>Natal chart wheel</title>
2221
- <desc>
2222
- Twelve zodiac sign segments around a circular wheel. Planet glyphs are
2223
- placed at their ecliptic longitudes. Aspect lines connect related planets.
2224
- </desc>
2225
- <circle
2226
- class="wheel-line"
2227
- cx=${A}
2228
- cy=${A}
2229
- r=${or}
2230
- stroke-width="1.5"
2231
- />
2232
- <circle
2233
- class="wheel-line"
2234
- cx=${A}
2235
- cy=${A}
2236
- r=${ir}
2237
- stroke-width="1"
2238
- />
2239
- <circle
2240
- class="wheel-line"
2241
- cx=${A}
2242
- cy=${A}
2243
- r=${je-16}
2244
- stroke-width="0.5"
2245
- />
2246
- ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()}
2247
- ${this.renderAspects(e,r)} ${this.renderPlanets(e)}
2248
- ${this.renderAngles()}
2249
- </svg>
2250
- <div class="legend">
2251
- <span>${e.length} planets</span>
2252
- <span>${r.length} aspects</span>
2253
- <span><span class="legend-swatch" style="background: var(--roxy-success)"></span>harmonious</span>
2254
- <span><span class="legend-swatch" style="background: var(--roxy-danger)"></span>challenging</span>
2255
- </div>
2256
- ${this.renderDetails()}
2257
- ${this.renderInterpretations()}
2258
- </div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),s=[this.renderAngleMark(e,"ASC")];return r!==null&&s.push(this.renderAngleMark(r,"MC")),s}renderAngleMark(e,r){let s=this.toAngle(e),o=R(A,A,or,s),l=R(A,A,vt,s),d=R(A,A,bt,s);return S`
2259
- <g>
2260
- <line class="angle-tick" x1=${o.x} y1=${o.y} x2=${l.x} y2=${l.y} />
2261
- <text class="angle-marker" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${r}</text>
2262
- </g>
2263
- `}renderSpokes(){return Array.from({length:12},(e,r)=>{let s=this.toAngle(r*30),o=R(A,A,ir,s),l=R(A,A,or,s);return S`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${l.x} y2=${l.y} stroke-width="0.8" />`})}renderSigns(){return pe.map((e,r)=>{let s=this.toAngle(r*30+15),o=R(A,A,ft,s);return S`<text class="sign-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${z[e]}</text>`})}renderHouseNumbers(){let e=Math.floor(this.getAscendant()/30);return Array.from({length:12},(r,s)=>{let o=this.toAngle(s*30+15),l=R(A,A,ir-12,o),d=(s-e+12)%12+1;return S`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${d}</text>`})}renderPlanets(e){return e.map(r=>{if(!Number.isFinite(r.longitude))return n;let s=this.toAngle(r.longitude),o=R(A,A,je,s),l=L[C(r.name)]??r.name.slice(0,2),d=r.isRetrograde?" R":"",c=d?`${l}\u1D3F`:l;return S`<text class="planet-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central"><title>${r.name}${d}</title>${c}</text>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return n;let s=e?.retrogradePlanets??[],o=e?.elementDistribution??{},l=e?.modalityDistribution??{},d=Math.max(1,...Object.values(o)),c=Math.max(1,...Object.values(l));return t`<div class="details">
2264
- ${e?.dominantElement||e?.dominantModality?t`<div class="pill-row">
2265
- ${e.dominantElement?t`<span class="pill">Dominant element: ${e.dominantElement}</span>`:n}
2266
- ${e.dominantModality?t`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:n}
2549
+
2550
+ <dl class="facts">
2551
+ ${e.lord?t`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:n}
2552
+ ${e.deity?t`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:n}
2553
+ ${e.symbol?t`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:n}
2554
+ </dl>
2555
+
2556
+ ${e.characteristics?t`<div class="section">
2557
+ <h3>Characteristics</h3>
2558
+ <p>${e.characteristics}</p>
2267
2559
  </div>`:n}
2268
- ${r?t`<div class="pill-row">
2269
- <span class="pill pill--success">Harmonious ${r.harmonious}</span>
2270
- <span class="pill pill--danger">Challenging ${r.challenging}</span>
2560
+
2561
+ ${r?t`<div class="section">
2562
+ <h3>Remedies</h3>
2563
+ <div class="remedies">
2564
+ ${r.mantras?t`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:n}
2565
+ ${r.gemstones?t`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:n}
2566
+ ${r.rituals?t`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:n}
2567
+ </div>
2568
+ </div>`:n}
2569
+ </article>`}};le.styles=[v,x`
2570
+ .wrap {
2571
+ border: 1px solid var(--roxy-border, #e4e4e7);
2572
+ border-radius: var(--roxy-radius-md, 8px);
2573
+ background: var(--roxy-bg, #fff);
2574
+ padding: var(--roxy-space-md, 1rem);
2575
+ display: grid;
2576
+ gap: var(--roxy-space-md, 1rem);
2577
+ box-shadow: var(--roxy-shadow-sm);
2578
+ }
2579
+ .head {
2580
+ display: flex;
2581
+ align-items: baseline;
2582
+ gap: var(--roxy-space-sm, 0.5rem);
2583
+ flex-wrap: wrap;
2584
+ }
2585
+ .name {
2586
+ margin: 0;
2587
+ font-size: var(--roxy-text-lg, 1.125rem);
2588
+ font-weight: var(--roxy-weight-bold, 600);
2589
+ }
2590
+ .number {
2591
+ color: var(--roxy-accent-fg, #b45309);
2592
+ font-size: var(--roxy-text-sm, 0.875rem);
2593
+ font-weight: var(--roxy-weight-bold, 600);
2594
+ }
2595
+ .range {
2596
+ color: var(--roxy-muted, #71717a);
2597
+ font-size: var(--roxy-text-sm, 0.875rem);
2598
+ }
2599
+ .facts {
2600
+ display: grid;
2601
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
2602
+ gap: var(--roxy-space-sm, 0.5rem);
2603
+ }
2604
+ .fact {
2605
+ display: grid;
2606
+ gap: 2px;
2607
+ }
2608
+ .fact dt {
2609
+ color: var(--roxy-muted, #71717a);
2610
+ font-size: var(--roxy-text-xs, 0.75rem);
2611
+ text-transform: uppercase;
2612
+ letter-spacing: 0.05em;
2613
+ }
2614
+ .fact dd {
2615
+ margin: 0;
2616
+ color: var(--roxy-fg, #0a0a0a);
2617
+ font-size: var(--roxy-text-sm, 0.875rem);
2618
+ }
2619
+ .section h3 {
2620
+ margin: 0 0 var(--roxy-space-xs, 0.25rem);
2621
+ font-size: var(--roxy-text-sm, 0.875rem);
2622
+ font-weight: var(--roxy-weight-bold, 600);
2623
+ color: var(--roxy-muted, #71717a);
2624
+ text-transform: uppercase;
2625
+ letter-spacing: 0.05em;
2626
+ }
2627
+ .section p {
2628
+ margin: 0;
2629
+ font-size: var(--roxy-text-sm, 0.875rem);
2630
+ color: var(--roxy-fg, #0a0a0a);
2631
+ line-height: 1.5;
2632
+ }
2633
+ .remedies {
2634
+ display: grid;
2635
+ gap: var(--roxy-space-xs, 0.25rem);
2636
+ }
2637
+ .remedy {
2638
+ font-size: var(--roxy-text-sm, 0.875rem);
2639
+ color: var(--roxy-fg, #0a0a0a);
2640
+ }
2641
+ .remedy strong {
2642
+ color: var(--roxy-muted, #71717a);
2643
+ font-weight: var(--roxy-weight-bold, 600);
2644
+ }
2645
+ `],p([g({attribute:!1})],le.prototype,"data",2),le=p([f("roxy-nakshatra-card")],le);var vr=420,k=vr/2,ze=164,fr=146,Ne=120,_e=96,Ot=178,Ht=196,M=class extends u{constructor(){super(...arguments);this.data=null;this.houseSystem="placidus";this.view="wheel"}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 t`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],a=this.view;return t`<div class="wrap">
2646
+ <header>
2647
+ <h2 class="title">Natal chart</h2>
2648
+ ${this.data.birthDetails?t`<div class="meta">
2649
+ ${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}
2650
+ </div>`:n}
2651
+ </header>
2652
+ <div
2653
+ class="tablist"
2654
+ role="tablist"
2655
+ aria-label="Natal chart views"
2656
+ @keydown=${this.onTabKeyDown}
2657
+ >
2658
+ ${["wheel","grid"].map(o=>t`<button
2659
+ class="tab"
2660
+ role="tab"
2661
+ id="tab-${o}"
2662
+ aria-selected=${a===o?"true":"false"}
2663
+ aria-controls="panel-${o}"
2664
+ tabindex=${a===o?"0":"-1"}
2665
+ @click=${()=>{this.view=o}}
2666
+ >
2667
+ ${o==="wheel"?"Wheel":"Aspect grid"}
2668
+ </button>`)}
2669
+ </div>
2670
+ <div id="panel-${a}" role="tabpanel" aria-labelledby="tab-${a}">
2671
+ ${a==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}
2672
+ </div>
2673
+ <div class="legend">
2674
+ <span>${e.length} planets</span>
2675
+ <span>${r.length} aspects</span>
2676
+ ${this.data.houseSystem?t`<span>${this.data.houseSystem} houses</span>`:n}
2677
+ <span><span class="legend-swatch" style="background: var(--roxy-success)"></span>harmonious</span>
2678
+ <span><span class="legend-swatch" style="background: var(--roxy-danger)"></span>challenging</span>
2679
+ </div>
2680
+ ${this.renderDetails()}
2681
+ ${this.renderInterpretations()}
2682
+ </div>`}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.view=this.view==="wheel"?"grid":"wheel";let r=this.view;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}renderWheel(e,r){return t`<svg
2683
+ viewBox="0 0 ${vr} ${vr}"
2684
+ role="img"
2685
+ aria-label="Natal chart wheel with twelve houses, planets, and aspects"
2686
+ >
2687
+ <title>Natal chart wheel</title>
2688
+ <desc>
2689
+ Twelve zodiac sign segments around a circular wheel. Planet glyphs are
2690
+ placed at their ecliptic longitudes. Aspect lines connect related planets.
2691
+ </desc>
2692
+ <circle class="wheel-line" cx=${k} cy=${k} r=${ze} stroke-width="1.5" />
2693
+ <circle class="wheel-line" cx=${k} cy=${k} r=${fr-14} stroke-width="0.8" />
2694
+ <circle class="wheel-line" cx=${k} cy=${k} r=${Ne} stroke-width="1" />
2695
+ <circle class="wheel-line" cx=${k} cy=${k} r=${_e-16} stroke-width="0.5" />
2696
+ ${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()}
2697
+ ${this.renderHouseNumbers()} ${this.renderCuspDegrees()}
2698
+ ${this.renderAspects(e,r)} ${this.renderPlanets(e)}
2699
+ ${this.renderAngles()}
2700
+ </svg>`}renderAspectGrid(e,r){let a=e.map(l=>A(l.name)),o=new Map;for(let l of r){let d=[A(l.planet1),A(l.planet2)].sort().join("|");o.set(d,l)}return a.length===0?t`<p class="roxy-empty" role="status">No planets to grid</p>`:t`<div class="grid-scroll">
2701
+ <table class="aspect-grid" aria-label="Planet by planet aspect grid">
2702
+ <thead>
2703
+ <tr>
2704
+ <th></th>
2705
+ ${a.slice(0,-1).map(l=>{let d=L[l]??l.slice(0,2);return t`<th scope="col" title=${l}>${d}</th>`})}
2706
+ </tr>
2707
+ </thead>
2708
+ <tbody>
2709
+ ${a.slice(1).map((l,d)=>{let c=L[l]??l.slice(0,2);return t`<tr>
2710
+ <th scope="row" title=${l}>${c}</th>
2711
+ ${a.slice(0,d+1).map(m=>{let y=o.get([l,m].sort().join("|"));if(!y)return t`<td class="empty"></td>`;let h=we(y),b=mr[h]??mr[h.replace(/-/g,"")]??h.slice(0,3),E=Re[h]??"aspect-other",$=w(y.orb,1);return t`<td class=${`cell ${E}`} title=${`${l} ${h} ${m}${$?` (orb ${$}\xB0)`:""}`}>
2712
+ <span class="asp">${b}</span>
2713
+ </td>`})}
2714
+ ${a.slice(d+1,-1).map(()=>t`<td class="empty"></td>`)}
2715
+ </tr>`})}
2716
+ </tbody>
2717
+ </table>
2718
+ </div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),a=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(yr(e),"DSC")];r!==null&&(a.push(this.renderAngleMark(r,"MC")),a.push(this.renderAngleMark(yr(r),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&a.push(this.renderAngleMark(se(o),"PoF"));let l=this.data?.vertex?.longitude;return typeof l=="number"&&a.push(this.renderAngleMark(se(l),"Vtx")),a}renderAngleMark(e,r){let a=this.toAngle(e),o=P(k,k,ze,a),l=P(k,k,Ot,a),d=P(k,k,Ht,a);return S`
2719
+ <g>
2720
+ <line class="angle-tick" x1=${o.x} y1=${o.y} x2=${l.x} y2=${l.y} />
2721
+ <text class="angle-marker" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${r}</text>
2722
+ </g>
2723
+ `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(a=>a.longitude):Array.from({length:12},(a,o)=>this.getAscendant()+o*30)).map(a=>{let o=this.toAngle(a),l=P(k,k,Ne,o),d=P(k,k,ze,o);return S`<line class="wheel-line" x1=${l.x} y1=${l.y} x2=${d.x} y2=${d.y} stroke-width="0.8" />`})}renderSigns(){return _.map((e,r)=>{let a=this.toAngle(r*30+15),o=P(k,k,fr,a);return S`<text class="sign-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${N[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((a,o)=>{let l=e[(o+1)%12],d=Fr(a.longitude,l?l.longitude:a.longitude+30),c=P(k,k,Ne-12,this.toAngle(d));return S`<text class="house-num" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${a.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(a,o)=>{let l=this.toAngle(o*30+15),d=P(k,k,Ne-12,l),c=(o-r+12)%12+1;return S`<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 a=this.toAngle(r),o=r%30===0,l=o?fr-14:ze-5,d=P(k,k,l,a),c=P(k,k,ze,a);e.push(S`<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?n:e.map(r=>{let a=this.toAngle(r.longitude),o=P(k,k,Ne+9,a),l=ve(r.longitude);return S`<text class="cusp-deg" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${l.degree}°${String(l.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){return e.map(r=>{if(!Number.isFinite(r.longitude))return n;let a=this.toAngle(r.longitude),o=P(k,k,_e,a),l=P(k,k,_e-13,a),d=L[A(r.name)]??r.name.slice(0,2),c=ve(r.longitude),m=r.isRetrograde===!0,y=`${c.degree}\xB0${String(c.minute).padStart(2,"0")}'`;return S`<g>
2724
+ <text class="planet-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central"><title>${r.name}${m?" retrograde":""} - ${y} ${r.sign??""}</title>${d}</text>
2725
+ <text class="planet-deg" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${y}${m?S`<tspan class="retro"> ℞</tspan>`:n}</text>
2726
+ </g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return n;let a=e?.retrogradePlanets??[];return t`<div class="details">
2727
+ ${e?.dominantElement||e?.dominantModality?t`<div class="pill-row">
2728
+ ${e.dominantElement?t`<span class="pill">Dominant element: ${e.dominantElement}</span>`:n}
2729
+ ${e.dominantModality?t`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:n}
2730
+ </div>`:n}
2731
+ ${r?t`<div class="pill-row">
2732
+ <span class="pill pill--success">Harmonious ${r.harmonious}</span>
2733
+ <span class="pill pill--danger">Challenging ${r.challenging}</span>
2271
2734
  <span class="pill pill--muted">Neutral ${r.neutral}</span>
2272
2735
  </div>`:n}
2273
- ${s.length>0?t`<div class="pill-row">
2274
- ${s.map(m=>{let h=L[m]??m.slice(0,2);return t`<span class="pill pill--muted">${h} ${m} R</span>`})}
2736
+ ${a.length>0?t`<div class="pill-row">
2737
+ ${a.map(o=>{let l=L[o]??o.slice(0,2);return t`<span class="pill pill--muted">${l} ${o} R</span>`})}
2275
2738
  </div>`:n}
2276
2739
  ${r?.summary?t`<p class="summary">${r.summary}</p>`:n}
2277
- ${Object.keys(o).length>0||Object.keys(l).length>0?t`<div class="dist-grid">
2278
- ${Object.keys(o).length>0?t`<div class="dist-section">
2279
- <h3>Elements</h3>
2280
- ${Object.entries(o).map(([m,h])=>t`<div class="dist-row">
2281
- <span>${m}</span>
2282
- <div class="dist-bar"><span style="width: ${Math.round(h/d*100)}%"></span></div>
2283
- <span>${h}</span>
2284
- </div>`)}
2285
- </div>`:n}
2286
- ${Object.keys(l).length>0?t`<div class="dist-section">
2287
- <h3>Modalities</h3>
2288
- ${Object.entries(l).map(([m,h])=>t`<div class="dist-row">
2289
- <span>${m}</span>
2290
- <div class="dist-bar"><span style="width: ${Math.round(h/c*100)}%"></span></div>
2291
- <span>${h}</span>
2292
- </div>`)}
2293
- </div>`:n}
2294
- </div>`:n}
2295
- </div>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?n:t`<section class="interpretations">
2740
+ ${this.renderElementModalityGrid()}
2741
+ </div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return n;let r=["Fire","Earth","Air","Water"],a=["Cardinal","Fixed","Mutable"],o=_,l={};for(let d of r)l[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=a[c%3],h=L[A(d.name)]??A(d.name).slice(0,2);l[m]?.[y]?.push(h)}return t`<table class="em-grid" aria-label="Element and modality distribution">
2742
+ <thead>
2743
+ <tr>
2744
+ <th></th>
2745
+ ${a.map(d=>t`<th scope="col">${d.slice(0,3)}</th>`)}
2746
+ <th scope="col">Total</th>
2747
+ </tr>
2748
+ </thead>
2749
+ <tbody>
2750
+ ${r.map(d=>{let c=a.reduce((m,y)=>m+(l[d]?.[y]?.length??0),0);return t`<tr>
2751
+ <th scope="row">${d}</th>
2752
+ ${a.map(m=>t`<td>${(l[d]?.[m]??[]).join(" ")}</td>`)}
2753
+ <td class="em-total">${c}</td>
2754
+ </tr>`})}
2755
+ <tr>
2756
+ <th scope="row">Total</th>
2757
+ ${a.map(d=>t`<td class="em-total">${r.reduce((c,m)=>c+(l[m]?.[d]?.length??0),0)}</td>`)}
2758
+ <td class="em-total">${e.length}</td>
2759
+ </tr>
2760
+ </tbody>
2761
+ </table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?n:t`<section class="interpretations">
2296
2762
  <h3>Planet readings</h3>
2297
- ${e.map((r,s)=>{let o=r.interpretation,l=L[C(r.name)]??"",d=w(r.degree??0,1);return t`<details class="interp-card" name="natal-planet-readings" ?open=${s===0}>
2763
+ ${e.map((r,a)=>{let o=r.interpretation,l=L[A(r.name)]??"",d=w(r.degree??0,1);return t`<details class="interp-card" name="natal-planet-readings" ?open=${a===0}>
2298
2764
  <summary>${l} ${r.name} <small>${r.sign??""} ${d}</small></summary>
2299
2765
  <div class="interp-body">
2300
2766
  ${o.summary?t`<p class="interp-summary">${o.summary}</p>`:n}
@@ -2302,7 +2768,7 @@
2302
2768
  ${o.keywords?.length?t`<div class="interp-keywords">${o.keywords.map(c=>t`<span class="kw">${c}</span>`)}</div>`:n}
2303
2769
  </div>
2304
2770
  </details>`})}
2305
- </section>`}renderAspects(e,r){let s=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let l=C(o.name);l&&s.set(l,o.longitude)}return r.map(o=>{let l=s.get(C(o.planet1)),d=s.get(C(o.planet2));if(l===void 0||d===void 0)return n;let c=R(A,A,je-18,this.toAngle(l)),m=R(A,A,je-18,this.toAngle(d)),h=ke(o),g=Ne[h]??"aspect-other",f=w(o.orb,1);return S`<line class=${`aspect ${g}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${h||""} ${o.planet2}${f?` (orb ${f}\xB0)`:""}</title></line>`})}};K.styles=[b,x`
2771
+ </section>`}renderAspects(e,r){let a=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let l=A(o.name);l&&a.set(l,o.longitude)}return r.map(o=>{let l=a.get(A(o.planet1)),d=a.get(A(o.planet2));if(l===void 0||d===void 0)return n;let c=P(k,k,_e-18,this.toAngle(l)),m=P(k,k,_e-18,this.toAngle(d)),y=we(o),h=Re[y]??"aspect-other",b=w(o.orb,1);return S`<line class=${`aspect ${h}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${y||""} ${o.planet2}${b?` (orb ${b}\xB0)`:""}</title></line>`})}};M.styles=[v,x`
2306
2772
  .wrap {
2307
2773
  width: 100%;
2308
2774
  display: grid;
@@ -2347,12 +2813,35 @@
2347
2813
  font-family: var(--roxy-font-sans);
2348
2814
  }
2349
2815
 
2816
+ .planet-deg {
2817
+ fill: var(--roxy-fg, #0a0a0a);
2818
+ font-size: 7px;
2819
+ font-family: var(--roxy-font-sans);
2820
+ }
2821
+
2822
+ .planet-deg .retro {
2823
+ fill: var(--roxy-danger, #dc2626);
2824
+ }
2825
+
2350
2826
  .house-num {
2351
2827
  fill: var(--roxy-muted, #71717a);
2352
2828
  font-size: 9px;
2353
2829
  font-family: var(--roxy-font-sans);
2354
2830
  }
2355
2831
 
2832
+ .cusp-deg {
2833
+ fill: var(--roxy-muted, #71717a);
2834
+ font-size: 6px;
2835
+ font-family: var(--roxy-font-sans);
2836
+ }
2837
+
2838
+ .tick {
2839
+ stroke: var(--roxy-border, #e4e4e7);
2840
+ }
2841
+ .tick-major {
2842
+ stroke: var(--roxy-secondary, #475569);
2843
+ }
2844
+
2356
2845
  .aspect {
2357
2846
  stroke-width: 0.8;
2358
2847
  fill: none;
@@ -2402,6 +2891,78 @@
2402
2891
  vertical-align: middle;
2403
2892
  }
2404
2893
 
2894
+ .tablist {
2895
+ display: flex;
2896
+ gap: 2px;
2897
+ border-bottom: 2px solid var(--roxy-border, #e4e4e7);
2898
+ }
2899
+ .tab {
2900
+ padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
2901
+ font-size: var(--roxy-text-sm, 0.875rem);
2902
+ background: none;
2903
+ border: none;
2904
+ border-bottom: 2px solid transparent;
2905
+ margin-bottom: -2px;
2906
+ cursor: pointer;
2907
+ color: var(--roxy-muted, #71717a);
2908
+ font-family: inherit;
2909
+ transition: color var(--roxy-motion-duration, 200ms) var(--roxy-motion-easing, ease);
2910
+ }
2911
+ .tab[aria-selected='true'] {
2912
+ color: var(--roxy-accent-fg, #b45309);
2913
+ border-bottom-color: var(--roxy-accent, #f59e0b);
2914
+ font-weight: var(--roxy-weight-bold, 600);
2915
+ }
2916
+ .tab:hover:not([aria-selected='true']) {
2917
+ color: var(--roxy-fg, #0a0a0a);
2918
+ }
2919
+
2920
+ .grid-scroll {
2921
+ overflow-x: auto;
2922
+ -webkit-overflow-scrolling: touch;
2923
+ }
2924
+ table.aspect-grid {
2925
+ border-collapse: collapse;
2926
+ font-size: var(--roxy-text-xs, 0.75rem);
2927
+ margin: 0 auto;
2928
+ }
2929
+ table.aspect-grid th,
2930
+ table.aspect-grid td {
2931
+ width: 1.6rem;
2932
+ height: 1.6rem;
2933
+ text-align: center;
2934
+ border: 1px solid var(--roxy-border, #e4e4e7);
2935
+ padding: 0;
2936
+ }
2937
+ table.aspect-grid th {
2938
+ color: var(--roxy-secondary, #475569);
2939
+ font-weight: var(--roxy-weight-bold, 600);
2940
+ }
2941
+ table.aspect-grid td.cell {
2942
+ cursor: default;
2943
+ }
2944
+ table.aspect-grid td.empty {
2945
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 18%, transparent);
2946
+ }
2947
+ table.aspect-grid td .asp {
2948
+ font-size: 0.95em;
2949
+ line-height: 1;
2950
+ }
2951
+ table.aspect-grid td.aspect-trine .asp,
2952
+ table.aspect-grid td.aspect-sextile .asp {
2953
+ color: var(--roxy-success, #16a34a);
2954
+ }
2955
+ table.aspect-grid td.aspect-square .asp,
2956
+ table.aspect-grid td.aspect-opposition .asp {
2957
+ color: var(--roxy-danger, #dc2626);
2958
+ }
2959
+ table.aspect-grid td.aspect-conjunction .asp {
2960
+ color: var(--roxy-accent-fg, #b45309);
2961
+ }
2962
+ table.aspect-grid td.aspect-other .asp {
2963
+ color: var(--roxy-muted, #71717a);
2964
+ }
2965
+
2405
2966
  .details {
2406
2967
  margin-top: var(--roxy-space-md, 1rem);
2407
2968
  }
@@ -2442,48 +3003,37 @@
2442
3003
  margin: var(--roxy-space-md, 1rem) 0;
2443
3004
  }
2444
3005
 
2445
- .dist-grid {
2446
- display: grid;
2447
- grid-template-columns: 1fr 1fr;
2448
- gap: var(--roxy-space-md, 1rem);
3006
+ .em-grid {
3007
+ border-collapse: collapse;
3008
+ font-size: var(--roxy-text-xs, 0.75rem);
3009
+ width: 100%;
2449
3010
  }
2450
-
2451
- @container (max-width: 639px) {
2452
- .dist-grid {
2453
- grid-template-columns: 1fr;
2454
- }
3011
+ .em-grid th,
3012
+ .em-grid td {
3013
+ border: 1px solid var(--roxy-border, #e4e4e7);
3014
+ padding: 3px 5px;
3015
+ text-align: center;
3016
+ vertical-align: middle;
2455
3017
  }
2456
-
2457
- .dist-section h3 {
2458
- font-size: var(--roxy-text-xs, 0.75rem);
2459
- font-weight: var(--roxy-weight-bold, 600);
3018
+ .em-grid th {
2460
3019
  color: var(--roxy-muted, #71717a);
2461
- margin: 0 0 var(--roxy-space-xs, 0.25rem);
3020
+ font-weight: var(--roxy-weight-bold, 600);
2462
3021
  text-transform: uppercase;
2463
- letter-spacing: 0.05em;
3022
+ letter-spacing: 0.04em;
2464
3023
  }
2465
-
2466
- .dist-row {
2467
- display: grid;
2468
- grid-template-columns: 4rem 1fr 1.5rem;
2469
- align-items: center;
2470
- gap: var(--roxy-space-xs, 0.25rem);
2471
- font-size: var(--roxy-text-xs, 0.75rem);
2472
- color: var(--roxy-fg, #0f172a);
2473
- margin-bottom: 4px;
3024
+ .em-grid th[scope='row'] {
3025
+ text-align: left;
2474
3026
  }
2475
-
2476
- .dist-bar {
2477
- background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 20%, transparent);
2478
- height: 6px;
2479
- border-radius: 3px;
3027
+ .em-grid td {
3028
+ color: var(--roxy-accent, #f59e0b);
3029
+ font-size: 0.95em;
3030
+ line-height: 1.4;
3031
+ min-width: 1.4rem;
2480
3032
  }
2481
-
2482
- .dist-bar > span {
2483
- display: block;
2484
- height: 100%;
2485
- background: var(--roxy-accent, #f59e0b);
2486
- border-radius: 3px;
3033
+ .em-grid .em-total {
3034
+ color: var(--roxy-fg, #0a0a0a);
3035
+ font-weight: var(--roxy-weight-bold, 600);
3036
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 25%, transparent);
2487
3037
  }
2488
3038
 
2489
3039
  .interpretations {
@@ -2531,7 +3081,7 @@
2531
3081
  color: var(--roxy-accent-fg, #b45309);
2532
3082
  font-size: var(--roxy-text-xs, 0.75rem);
2533
3083
  }
2534
- `],p([y({attribute:!1})],K.prototype,"data",2),p([y({type:String,attribute:"house-system",reflect:!0})],K.prototype,"houseSystem",2),K=p([v("roxy-natal-chart")],K);var V=class extends u{constructor(){super(...arguments);this.data=null;this.type="life-path"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No numerology data</div>`;let r=$t[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 s=e.meaning?.keywords??[];return t`<article class="card" aria-label=${r}>
3084
+ `],p([g({attribute:!1})],M.prototype,"data",2),p([g({type:String,attribute:"house-system",reflect:!0})],M.prototype,"houseSystem",2),p([C()],M.prototype,"view",2),M=p([f("roxy-natal-chart")],M);var W=class extends u{constructor(){super(...arguments);this.data=null;this.type="life-path"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No numerology data</div>`;let r=Gt[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 a=e.meaning?.keywords??[];return t`<article class="card" aria-label=${r}>
2535
3085
  <div class="hero">
2536
3086
  ${typeof e.number=="number"?t`<div class="numeral">${e.number}</div>`:n}
2537
3087
  <div>
@@ -2541,12 +3091,12 @@
2541
3091
  </div>
2542
3092
  ${e.meaning?.description?t`<p class="meaning">${e.meaning.description}</p>`:n}
2543
3093
  ${e.calculation?t`<pre class="calc">${e.calculation}</pre>`:n}
2544
- ${s.length>0?t`<div class="chips">
2545
- ${s.map(o=>t`<span>${o}</span>`)}
3094
+ ${a.length>0?t`<div class="chips">
3095
+ ${a.map(o=>t`<span>${o}</span>`)}
2546
3096
  </div>`:n}
2547
3097
  ${e.hasKarmicDebt&&e.karmicDebtNumber?t`<div class="karmic">
2548
3098
  Karmic debt ${e.karmicDebtNumber}.
2549
- ${wt(e.karmicDebtMeaning)}
3099
+ ${jt(e.karmicDebtMeaning)}
2550
3100
  </div>`:n}
2551
3101
  </article>`}renderPersonalYear(e,r){return t`<article class="card" aria-label=${r}>
2552
3102
  <div class="hero">
@@ -2558,18 +3108,18 @@
2558
3108
  </div>
2559
3109
  ${e.forecast?t`<p class="meaning">${e.forecast}</p>`:n}
2560
3110
  ${e.advice?t`<p>${e.advice}</p>`:n}
2561
- </article>`}renderChart(e,r){let s=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return t`<article class="card" aria-label=${r}>
3111
+ </article>`}renderChart(e,r){let a=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return t`<article class="card" aria-label=${r}>
2562
3112
  <div>
2563
3113
  <p class="label">${r}</p>
2564
3114
  ${e.profile?.name?t`<h2 class="title">${e.profile.name}</h2>`:n}
2565
3115
  </div>
2566
- ${s.length>0?t`<div class="cores">
2567
- ${s.map(([o,l])=>t`<div class="item">
2568
- <span>${ee(o)}</span>
3116
+ ${a.length>0?t`<div class="cores">
3117
+ ${a.map(([o,l])=>t`<div class="item">
3118
+ <span>${te(o)}</span>
2569
3119
  <strong>${l.number??""}</strong>
2570
3120
  </div>`)}
2571
3121
  </div>`:n}
2572
- </article>`}};V.styles=[b,x`
3122
+ </article>`}};W.styles=[v,x`
2573
3123
  .card {
2574
3124
  background: var(--roxy-bg, #fff);
2575
3125
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -2665,32 +3215,32 @@
2665
3215
  font-size: var(--roxy-text-sm, 0.875rem);
2666
3216
  color: var(--roxy-fg, #0a0a0a);
2667
3217
  }
2668
- `],p([y({attribute:!1})],V.prototype,"data",2),p([y({type:String,reflect:!0})],V.prototype,"type",2),V=p([v("roxy-numerology-card")],V);var $t={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function wt(i){return i?[i.description,i.challenge,i.resolution].filter(Boolean).join(" "):""}var F=class extends u{constructor(){super(...arguments);this.data=null;this.detail="detailed"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,s=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&s.push(["Vara",this.formatPart(r.vara)]);let o=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]]:[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[];return t`<div class="wrap" aria-label="Panchang">
3218
+ `],p([g({attribute:!1})],W.prototype,"data",2),p([g({type:String,reflect:!0})],W.prototype,"type",2),W=p([f("roxy-numerology-card")],W);var Gt={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function jt(i){return i?[i.description,i.challenge,i.resolution].filter(Boolean).join(" "):""}var J=class extends u{constructor(){super(...arguments);this.data=null;this.detail="detailed"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,a=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&a.push(["Vara",this.formatPart(r.vara)]);let o=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]]:[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[];return t`<div class="wrap" aria-label="Panchang">
2669
3219
  <header class="head">
2670
3220
  <h2 class="title">Panchang</h2>
2671
- <span class="date">${r?ze(r.date):""}</span>
3221
+ <span class="date">${r?Ke(r.date):""}</span>
2672
3222
  </header>
2673
3223
  <table>
2674
3224
  <tbody>
2675
- ${s.map(([d,c])=>t`<tr>
3225
+ ${a.map(([d,c])=>t`<tr>
2676
3226
  <th>${d}</th>
2677
3227
  <td>${c}</td>
2678
3228
  </tr>`)}
2679
3229
  ${r?.sunrise?t`<tr>
2680
3230
  <th>Sunrise</th>
2681
- <td>${O(r.sunrise)}</td>
3231
+ <td>${G(r.sunrise)}</td>
2682
3232
  </tr>`:n}
2683
3233
  ${r?.sunset?t`<tr>
2684
3234
  <th>Sunset</th>
2685
- <td>${O(r.sunset)}</td>
3235
+ <td>${G(r.sunset)}</td>
2686
3236
  </tr>`:n}
2687
3237
  ${r?.moonrise?t`<tr>
2688
3238
  <th>Moonrise</th>
2689
- <td>${O(r.moonrise)}</td>
3239
+ <td>${G(r.moonrise)}</td>
2690
3240
  </tr>`:n}
2691
3241
  ${r?.moonset?t`<tr>
2692
3242
  <th>Moonset</th>
2693
- <td>${O(r.moonset)}</td>
3243
+ <td>${G(r.moonset)}</td>
2694
3244
  </tr>`:n}
2695
3245
  </tbody>
2696
3246
  </table>
@@ -2700,7 +3250,7 @@
2700
3250
  <tbody>
2701
3251
  ${o.filter(([,d])=>!!d).map(([d,c])=>t`<tr>
2702
3252
  <th>${d}</th>
2703
- <td>${ar(c)}</td>
3253
+ <td>${gr(c)}</td>
2704
3254
  </tr>`)}
2705
3255
  </tbody>
2706
3256
  </table>
@@ -2709,12 +3259,12 @@
2709
3259
  <tbody>
2710
3260
  ${l.filter(([,d])=>!!d).map(([d,c])=>t`<tr>
2711
3261
  <th>${d}</th>
2712
- <td>${ar(c)}</td>
3262
+ <td>${gr(c)}</td>
2713
3263
  </tr>`)}
2714
3264
  </tbody>
2715
3265
  </table>
2716
3266
  `:n}
2717
- </div>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.lord?`(${r.lord})`:"",r.phase].filter(Boolean).join(" ")}return String(e)}};F.styles=[b,x`
3267
+ </div>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.lord?`(${r.lord})`:"",r.phase].filter(Boolean).join(" ")}return String(e)}};J.styles=[v,x`
2718
3268
  .wrap {
2719
3269
  border: 1px solid var(--roxy-border, #e4e4e7);
2720
3270
  border-radius: var(--roxy-radius-md, 8px);
@@ -2772,7 +3322,7 @@
2772
3322
  text-transform: uppercase;
2773
3323
  letter-spacing: 0.06em;
2774
3324
  }
2775
- `],p([y({attribute:!1})],F.prototype,"data",2),p([y({type:String,reflect:!0})],F.prototype,"detail",2),F=p([v("roxy-panchang-table")],F);var lr=[{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 u{constructor(){super(...arguments);this.data=null}render(){if(!this.data?.planets?.length)return t`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,s)=>r.relativeRank-s.relativeRank);return t`<div class="wrap" aria-label="Shadbala planetary strength">
3325
+ `],p([g({attribute:!1})],J.prototype,"data",2),p([g({type:String,reflect:!0})],J.prototype,"detail",2),J=p([f("roxy-panchang-table")],J);var br=[{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)"}],de=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data?.planets?.length)return t`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,a)=>r.relativeRank-a.relativeRank);return t`<div class="wrap" aria-label="Shadbala planetary strength">
2776
3326
  <div class="head">
2777
3327
  <h2 class="title">Shadbala</h2>
2778
3328
  <p class="subtitle">${e.length} planets ranked by strength</p>
@@ -2783,7 +3333,7 @@
2783
3333
  </div>
2784
3334
 
2785
3335
  <div class="legend" aria-label="Strength component legend">
2786
- ${lr.map(r=>t`<div class="legend-row">
3336
+ ${br.map(r=>t`<div class="legend-row">
2787
3337
  <span
2788
3338
  class="legend-swatch"
2789
3339
  style="background: ${r.color}"
@@ -2792,7 +3342,7 @@
2792
3342
  ${r.label}
2793
3343
  </div>`)}
2794
3344
  </div>
2795
- </div>`}renderPlanetRow(e){let r=L[C(e.planet)]??"",s=lr.map(h=>Math.max(0,e[h.key])),o=s.reduce((h,g)=>h+g,0),l=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,d=l?"adequacy-badge--adequate":"adequacy-badge--weak",c=l?"adequate":"weak",m=w(e.totalRupas,2)&&w(e.minRequired,2)?`${w(e.totalRupas,2)} / ${w(e.minRequired,2)} R`:"";return t`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala">
3345
+ </div>`}renderPlanetRow(e){let r=L[A(e.planet)]??"",a=br.map(y=>Math.max(0,e[y.key])),o=a.reduce((y,h)=>y+h,0),l=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,d=l?"adequacy-badge--adequate":"adequacy-badge--weak",c=l?"adequate":"weak",m=w(e.totalRupas,2)&&w(e.minRequired,2)?`${w(e.totalRupas,2)} / ${w(e.minRequired,2)} R`:"";return t`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala">
2796
3346
  <div class="planet-label">
2797
3347
  <span class="glyph" aria-hidden="true">${r}</span>
2798
3348
  ${e.planet}
@@ -2800,10 +3350,10 @@
2800
3350
  </div>
2801
3351
  <div class="bar-wrap">
2802
3352
  <div class="bar" role="img" aria-label="Strength components for ${e.planet}">
2803
- ${o>0?lr.map((h,g)=>{let f=s[g];if(f<=0)return n;let k=f/o*100;return t`<div
3353
+ ${o>0?br.map((y,h)=>{let b=a[h];if(b<=0)return n;let E=b/o*100;return t`<div
2804
3354
  class="bar-segment"
2805
- style="flex-grow: ${k}; background: ${h.color};"
2806
- title="${h.label}: ${w(f,1)}"
3355
+ style="flex-grow: ${E}; background: ${y.color};"
3356
+ title="${y.label}: ${w(b,1)}"
2807
3357
  ></div>`}):n}
2808
3358
  </div>
2809
3359
  </div>
@@ -2811,7 +3361,7 @@
2811
3361
  ${m?t`<span class="rupas-label">${m}</span>`:n}
2812
3362
  <span class="${`adequacy-badge ${d}`}">${c}</span>
2813
3363
  </div>
2814
- </div>`}};se.styles=[b,x`
3364
+ </div>`}};de.styles=[v,x`
2815
3365
  .wrap {
2816
3366
  display: grid;
2817
3367
  gap: var(--roxy-space-md, 1rem);
@@ -2957,7 +3507,7 @@
2957
3507
  justify-content: flex-start;
2958
3508
  }
2959
3509
  }
2960
- `],p([y({attribute:!1})],se.prototype,"data",2),se=p([v("roxy-shadbala-table")],se);var dr=360,P=dr/2,Dr=170,kt=154,Or=124,Se=96,oe=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:s,analysis:o}=this.data,l=this.data.interAspects??[],d=e?.planets??[],c=r?.planets??[],m=typeof s=="number"?Math.round(s):void 0,h=o?.overall,g=o?.strengths??[],f=o?.challenges??[];return d.length>0&&c.length>0?t`<div
3510
+ `],p([g({attribute:!1})],de.prototype,"data",2),de=p([f("roxy-shadbala-table")],de);var $r=360,T=$r/2,Jr=170,It=154,Xr=124,Me=96,ce=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:a,analysis:o}=this.data,l=this.data.interAspects??[],d=e?.planets??[],c=r?.planets??[],m=typeof a=="number"?Math.round(a):void 0,y=o?.overall,h=o?.strengths??[],b=o?.challenges??[];return d.length>0&&c.length>0?t`<div
2961
3511
  class="wrap"
2962
3512
  aria-label="Synastry compatibility chart"
2963
3513
  >
@@ -2968,35 +3518,35 @@
2968
3518
  >`:n}
2969
3519
  </div>
2970
3520
  <svg
2971
- viewBox="0 0 ${dr} ${dr}"
3521
+ viewBox="0 0 ${$r} ${$r}"
2972
3522
  role="img"
2973
3523
  aria-label="Dual chart wheel comparing two natal charts"
2974
3524
  >
2975
3525
  <title>Synastry dual wheel</title>
2976
3526
  <circle
2977
3527
  class="wheel-line"
2978
- cx=${P}
2979
- cy=${P}
2980
- r=${Dr}
3528
+ cx=${T}
3529
+ cy=${T}
3530
+ r=${Jr}
2981
3531
  stroke-width="1.5"
2982
3532
  />
2983
3533
  <circle
2984
3534
  class="wheel-line"
2985
- cx=${P}
2986
- cy=${P}
2987
- r=${Se+14}
3535
+ cx=${T}
3536
+ cy=${T}
3537
+ r=${Me+14}
2988
3538
  stroke-width="0.8"
2989
3539
  />
2990
3540
  <circle
2991
3541
  class="wheel-line"
2992
- cx=${P}
2993
- cy=${P}
2994
- r=${Se-14}
3542
+ cx=${T}
3543
+ cy=${T}
3544
+ r=${Me-14}
2995
3545
  stroke-width="0.6"
2996
3546
  />
2997
3547
  ${this.renderSpokes()} ${this.renderSigns()}
2998
3548
  ${this.renderInterAspectLines(d,c,l)}
2999
- ${this.renderRing(d,Or,"p1")} ${this.renderRing(c,Se,"p2")}
3549
+ ${this.renderRing(d,Xr,"p1")} ${this.renderRing(c,Me,"p2")}
3000
3550
  </svg>
3001
3551
  <div class="legend-row">
3002
3552
  <span><span class="swatch" style="background: var(--roxy-accent)"></span>Person 1</span>
@@ -3004,19 +3554,19 @@
3004
3554
  <span><span class="swatch" style="background: var(--roxy-success)"></span>harmonious</span>
3005
3555
  <span><span class="swatch" style="background: var(--roxy-danger)"></span>challenging</span>
3006
3556
  </div>
3007
- ${h?t`<p class="summary">${h}</p>`:n}
3557
+ ${y?t`<p class="summary">${y}</p>`:n}
3008
3558
  ${l.length>0?this.renderAspects(l):n}
3009
- ${g.length>0||f.length>0?t`<div class="lists">
3010
- ${g.length?t`<div>
3559
+ ${h.length>0||b.length>0?t`<div class="lists">
3560
+ ${h.length?t`<div>
3011
3561
  <h3>Strengths</h3>
3012
3562
  <ul>
3013
- ${g.map($=>t`<li>${$}</li>`)}
3563
+ ${h.map($=>t`<li>${$}</li>`)}
3014
3564
  </ul>
3015
3565
  </div>`:n}
3016
- ${f.length?t`<div>
3566
+ ${b.length?t`<div>
3017
3567
  <h3>Challenges</h3>
3018
3568
  <ul>
3019
- ${f.map($=>t`<li>${$}</li>`)}
3569
+ ${b.map($=>t`<li>${$}</li>`)}
3020
3570
  </ul>
3021
3571
  </div>`:n}
3022
3572
  </div>`:n}
@@ -3036,23 +3586,23 @@
3036
3586
  <code>person2.planets</code> arrays from the natal-chart endpoint, or
3037
3587
  use the <code>&lt;roxy-data&gt;</code> fallback.
3038
3588
  </div>
3039
- ${h?t`<p class="summary">${h}</p>`:n}
3589
+ ${y?t`<p class="summary">${y}</p>`:n}
3040
3590
  ${l.length>0?this.renderAspects(l):n}
3041
- ${g.length>0||f.length>0?t`<div class="lists">
3042
- ${g.length?t`<div>
3591
+ ${h.length>0||b.length>0?t`<div class="lists">
3592
+ ${h.length?t`<div>
3043
3593
  <h3>Strengths</h3>
3044
3594
  <ul>
3045
- ${g.map($=>t`<li>${$}</li>`)}
3595
+ ${h.map($=>t`<li>${$}</li>`)}
3046
3596
  </ul>
3047
3597
  </div>`:n}
3048
- ${f.length?t`<div>
3598
+ ${b.length?t`<div>
3049
3599
  <h3>Challenges</h3>
3050
3600
  <ul>
3051
- ${f.map($=>t`<li>${$}</li>`)}
3601
+ ${b.map($=>t`<li>${$}</li>`)}
3052
3602
  </ul>
3053
3603
  </div>`:n}
3054
3604
  </div>`:n}
3055
- </div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let s=this.toAngle(r*30),o=R(P,P,Se-14,s),l=R(P,P,Dr,s);return S`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${l.x} y2=${l.y} stroke-width="0.6" />`})}renderSigns(){return pe.map((e,r)=>{let s=this.toAngle(r*30+15),o=R(P,P,kt,s);return S`<text class="sign" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${z[e]}</text>`})}renderRing(e,r,s){return e.map(o=>{if(!Number.isFinite(o.longitude))return n;let l=R(P,P,r,this.toAngle(o.longitude)),d=L[C(o.name)]??o.name.slice(0,2);return S`<text class=${s} x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}</title>${d}</text>`})}renderInterAspectLines(e,r,s){let o=(l,d)=>{let c=C(d);for(let m of l)if(C(m.name)===c&&typeof m.longitude=="number")return m.longitude};return s.map(l=>{let d=o(e,l.planet1),c=o(r,l.planet2);if(d===void 0||c===void 0)return n;let m=R(P,P,Or-12,this.toAngle(d)),h=R(P,P,Se+8,this.toAngle(c)),g=ke(l),f=Ne[g]??"aspect-other",k=w(l.orb,1);return S`<line class=${`aspect ${f}`} x1=${m.x} y1=${m.y} x2=${h.x} y2=${h.y}><title>${l.planet1} ${g} ${l.planet2}${k?` (orb ${k}\xB0)`:""}</title></line>`})}renderAspects(e){return t`<table>
3605
+ </div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let a=this.toAngle(r*30),o=P(T,T,Me-14,a),l=P(T,T,Jr,a);return S`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${l.x} y2=${l.y} stroke-width="0.6" />`})}renderSigns(){return _.map((e,r)=>{let a=this.toAngle(r*30+15),o=P(T,T,It,a);return S`<text class="sign" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${N[e]}</text>`})}renderRing(e,r,a){return e.map(o=>{if(!Number.isFinite(o.longitude))return n;let l=P(T,T,r,this.toAngle(o.longitude)),d=L[A(o.name)]??o.name.slice(0,2);return S`<text class=${a} x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}</title>${d}</text>`})}renderInterAspectLines(e,r,a){let o=(l,d)=>{let c=A(d);for(let m of l)if(A(m.name)===c&&typeof m.longitude=="number")return m.longitude};return a.map(l=>{let d=o(e,l.planet1),c=o(r,l.planet2);if(d===void 0||c===void 0)return n;let m=P(T,T,Xr-12,this.toAngle(d)),y=P(T,T,Me+8,this.toAngle(c)),h=we(l),b=Re[h]??"aspect-other",E=w(l.orb,1);return S`<line class=${`aspect ${b}`} x1=${m.x} y1=${m.y} x2=${y.x} y2=${y.y}><title>${l.planet1} ${h} ${l.planet2}${E?` (orb ${E}\xB0)`:""}</title></line>`})}renderAspects(e){return t`<table>
3056
3606
  <thead>
3057
3607
  <tr>
3058
3608
  <th>Planet 1</th>
@@ -3066,12 +3616,12 @@
3066
3616
  ${e.slice(0,12).map(r=>t`<tr>
3067
3617
  <td>${r.planet1}</td>
3068
3618
  <td>${r.planet2}</td>
3069
- <td>${ke(r)||""}</td>
3619
+ <td>${we(r)||""}</td>
3070
3620
  <td class="orb">${w(r.orb,1)}</td>
3071
- <td>${St(r.strength)}</td>
3621
+ <td>${Bt(r.strength)}</td>
3072
3622
  </tr>`)}
3073
3623
  </tbody>
3074
- </table>`}};oe.styles=[b,x`
3624
+ </table>`}};ce.styles=[v,x`
3075
3625
  .wrap {
3076
3626
  display: grid;
3077
3627
  gap: var(--roxy-space-md, 1rem);
@@ -3223,17 +3773,17 @@
3223
3773
  padding: 0 4px;
3224
3774
  border-radius: 4px;
3225
3775
  }
3226
- `],p([y({attribute:!1})],oe.prototype,"data",2),oe=p([v("roxy-synastry-chart")],oe);function St(i){return typeof i=="number"?Math.round(i).toString():""}var W=class extends u{constructor(){super(...arguments);this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):t`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,s=this.flipped!==!!r.reversed,o=r.keywords??[];return t`<article class="card" aria-label=${r.name??"Tarot card"}>
3776
+ `],p([g({attribute:!1})],ce.prototype,"data",2),ce=p([f("roxy-synastry-chart")],ce);function Bt(i){return typeof i=="number"?Math.round(i).toString():""}var X=class extends u{constructor(){super(...arguments);this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):t`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,a=this.flipped!==!!r.reversed,o=r.keywords??[];return t`<article class="card" aria-label=${r.name??"Tarot card"}>
3227
3777
  <div class="image-wrap">
3228
3778
  ${r.imageUrl?t`<img
3229
- class=${`image ${s?"reversed":""}`}
3779
+ class=${`image ${a?"reversed":""}`}
3230
3780
  src=${r.imageUrl}
3231
3781
  alt=${r.name??"Tarot card"}
3232
3782
  tabindex="0"
3233
3783
  @click=${this.toggleFlip}
3234
3784
  @keydown=${l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),this.toggleFlip())}}
3235
3785
  />`:t`<div
3236
- class=${`image ${s?"reversed":""}`}
3786
+ class=${`image ${a?"reversed":""}`}
3237
3787
  style="aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)"
3238
3788
  >
3239
3789
  ${r.name??"?"}
@@ -3242,7 +3792,7 @@
3242
3792
  <div>
3243
3793
  <div class="meta">
3244
3794
  ${r.arcana?t`${r.arcana} arcana`:n}
3245
- ${s?t` · reversed`:n}
3795
+ ${a?t` · reversed`:n}
3246
3796
  </div>
3247
3797
  <h2 class="title">${r.name??"Tarot card"}</h2>
3248
3798
  ${e.dailyMessage?t`<p class="message">${e.dailyMessage}</p>`:n}
@@ -3259,7 +3809,7 @@
3259
3809
  Flip card
3260
3810
  </button>
3261
3811
  </div>
3262
- </article>`}renderFullCard(e){let r=this.flipped,s=r?e.reversed:e.upright,o=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return t`<article class="card" aria-label=${e.name??"Tarot card"}>
3812
+ </article>`}renderFullCard(e){let r=this.flipped,a=r?e.reversed:e.upright,o=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return t`<article class="card" aria-label=${e.name??"Tarot card"}>
3263
3813
  <div class="image-wrap">
3264
3814
  ${e.imageUrl?t`<img
3265
3815
  class=${`image ${r?"reversed":""}`}
@@ -3282,7 +3832,7 @@
3282
3832
  ${r?t` · reversed`:n}
3283
3833
  </div>
3284
3834
  <h2 class="title">${e.name??"Tarot card"}</h2>
3285
- ${s?.description?t`<p>${s.description}</p>`:n}
3835
+ ${a?.description?t`<p>${a.description}</p>`:n}
3286
3836
  ${o.length>0?t`<div class="chips">
3287
3837
  ${o.map(l=>t`<span>${l}</span>`)}
3288
3838
  </div>`:n}
@@ -3295,7 +3845,7 @@
3295
3845
  Flip card
3296
3846
  </button>
3297
3847
  </div>
3298
- </article>`}};W.styles=[b,x`
3848
+ </article>`}};X.styles=[v,x`
3299
3849
  .card {
3300
3850
  background: var(--roxy-bg, #fff);
3301
3851
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -3385,13 +3935,13 @@
3385
3935
  .flip:hover {
3386
3936
  transform: scale(1.02);
3387
3937
  }
3388
- `],p([y({attribute:!1})],W.prototype,"data",2),p([E()],W.prototype,"flipped",2),W=p([v("roxy-tarot-card")],W);var J=class extends u{constructor(){super(...arguments);this.data=null;this.spread="three-card"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,s="cards"in e&&!("spread"in e),o=s?[]:"positions"in e?e.positions??[]:[],l=s&&"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," "),h="question"in e?e.question:void 0,g="summary"in e?e.summary:void 0,f=r?e.interpretation:void 0,k=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return t`<article class="wrap" aria-label="Tarot spread">
3938
+ `],p([g({attribute:!1})],X.prototype,"data",2),p([C()],X.prototype,"flipped",2),X=p([f("roxy-tarot-card")],X);var Z=class extends u{constructor(){super(...arguments);this.data=null;this.spread="three-card"}render(){let e=this.data;if(!e)return t`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,a="cards"in e&&!("spread"in e),o=a?[]:"positions"in e?e.positions??[]:[],l=a&&"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,h="summary"in e?e.summary:void 0,b=r?e.interpretation:void 0,E=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return t`<article class="wrap" aria-label="Tarot spread">
3389
3939
  <header class="head">
3390
3940
  <h2 class="title">${m}</h2>
3391
- ${h?t`<span class="question">"${h}"</span>`:n}
3941
+ ${y?t`<span class="question">"${y}"</span>`:n}
3392
3942
  </header>
3393
3943
  ${r?t`<div>
3394
- <span class=${`answer ${k}`}>${d}</span>
3944
+ <span class=${`answer ${E}`}>${d}</span>
3395
3945
  ${c?t`<small> · ${c}</small>`:n}
3396
3946
  </div>`:n}
3397
3947
  ${o.length>0?t`<div class="grid">
@@ -3427,9 +3977,9 @@
3427
3977
  ${$.meaning?t`<p class="interp">${$.meaning}</p>`:n}
3428
3978
  </div>`)}
3429
3979
  </div>`:n}
3430
- ${g?t`<p class="reading">${g}</p>`:n}
3431
- ${f?t`<p class="reading">${f}</p>`:n}
3432
- </article>`}};J.styles=[b,x`
3980
+ ${h?t`<p class="reading">${h}</p>`:n}
3981
+ ${b?t`<p class="reading">${b}</p>`:n}
3982
+ </article>`}};Z.styles=[v,x`
3433
3983
  .wrap {
3434
3984
  display: grid;
3435
3985
  gap: var(--roxy-space-md, 1rem);
@@ -3535,7 +4085,7 @@
3535
4085
  margin: 0;
3536
4086
  color: var(--roxy-fg, #0a0a0a);
3537
4087
  }
3538
- `],p([y({attribute:!1})],J.prototype,"data",2),p([y({type:String,reflect:!0})],J.prototype,"spread",2),J=p([v("roxy-tarot-spread")],J);var ie=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data?.transitPlanets?.length)return t`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:s,transitAspects:o,summary:l}=this.data,d=[ze(e),O(r)].filter(Boolean).join(" ");return t`<div class="wrap" aria-label="Transit positions table">
4088
+ `],p([g({attribute:!1})],Z.prototype,"data",2),p([g({type:String,reflect:!0})],Z.prototype,"spread",2),Z=p([f("roxy-tarot-spread")],Z);var pe=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data?.transitPlanets?.length)return t`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:a,transitAspects:o,summary:l}=this.data,d=[Ke(e),G(r)].filter(Boolean).join(" ");return t`<div class="wrap" aria-label="Transit positions table">
3539
4089
  <div class="head">
3540
4090
  <h2 class="title">Transits</h2>
3541
4091
  ${d?t`<p class="subtitle">${d}</p>`:n}
@@ -3546,7 +4096,7 @@
3546
4096
  <div>
3547
4097
  <p class="section-label">Planet positions</p>
3548
4098
  <div class="overflow-scroll">
3549
- ${this.renderPlanetsTable(s)}
4099
+ ${this.renderPlanetsTable(a)}
3550
4100
  </div>
3551
4101
  </div>
3552
4102
 
@@ -3579,10 +4129,10 @@
3579
4129
  </tr>
3580
4130
  </thead>
3581
4131
  <tbody>
3582
- ${e.map(r=>{let s=L[C(r.name)]??"",o=z[C(r.sign)]??"",l=r.speed>=0?"\u2191":"\u2193";return t`<tr>
4132
+ ${e.map(r=>{let a=L[A(r.name)]??"",o=N[A(r.sign)]??"",l=r.speed>=0?"\u2191":"\u2193";return t`<tr>
3583
4133
  <td>
3584
4134
  <div class="planet-cell">
3585
- <span class="glyph" aria-hidden="true">${s}</span>
4135
+ <span class="glyph" aria-hidden="true">${a}</span>
3586
4136
  ${r.name}
3587
4137
  ${r.isRetrograde?t`<span class="retro-badge" aria-label="retrograde">R</span>`:n}
3588
4138
  </div>
@@ -3601,7 +4151,7 @@
3601
4151
  </tr>`})}
3602
4152
  </tbody>
3603
4153
  </table>`}renderAspectsList(e){return t`<div role="list" aria-label="Transit aspects">
3604
- ${e.map((r,s)=>{let o=L[C(r.transitPlanet)]??"",l=L[C(r.natalPlanet)]??"",d=(r.nature??"neutral").toLowerCase(),c=r.interpretation,m=(r.type??"").toLowerCase(),h=r.isApplying?"Applying":"Separating";return t`<details class="aspect-card" role="listitem" name="transit-aspects" ?open=${s===0}>
4154
+ ${e.map((r,a)=>{let o=L[A(r.transitPlanet)]??"",l=L[A(r.natalPlanet)]??"",d=(r.nature??"neutral").toLowerCase(),c=r.interpretation,m=(r.type??"").toLowerCase(),y=r.isApplying?"Applying":"Separating";return t`<details class="aspect-card" role="listitem" name="transit-aspects" ?open=${a===0}>
3605
4155
  <summary>
3606
4156
  <span aria-hidden="true">${o}</span>
3607
4157
  ${r.transitPlanet}
@@ -3609,7 +4159,7 @@
3609
4159
  <span aria-hidden="true">${l}</span>
3610
4160
  ${r.natalPlanet}
3611
4161
  <span class="meta">
3612
- ${h} · orb ${w(r.orb,2)}° · strength ${w(r.strength,1)}
4162
+ ${y} · orb ${w(r.orb,2)}° · strength ${w(r.strength,1)}
3613
4163
  </span>
3614
4164
  </summary>
3615
4165
  <div class="interp-body">
@@ -3618,11 +4168,11 @@
3618
4168
  ${c?.timing?t`<p><strong>Timing:</strong> ${c.timing}</p>`:n}
3619
4169
  ${c?.guidance?t`<p><strong>Guidance:</strong> ${c.guidance}</p>`:n}
3620
4170
  ${c?.keywords?.length?t`<div class="interp-keywords">
3621
- ${c.keywords.map(g=>t`<span class="kw">${g}</span>`)}
4171
+ ${c.keywords.map(h=>t`<span class="kw">${h}</span>`)}
3622
4172
  </div>`:n}
3623
4173
  </div>
3624
4174
  </details>`})}
3625
- </div>`}};ie.styles=[b,x`
4175
+ </div>`}};pe.styles=[v,x`
3626
4176
  .wrap {
3627
4177
  display: grid;
3628
4178
  gap: var(--roxy-space-md, 1rem);
@@ -3818,7 +4368,7 @@
3818
4368
  background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
3819
4369
  color: var(--roxy-fg, #0a0a0a);
3820
4370
  }
3821
- `],p([y({attribute:!1})],ie.prototype,"data",2),ie=p([v("roxy-transits-table")],ie);var X=class extends u{constructor(){super(...arguments);this.data=null;this.chartStyle="south"}buildHouses(){if(!this.data)return[];let e=this.data,r=this.data?.meta?.Lagna?.rashi??"",s=[];for(let o=0;o<12;o++){let l=_e[o],c=(e[l]?.signs??[]).map(h=>h.graha).filter(Boolean),m=Me[l]??"";s.push({number:o+1,sign:m,planets:c,isLagna:r?r.toLowerCase()===m.toLowerCase():!1})}return s}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No kundli data</div>`;let e=this.buildHouses(),r=this.chartStyle==="north";return t`<div class="wrap">
4371
+ `],p([g({attribute:!1})],pe.prototype,"data",2),pe=p([f("roxy-transits-table")],pe);var Q=class extends u{constructor(){super(...arguments);this.data=null;this.chartStyle="south"}buildHouses(){return this.data?.meta?Ze(this.data.meta):[]}render(){if(!this.data)return t`<div class="roxy-empty" role="status">No kundli data</div>`;let e=this.buildHouses(),r=this.chartStyle,a=r==="north"?Fe():r==="east"?Je():We(),o=r==="north"?Ve:r==="east"?Xe:Ye;return t`<div class="wrap">
3822
4372
  <h2 class="title">Vedic kundli</h2>
3823
4373
  <svg
3824
4374
  viewBox="0 0 300 300"
@@ -3826,10 +4376,10 @@
3826
4376
  aria-label="Vedic birth chart with twelve sign houses"
3827
4377
  >
3828
4378
  <title>Vedic kundli</title>
3829
- ${r?Oe():Ge()}
3830
- ${r?e.map(s=>He(s)):e.map(s=>De(s))}
4379
+ ${a}
4380
+ ${e.map(l=>o(l))}
3831
4381
  </svg>
3832
- </div>`}};X.styles=[b,x`
4382
+ </div>`}};Q.styles=[v,x`
3833
4383
  .wrap {
3834
4384
  display: grid;
3835
4385
  gap: var(--roxy-space-md, 1rem);
@@ -3857,7 +4407,7 @@
3857
4407
  }
3858
4408
  .planet-text {
3859
4409
  fill: var(--roxy-fg, #0a0a0a);
3860
- font-size: 11px;
4410
+ font-size: 10px;
3861
4411
  font-weight: 600;
3862
4412
  font-family: var(--roxy-font-sans);
3863
4413
  }
@@ -3879,7 +4429,204 @@
3879
4429
  stroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
3880
4430
  stroke-width: 0.8;
3881
4431
  }
3882
- `],p([y({attribute:!1})],X.prototype,"data",2),p([y({type:String,reflect:!0,attribute:"chart-style"})],X.prototype,"chartStyle",2),X=p([v("roxy-vedic-kundli")],X);var Z=class extends u{constructor(){super(...arguments);this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return t`<span class=${r}>${e}</span>`}renderDetailCard(e){return t`<div class="detail-card">
4432
+ `],p([g({attribute:!1})],Q.prototype,"data",2),p([g({type:String,reflect:!0,attribute:"chart-style"})],Q.prototype,"chartStyle",2),Q=p([f("roxy-vedic-kundli")],Q);var qt=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],me=class extends u{constructor(){super(...arguments);this.data=null}orderedRows(){let e=this.data?.meta??{},r=new Set,a=[];for(let o of qt){let l=e[o];l&&(a.push([o,l]),r.add(o))}for(let[o,l]of Object.entries(e))r.has(o)||a.push([o,l]);return a}render(){if(!this.data?.meta)return t`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return t`<div class="wrap" aria-label="Vedic planetary positions" tabindex="0">
4433
+ <header class="head">
4434
+ <h2 class="title">Planetary positions</h2>
4435
+ </header>
4436
+ <table role="table">
4437
+ <thead>
4438
+ <tr>
4439
+ <th scope="col">Graha</th>
4440
+ <th scope="col">Rashi</th>
4441
+ <th scope="col">Degree</th>
4442
+ <th scope="col">Nakshatra</th>
4443
+ <th scope="col">Pada</th>
4444
+ <th scope="col">Nak. lord</th>
4445
+ <th scope="col">House</th>
4446
+ <th scope="col">Avastha</th>
4447
+ <th scope="col">Retro</th>
4448
+ </tr>
4449
+ </thead>
4450
+ <tbody>
4451
+ ${e.map(([r,a])=>{let o=(a.graha??r)==="Lagna",l=L[A(a.graha??r)]??"",d=N[A(a.rashi??"")]??"";return t`<tr class=${o?"lagna":""}>
4452
+ <td class="graha">
4453
+ ${l?t`<span class="glyph">${l}</span>`:n}${a.graha??r}
4454
+ </td>
4455
+ <td>
4456
+ ${d?t`<span class="glyph">${d}</span>`:n}${a.rashi??""}
4457
+ </td>
4458
+ <td class="num">
4459
+ ${typeof a.longitude=="number"?Ue(a.longitude):""}
4460
+ </td>
4461
+ <td>${a.nakshatra?.name??""}</td>
4462
+ <td class="num">${a.nakshatra?.pada??""}</td>
4463
+ <td>${a.nakshatra?.lord??""}</td>
4464
+ <td class="num">${typeof a.house=="number"?a.house:""}</td>
4465
+ <td>${a.awastha??""}</td>
4466
+ <td>${a.isRetrograde?t`<span class="retro">R</span>`:n}</td>
4467
+ </tr>`})}
4468
+ </tbody>
4469
+ </table>
4470
+ </div>`}};me.styles=[v,x`
4471
+ .wrap {
4472
+ border: 1px solid var(--roxy-border, #e4e4e7);
4473
+ border-radius: var(--roxy-radius-md, 8px);
4474
+ background: var(--roxy-bg, #fff);
4475
+ overflow: auto;
4476
+ box-shadow: var(--roxy-shadow-sm);
4477
+ }
4478
+ .head {
4479
+ padding: var(--roxy-space-md, 1rem);
4480
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
4481
+ }
4482
+ .title {
4483
+ margin: 0;
4484
+ font-size: var(--roxy-text-lg, 1.125rem);
4485
+ font-weight: var(--roxy-weight-bold, 600);
4486
+ }
4487
+ table {
4488
+ width: 100%;
4489
+ border-collapse: collapse;
4490
+ font-size: var(--roxy-text-sm, 0.875rem);
4491
+ min-width: 620px;
4492
+ }
4493
+ thead {
4494
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 20%, transparent);
4495
+ }
4496
+ th,
4497
+ td {
4498
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
4499
+ text-align: left;
4500
+ white-space: nowrap;
4501
+ }
4502
+ th {
4503
+ color: var(--roxy-muted, #71717a);
4504
+ font-weight: var(--roxy-weight-bold, 600);
4505
+ text-transform: uppercase;
4506
+ font-size: var(--roxy-text-xs, 0.75rem);
4507
+ letter-spacing: 0.04em;
4508
+ }
4509
+ tbody tr {
4510
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
4511
+ }
4512
+ tbody tr.lagna {
4513
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 10%, transparent);
4514
+ }
4515
+ td.graha {
4516
+ font-weight: var(--roxy-weight-bold, 600);
4517
+ color: var(--roxy-fg, #0a0a0a);
4518
+ }
4519
+ .glyph {
4520
+ margin-right: 0.4em;
4521
+ color: var(--roxy-muted, #71717a);
4522
+ }
4523
+ /* On the tinted Lagna row the muted glyph drops below the WCAG AA
4524
+ contrast floor, so use the accent foreground there instead. */
4525
+ tbody tr.lagna .glyph {
4526
+ color: var(--roxy-accent-fg, #b45309);
4527
+ }
4528
+ .retro {
4529
+ color: var(--roxy-warning-fg, #9a3412);
4530
+ font-size: var(--roxy-text-xs, 0.75rem);
4531
+ font-weight: var(--roxy-weight-bold, 600);
4532
+ }
4533
+ .num {
4534
+ font-variant-numeric: tabular-nums;
4535
+ }
4536
+ `],p([g({attribute:!1})],me.prototype,"data",2),me=p([f("roxy-vedic-planets-table")],me);var he=class extends u{constructor(){super(...arguments);this.data=null}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.name,sign:a.sign,longitude:a.longitude,house:a.house,speed:a.speed,isRetrograde:a.isRetrograde}));for(let[a,o]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])o&&r.push({name:a,sign:o.sign,longitude:o.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return t`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return t`<div class="wrap" aria-label="Western planetary positions" tabindex="0">
4537
+ <header class="head">
4538
+ <h2 class="title">Planetary positions</h2>
4539
+ </header>
4540
+ <table role="table">
4541
+ <thead>
4542
+ <tr>
4543
+ <th scope="col">Body</th>
4544
+ <th scope="col">Sign</th>
4545
+ <th scope="col">Degree</th>
4546
+ <th scope="col">House</th>
4547
+ <th scope="col">Motion</th>
4548
+ </tr>
4549
+ </thead>
4550
+ <tbody>
4551
+ ${e.map(r=>{let a=L[A(r.name)]??"",o=N[A(r.sign??"")]??"",l=typeof r.speed=="number"?w(r.speed,3):"";return t`<tr class=${r.isPoint?"point":""}>
4552
+ <td class="body">
4553
+ ${a?t`<span class="glyph">${a}</span>`:n}${r.name}
4554
+ </td>
4555
+ <td>
4556
+ ${o?t`<span class="glyph">${o}</span>`:n}${r.sign??""}
4557
+ </td>
4558
+ <td class="num">
4559
+ ${typeof r.longitude=="number"?Ue(r.longitude):""}
4560
+ </td>
4561
+ <td class="num">${typeof r.house=="number"?r.house:""}</td>
4562
+ <td class="num">
4563
+ ${l?t`${l}°/day`:n}
4564
+ ${r.isRetrograde?t`<span class="retro"> ℞</span>`:n}
4565
+ </td>
4566
+ </tr>`})}
4567
+ </tbody>
4568
+ </table>
4569
+ </div>`}};he.styles=[v,x`
4570
+ .wrap {
4571
+ border: 1px solid var(--roxy-border, #e4e4e7);
4572
+ border-radius: var(--roxy-radius-md, 8px);
4573
+ background: var(--roxy-bg, #fff);
4574
+ overflow: auto;
4575
+ box-shadow: var(--roxy-shadow-sm);
4576
+ }
4577
+ .head {
4578
+ padding: var(--roxy-space-md, 1rem);
4579
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
4580
+ }
4581
+ .title {
4582
+ margin: 0;
4583
+ font-size: var(--roxy-text-lg, 1.125rem);
4584
+ font-weight: var(--roxy-weight-bold, 600);
4585
+ }
4586
+ table {
4587
+ width: 100%;
4588
+ border-collapse: collapse;
4589
+ font-size: var(--roxy-text-sm, 0.875rem);
4590
+ min-width: 460px;
4591
+ }
4592
+ thead {
4593
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 20%, transparent);
4594
+ }
4595
+ th,
4596
+ td {
4597
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
4598
+ text-align: left;
4599
+ white-space: nowrap;
4600
+ }
4601
+ th {
4602
+ color: var(--roxy-muted, #71717a);
4603
+ font-weight: var(--roxy-weight-bold, 600);
4604
+ text-transform: uppercase;
4605
+ font-size: var(--roxy-text-xs, 0.75rem);
4606
+ letter-spacing: 0.04em;
4607
+ }
4608
+ tbody tr {
4609
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
4610
+ }
4611
+ tbody tr.point {
4612
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 8%, transparent);
4613
+ }
4614
+ td.body {
4615
+ font-weight: var(--roxy-weight-bold, 600);
4616
+ color: var(--roxy-fg, #0a0a0a);
4617
+ }
4618
+ .glyph {
4619
+ margin-right: 0.4em;
4620
+ color: var(--roxy-muted, #71717a);
4621
+ }
4622
+ .retro {
4623
+ color: var(--roxy-danger, #dc2626);
4624
+ font-weight: var(--roxy-weight-bold, 600);
4625
+ }
4626
+ .num {
4627
+ font-variant-numeric: tabular-nums;
4628
+ }
4629
+ `],p([g({attribute:!1})],he.prototype,"data",2),he=p([f("roxy-western-planets-table")],he);var ee=class extends u{constructor(){super(...arguments);this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return t`<span class=${r}>${e}</span>`}renderDetailCard(e){return t`<div class="detail-card">
3883
4630
  <p class="detail-name">
3884
4631
  ${e.name}
3885
4632
  ${e.quality?this.renderQualityChip(e.quality):n}
@@ -3889,10 +4636,10 @@
3889
4636
  <summary>Effects</summary>
3890
4637
  <div class="result-body">${e.result}</div>
3891
4638
  </details>`:n}
3892
- </div>`}render(){if(!this.data)return t`<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 s=e;return t`<div class="wrap">${this.renderDetailCard(s)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let s=e.yogas;if(s.length>0&&"description"in s[0]){let m=s,h=r?m.filter(f=>f.name.toLowerCase().includes(r)):m,g=e.total;return t`<div class="wrap">
4639
+ </div>`}render(){if(!this.data)return t`<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 a=e;return t`<div class="wrap">${this.renderDetailCard(a)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let a=e.yogas;if(a.length>0&&"description"in a[0]){let m=a,y=r?m.filter(b=>b.name.toLowerCase().includes(r)):m,h=e.total;return t`<div class="wrap">
3893
4640
  <div class="head">
3894
4641
  <h2 class="title">Yoga catalog</h2>
3895
- ${g!==void 0?t`<span class="count">${g} total</span>`:n}
4642
+ ${h!==void 0?t`<span class="count">${h} total</span>`:n}
3896
4643
  </div>
3897
4644
  <div class="search-wrap">
3898
4645
  <input
@@ -3910,9 +4657,9 @@
3910
4657
  aria-live="polite"
3911
4658
  aria-label="Yoga results"
3912
4659
  >
3913
- ${h.length>0?h.map(f=>this.renderDetailCard(f)):t`<p class="no-results">No yogas match your search.</p>`}
4660
+ ${y.length>0?y.map(b=>this.renderDetailCard(b)):t`<p class="no-results">No yogas match your search.</p>`}
3914
4661
  </div>
3915
- </div>`}let l=s,d=r?l.filter(m=>m.name.toLowerCase().includes(r)):l,c=e.total;return t`<div class="wrap">
4662
+ </div>`}let l=a,d=r?l.filter(m=>m.name.toLowerCase().includes(r)):l,c=e.total;return t`<div class="wrap">
3916
4663
  <div class="head">
3917
4664
  <h2 class="title">Yoga catalog</h2>
3918
4665
  ${c!==void 0?t`<span class="count">${c} total</span>`:n}
@@ -3938,7 +4685,7 @@
3938
4685
  <span class="yoga-id">${m.id}</span>
3939
4686
  </div>`):t`<p class="no-results">No yogas match your search.</p>`}
3940
4687
  </div>
3941
- </div>`}return t`<div class="roxy-empty" role="status">No yoga data</div>`}};Z.styles=[b,x`
4688
+ </div>`}return t`<div class="roxy-empty" role="status">No yoga data</div>`}};ee.styles=[v,x`
3942
4689
  .wrap {
3943
4690
  display: grid;
3944
4691
  gap: var(--roxy-space-md, 1rem);
@@ -4086,7 +4833,7 @@
4086
4833
  display: grid;
4087
4834
  gap: var(--roxy-space-sm, 0.5rem);
4088
4835
  }
4089
- `],p([y({attribute:!1})],Z.prototype,"data",2),p([E()],Z.prototype,"filter",2),Z=p([v("roxy-yoga-list")],Z);var Ie=[{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:"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:"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:"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:"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:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South or North Indian Vedic kundli for /vedic-astrology/birth-chart",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South or North Indian kundli",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:"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:"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:"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:"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:"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:"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:"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:"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:"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:"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:"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 Hr="0.2.2";var At=Ie.map(i=>i.slug);return qr(Ct);})();
4836
+ `],p([g({attribute:!1})],ee.prototype,"data",2),p([C()],ee.prototype,"filter",2),ee=p([f("roxy-yoga-list")],ee);var Qe=[{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:"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 Zr="0.3.0";var Kt=Qe.map(i=>i.slug);return at(Ut);})();
4090
4837
  /*! Bundled license information:
4091
4838
 
4092
4839
  @lit/reactive-element/css-tag.js: