@roxyapi/ui 0.3.0 → 0.4.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 (164) hide show
  1. package/AGENTS.md +228 -29
  2. package/README.md +291 -19
  3. package/dist/cdn/components/ashtakavarga-grid.js +74 -19
  4. package/dist/cdn/components/ashtakavarga-grid.js.map +2 -2
  5. package/dist/cdn/components/biorhythm-chart.js +18 -4
  6. package/dist/cdn/components/biorhythm-chart.js.map +2 -2
  7. package/dist/cdn/components/choghadiya-grid.js +47 -12
  8. package/dist/cdn/components/choghadiya-grid.js.map +3 -3
  9. package/dist/cdn/components/compatibility-card.js +21 -7
  10. package/dist/cdn/components/compatibility-card.js.map +2 -2
  11. package/dist/cdn/components/dasha-timeline.js +113 -28
  12. package/dist/cdn/components/dasha-timeline.js.map +3 -3
  13. package/dist/cdn/components/data.js +27 -13
  14. package/dist/cdn/components/data.js.map +2 -2
  15. package/dist/cdn/components/divisional-chart.js +225 -118
  16. package/dist/cdn/components/divisional-chart.js.map +4 -4
  17. package/dist/cdn/components/dosha-card.js +18 -4
  18. package/dist/cdn/components/dosha-card.js.map +2 -2
  19. package/dist/cdn/components/endpoint-form.js +25 -11
  20. package/dist/cdn/components/endpoint-form.js.map +2 -2
  21. package/dist/cdn/components/guna-milan.js +20 -6
  22. package/dist/cdn/components/guna-milan.js.map +2 -2
  23. package/dist/cdn/components/hexagram.js +22 -8
  24. package/dist/cdn/components/hexagram.js.map +2 -2
  25. package/dist/cdn/components/horoscope-card.js +20 -6
  26. package/dist/cdn/components/horoscope-card.js.map +2 -2
  27. package/dist/cdn/components/kp-chart.js +19 -5
  28. package/dist/cdn/components/kp-chart.js.map +2 -2
  29. package/dist/cdn/components/kp-planets-table.js +17 -3
  30. package/dist/cdn/components/kp-planets-table.js.map +2 -2
  31. package/dist/cdn/components/kp-ruling-planets.js +17 -3
  32. package/dist/cdn/components/kp-ruling-planets.js.map +2 -2
  33. package/dist/cdn/components/location-search.js +18 -4
  34. package/dist/cdn/components/location-search.js.map +2 -2
  35. package/dist/cdn/components/moon-phase.js +27 -13
  36. package/dist/cdn/components/moon-phase.js.map +2 -2
  37. package/dist/cdn/components/nakshatra-card.js +16 -2
  38. package/dist/cdn/components/nakshatra-card.js.map +2 -2
  39. package/dist/cdn/components/natal-chart.js +79 -40
  40. package/dist/cdn/components/natal-chart.js.map +3 -3
  41. package/dist/cdn/components/numerology-card.js +18 -4
  42. package/dist/cdn/components/numerology-card.js.map +2 -2
  43. package/dist/cdn/components/panchang-table.js +53 -25
  44. package/dist/cdn/components/panchang-table.js.map +3 -3
  45. package/dist/cdn/components/shadbala-table.js +24 -10
  46. package/dist/cdn/components/shadbala-table.js.map +2 -2
  47. package/dist/cdn/components/synastry-chart.js +96 -48
  48. package/dist/cdn/components/synastry-chart.js.map +3 -3
  49. package/dist/cdn/components/tarot-card.js +17 -3
  50. package/dist/cdn/components/tarot-card.js.map +2 -2
  51. package/dist/cdn/components/tarot-spread.js +39 -25
  52. package/dist/cdn/components/tarot-spread.js.map +2 -2
  53. package/dist/cdn/components/transits-table.js +18 -4
  54. package/dist/cdn/components/transits-table.js.map +2 -2
  55. package/dist/cdn/components/vedic-kundli.js +215 -105
  56. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  57. package/dist/cdn/components/vedic-planets-table.js +22 -8
  58. package/dist/cdn/components/vedic-planets-table.js.map +2 -2
  59. package/dist/cdn/components/western-planets-table.js +18 -4
  60. package/dist/cdn/components/western-planets-table.js.map +2 -2
  61. package/dist/cdn/components/yoga-list.js +17 -3
  62. package/dist/cdn/components/yoga-list.js.map +2 -2
  63. package/dist/cdn/roxy-ui.js +1082 -816
  64. package/dist/cdn/roxy-ui.js.map +4 -4
  65. package/dist/components/ashtakavarga-grid.d.ts +13 -1
  66. package/dist/components/ashtakavarga-grid.d.ts.map +1 -1
  67. package/dist/components/ashtakavarga-grid.js +86 -11
  68. package/dist/components/ashtakavarga-grid.js.map +2 -2
  69. package/dist/components/biorhythm-chart.js +14 -0
  70. package/dist/components/biorhythm-chart.js.map +2 -2
  71. package/dist/components/choghadiya-grid.d.ts +6 -0
  72. package/dist/components/choghadiya-grid.d.ts.map +1 -1
  73. package/dist/components/choghadiya-grid.js +50 -2
  74. package/dist/components/choghadiya-grid.js.map +2 -2
  75. package/dist/components/compatibility-card.js +14 -0
  76. package/dist/components/compatibility-card.js.map +2 -2
  77. package/dist/components/dasha-timeline.d.ts +10 -0
  78. package/dist/components/dasha-timeline.d.ts.map +1 -1
  79. package/dist/components/dasha-timeline.js +135 -4
  80. package/dist/components/dasha-timeline.js.map +2 -2
  81. package/dist/components/data.js +14 -0
  82. package/dist/components/data.js.map +2 -2
  83. package/dist/components/divisional-chart.d.ts +9 -6
  84. package/dist/components/divisional-chart.d.ts.map +1 -1
  85. package/dist/components/divisional-chart.js +546 -251
  86. package/dist/components/divisional-chart.js.map +4 -4
  87. package/dist/components/dosha-card.js +14 -0
  88. package/dist/components/dosha-card.js.map +2 -2
  89. package/dist/components/endpoint-form.js +14 -0
  90. package/dist/components/endpoint-form.js.map +2 -2
  91. package/dist/components/guna-milan.js +14 -0
  92. package/dist/components/guna-milan.js.map +2 -2
  93. package/dist/components/hexagram.js +14 -0
  94. package/dist/components/hexagram.js.map +2 -2
  95. package/dist/components/horoscope-card.js +14 -0
  96. package/dist/components/horoscope-card.js.map +2 -2
  97. package/dist/components/kp-chart.js +14 -0
  98. package/dist/components/kp-chart.js.map +2 -2
  99. package/dist/components/kp-planets-table.js +14 -0
  100. package/dist/components/kp-planets-table.js.map +2 -2
  101. package/dist/components/kp-ruling-planets.js +14 -0
  102. package/dist/components/kp-ruling-planets.js.map +2 -2
  103. package/dist/components/location-search.js +14 -0
  104. package/dist/components/location-search.js.map +2 -2
  105. package/dist/components/moon-phase.js +14 -0
  106. package/dist/components/moon-phase.js.map +2 -2
  107. package/dist/components/nakshatra-card.js +14 -0
  108. package/dist/components/nakshatra-card.js.map +2 -2
  109. package/dist/components/natal-chart.d.ts.map +1 -1
  110. package/dist/components/natal-chart.js +76 -6
  111. package/dist/components/natal-chart.js.map +2 -2
  112. package/dist/components/numerology-card.js +14 -0
  113. package/dist/components/numerology-card.js.map +2 -2
  114. package/dist/components/panchang-table.d.ts +1 -0
  115. package/dist/components/panchang-table.d.ts.map +1 -1
  116. package/dist/components/panchang-table.js +37 -1
  117. package/dist/components/panchang-table.js.map +2 -2
  118. package/dist/components/shadbala-table.js +14 -0
  119. package/dist/components/shadbala-table.js.map +2 -2
  120. package/dist/components/synastry-chart.d.ts +6 -0
  121. package/dist/components/synastry-chart.d.ts.map +1 -1
  122. package/dist/components/synastry-chart.js +106 -7
  123. package/dist/components/synastry-chart.js.map +2 -2
  124. package/dist/components/tarot-card.js +14 -0
  125. package/dist/components/tarot-card.js.map +2 -2
  126. package/dist/components/tarot-spread.js +14 -0
  127. package/dist/components/tarot-spread.js.map +2 -2
  128. package/dist/components/transits-table.js +14 -0
  129. package/dist/components/transits-table.js.map +2 -2
  130. package/dist/components/vedic-kundli.d.ts +14 -9
  131. package/dist/components/vedic-kundli.d.ts.map +1 -1
  132. package/dist/components/vedic-kundli.js +537 -245
  133. package/dist/components/vedic-kundli.js.map +4 -4
  134. package/dist/components/vedic-planets-table.js +14 -0
  135. package/dist/components/vedic-planets-table.js.map +2 -2
  136. package/dist/components/western-planets-table.js +14 -0
  137. package/dist/components/western-planets-table.js.map +2 -2
  138. package/dist/components/yoga-list.js +14 -0
  139. package/dist/components/yoga-list.js.map +2 -2
  140. package/dist/index.cjs +1397 -797
  141. package/dist/index.cjs.map +4 -4
  142. package/dist/index.js +1278 -678
  143. package/dist/index.js.map +4 -4
  144. package/dist/styles/tokens.css +8 -23
  145. package/dist/utils/base-styles.d.ts.map +1 -1
  146. package/dist/utils/kundli-render.d.ts +43 -104
  147. package/dist/utils/kundli-render.d.ts.map +1 -1
  148. package/dist/utils/kundli-styles.d.ts +13 -0
  149. package/dist/utils/kundli-styles.d.ts.map +1 -0
  150. package/dist/version.d.ts +1 -1
  151. package/package.json +1 -1
  152. package/src/components/ashtakavarga-grid.ts +73 -11
  153. package/src/components/choghadiya-grid.ts +37 -2
  154. package/src/components/dasha-timeline.ts +135 -4
  155. package/src/components/divisional-chart.ts +40 -97
  156. package/src/components/natal-chart.ts +89 -6
  157. package/src/components/panchang-table.ts +34 -1
  158. package/src/components/synastry-chart.ts +84 -8
  159. package/src/components/vedic-kundli.ts +35 -95
  160. package/src/styles/tokens.css +8 -23
  161. package/src/utils/base-styles.ts +14 -0
  162. package/src/utils/kundli-render.ts +609 -270
  163. package/src/utils/kundli-styles.ts +124 -0
  164. package/src/version.ts +1 -1
@@ -1,6 +1,6 @@
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`
1
+ "use strict";var RoxyUI=(()=>{var We=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var mr=Object.prototype.hasOwnProperty;var hr=(n,a)=>{for(var e in a)We(n,e,{get:a[e],enumerable:!0})},gr=(n,a,e,t)=>{if(a&&typeof a=="object"||typeof a=="function")for(let r of pr(a))!mr.call(n,r)&&r!==e&&We(n,r,{get:()=>a[r],enumerable:!(t=_t(a,r))||t.enumerable});return n};var yr=n=>gr(We({},"__esModule",{value:!0}),n),p=(n,a,e,t)=>{for(var r=t>1?void 0:t?_t(a,e):a,o=n.length-1,i;o>=0;o--)(i=n[o])&&(r=(t?i(a,e,r):i(r))||r);return t&&r&&We(a,e,r),r};var ga={};hr(ga,{ROXY_COMPONENTS:()=>dt,ROXY_UI_COMPONENTS:()=>ha,ROXY_UI_VERSION:()=>cr,RoxyAshtakavargaGrid:()=>V,RoxyBiorhythmChart:()=>Y,RoxyChoghadiyaGrid:()=>pe,RoxyCompatibilityCard:()=>U,RoxyDashaTimeline:()=>F,RoxyData:()=>W,RoxyDivisionalChart:()=>X,RoxyDoshaCard:()=>Z,RoxyEndpointForm:()=>O,RoxyGunaMilan:()=>me,RoxyHexagram:()=>Q,RoxyHoroscopeCard:()=>ee,RoxyKpChart:()=>te,RoxyKpPlanetsTable:()=>he,RoxyKpRulingPlanets:()=>ge,RoxyLocationSearch:()=>_,RoxyMoonPhase:()=>re,RoxyNakshatraCard:()=>ye,RoxyNatalChart:()=>K,RoxyNumerologyCard:()=>ae,RoxyPanchangTable:()=>se,RoxyShadbalaTable:()=>ue,RoxySynastryChart:()=>xe,RoxyTarotCard:()=>oe,RoxyTarotSpread:()=>ne,RoxyTransitsTable:()=>fe,RoxyVedicKundli:()=>ie,RoxyVedicPlanetsTable:()=>be,RoxyWesternPlanetsTable:()=>ve,RoxyYogaList:()=>le});var Je=globalThis,Xe=Je.ShadowRoot&&(Je.ShadyCSS===void 0||Je.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,ct=Symbol(),Dt=new WeakMap,De=class{constructor(a,e,t){if(this._$cssResult$=!0,t!==ct)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(Xe&&a===void 0){let t=e!==void 0&&e.length===1;t&&(a=Dt.get(e)),a===void 0&&((this.o=a=new CSSStyleSheet).replaceSync(this.cssText),t&&Dt.set(e,a))}return a}toString(){return this.cssText}},Ot=n=>new De(typeof n=="string"?n:n+"",void 0,ct),f=(n,...a)=>{let e=n.length===1?n[0]:a.reduce((t,r,o)=>t+(i=>{if(i._$cssResult$===!0)return i.cssText;if(typeof i=="number")return i;throw Error("Value passed to 'css' function must be a 'css' function result: "+i+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(r)+n[o+1],n[0]);return new De(e,n,ct)},Gt=(n,a)=>{if(Xe)n.adoptedStyleSheets=a.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of a){let t=document.createElement("style"),r=Je.litNonce;r!==void 0&&t.setAttribute("nonce",r),t.textContent=e.cssText,n.appendChild(t)}},pt=Xe?n=>n:n=>n instanceof CSSStyleSheet?(a=>{let e="";for(let t of a.cssRules)e+=t.cssText;return Ot(e)})(n):n;var{is:ur,defineProperty:xr,getOwnPropertyDescriptor:fr,getOwnPropertyNames:br,getOwnPropertySymbols:vr,getPrototypeOf:$r}=Object,Ze=globalThis,Ht=Ze.trustedTypes,wr=Ht?Ht.emptyScript:"",kr=Ze.reactiveElementPolyfillSupport,Oe=(n,a)=>n,Ge={toAttribute(n,a){switch(a){case Boolean:n=n?wr:null;break;case Object:case Array:n=n==null?n:JSON.stringify(n)}return n},fromAttribute(n,a){let e=n;switch(a){case Boolean:e=n!==null;break;case Number:e=n===null?null:Number(n);break;case Object:case Array:try{e=JSON.parse(n)}catch{e=null}}return e}},Qe=(n,a)=>!ur(n,a),jt={attribute:!0,type:String,converter:Ge,reflect:!1,useDefault:!1,hasChanged:Qe};Symbol.metadata??=Symbol("metadata"),Ze.litPropertyMetadata??=new WeakMap;var q=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=jt){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 t=Symbol(),r=this.getPropertyDescriptor(a,t,e);r!==void 0&&xr(this.prototype,a,r)}}static getPropertyDescriptor(a,e,t){let{get:r,set:o}=fr(this.prototype,a)??{get(){return this[e]},set(i){this[e]=i}};return{get:r,set(i){let d=r?.call(this);o?.call(this,i),this.requestUpdate(a,d,t)},configurable:!0,enumerable:!0}}static getPropertyOptions(a){return this.elementProperties.get(a)??jt}static _$Ei(){if(this.hasOwnProperty(Oe("elementProperties")))return;let a=$r(this);a.finalize(),a.l!==void 0&&(this.l=[...a.l]),this.elementProperties=new Map(a.elementProperties)}static finalize(){if(this.hasOwnProperty(Oe("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(Oe("properties"))){let e=this.properties,t=[...br(e),...vr(e)];for(let r of t)this.createProperty(r,e[r])}let a=this[Symbol.metadata];if(a!==null){let e=litPropertyMetadata.get(a);if(e!==void 0)for(let[t,r]of e)this.elementProperties.set(t,r)}this._$Eh=new Map;for(let[e,t]of this.elementProperties){let r=this._$Eu(e,t);r!==void 0&&this._$Eh.set(r,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(a){let e=[];if(Array.isArray(a)){let t=new Set(a.flat(1/0).reverse());for(let r of t)e.unshift(pt(r))}else a!==void 0&&e.push(pt(a));return e}static _$Eu(a,e){let t=e.attribute;return t===!1?void 0:typeof t=="string"?t: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 t of e.keys())this.hasOwnProperty(t)&&(a.set(t,this[t]),delete this[t]);a.size>0&&(this._$Ep=a)}createRenderRoot(){let a=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Gt(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,t){this._$AK(a,t)}_$ET(a,e){let t=this.constructor.elementProperties.get(a),r=this.constructor._$Eu(a,t);if(r!==void 0&&t.reflect===!0){let o=(t.converter?.toAttribute!==void 0?t.converter:Ge).toAttribute(e,t.type);this._$Em=a,o==null?this.removeAttribute(r):this.setAttribute(r,o),this._$Em=null}}_$AK(a,e){let t=this.constructor,r=t._$Eh.get(a);if(r!==void 0&&this._$Em!==r){let o=t.getPropertyOptions(r),i=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:Ge;this._$Em=r;let d=i.fromAttribute(e,o.type);this[r]=d??this._$Ej?.get(r)??d,this._$Em=null}}requestUpdate(a,e,t,r=!1,o){if(a!==void 0){let i=this.constructor;if(r===!1&&(o=this[a]),t??=i.getPropertyOptions(a),!((t.hasChanged??Qe)(o,e)||t.useDefault&&t.reflect&&o===this._$Ej?.get(a)&&!this.hasAttribute(i._$Eu(a,t))))return;this.C(a,e,t)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(a,e,{useDefault:t,reflect:r,wrapped:o},i){t&&!(this._$Ej??=new Map).has(a)&&(this._$Ej.set(a,i??e??this[a]),o!==!0||i!==void 0)||(this._$AL.has(a)||(this.hasUpdated||t||(e=void 0),this._$AL.set(a,e)),r===!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[r,o]of this._$Ep)this[r]=o;this._$Ep=void 0}let t=this.constructor.elementProperties;if(t.size>0)for(let[r,o]of t){let{wrapped:i}=o,d=this[r];i!==!0||this._$AL.has(r)||d===void 0||this.C(r,void 0,o,d)}}let a=!1,e=this._$AL;try{a=this.shouldUpdate(e),a?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(t){throw a=!1,this._$EM(),t}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){}};q.elementStyles=[],q.shadowRootOptions={mode:"open"},q[Oe("elementProperties")]=new Map,q[Oe("finalized")]=new Map,kr?.({ReactiveElement:q}),(Ze.reactiveElementVersions??=[]).push("2.1.2");var ft=globalThis,It=n=>n,et=ft.trustedTypes,Bt=et?et.createPolicy("lit-html",{createHTML:n=>n}):void 0,Ft="$lit$",de=`lit$${Math.random().toFixed(9).slice(2)}$`,Wt="?"+de,Sr=`<${Wt}>`,Se=document,je=()=>Se.createComment(""),Ie=n=>n===null||typeof n!="object"&&typeof n!="function",bt=Array.isArray,Ar=n=>bt(n)||typeof n?.[Symbol.iterator]=="function",mt=`[
2
+ \f\r]`,He=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Kt=/-->/g,qt=/>/g,we=RegExp(`>|${mt}(?:([^\\s"'>=/]+)(${mt}*=${mt}*(?:[^
3
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),Vt=/'/g,Yt=/"/g,Jt=/^(?:script|style|textarea|title)$/i,vt=n=>(a,...e)=>({_$litType$:n,strings:a,values:e}),s=vt(1),w=vt(2),va=vt(3),Ae=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),Ut=new WeakMap,ke=Se.createTreeWalker(Se,129);function Xt(n,a){if(!bt(n)||!n.hasOwnProperty("raw"))throw Error("invalid template strings array");return Bt!==void 0?Bt.createHTML(a):a}var Er=(n,a)=>{let e=n.length-1,t=[],r,o=a===2?"<svg>":a===3?"<math>":"",i=He;for(let d=0;d<e;d++){let c=n[d],m,g,h=-1,u=0;for(;u<c.length&&(i.lastIndex=u,g=i.exec(c),g!==null);)u=i.lastIndex,i===He?g[1]==="!--"?i=Kt:g[1]!==void 0?i=qt:g[2]!==void 0?(Jt.test(g[2])&&(r=RegExp("</"+g[2],"g")),i=we):g[3]!==void 0&&(i=we):i===we?g[0]===">"?(i=r??He,h=-1):g[1]===void 0?h=-2:(h=i.lastIndex-g[2].length,m=g[1],i=g[3]===void 0?we:g[3]==='"'?Yt:Vt):i===Yt||i===Vt?i=we:i===Kt||i===qt?i=He:(i=we,r=void 0);let k=i===we&&n[d+1].startsWith("/>")?" ":"";o+=i===He?c+Sr:h>=0?(t.push(m),c.slice(0,h)+Ft+c.slice(h)+de+k):c+de+(h===-2?d:k)}return[Xt(n,o+(n[e]||"<?>")+(a===2?"</svg>":a===3?"</math>":"")),t]},Be=class n{constructor({strings:a,_$litType$:e},t){let r;this.parts=[];let o=0,i=0,d=a.length-1,c=this.parts,[m,g]=Er(a,e);if(this.el=n.createElement(m,t),ke.currentNode=this.el.content,e===2||e===3){let h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(r=ke.nextNode())!==null&&c.length<d;){if(r.nodeType===1){if(r.hasAttributes())for(let h of r.getAttributeNames())if(h.endsWith(Ft)){let u=g[i++],k=r.getAttribute(h).split(de),$=/([.?@])?(.*)/.exec(u);c.push({type:1,index:o,name:$[2],strings:k,ctor:$[1]==="."?gt:$[1]==="?"?yt:$[1]==="@"?ut:Te}),r.removeAttribute(h)}else h.startsWith(de)&&(c.push({type:6,index:o}),r.removeAttribute(h));if(Jt.test(r.tagName)){let h=r.textContent.split(de),u=h.length-1;if(u>0){r.textContent=et?et.emptyScript:"";for(let k=0;k<u;k++)r.append(h[k],je()),ke.nextNode(),c.push({type:2,index:++o});r.append(h[u],je())}}}else if(r.nodeType===8)if(r.data===Wt)c.push({type:2,index:o});else{let h=-1;for(;(h=r.data.indexOf(de,h+1))!==-1;)c.push({type:7,index:o}),h+=de.length-1}o++}}static createElement(a,e){let t=Se.createElement("template");return t.innerHTML=a,t}};function Pe(n,a,e=n,t){if(a===Ae)return a;let r=t!==void 0?e._$Co?.[t]:e._$Cl,o=Ie(a)?void 0:a._$litDirective$;return r?.constructor!==o&&(r?._$AO?.(!1),o===void 0?r=void 0:(r=new o(n),r._$AT(n,e,t)),t!==void 0?(e._$Co??=[])[t]=r:e._$Cl=r),r!==void 0&&(a=Pe(n,r._$AS(n,a.values),r,t)),a}var ht=class{constructor(a,e){this._$AV=[],this._$AN=void 0,this._$AD=a,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(a){let{el:{content:e},parts:t}=this._$AD,r=(a?.creationScope??Se).importNode(e,!0);ke.currentNode=r;let o=ke.nextNode(),i=0,d=0,c=t[0];for(;c!==void 0;){if(i===c.index){let m;c.type===2?m=new Ke(o,o.nextSibling,this,a):c.type===1?m=new c.ctor(o,c.name,c.strings,this,a):c.type===6&&(m=new xt(o,this,a)),this._$AV.push(m),c=t[++d]}i!==c?.index&&(o=ke.nextNode(),i++)}return ke.currentNode=Se,r}p(a){let e=0;for(let t of this._$AV)t!==void 0&&(t.strings!==void 0?(t._$AI(a,t,e),e+=t.strings.length-2):t._$AI(a[e])),e++}},Ke=class n{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(a,e,t,r){this.type=2,this._$AH=l,this._$AN=void 0,this._$AA=a,this._$AB=e,this._$AM=t,this.options=r,this._$Cv=r?.isConnected??!0}get parentNode(){let a=this._$AA.parentNode,e=this._$AM;return e!==void 0&&a?.nodeType===11&&(a=e.parentNode),a}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(a,e=this){a=Pe(this,a,e),Ie(a)?a===l||a==null||a===""?(this._$AH!==l&&this._$AR(),this._$AH=l):a!==this._$AH&&a!==Ae&&this._(a):a._$litType$!==void 0?this.$(a):a.nodeType!==void 0?this.T(a):Ar(a)?this.k(a):this._(a)}O(a){return this._$AA.parentNode.insertBefore(a,this._$AB)}T(a){this._$AH!==a&&(this._$AR(),this._$AH=this.O(a))}_(a){this._$AH!==l&&Ie(this._$AH)?this._$AA.nextSibling.data=a:this.T(Se.createTextNode(a)),this._$AH=a}$(a){let{values:e,_$litType$:t}=a,r=typeof t=="number"?this._$AC(a):(t.el===void 0&&(t.el=Be.createElement(Xt(t.h,t.h[0]),this.options)),t);if(this._$AH?._$AD===r)this._$AH.p(e);else{let o=new ht(r,this),i=o.u(this.options);o.p(e),this.T(i),this._$AH=o}}_$AC(a){let e=Ut.get(a.strings);return e===void 0&&Ut.set(a.strings,e=new Be(a)),e}k(a){bt(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,t,r=0;for(let o of a)r===e.length?e.push(t=new n(this.O(je()),this.O(je()),this,this.options)):t=e[r],t._$AI(o),r++;r<e.length&&(this._$AR(t&&t._$AB.nextSibling,r),e.length=r)}_$AR(a=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);a!==this._$AB;){let t=It(a).nextSibling;It(a).remove(),a=t}}setConnected(a){this._$AM===void 0&&(this._$Cv=a,this._$AP?.(a))}},Te=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(a,e,t,r,o){this.type=1,this._$AH=l,this._$AN=void 0,this.element=a,this.name=e,this._$AM=r,this.options=o,t.length>2||t[0]!==""||t[1]!==""?(this._$AH=Array(t.length-1).fill(new String),this.strings=t):this._$AH=l}_$AI(a,e=this,t,r){let o=this.strings,i=!1;if(o===void 0)a=Pe(this,a,e,0),i=!Ie(a)||a!==this._$AH&&a!==Ae,i&&(this._$AH=a);else{let d=a,c,m;for(a=o[0],c=0;c<o.length-1;c++)m=Pe(this,d[t+c],e,c),m===Ae&&(m=this._$AH[c]),i||=!Ie(m)||m!==this._$AH[c],m===l?a=l:a!==l&&(a+=(m??"")+o[c+1]),this._$AH[c]=m}i&&!r&&this.j(a)}j(a){a===l?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,a??"")}},gt=class extends Te{constructor(){super(...arguments),this.type=3}j(a){this.element[this.name]=a===l?void 0:a}},yt=class extends Te{constructor(){super(...arguments),this.type=4}j(a){this.element.toggleAttribute(this.name,!!a&&a!==l)}},ut=class extends Te{constructor(a,e,t,r,o){super(a,e,t,r,o),this.type=5}_$AI(a,e=this){if((a=Pe(this,a,e,0)??l)===Ae)return;let t=this._$AH,r=a===l&&t!==l||a.capture!==t.capture||a.once!==t.once||a.passive!==t.passive,o=a!==l&&(t===l||r);r&&this.element.removeEventListener(this.name,this,t),o&&this.element.addEventListener(this.name,this,a),this._$AH=a}handleEvent(a){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,a):this._$AH.handleEvent(a)}},xt=class{constructor(a,e,t){this.element=a,this.type=6,this._$AN=void 0,this._$AM=e,this.options=t}get _$AU(){return this._$AM._$AU}_$AI(a){Pe(this,a)}};var Cr=ft.litHtmlPolyfillSupport;Cr?.(Be,Ke),(ft.litHtmlVersions??=[]).push("3.3.2");var Zt=(n,a,e)=>{let t=e?.renderBefore??a,r=t._$litPart$;if(r===void 0){let o=e?.renderBefore??null;t._$litPart$=r=new Ke(a.insertBefore(je(),o),o,void 0,e??{})}return r._$AI(n),r};var $t=globalThis,x=class extends q{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=Zt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Ae}};x._$litElement$=!0,x.finalized=!0,$t.litElementHydrateSupport?.({LitElement:x});var Lr=$t.litElementPolyfillSupport;Lr?.({LitElement:x});($t.litElementVersions??=[]).push("4.2.2");var b=n=>(a,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(n,a)}):customElements.define(n,a)};var Pr={attribute:!0,type:String,converter:Ge,reflect:!1,hasChanged:Qe},Tr=(n=Pr,a,e)=>{let{kind:t,metadata:r}=e,o=globalThis.litPropertyMetadata.get(r);if(o===void 0&&globalThis.litPropertyMetadata.set(r,o=new Map),t==="setter"&&((n=Object.create(n)).wrapped=!0),o.set(e.name,n),t==="accessor"){let{name:i}=e;return{set(d){let c=a.get.call(this);a.set.call(this,d),this.requestUpdate(i,c,n,!0,d)},init(d){return d!==void 0&&this.C(i,void 0,n,d),d}}}if(t==="setter"){let{name:i}=e;return function(d){let c=this[i];a.call(this,d),this.requestUpdate(i,c,n,!0,d)}}throw Error("Unsupported decorator location: "+t)};function y(n){return(a,e)=>typeof e=="object"?Tr(n,a,e):((t,r,o)=>{let i=r.hasOwnProperty(o);return r.constructor.createProperty(o,t),i?Object.getOwnPropertyDescriptor(r,o):void 0})(n,a,e)}function z(n){return y({...n,state:!0,attribute:!1})}var R={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"},Qt={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},G={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},wt={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},M=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],ns=M.map(n=>n.toLowerCase()),kt={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},St={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"},er={"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=f`
4
4
  :host {
5
5
  display: block;
6
6
  container-type: inline-size;
@@ -82,10 +82,24 @@
82
82
  outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
83
83
  outline-offset: 2px;
84
84
  }
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">
85
+
86
+ /* Force the text-style variant on every Unicode glyph in the component.
87
+ * macOS and iOS substitute coloured emoji glyphs for the planetary and
88
+ * gender Unicode code points (Mars, Venus, Mercury, etc.) when the
89
+ * system colour-emoji font wins font selection. The text-style variant
90
+ * keeps glyphs monochrome so they inherit the surrounding fill colour
91
+ * and match the brand palette consistently across platforms.
92
+ *
93
+ * font-variant-emoji is part of CSS Fonts 4 (Safari 17+, Chrome 134+,
94
+ * Firefox 139+). On older browsers the rule is silently ignored.
95
+ */
96
+ :host {
97
+ font-variant-emoji: text;
98
+ }
99
+ `;var Rr={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Ee=["sarva","bhinna","pinda"],V=class extends x{constructor(){super(...arguments);this.data=null;this.activeTab="sarva"}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return s`<div class="wrap" aria-label="Ashtakavarga grid">
86
100
  <div class="head">
87
101
  <h2 class="title">Ashtakavarga</h2>
88
- ${e.length?t`<p class="subtitle">${e.length} signs</p>`:n}
102
+ ${e.length?s`<p class="subtitle">${e.length} signs</p>`:l}
89
103
  </div>
90
104
 
91
105
  <div
@@ -94,16 +108,16 @@
94
108
  aria-label="Ashtakavarga views"
95
109
  @keydown=${this.onTabKeyDown}
96
110
  >
97
- ${fe.map(r=>t`<button
111
+ ${Ee.map(t=>s`<button
98
112
  class="tab"
99
113
  role="tab"
100
- id="tab-${r}"
101
- aria-selected=${this.activeTab===r?"true":"false"}
102
- aria-controls="panel-${r}"
103
- tabindex=${this.activeTab===r?"0":"-1"}
104
- @click=${()=>{this.activeTab=r}}
114
+ id="tab-${t}"
115
+ aria-selected=${this.activeTab===t?"true":"false"}
116
+ aria-controls="panel-${t}"
117
+ tabindex=${this.activeTab===t?"0":"-1"}
118
+ @click=${()=>{this.activeTab=t}}
105
119
  >
106
- ${vt[r]}
120
+ ${Rr[t]}
107
121
  </button>`)}
108
122
  </div>
109
123
 
@@ -114,7 +128,7 @@
114
128
  >
115
129
  ${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}
116
130
  </div>
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">
131
+ </div>`}onTabKeyDown(e){let t=Ee.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Ee[(t+1)%Ee.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Ee[(t-1+Ee.length)%Ee.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let t=this.data.sarvashtakavarga;return t?s`<div class="overflow-scroll">
118
132
  <table aria-label="Sarvashtakavarga bindu counts per sign">
119
133
  <thead>
120
134
  <tr>
@@ -123,41 +137,41 @@
123
137
  </tr>
124
138
  </thead>
125
139
  <tbody>
126
- ${e.map((a,o)=>{let l=r.bindus[o]??0,d=this.heatClass(l);return t`<tr>
140
+ ${e.map((r,o)=>{let i=t.bindus[o]??0,d=this.sarvaHeat(i);return s`<tr>
127
141
  <td>
128
142
  <div class="planet-cell">
129
- <span class="glyph" aria-hidden="true">${N[a]??""}</span>
130
- ${a}
143
+ <span class="glyph" aria-hidden="true">${G[r]??""}</span>
144
+ ${r}
131
145
  </div>
132
146
  </td>
133
- <td class="${`heat-cell ${d}`}">${l}</td>
147
+ <td class="${`heat-cell ${d}`}">${i}</td>
134
148
  </tr>`})}
135
149
  </tbody>
136
150
  <tfoot>
137
151
  <tr class="total-row">
138
152
  <td>Total</td>
139
- <td>${r.total}</td>
153
+ <td>${t.total}</td>
140
154
  </tr>
141
155
  </tfoot>
142
156
  </table>
143
- </div>`:t`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?t`<div class="overflow-scroll">
157
+ </div>`:s`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let t=this.data.bhinnashtakavarga;return t?.length?s`<div class="overflow-scroll">
144
158
  <table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid">
145
159
  <thead>
146
160
  <tr>
147
161
  <th scope="col">Planet</th>
148
- ${e.map(a=>t`<th scope="col" title=${a}>${N[a]??a.slice(0,2)}</th>`)}
162
+ ${e.map(r=>s`<th scope="col" title=${r}>${G[r]??r.slice(0,2)}</th>`)}
149
163
  <th scope="col">Total</th>
150
164
  </tr>
151
165
  </thead>
152
166
  <tbody>
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>
167
+ ${t.map(r=>s`<tr>
168
+ <td>${r.planet}</td>
169
+ ${r.bindus.map(o=>{let i=this.bhinnaHeat(o);return s`<td class="${`heat-cell ${i}`}">${o}</td>`})}
170
+ <td>${r.total}</td>
157
171
  </tr>`)}
158
172
  </tbody>
159
173
  </table>
160
- </div>`:t`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?t`<div class="overflow-scroll">
174
+ </div>`:s`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?s`<div class="overflow-scroll">
161
175
  <table aria-label="Shodhya Pinda planet strength scores">
162
176
  <thead>
163
177
  <tr>
@@ -168,15 +182,15 @@
168
182
  </tr>
169
183
  </thead>
170
184
  <tbody>
171
- ${e.map(r=>t`<tr>
172
- <td>${r.planet}</td>
173
- <td>${r.rashiPinda}</td>
174
- <td>${r.grahaPinda}</td>
175
- <td>${r.shodhyaPinda}</td>
185
+ ${e.map(t=>s`<tr>
186
+ <td>${t.planet}</td>
187
+ <td>${t.rashiPinda}</td>
188
+ <td>${t.grahaPinda}</td>
189
+ <td>${t.shodhyaPinda}</td>
176
190
  </tr>`)}
177
191
  </tbody>
178
192
  </table>
179
- </div>`:t`<p class="roxy-empty">No shodhya pinda data</p>`}};O.styles=[v,x`
193
+ </div>`:s`<p class="roxy-empty">No shodhya pinda data</p>`}};V.styles=[v,f`
180
194
  .wrap {
181
195
  display: grid;
182
196
  gap: var(--roxy-space-md, 1rem);
@@ -283,34 +297,75 @@
283
297
  border-bottom: none;
284
298
  }
285
299
 
286
- /* Heat cells */
300
+ /* Heat cells. Single base hue (var --roxy-heat) mixed with
301
+ * transparent at increasing percentages produces seven readable
302
+ * tiers in both light and dark themes. Text colour stays
303
+ * var(--roxy-fg) so it inverts with the host theme without
304
+ * per-tier overrides. */
287
305
  .heat-cell {
288
306
  border-radius: var(--roxy-radius-sm, 4px);
289
307
  font-weight: var(--roxy-weight-bold, 600);
290
308
  min-width: 2rem;
291
309
  font-variant-numeric: tabular-nums;
310
+ color: var(--roxy-fg, currentColor);
292
311
  }
293
312
 
294
- .heat-1 { background: var(--roxy-heat-1, #f0fdf4); color: var(--roxy-fg, #0a0a0a); }
295
- .heat-2 { background: var(--roxy-heat-2, #d1fae5); color: var(--roxy-fg, #0a0a0a); }
296
- .heat-3 { background: var(--roxy-heat-3, #a7f3d0); color: var(--roxy-fg, #0a0a0a); }
297
- .heat-4 { background: var(--roxy-heat-4, #fde68a); color: var(--roxy-fg, #0a0a0a); }
298
- .heat-5 { background: var(--roxy-heat-5, #fdba74); color: var(--roxy-fg, #0a0a0a); }
299
- .heat-6 { background: var(--roxy-heat-6, #fb923c); color: var(--roxy-fg, #0a0a0a); }
300
- .heat-7 { background: var(--roxy-heat-7, #ef4444); color: var(--roxy-fg, #0a0a0a); }
313
+ .heat-1 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 6%, transparent); }
314
+ .heat-2 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 14%, transparent); }
315
+ .heat-3 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 26%, transparent); }
316
+ .heat-4 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 40%, transparent); }
317
+ .heat-5 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 55%, transparent); }
318
+ .heat-6 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 72%, transparent); }
319
+ .heat-7 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 90%, transparent); }
301
320
 
302
321
  /* Bhinna grid: planet header column narrower */
303
322
  .bhinna-table th:first-child,
304
323
  .bhinna-table td:first-child {
305
324
  min-width: 5rem;
306
325
  }
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">
326
+
327
+ /* Tight cells below 480px so the 14-column bhinna grid stops
328
+ * overflowing the viewport. The wrapper keeps overflow-x:auto as
329
+ * a fallback for very long content. */
330
+ @container (max-width: 480px) {
331
+ .bhinna-table th,
332
+ .bhinna-table td {
333
+ padding: 0.3rem 0.35rem;
334
+ font-size: var(--roxy-text-xs, 0.75rem);
335
+ }
336
+ .bhinna-table th:first-child,
337
+ .bhinna-table td:first-child {
338
+ min-width: 3.5rem;
339
+ }
340
+ .heat-cell {
341
+ min-width: 1.5rem;
342
+ }
343
+ }
344
+ /* Visual cue that the bhinna table is scrollable below the breakpoint:
345
+ * a soft gradient at the right edge so users see there is more to scroll. */
346
+ .overflow-scroll {
347
+ mask-image: linear-gradient(
348
+ to right,
349
+ transparent 0,
350
+ black 0.5rem,
351
+ black calc(100% - 1rem),
352
+ transparent 100%
353
+ );
354
+ -webkit-mask-image: linear-gradient(
355
+ to right,
356
+ transparent 0,
357
+ black 0.5rem,
358
+ black calc(100% - 1rem),
359
+ transparent 100%
360
+ );
361
+ }
362
+ `],p([y({attribute:!1})],V.prototype,"data",2),p([z()],V.prototype,"activeTab",2),V=p([b("roxy-ashtakavarga-grid")],V);var tr={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},Y=class extends x{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):s`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let t=e.quickRead??{},r=Object.entries(t).map(([o,i])=>{let d=typeof i=="number"?i:0,c=Math.abs(d)>1?d/100:d;return[o,c]});return s`<section class="wrap" aria-label="Daily biorhythm">
308
363
  <header class="head">
309
364
  <h2 class="title">Biorhythm</h2>
310
- ${typeof e.energyRating=="number"?t`<span class="energy">Energy ${e.energyRating}/10</span>`:n}
365
+ ${typeof e.energyRating=="number"?s`<span class="energy">Energy ${e.energyRating}/10</span>`:l}
311
366
  </header>
312
367
  <div class="bars" role="list">
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">
368
+ ${r.map(([o,i])=>{let d=(i+1)/2*100,c=tr[o]??"var(--roxy-accent, #f59e0b)";return s`<div class="bar" role="listitem">
314
369
  <span style="text-transform: capitalize">${o}</span>
315
370
  <span class="track">
316
371
  <span
@@ -318,18 +373,18 @@
318
373
  style="width: ${d}%; background: ${c}"
319
374
  ></span>
320
375
  </span>
321
- <span class="value">${Math.round(l*100)}%</span>
376
+ <span class="value">${Math.round(i*100)}%</span>
322
377
  </div>`})}
323
378
  </div>
324
- ${e.dailyMessage?t`<p class="advice">${e.dailyMessage}</p>`:n}
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 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">
379
+ ${e.dailyMessage?s`<p class="advice">${e.dailyMessage}</p>`:l}
380
+ ${e.advice?s`<p class="advice">${e.advice}</p>`:l}
381
+ </section>`}renderForecast(e){let t=e.days??[];if(t.length===0)return s`<div class="roxy-empty" role="status">No forecast</div>`;let r=600,o=160,i=r/Math.max(t.length-1,1),d=["physical","emotional","intellectual","intuitive"];return s`<section class="wrap" aria-label="Biorhythm forecast">
327
382
  <header class="head">
328
383
  <h2 class="title">Forecast</h2>
329
384
  <span class="energy">${e.startDate} - ${e.endDate}</span>
330
385
  </header>
331
386
  <svg
332
- viewBox="0 0 ${a} ${o}"
387
+ viewBox="0 0 ${r} ${o}"
333
388
  role="img"
334
389
  aria-label="Biorhythm cycle lines across the forecast window"
335
390
  >
@@ -337,25 +392,25 @@
337
392
  <line
338
393
  x1="0"
339
394
  y1=${o/2}
340
- x2=${a}
395
+ x2=${r}
341
396
  y2=${o/2}
342
397
  stroke="var(--roxy-border, #e4e4e7)"
343
398
  stroke-width="1"
344
399
  />
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" />`})}
400
+ ${d.map(c=>{let m=t.map((h,u)=>{let k=h[c]??0,$=u*i,$e=o/2-k/100*(o/2-8);return`${$.toFixed(2)},${$e.toFixed(2)}`}).join(" "),g=tr[c]??"#475569";return w`<polyline points=${m} fill="none" stroke=${g} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}
346
401
  </svg>
347
- ${e.summary?.periodAdvice?t`<p class="advice">${e.summary.periodAdvice}</p>`:n}
348
- </section>`}renderCritical(e){return t`<section class="wrap" aria-label="Critical days">
402
+ ${e.summary?.periodAdvice?s`<p class="advice">${e.summary.periodAdvice}</p>`:l}
403
+ </section>`}renderCritical(e){return s`<section class="wrap" aria-label="Critical days">
349
404
  <header class="head">
350
405
  <h2 class="title">Critical days</h2>
351
406
  <span class="energy">${e.totalCriticalDays} total</span>
352
407
  </header>
353
408
  <div>
354
- ${e.criticalDays.map(r=>t`<span class="crit"
355
- >${r.date} · ${r.cycle} ${r.severity}</span
409
+ ${e.criticalDays.map(t=>s`<span class="crit"
410
+ >${t.date} · ${t.cycle} ${t.severity}</span
356
411
  >`)}
357
412
  </div>
358
- </section>`}};H.styles=[v,x`
413
+ </section>`}};Y.styles=[v,f`
359
414
  .wrap {
360
415
  display: grid;
361
416
  gap: var(--roxy-space-md, 1rem);
@@ -431,35 +486,41 @@
431
486
  display: inline-block;
432
487
  margin: 2px;
433
488
  }
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
- <span class="tile-name">${e.name}</span>
436
- <span class="tile-time" aria-label="Time range">${o}</span>
489
+ `],p([y({attribute:!1})],Y.prototype,"data",2),p([y({type:String,reflect:!0})],Y.prototype,"mode",2),Y=p([b("roxy-biorhythm-chart")],Y);function E(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function ce(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}function rr(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var pe=class extends x{constructor(){super(...arguments);this.data=null}isCurrent(e){let t=Date.now(),r=Date.parse(e.start),o=Date.parse(e.end);return Number.isNaN(r)||Number.isNaN(o)?!1:t>=r&&t<o}renderTile(e){let t=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",r=this.isCurrent(e),o=R[E(e.lord)]??"",i=`${rr(e.start)} - ${rr(e.end)}`;return s`<div
490
+ class="cho-tile ${t}${r?" now":""}"
491
+ role="listitem"
492
+ aria-current=${r?"time":"false"}
493
+ >
494
+ <span class="tile-name">
495
+ ${e.name}${r?s`<span class="now-badge">Now</span>`:l}
496
+ </span>
497
+ <span class="tile-time" aria-label="Time range">${i}</span>
437
498
  <span class="tile-lord">
438
- ${a?t`<span aria-hidden="true">${a}</span>`:n}
499
+ ${o?s`<span aria-hidden="true">${o}</span>`:l}
439
500
  ${e.lord}
440
501
  </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:a}=this.data;return t`<div class="wrap">
502
+ </div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:t,nightChoghadiya:r}=this.data;return s`<div class="wrap">
442
503
  <div class="header">
443
504
  <h2 class="title">Choghadiya</h2>
444
- ${e?t`<p class="subtitle">${e}</p>`:n}
505
+ ${e?s`<p class="subtitle">${e}</p>`:l}
445
506
  </div>
446
507
 
447
508
  <div class="cho-grid">
448
509
  <section class="period-col" aria-label="Day muhurta periods">
449
510
  <h3 class="period-heading">Day</h3>
450
511
  <div role="list" aria-label="Daytime choghadiya">
451
- ${r&&r.length>0?r.map(o=>this.renderTile(o)):t`<p class="roxy-empty" role="status">No daytime periods</p>`}
512
+ ${t&&t.length>0?t.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No daytime periods</p>`}
452
513
  </div>
453
514
  </section>
454
515
 
455
516
  <section class="period-col" aria-label="Night muhurta periods">
456
517
  <h3 class="period-heading">Night</h3>
457
518
  <div role="list" aria-label="Nighttime choghadiya">
458
- ${a&&a.length>0?a.map(o=>this.renderTile(o)):t`<p class="roxy-empty" role="status">No nighttime periods</p>`}
519
+ ${r&&r.length>0?r.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No nighttime periods</p>`}
459
520
  </div>
460
521
  </section>
461
522
  </div>
462
- </div>`}};ae.styles=[v,x`
523
+ </div>`}};pe.styles=[v,f`
463
524
  .wrap {
464
525
  display: grid;
465
526
  gap: var(--roxy-space-md, 1rem);
@@ -521,6 +582,21 @@
521
582
  background: transparent;
522
583
  color: var(--roxy-fg, #0a0a0a);
523
584
  }
585
+ .cho-tile.now {
586
+ outline: 2px solid var(--roxy-accent, #f59e0b);
587
+ outline-offset: 1px;
588
+ box-shadow: 0 0 0 4px
589
+ color-mix(in srgb, var(--roxy-accent, #f59e0b) 18%, transparent);
590
+ }
591
+ .now-badge {
592
+ display: inline-block;
593
+ margin-left: 0.4em;
594
+ font-size: var(--roxy-text-xs, 0.75rem);
595
+ font-weight: var(--roxy-weight-bold, 600);
596
+ color: var(--roxy-accent-fg, #b45309);
597
+ text-transform: uppercase;
598
+ letter-spacing: 0.06em;
599
+ }
524
600
  .tile-name {
525
601
  font-size: var(--roxy-text-base, 1rem);
526
602
  font-weight: var(--roxy-weight-bold, 600);
@@ -543,55 +619,55 @@
543
619
  align-items: center;
544
620
  gap: 0.25em;
545
621
  }
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
622
+ `],p([y({attribute:!1})],pe.prototype,"data",2),pe=p([b("roxy-choghadiya-grid")],pe);function j(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,t=new Date(e);return Number.isNaN(t.getTime())?n:t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function rt(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function At(n){if(!n)return"";let a=j(n.start),e=j(n.end);return a&&e?`${a} - ${e}`:a||e||""}function A(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function ar(n,a=1){let e=A(n,a);return e?`${e}%`:""}var qe={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function Re(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}var U=class extends x{constructor(){super(...arguments);this.data=null;this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let t={};for(let[r,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(t[r]=o);return t}return{}}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No compatibility data</div>`;let t=e.overallScore,r=this.getBreakdown(),o="rating"in e?e.rating:void 0,i="archetype"in e?e.archetype:void 0,d="advice"in e?e.advice:void 0,c="summary"in e?e.summary:void 0,m="interpretation"in e?e.interpretation:void 0,g="strengths"in e?e.strengths:void 0,h="challenges"in e?e.challenges:void 0,u="keyAspects"in e?e.keyAspects:void 0;return s`<article
547
623
  class="card"
548
624
  aria-label=${`Compatibility (${this.mode})`}
549
625
  >
550
626
  <div class="head">
551
627
  <h2>${this.mode} compatibility</h2>
552
628
  <div>
553
- ${typeof r=="number"?t`<div class="score">${w(r,0)}</div>`:n}
554
- ${o?t`<div class="rating">${o}</div>`:n}
629
+ ${typeof t=="number"?s`<div class="score">${A(t,0)}</div>`:l}
630
+ ${o?s`<div class="rating">${o}</div>`:l}
555
631
  </div>
556
632
  </div>
557
633
 
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>
634
+ ${Object.keys(r).length>0?s`<div role="list">
635
+ ${Object.entries(r).map(([k,$])=>s`<div class="bar-row" role="listitem">
636
+ <span style="text-transform: capitalize">${k}</span>
561
637
  <span class="bar"
562
638
  ><span style="width: ${Math.max(0,Math.min(100,$))}%"></span
563
639
  ></span>
564
- <span>${w($,0)}</span>
640
+ <span>${A($,0)}</span>
565
641
  </div>`)}
566
- </div>`:n}
567
- ${l?t`<p>
568
- <span class="archetype">${l.label}</span>
569
- ${l.description?t` · ${l.description}`:n}
570
- </p>`:n}
571
- ${c?t`<p>${c}</p>`:n}
572
- ${m&&!c?t`<p>${m}</p>`:n}
573
- ${d?t`<p>${d}</p>`:n}
574
- ${(y?.length??0)>0||(h?.length??0)>0?t`<div class="lists">
575
- ${y?.length?t`<div>
642
+ </div>`:l}
643
+ ${i?s`<p>
644
+ <span class="archetype">${i.label}</span>
645
+ ${i.description?s` · ${i.description}`:l}
646
+ </p>`:l}
647
+ ${c?s`<p>${c}</p>`:l}
648
+ ${m&&!c?s`<p>${m}</p>`:l}
649
+ ${d?s`<p>${d}</p>`:l}
650
+ ${(g?.length??0)>0||(h?.length??0)>0?s`<div class="lists">
651
+ ${g?.length?s`<div>
576
652
  <h3>Strengths</h3>
577
653
  <ul>
578
- ${y.map(E=>t`<li>${E}</li>`)}
654
+ ${g.map(k=>s`<li>${k}</li>`)}
579
655
  </ul>
580
- </div>`:n}
581
- ${h?.length?t`<div>
656
+ </div>`:l}
657
+ ${h?.length?s`<div>
582
658
  <h3>Challenges</h3>
583
659
  <ul>
584
- ${h.map(E=>t`<li>${E}</li>`)}
660
+ ${h.map(k=>s`<li>${k}</li>`)}
585
661
  </ul>
586
- </div>`:n}
587
- </div>`:n}
588
- ${b?.length?t`<div>
662
+ </div>`:l}
663
+ </div>`:l}
664
+ ${u?.length?s`<div>
589
665
  <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
666
  <ul style="margin: 0; padding-left: 1rem; font-size: var(--roxy-text-sm);">
591
- ${b.slice(0,6).map(E=>t`<li>${bt(E)}</li>`)}
667
+ ${u.slice(0,6).map(k=>s`<li>${Nr(k)}</li>`)}
592
668
  </ul>
593
- </div>`:n}
594
- </article>`}};j.styles=[v,x`
669
+ </div>`:l}
670
+ </article>`}};U.styles=[v,f`
595
671
  .card {
596
672
  background: var(--roxy-bg, #fff);
597
673
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -675,45 +751,66 @@
675
751
  margin: 0;
676
752
  padding-left: var(--roxy-space-md, 1rem);
677
753
  }
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">
754
+ `],p([y({attribute:!1})],U.prototype,"data",2),p([y({type:String,reflect:!0})],U.prototype,"mode",2),U=p([b("roxy-compatibility-card")],U);function Nr(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${A(n.orb,1)}\xB0)`:"",t=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${t}${e} \xB7 ${n.description}`:`${t}${e}`}var F=class extends x{constructor(){super(...arguments);this.data=null;this.period="current"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dasha data</div>`;let t=this.collectPeriods(e),r=t.length?Math.max(...t.map(o=>o.durationYears)):0;return s`<div class="wrap" aria-label="Dasha timeline">
679
755
  <header class="head">
680
756
  <h2 class="title">
681
757
  ${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}
682
758
  </h2>
683
- ${"nakshatraName"in e&&e.nakshatraName?t`<div class="nakshatra">
759
+ ${"nakshatraName"in e&&e.nakshatraName?s`<div class="nakshatra">
684
760
  Moon nakshatra: ${e.nakshatraName}
685
- ${"nakshatraLord"in e&&e.nakshatraLord?t`(lord ${e.nakshatraLord})`:n}
686
- </div>`:n}
761
+ ${"nakshatraLord"in e&&e.nakshatraLord?s`(lord ${e.nakshatraLord})`:l}
762
+ </div>`:l}
687
763
  </header>
688
764
 
689
- ${this.period==="current"?this.renderCurrent(e):n}
690
- ${r.length>0?t`<div class="timeline" role="list">
691
- ${r.map(o=>this.renderBar(o,a))}
692
- </div>`:n}
693
- </div>`}renderCurrent(e){return"mahadasha"in e?t`<div class="current">
694
- ${"mahadasha"in e&&e.mahadasha?t`<div>
765
+ ${this.renderBirthBalance(e)}
766
+ ${this.period==="current"?this.renderCurrent(e):l}
767
+ ${t.length>0?s`<div class="timeline" role="list">
768
+ ${t.map(o=>this.renderBar(o,r))}
769
+ </div>`:l}
770
+ ${this.renderActiveInterpretation(t)}
771
+ </div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return l;let t=e.birthDashaBalance,r="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",o=t.years??0,i=t.months??0,d=t.days??0,c=[];o&&c.push(`${o}y`),i&&c.push(`${i}m`),d&&c.push(`${d}d`);let m=c.length?c.join(" "):"0d";return s`<p class="balance">
772
+ Birth dasha balance: ${m} of
773
+ ${r?s`<strong>${r}</strong>`:"the opening mahadasha"} remained at birth.
774
+ </p>`}renderActiveInterpretation(e){let t=e.find(r=>this.isCurrent(r));return t?.interpretation?s`<details class="interp">
775
+ <summary>${t.planet} mahadasha interpretation</summary>
776
+ <p>${t.interpretation}</p>
777
+ </details>`:l}renderCurrent(e){return"mahadasha"in e?s`<div class="current">
778
+ ${"mahadasha"in e&&e.mahadasha?s`<div>
695
779
  <span>Mahadasha</span>
696
780
  <strong>${e.mahadasha.planet}</strong>
697
- ${"remainingInMahadasha"in e&&e.remainingInMahadasha?t`<small>${w(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:n}
698
- </div>`:n}
699
- ${"antardasha"in e&&e.antardasha?t`<div>
781
+ ${"remainingInMahadasha"in e&&e.remainingInMahadasha?s`<small>${A(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:l}
782
+ </div>`:l}
783
+ ${"antardasha"in e&&e.antardasha?s`<div>
700
784
  <span>Antardasha</span>
701
785
  <strong>${e.antardasha.planet}</strong>
702
- ${"remainingInAntardasha"in e&&e.remainingInAntardasha?t`<small>${w(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:n}
703
- </div>`:n}
704
- ${"pratyantardasha"in e&&e.pratyantardasha?t`<div>
786
+ ${"remainingInAntardasha"in e&&e.remainingInAntardasha?s`<small>${A(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:l}
787
+ </div>`:l}
788
+ ${"pratyantardasha"in e&&e.pratyantardasha?s`<div>
705
789
  <span>Pratyantardasha</span>
706
790
  <strong>${e.pratyantardasha.planet}</strong>
707
- ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?t`<small>${w(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:n}
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 a=e.durationYears,o=r>0?a/r*100:0;return t`<div class="bar" role="listitem">
710
- <span>${e.planet}</span>
711
- <span class="bar-track"><span style="width: ${o}%"></span></span>
791
+ ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?s`<small>${A(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:l}
792
+ </div>`:l}
793
+ </div>`:l}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let t=Date.now(),r=Date.parse(e.startDate),o=Date.parse(e.endDate);return Number.isNaN(r)||Number.isNaN(o)?!1:t>=r&&t<o}progressIn(e){if(!e.startDate||!e.endDate)return-1;let t=Date.parse(e.startDate),r=Date.parse(e.endDate),o=Date.now();return Number.isNaN(t)||Number.isNaN(r)||o<t||o>=r||r<=t?-1:(o-t)/(r-t)}renderBar(e,t){let r=e.durationYears,o=t>0?r/t*100:0,i=this.isCurrent(e),d=i?this.progressIn(e):-1,c=i?"bar-track bar-now":"bar-track";return s`<div
794
+ class=${i?"bar now":"bar"}
795
+ role="listitem"
796
+ aria-current=${i?"time":"false"}
797
+ >
798
+ <span>
799
+ <strong>${e.planet}</strong>${i?s`<span class="now-badge">Now</span>`:l}
800
+ </span>
801
+ <span class=${c}>
802
+ <span class="bar-fill" style="width: ${o}%"></span>
803
+ ${d>=0?s`<span
804
+ class="bar-progress"
805
+ style="left: ${d*o}%"
806
+ aria-hidden="true"
807
+ ></span>`:l}
808
+ </span>
712
809
  <span class="dates">
713
- ${e.startDate?Yr(e.startDate):""}
714
- ${e.endDate?t`- ${Yr(e.endDate)}`:""}
810
+ ${e.startDate?sr(e.startDate):""}
811
+ ${e.endDate?s`- ${sr(e.endDate)}`:""}
715
812
  </span>
716
- </div>`}};I.styles=[v,x`
813
+ </div>`}};F.styles=[v,f`
717
814
  .wrap {
718
815
  display: grid;
719
816
  gap: var(--roxy-space-md, 1rem);
@@ -757,6 +854,13 @@
757
854
  color: var(--roxy-fg, #0a0a0a);
758
855
  }
759
856
 
857
+ .balance {
858
+ font-size: var(--roxy-text-sm, 0.875rem);
859
+ color: var(--roxy-muted, #71717a);
860
+ border-left: 2px solid var(--roxy-border, #e4e4e7);
861
+ padding-left: var(--roxy-space-sm, 0.5rem);
862
+ margin: 0;
863
+ }
760
864
  .timeline {
761
865
  display: grid;
762
866
  gap: var(--roxy-space-xs, 0.25rem);
@@ -768,64 +872,107 @@
768
872
  align-items: center;
769
873
  font-size: var(--roxy-text-sm, 0.875rem);
770
874
  }
875
+ .bar.now strong {
876
+ color: var(--roxy-accent-fg, #b45309);
877
+ }
878
+ .now-badge {
879
+ display: inline-block;
880
+ margin-left: 0.4em;
881
+ font-size: var(--roxy-text-xs, 0.75rem);
882
+ font-weight: var(--roxy-weight-bold, 600);
883
+ color: var(--roxy-accent-fg, #b45309);
884
+ text-transform: uppercase;
885
+ letter-spacing: 0.06em;
886
+ }
771
887
  .bar-track {
888
+ position: relative;
772
889
  height: 14px;
773
890
  background: var(--roxy-border, #e4e4e7);
774
891
  border-radius: var(--roxy-radius-full, 9999px);
775
892
  overflow: hidden;
776
893
  }
777
- .bar-track > span {
894
+ .bar-fill {
778
895
  display: block;
779
896
  height: 100%;
780
897
  background: var(--roxy-accent, #f59e0b);
898
+ opacity: 0.45;
781
899
  transition:
782
900
  width var(--roxy-motion-duration, 200ms)
783
901
  var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
784
902
  }
903
+ .bar-now .bar-fill {
904
+ opacity: 1;
905
+ }
906
+ .bar-progress {
907
+ position: absolute;
908
+ top: -2px;
909
+ bottom: -2px;
910
+ width: 2px;
911
+ background: var(--roxy-accent-fg, #b45309);
912
+ border-radius: 2px;
913
+ box-shadow: 0 0 0 2px
914
+ color-mix(in srgb, var(--roxy-accent, #f59e0b) 35%, transparent);
915
+ }
785
916
  .dates {
786
917
  color: var(--roxy-muted, #71717a);
787
918
  font-size: var(--roxy-text-xs, 0.75rem);
788
919
  font-variant-numeric: tabular-nums;
789
920
  text-align: right;
790
921
  }
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
922
+ details.interp {
923
+ border: 1px solid var(--roxy-border, #e4e4e7);
924
+ border-radius: var(--roxy-radius-md, 8px);
925
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
926
+ background: var(--roxy-bg, #fff);
927
+ }
928
+ details.interp summary {
929
+ cursor: pointer;
930
+ font-size: var(--roxy-text-sm, 0.875rem);
931
+ font-weight: var(--roxy-weight-bold, 600);
932
+ }
933
+ details.interp p {
934
+ margin: var(--roxy-space-sm, 0.5rem) 0 0;
935
+ font-size: var(--roxy-text-sm, 0.875rem);
936
+ color: var(--roxy-muted, #71717a);
937
+ }
938
+ `],p([y({attribute:!1})],F.prototype,"data",2),p([y({type:String,reflect:!0})],F.prototype,"period",2),F=p([b("roxy-dasha-timeline")],F);function sr(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var zr=["title","name","label","heading","overview","summary"],Mr=["imageUrl","image","icon","symbol"],_r=["imageUrl","image"],Dr=6,W=class extends x{constructor(){super(...arguments);this.data=null;this.depth=0}render(){return this.data==null?s`<div class="roxy-empty" role="status">No data</div>`:this.depth>=Dr?s`<div class="roxy-empty" role="status">…</div>`:s`<div
792
939
  class="roxy-card"
793
940
  aria-label="Generic data display"
794
941
  >
795
942
  ${this.renderValue(this.data)}
796
- </div>`}renderValue(e){return e==null?n:typeof e=="string"?t`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?t`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?t`<div class="roxy-empty" role="status">Empty list</div>`:e.every(o=>o===null||["string","number","boolean"].includes(typeof o))?t`<ul class="roxy-chips">
797
- ${e.map(o=>t`<li>${String(o)}</li>`)}
798
- </ul>`:e.every(o=>o!==null&&typeof o=="object"&&!Array.isArray(o))?this.renderTable(e):t`<ol>
799
- ${e.map(o=>t`<li>${this.renderValue(o)}</li>`)}
800
- </ol>`}renderTable(e){let r=this.collectKeys(e);return t`<table class="roxy-table" role="table">
943
+ </div>`}renderValue(e){return e==null?l:typeof e=="string"?s`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?s`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?s`<div class="roxy-empty" role="status">Empty list</div>`:e.every(o=>o===null||["string","number","boolean"].includes(typeof o))?s`<ul class="roxy-chips">
944
+ ${e.map(o=>s`<li>${String(o)}</li>`)}
945
+ </ul>`:e.every(o=>o!==null&&typeof o=="object"&&!Array.isArray(o))?this.renderTable(e):s`<ol>
946
+ ${e.map(o=>s`<li>${this.renderValue(o)}</li>`)}
947
+ </ol>`}renderTable(e){let t=this.collectKeys(e);return s`<table class="roxy-table" role="table">
801
948
  <thead>
802
949
  <tr>
803
- ${r.map(a=>t`<th>${te(a)}</th>`)}
950
+ ${t.map(r=>s`<th>${ce(r)}</th>`)}
804
951
  </tr>
805
952
  </thead>
806
953
  <tbody>
807
- ${e.map(a=>t`<tr>
808
- ${r.map(o=>t`<td>${this.formatPrimitive(a[o])}</td>`)}
954
+ ${e.map(r=>s`<tr>
955
+ ${t.map(o=>s`<td>${this.formatPrimitive(r[o])}</td>`)}
809
956
  </tr>`)}
810
957
  </tbody>
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
958
+ </table>`}renderObject(e){let t=zr.find(d=>typeof e[d]=="string"),r=Mr.find(d=>typeof e[d]=="string"&&e[d].startsWith("http")),o=t!=="summary"&&typeof e.summary=="string"?"summary":null,i=Object.entries(e).filter(([d,c])=>d!==t&&d!==o&&!_r.includes(d)&&c!==null&&c!==void 0);return s`
959
+ ${r?s`<img
813
960
  class="roxy-image"
814
- src=${String(e[a])}
815
- alt=${r?String(e[r]):"illustration"}
961
+ src=${String(e[r])}
962
+ alt=${t?String(e[t]):"illustration"}
816
963
  loading="lazy"
817
- />`:n}
818
- ${r?t`<h3 class="roxy-title">${e[r]}</h3>`:n}
819
- ${o?t`<p class="roxy-summary">${e[o]}</p>`:n}
820
- ${l.length>0?t`<dl class="roxy-rows">
821
- ${l.map(([d,c])=>t`
822
- <dt>${te(d)}</dt>
964
+ />`:l}
965
+ ${t?s`<h3 class="roxy-title">${e[t]}</h3>`:l}
966
+ ${o?s`<p class="roxy-summary">${e[o]}</p>`:l}
967
+ ${i.length>0?s`<dl class="roxy-rows">
968
+ ${i.map(([d,c])=>s`
969
+ <dt>${ce(d)}</dt>
823
970
  <dd>${this.renderField(c)}</dd>
824
971
  `)}
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(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`
972
+ </dl>`:l}
973
+ `}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(r=>["string","number","boolean"].includes(typeof r))?s`<ul class="roxy-chips">
974
+ ${e.map(r=>s`<li>${String(r)}</li>`)}
975
+ </ul>`:s`<roxy-data .data=${e} .depth=${this.depth+1}></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let t=new Set;for(let r of e)for(let o of Object.keys(r))t.add(o);return Array.from(t)}};W.styles=[v,f`
829
976
  .roxy-card {
830
977
  background: var(--roxy-bg, #fff);
831
978
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -919,94 +1066,227 @@
919
1066
  margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
920
1067
  text-transform: capitalize;
921
1068
  }
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
- <g>
924
- ${i.isLagna?S`<rect
925
- class="lagna-bg"
926
- x=${s.x-30} y=${s.y-28}
927
- width="60" height="56" rx="6"
928
- />`:n}
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=${s.x} y=${s.y-18} text-anchor="middle" dominant-baseline="central">LAGNA</text>`:n}
931
- ${ur(i.planets,s.x,a,13)}
1069
+ `],p([y({attribute:!1})],W.prototype,"data",2),p([y({attribute:!1})],W.prototype,"depth",2),W=p([b("roxy-data")],W);function I(n){let a=n%360;return a<0?a+360:a}function B(n){let a=I(n),e=Math.floor(a/30)%12,t=a%30,r=Math.floor(t),o=(t-r)*60,i=Math.floor(o),d=Math.round((o-i)*60);return{sign:M[e]??"Aries",signIndex:e,degree:r,minute:i,second:d}}function at(n){let{sign:a,degree:e,minute:t}=B(n);return`${e}\xB0 ${a} ${String(t).padStart(2,"0")}'`}function Et(n){return I(n+180)}function or(n,a){let e=I(n),t=I(a)-e;return t<0&&(t+=360),I(e+t/2)}function L(n,a,e,t){let r=t*Math.PI/180;return{x:n+e*Math.cos(r),y:a+e*Math.sin(r)}}var H=400,P=20,D=H-2*P,N=H/2,Or=Object.fromEntries(M.map(n=>[n.toLowerCase(),n])),Ce=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Gr="\u02B3";function nr(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:B(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function Hr(n,a){let e=Qt[E(n.graha)]??n.graha.slice(0,2),t=n.isRetrograde?Gr:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||nr(n,a))return`${e}${t}`;let{degree:r}=B(n.longitude);return`${e} ${r}\xB0${t}`}function jr(n,a){let e=[E(n.graha)],t=nr(n,a);if(t&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let r=B(n.longitude),o=String(r.minute).padStart(2,"0");e.push(t?`D1: ${r.degree}\xB0${o}' ${r.sign}`:`${r.degree}\xB0${o}' ${r.sign}`)}if(n.nakshatra?.name){let r=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${r}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Ct(n,a,e,t,r){let o=t-(n.length-1)*r/2;return n.map((i,d)=>{let c=o+d*r;return w`<text class="planet-text" x=${e} y=${c} text-anchor="middle" dominant-baseline="central">${Hr(i,a)}<title>${jr(i,a)}</title></text>`})}function ot(n,a){let e={};for(let r of M)e[r.toLowerCase()]=[];let t="";for(let[r,o]of Object.entries(n??{})){let i=(o?.rashi??"").toLowerCase();if(r==="Lagna"||o?.graha==="Lagna"){t=Or[i]??"";continue}!i||!(i in e)||e[i]?.push({graha:o.graha??r,longitude:o.longitude,nakshatra:o.nakshatra,isRetrograde:o.isRetrograde,awastha:o.awastha})}return{lagnaSign:t,placements:e,divisionLabel:a}}var Le=D/4,Ir={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function Br(n){let a=Ir[n]??{col:0,row:0};return{x:P+a.col*Le,y:P+a.row*Le,w:Le,h:Le}}function Kr(n){let a=P,e=P+Le,t=P+2*Le,r=P+3*Le,o=H-P;return w`
1070
+ <rect class="line" x=${a} y=${a} width=${D} height=${D} stroke-width="1.5" fill="none" />
1071
+ <line class="line" x1=${a} y1=${e} x2=${o} y2=${e} stroke-width="1" />
1072
+ <line class="line" x1=${a} y1=${r} x2=${o} y2=${r} stroke-width="1" />
1073
+ <line class="line" x1=${e} y1=${a} x2=${e} y2=${o} stroke-width="1" />
1074
+ <line class="line" x1=${r} y1=${a} x2=${r} y2=${o} stroke-width="1" />
1075
+ <line class="line" x1=${a} y1=${t} x2=${e} y2=${t} stroke-width="1" />
1076
+ <line class="line" x1=${r} y1=${t} x2=${o} y2=${t} stroke-width="1" />
1077
+ <line class="line" x1=${t} y1=${a} x2=${t} y2=${e} stroke-width="1" />
1078
+ <line class="line" x1=${t} y1=${r} x2=${t} y2=${o} stroke-width="1" />
1079
+ ${n?w`<text class="centre-label" x=${N} y=${N} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
1080
+ `}function ir(n,a){let e=M.findIndex(r=>r===a),t=M.findIndex(r=>r===n);return e===-1||t===-1?0:(t-e+12)%12+1}function qr(n,a,e,t){let r=Br(n),o=r.x+r.w/2,i=r.y+r.h/2,d=wt[n]??n.slice(0,2),c=14;return w`
1081
+ <g class=${e?"cell lagna":"cell"}>
1082
+ ${e?w`
1083
+ <rect class="lagna-bg" x=${r.x} y=${r.y} width=${r.w} height=${r.h} />
1084
+ <line class="lagna-slash" x1=${r.x+r.w-c} y1=${r.y+c} x2=${r.x+c} y2=${r.y+r.h-c} stroke-width="1.2" />
1085
+ `:l}
1086
+ <text class="sign-text" x=${r.x+6} y=${r.y+12} text-anchor="start" dominant-baseline="central">${d}</text>
1087
+ ${t>0?w`<text class="house-num" x=${r.x+r.w-6} y=${r.y+12} text-anchor="end" dominant-baseline="central">${t}</text>`:l}
1088
+ ${a.length?Ct(a,n,o,i+4,14):l}
932
1089
  </g>
933
- `}function Fe(){return S`
934
- <polygon class="line" points="150,10 290,150 150,290 10,150" stroke-width="1.5" />
935
- <line class="line" x1="150" y1="10" x2="150" y2="290" stroke-width="1" />
936
- <line class="line" x1="10" y1="150" x2="290" y2="150" stroke-width="1" />
937
- <line class="line" x1="150" y1="10" x2="10" y2="150" stroke-width="0.6" stroke-dasharray="3,3" />
938
- <line class="line" x1="150" y1="10" x2="290" y2="150" stroke-width="0.6" stroke-dasharray="3,3" />
939
- <line class="line" x1="150" y1="290" x2="10" y2="150" stroke-width="0.6" stroke-dasharray="3,3" />
940
- <line class="line" x1="150" y1="290" x2="290" y2="150" stroke-width="0.6" stroke-dasharray="3,3" />
941
- `}function Ve(i){let s=Tt[i.number];if(!s)return n;let e=qe[i.sign]??"";return S`
942
- <g>
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)}
1090
+ `}function Vr(n){let a=n.lagnaSign.toLowerCase();return w`
1091
+ ${Kr(n.divisionLabel)}
1092
+ ${M.map(e=>qr(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,ir(e,n.lagnaSign)))}
1093
+ `}var C={tl:{x:P,y:P},tr:{x:H-P,y:P},br:{x:H-P,y:H-P},bl:{x:P,y:H-P},top:{x:N,y:P},right:{x:H-P,y:N},bottom:{x:N,y:H-P},left:{x:P,y:N},tlMid:{x:N-D/4,y:N-D/4},trMid:{x:N+D/4,y:N-D/4},brMid:{x:N+D/4,y:N+D/4},blMid:{x:N-D/4,y:N+D/4}};function J(n){let a=n.reduce((t,r)=>t+r.x,0)/n.length,e=n.reduce((t,r)=>t+r.y,0)/n.length;return{x:a,y:e}}var Yr={1:{x:N,y:C.tlMid.y},2:J([C.tl,C.top,C.tlMid]),3:J([C.tl,C.left,C.tlMid]),4:{x:C.tlMid.x,y:N},5:J([C.bl,C.left,C.blMid]),6:J([C.bl,C.bottom,C.blMid]),7:{x:N,y:C.blMid.y},8:J([C.br,C.bottom,C.brMid]),9:J([C.br,C.right,C.brMid]),10:{x:C.brMid.x,y:N},11:J([C.tr,C.right,C.trMid]),12:J([C.tr,C.top,C.trMid])};function Ur(n,a){let e=M.findIndex(t=>t===a);return e===-1?n:(e+n-1)%12+1}function Fr(n){let{tl:a,tr:e,br:t,bl:r,top:o,right:i,bottom:d,left:c}=C;return w`
1094
+ <rect class="line" x=${a.x} y=${a.y} width=${D} height=${D} stroke-width="1.5" fill="none" />
1095
+ <polygon class="line" points="${o.x},${o.y} ${i.x},${i.y} ${d.x},${d.y} ${c.x},${c.y}" stroke-width="1" fill="none" />
1096
+ <line class="line" x1=${a.x} y1=${a.y} x2=${t.x} y2=${t.y} stroke-width="1" />
1097
+ <line class="line" x1=${e.x} y1=${e.y} x2=${r.x} y2=${r.y} stroke-width="1" />
1098
+ ${n?w`<text class="centre-label" x=${N} y=${N} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
1099
+ `}function Wr(n,a,e,t,r){let o=Yr[n];if(!o)return w``;let i=Math.min(14,Math.abs(o.y-N)*.45+6),d=i+12;return w`
1100
+ <g class=${r?"cell lagna":"cell"}>
1101
+ <text class="rashi-num" x=${o.x} y=${o.y-i} text-anchor="middle" dominant-baseline="central">${a}</text>
1102
+ ${r?w`<text class="lagna-marker" x=${o.x} y=${o.y-d} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
1103
+ ${t.length?Ct(t,e,o.x,o.y+8,12):l}
947
1104
  </g>
948
- `}function We(){return S`
949
- <polygon class="line" points="150,10 290,150 150,290 10,150" stroke-width="1.5" />
950
- <polygon class="line" points="220,80 220,220 80,220 80,80" stroke-width="1" fill="none" />
951
- <line class="line" x1="150" y1="10" x2="80" y2="80" stroke-width="1" />
952
- <line class="line" x1="150" y1="10" x2="220" y2="80" stroke-width="1" />
953
- <line class="line" x1="290" y1="150" x2="220" y2="80" stroke-width="1" />
954
- <line class="line" x1="290" y1="150" x2="220" y2="220" stroke-width="1" />
955
- <line class="line" x1="150" y1="290" x2="220" y2="220" stroke-width="1" />
956
- <line class="line" x1="150" y1="290" x2="80" y2="220" stroke-width="1" />
957
- <line class="line" x1="10" y1="150" x2="80" y2="220" stroke-width="1" />
958
- <line class="line" x1="10" y1="150" x2="80" y2="80" stroke-width="1" />
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)}
1105
+ `}function Jr(n){let a=n.lagnaSign||"Aries";return w`
1106
+ ${Fr(n.divisionLabel)}
1107
+ ${Array.from({length:12},(e,t)=>{let r=t+1,o=Ur(r,a),i=M[o-1]??"Aries";return Wr(r,o,i,n.placements[i.toLowerCase()]??[],r===1)})}
1108
+ `}var st=D/3;function Xr(){let n=P,a=P+st,e=P+2*st,t=H-P,Ye={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:t}],Virgo:[{x:a,y:e},{x:a,y:t},{x:n,y:t}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:t},{x:a,y:t}],Scorpio:[{x:e,y:e},{x:e,y:t},{x:t,y:t}],Sagittarius:[{x:e,y:e},{x:t,y:t},{x:t,y:e}],Capricorn:[{x:e,y:a},{x:t,y:a},{x:t,y:e},{x:e,y:e}],Aquarius:[{x:t,y:n},{x:t,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:t,y:n},{x:e,y:a}]},_e={};for(let[Ue,Fe]of Object.entries(Ye))_e[Ue]={points:[...Fe],centroid:J(Fe)};return _e}var Zr=Xr();function Qr(n){let a=P,e=P+st,t=P+2*st,r=H-P;return w`
1109
+ <rect class="line" x=${a} y=${a} width=${D} height=${D} stroke-width="1.5" fill="none" />
1110
+ <line class="line" x1=${a} y1=${e} x2=${e} y2=${e} stroke-width="1" />
1111
+ <line class="line" x1=${t} y1=${e} x2=${r} y2=${e} stroke-width="1" />
1112
+ <line class="line" x1=${a} y1=${t} x2=${e} y2=${t} stroke-width="1" />
1113
+ <line class="line" x1=${t} y1=${t} x2=${r} y2=${t} stroke-width="1" />
1114
+ <line class="line" x1=${e} y1=${a} x2=${e} y2=${e} stroke-width="1" />
1115
+ <line class="line" x1=${e} y1=${t} x2=${e} y2=${r} stroke-width="1" />
1116
+ <line class="line" x1=${t} y1=${a} x2=${t} y2=${e} stroke-width="1" />
1117
+ <line class="line" x1=${t} y1=${t} x2=${t} y2=${r} stroke-width="1" />
1118
+ <line class="line" x1=${a} y1=${a} x2=${e} y2=${e} stroke-width="1" />
1119
+ <line class="line" x1=${r} y1=${a} x2=${t} y2=${e} stroke-width="1" />
1120
+ <line class="line" x1=${r} y1=${r} x2=${t} y2=${t} stroke-width="1" />
1121
+ <line class="line" x1=${a} y1=${r} x2=${e} y2=${t} stroke-width="1" />
1122
+ ${n?w`<text class="centre-label" x=${N} y=${N} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
1123
+ `}function ea(n,a,e,t){let r=Zr[n];if(!r)return w``;let{centroid:o,points:i}=r,d=wt[n]??n.slice(0,2),c=i.map(m=>`${m.x},${m.y}`).join(" ");return w`
1124
+ <g class=${e?"cell lagna":"cell"}>
1125
+ ${e?w`<polygon class="lagna-bg" points=${c} />`:l}
1126
+ <text class="sign-text" x=${o.x} y=${o.y-16} text-anchor="middle" dominant-baseline="central">${d}</text>
1127
+ ${t>0?w`<text class="house-num" x=${o.x+18} y=${o.y-16} text-anchor="start" dominant-baseline="central">${t}</text>`:l}
1128
+ ${e?w`<text class="lagna-marker" x=${o.x} y=${o.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
1129
+ ${a.length?Ct(a,n,o.x,o.y+4,12):l}
970
1130
  </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">
1131
+ `}function ta(n){let a=n.lagnaSign.toLowerCase();return w`
1132
+ ${Qr(n.divisionLabel)}
1133
+ ${M.map(e=>ea(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,ir(e,n.lagnaSign)))}
1134
+ `}function nt(n,a){switch(a){case"north":return Jr(n);case"east":return ta(n);default:return Vr(n)}}function it(n,a){return s`<div
1135
+ class="kundli-tablist"
1136
+ role="tablist"
1137
+ aria-label="Kundli style"
1138
+ @keydown=${t=>{let r=Ce.findIndex(o=>o.id===n);if(t.key==="ArrowRight"){t.preventDefault();let o=Ce[(r+1)%Ce.length];o&&a(o.id)}else if(t.key==="ArrowLeft"){t.preventDefault();let o=Ce[(r-1+Ce.length)%Ce.length];o&&a(o.id)}}}
1139
+ >
1140
+ ${Ce.map(t=>s`<button
1141
+ type="button"
1142
+ class="kundli-tab"
1143
+ role="tab"
1144
+ id="kundli-tab-${t.id}"
1145
+ aria-selected=${n===t.id?"true":"false"}
1146
+ tabindex=${n===t.id?"0":"-1"}
1147
+ @click=${()=>a(t.id)}
1148
+ >
1149
+ ${t.label}
1150
+ </button>`)}
1151
+ </div>`}var lt=f`
1152
+ .wrap {
1153
+ display: grid;
1154
+ gap: var(--roxy-space-md, 1rem);
1155
+ }
1156
+ .header {
1157
+ display: flex;
1158
+ flex-wrap: wrap;
1159
+ align-items: center;
1160
+ justify-content: space-between;
1161
+ gap: var(--roxy-space-sm, 0.5rem);
1162
+ }
1163
+ .title {
1164
+ font-size: var(--roxy-text-lg, 1.125rem);
1165
+ font-weight: var(--roxy-weight-bold, 600);
1166
+ margin: 0;
1167
+ }
1168
+ .kundli-tablist {
1169
+ display: inline-flex;
1170
+ gap: 2px;
1171
+ border-bottom: 2px solid var(--roxy-border, #e4e4e7);
1172
+ }
1173
+ .kundli-tab {
1174
+ padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
1175
+ font-size: var(--roxy-text-sm, 0.875rem);
1176
+ background: none;
1177
+ border: none;
1178
+ border-bottom: 2px solid transparent;
1179
+ margin-bottom: -2px;
1180
+ cursor: pointer;
1181
+ color: var(--roxy-muted, #71717a);
1182
+ font-family: inherit;
1183
+ transition: color var(--roxy-motion-duration, 200ms)
1184
+ var(--roxy-motion-easing, ease);
1185
+ }
1186
+ .kundli-tab[aria-selected='true'] {
1187
+ color: var(--roxy-accent-fg, #b45309);
1188
+ border-bottom-color: var(--roxy-accent, #f59e0b);
1189
+ font-weight: var(--roxy-weight-bold, 600);
1190
+ }
1191
+ .kundli-tab:hover:not([aria-selected='true']) {
1192
+ color: var(--roxy-fg, #0a0a0a);
1193
+ }
1194
+ .kundli-tab:focus-visible {
1195
+ outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
1196
+ outline-offset: 2px;
1197
+ border-radius: 4px;
1198
+ }
1199
+ svg {
1200
+ display: block;
1201
+ width: 100%;
1202
+ max-width: 560px;
1203
+ aspect-ratio: 1 / 1;
1204
+ height: auto;
1205
+ margin: 0 auto;
1206
+ }
1207
+ .line {
1208
+ fill: transparent;
1209
+ stroke: var(--roxy-border, #d4d4d8);
1210
+ }
1211
+ .sign-text {
1212
+ fill: var(--roxy-muted, #71717a);
1213
+ font-size: 11px;
1214
+ font-weight: 500;
1215
+ font-family: var(--roxy-font-sans);
1216
+ text-transform: uppercase;
1217
+ letter-spacing: 0.04em;
1218
+ }
1219
+ .rashi-num {
1220
+ fill: var(--roxy-muted, #71717a);
1221
+ font-size: 12px;
1222
+ font-weight: 500;
1223
+ font-family: var(--roxy-font-sans);
1224
+ }
1225
+ .house-num {
1226
+ fill: var(--roxy-accent-fg, #b45309);
1227
+ font-size: 11px;
1228
+ font-weight: 600;
1229
+ font-family: var(--roxy-font-sans);
1230
+ opacity: 0.85;
1231
+ }
1232
+ .planet-text {
1233
+ fill: var(--roxy-fg, #0a0a0a);
1234
+ font-size: 13px;
1235
+ font-weight: 600;
1236
+ font-family: var(--roxy-font-sans);
1237
+ }
1238
+ .centre-label {
1239
+ fill: var(--roxy-muted, #71717a);
1240
+ font-size: 14px;
1241
+ font-weight: 600;
1242
+ font-family: var(--roxy-font-sans);
1243
+ letter-spacing: 0.02em;
1244
+ }
1245
+ .lagna-marker {
1246
+ fill: var(--roxy-accent-fg, #b45309);
1247
+ font-size: 10px;
1248
+ font-weight: 700;
1249
+ font-family: var(--roxy-font-sans);
1250
+ letter-spacing: 0.08em;
1251
+ text-transform: uppercase;
1252
+ }
1253
+ .lagna-bg {
1254
+ fill: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
1255
+ }
1256
+ .lagna-slash {
1257
+ stroke: var(--roxy-accent, #f59e0b);
1258
+ stroke-linecap: round;
1259
+ opacity: 0.7;
1260
+ }
1261
+ `;var X=class extends x{constructor(){super(...arguments);this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,t=`D${e.number} ${e.name}`;return ot(this.data.chart.meta,t)}render(){let e=this.viewModel();if(!this.data||!e)return s`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:t,vargottama:r}=this.data;return s`<div class="wrap">
972
1262
  <div class="header">
973
- <h2 class="title">
974
- D${e.number} ${e.name}
975
- ${e.sanskritName&&e.sanskritName!==e.name?t`<span class="division-meta"> · ${e.sanskritName}</span>`:n}
976
- </h2>
977
- ${e.significance?t`<p class="significance">${e.significance}</p>`:n}
1263
+ <div>
1264
+ <h2 class="title">
1265
+ D${t.number} ${t.name}
1266
+ ${t.sanskritName&&t.sanskritName!==t.name?s`<span class="division-meta"> · ${t.sanskritName}</span>`:l}
1267
+ </h2>
1268
+ ${t.significance?s`<p class="significance">${t.significance}</p>`:l}
1269
+ </div>
1270
+ ${it(this.chartStyle,this.setStyle)}
978
1271
  </div>
979
1272
 
980
1273
  <svg
981
- viewBox="0 0 300 300"
1274
+ viewBox="0 0 400 400"
1275
+ preserveAspectRatio="xMidYMid meet"
982
1276
  role="img"
983
- aria-label="D${e.number} ${e.name} divisional chart with twelve sign houses"
1277
+ aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"
984
1278
  >
985
- <title>D${e.number} ${e.name}</title>
986
- ${l}
987
- ${a.map(c=>d(c))}
1279
+ <title>D${t.number} ${t.name}</title>
1280
+ ${nt(e,this.chartStyle)}
988
1281
  </svg>
989
1282
 
990
- ${r&&r.length>0?t`<div class="vargottama-row" role="list" aria-label="Vargottama planets">
1283
+ ${r&&r.length>0?s`<div class="vargottama-row" role="list" aria-label="Vargottama planets">
991
1284
  <span class="vargottama-label">Vargottama:</span>
992
- ${r.map(c=>t`<span class="vargottama-pill" role="listitem">
993
- ${L[c]??""} ${c}
1285
+ ${r.map(o=>s`<span class="vargottama-pill" role="listitem">
1286
+ ${R[o]??""} ${o}
994
1287
  </span>`)}
995
- </div>`:n}
996
- </div>`}};q.styles=[v,x`
997
- .wrap {
998
- display: grid;
999
- gap: var(--roxy-space-md, 1rem);
1000
- }
1001
- .header {
1002
- display: grid;
1003
- gap: var(--roxy-space-xs, 0.25rem);
1004
- }
1005
- .title {
1006
- font-size: var(--roxy-text-lg, 1.125rem);
1007
- font-weight: var(--roxy-weight-bold, 600);
1008
- margin: 0;
1009
- }
1288
+ </div>`:l}
1289
+ </div>`}};X.styles=[v,lt,f`
1010
1290
  .division-meta {
1011
1291
  font-size: var(--roxy-text-sm, 0.875rem);
1012
1292
  color: var(--roxy-muted, #71717a);
@@ -1019,46 +1299,6 @@
1019
1299
  padding-left: var(--roxy-space-sm, 0.5rem);
1020
1300
  margin: 0;
1021
1301
  }
1022
- svg {
1023
- display: block;
1024
- width: 100%;
1025
- max-width: 360px;
1026
- margin: 0 auto;
1027
- }
1028
- .line {
1029
- fill: transparent;
1030
- stroke: var(--roxy-border, #e4e4e7);
1031
- }
1032
- .sign-text {
1033
- fill: var(--roxy-muted, #71717a);
1034
- font-size: 9px;
1035
- font-weight: 500;
1036
- font-family: var(--roxy-font-sans);
1037
- }
1038
- .planet-text {
1039
- fill: var(--roxy-fg, #0a0a0a);
1040
- font-size: 11px;
1041
- font-weight: 600;
1042
- font-family: var(--roxy-font-sans);
1043
- }
1044
- .house-num {
1045
- fill: var(--roxy-muted, #71717a);
1046
- font-size: 9px;
1047
- font-weight: 400;
1048
- font-family: var(--roxy-font-sans);
1049
- }
1050
- .lagna-marker {
1051
- fill: var(--roxy-accent-fg, #b45309);
1052
- font-size: 8px;
1053
- font-weight: 700;
1054
- font-family: var(--roxy-font-sans);
1055
- letter-spacing: 0.05em;
1056
- }
1057
- .lagna-bg {
1058
- fill: color-mix(in srgb, var(--roxy-accent, #f59e0b) 12%, transparent);
1059
- stroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
1060
- stroke-width: 0.8;
1061
- }
1062
1302
  .vargottama-row {
1063
1303
  display: flex;
1064
1304
  flex-wrap: wrap;
@@ -1083,46 +1323,46 @@
1083
1323
  color: var(--roxy-fg, #0a0a0a);
1084
1324
  border: 1px solid color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
1085
1325
  }
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
1326
+ `],p([y({attribute:!1})],X.prototype,"data",2),p([y({type:String,reflect:!0,attribute:"chart-style"})],X.prototype,"chartStyle",2),X=p([b("roxy-divisional-chart")],X);var ra={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Z=class extends x{constructor(){super(...arguments);this.data=null;this.type="manglik"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dosha data</div>`;let t=!!e.present,r=ra[this.type]??this.type,o=(e.severity??"").toLowerCase(),i=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=i*33,c=i===3?"var(--roxy-danger)":i===2?"var(--roxy-warning)":i===1?"var(--roxy-success)":"transparent";return s`<article
1087
1327
  class="card"
1088
- aria-label=${a}
1328
+ aria-label=${r}
1089
1329
  >
1090
1330
  <header class="head">
1091
- <h2 class="title">${a}</h2>
1092
- <span class=${`badge ${r?"present":"absent"}`}>
1093
- ${r?"Present":"Absent"}
1331
+ <h2 class="title">${r}</h2>
1332
+ <span class=${`badge ${t?"present":"absent"}`}>
1333
+ ${t?"Present":"Absent"}
1094
1334
  </span>
1095
1335
  </header>
1096
- ${e.severity?t`<div
1336
+ ${e.severity?s`<div
1097
1337
  class="severity-bar"
1098
1338
  role="meter"
1099
1339
  aria-valuemin="0"
1100
1340
  aria-valuemax="3"
1101
- aria-valuenow="${l}"
1341
+ aria-valuenow="${i}"
1102
1342
  aria-label="Severity ${e.severity}"
1103
1343
  >
1104
1344
  <span class="severity-fill" style="width: ${d}%; background: ${c};"></span>
1105
- </div>`:n}
1106
- ${e.description?t`<p class="description">${e.description}</p>`:n}
1345
+ </div>`:l}
1346
+ ${e.description?s`<p class="description">${e.description}</p>`:l}
1107
1347
  ${this.renderEffects(e)}
1108
- ${e.remedies&&e.remedies.length>0?t`<div>
1348
+ ${e.remedies&&e.remedies.length>0?s`<div>
1109
1349
  <h3>Remedies</h3>
1110
1350
  <ul>
1111
- ${e.remedies.map(m=>t`<li>${m}</li>`)}
1351
+ ${e.remedies.map(m=>s`<li>${m}</li>`)}
1112
1352
  </ul>
1113
- </div>`:n}
1114
- ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?t`<div>
1353
+ </div>`:l}
1354
+ ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?s`<div>
1115
1355
  <h3>Exceptions</h3>
1116
1356
  <ul>
1117
- ${e.exceptions.map(m=>t`<li>${m}</li>`)}
1357
+ ${e.exceptions.map(m=>s`<li>${m}</li>`)}
1118
1358
  </ul>
1119
- </div>`:n}
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>
1359
+ </div>`:l}
1360
+ </article>`}renderEffects(e){if(!e.effects)return l;let t=Object.entries(e.effects).filter(([,r])=>typeof r=="string"&&r.length>0);return t.length===0?l:s`<div class="effects">
1361
+ ${t.map(([r,o])=>s`<div>
1362
+ <h3>${r}</h3>
1123
1363
  <p>${o}</p>
1124
1364
  </div>`)}
1125
- </div>`}};K.styles=[v,x`
1365
+ </div>`}};Z.styles=[v,f`
1126
1366
  .card {
1127
1367
  background: var(--roxy-bg, #fff);
1128
1368
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1210,36 +1450,36 @@
1210
1450
  margin: 0;
1211
1451
  font-size: var(--roxy-text-sm, 0.875rem);
1212
1452
  }
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">
1453
+ `],p([y({attribute:!1})],Z.prototype,"data",2),p([y({type:String,reflect:!0})],Z.prototype,"type",2),Z=p([b("roxy-dosha-card")],Z);var Lt=new Map;async function aa(n){let a=Lt.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Lt.delete(n),e}),Lt.set(n,a)),a}var O=class extends x{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let t=e.detail;t&&(this.values={...this.values,latitude:t.latitude,longitude:t.longitude,timezone:t.timezone??t.utcOffset})};this.onSubmit=e=>{e.preventDefault();let t=this.fields.filter(r=>r.required).filter(r=>this.values[r.name]===void 0||this.values[r.name]==="");if(t.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:t.map(r=>r.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await aa(this.specUrl),t=`/${this.endpoint.replace(/^\//,"")}`,r=e.paths?.[t]?.[this.method.toLowerCase()];if(!r)throw new Error(`Endpoint ${this.method} ${t} not found in OpenAPI spec`);let o=e.components?.schemas??{},i=[],d;if(r.requestBody){let m=r.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[g,h]of Object.entries(d.properties)){let u=this.resolve(h,o)??{};i.push({name:g,type:this.fieldType(u),required:m.has(g),description:u.description,enum:u.enum,min:u.minimum,max:u.maximum,default:u.default})}}for(let m of r.parameters??[])if(m.in==="path"||m.in==="query"){let g=this.resolve(m.schema,o)??{};i.push({name:m.name,type:this.fieldType(g),required:!!m.required,description:g.description,enum:g.enum,default:g.default})}this.fields=i,this.hasLocation=i.some(m=>m.name==="latitude")&&i.some(m=>m.name==="longitude")&&i.some(m=>m.name==="timezone");let c={};for(let m of i)m.default!==void 0&&(c[m.name]=m.default);this.values=c,this.loaded=!0}catch(e){let t=e instanceof Error?e.message:String(e);this.specError=t,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:t},bubbles:!0,composed:!0}))}}resolve(e,t){if(e){if("$ref"in e&&e.$ref){let r=e.$ref.split("/").pop();return r?t[r]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,t){this.values={...this.values,[e]:t}}render(){if(!this.loaded)return s`<form><div class="roxy-skeleton" style="height: 8rem"></div></form>`;if(this.specError)return s`<div class="spec-error" role="alert">
1214
1454
  Schema load failed: ${this.specError}
1215
1455
  <button type="button" class="submit" @click=${this.retryLoadSchema}>Retry</button>
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}
1456
+ </div>`;let e=t=>{if(this.hasLocation&&(t.name==="latitude"||t.name==="longitude"||t.name==="timezone"))return l;let r=`roxy-form-${t.name}`;return s`<div class="field">
1457
+ <label for=${r}>
1458
+ ${ce(t.name)}${t.required?s`<span class="req" aria-hidden="true">*</span>`:l}
1219
1459
  </label>
1220
- ${r.enum?t`<select
1221
- id=${a}
1222
- ?required=${r.required}
1223
- @change=${o=>this.setValue(r.name,o.target.value)}
1460
+ ${t.enum?s`<select
1461
+ id=${r}
1462
+ ?required=${t.required}
1463
+ @change=${o=>this.setValue(t.name,o.target.value)}
1224
1464
  >
1225
1465
  <option value="">Choose</option>
1226
- ${r.enum.map(o=>t`<option value=${o} ?selected=${this.values[r.name]===o}>
1466
+ ${t.enum.map(o=>s`<option value=${o} ?selected=${this.values[t.name]===o}>
1227
1467
  ${o}
1228
1468
  </option>`)}
1229
- </select>`:t`<input
1230
- id=${a}
1231
- type=${this.htmlType(r.type)}
1232
- ?required=${r.required}
1233
- min=${r.min??""}
1234
- max=${r.max??""}
1235
- step=${r.type==="number"?"any":""}
1236
- .value=${this.values[r.name]??""}
1237
- @input=${o=>this.setValue(r.name,this.coerce(r.type,o.target.value))}
1469
+ </select>`:s`<input
1470
+ id=${r}
1471
+ type=${this.htmlType(t.type)}
1472
+ ?required=${t.required}
1473
+ min=${t.min??""}
1474
+ max=${t.max??""}
1475
+ step=${t.type==="number"?"any":""}
1476
+ .value=${this.values[t.name]??""}
1477
+ @input=${o=>this.setValue(t.name,this.coerce(t.type,o.target.value))}
1238
1478
  />`}
1239
- ${r.description?t`<small class="help">${r.description}</small>`:n}
1240
- </div>`};return t`<form @submit=${this.onSubmit}>
1241
- <h2 class="title">${te(this.endpoint.split("/").pop()??"")}</h2>
1242
- ${this.hasLocation?t`<div class="location-block">
1479
+ ${t.description?s`<small class="help">${t.description}</small>`:l}
1480
+ </div>`};return s`<form @submit=${this.onSubmit}>
1481
+ <h2 class="title">${ce(this.endpoint.split("/").pop()??"")}</h2>
1482
+ ${this.hasLocation?s`<div class="location-block">
1243
1483
  <label>Birth location</label>
1244
1484
  <roxy-location-search
1245
1485
  @roxy-location-select=${this.onLocation}
@@ -1248,12 +1488,12 @@
1248
1488
  <small class="help">
1249
1489
  Required: latitude, longitude, timezone. Pick a city to autofill.
1250
1490
  </small>
1251
- </div>`:n}
1491
+ </div>`:l}
1252
1492
  <div class="fields">
1253
- ${this.fields.map(r=>e(r))}
1493
+ ${this.fields.map(t=>e(t))}
1254
1494
  </div>
1255
1495
  <button class="submit" type="submit">${this.submitLabel}</button>
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`
1496
+ </form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,t){if(t!==""){if(e==="number"){let r=Number(t);return Number.isFinite(r)?r:void 0}return t}}};O.styles=[v,f`
1257
1497
  form {
1258
1498
  display: grid;
1259
1499
  gap: var(--roxy-space-md, 1rem);
@@ -1355,33 +1595,33 @@
1355
1595
  color: var(--roxy-danger-fg, #991b1b);
1356
1596
  font-size: var(--roxy-text-sm, 0.875rem);
1357
1597
  }
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">
1598
+ `],p([y({type:String,attribute:"data-endpoint"})],O.prototype,"endpoint",2),p([y({type:String})],O.prototype,"method",2),p([y({type:String,attribute:"spec-url"})],O.prototype,"specUrl",2),p([y({type:String,attribute:"submit-label"})],O.prototype,"submitLabel",2),p([z()],O.prototype,"fields",2),p([z()],O.prototype,"values",2),p([z()],O.prototype,"hasLocation",2),p([z()],O.prototype,"loaded",2),p([z()],O.prototype,"specError",2),O=p([b("roxy-endpoint-form")],O);var me=class extends x{constructor(){super(...arguments);this.data=null}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let t=(e.breakdown??[]).filter(h=>h?.category!==void 0),r=e.total??0,o=e.maxScore??36,i=r/o*100,d="color-mix(in srgb, var(--roxy-border) 50%, transparent)",c=i>=70?"var(--roxy-success)":i>=50?"var(--roxy-warning)":"var(--roxy-danger)",m=i*2.827,g=(100-i)*2.827;return s`<article class="card" aria-label="Guna Milan score">
1359
1599
  <div class="score-header">
1360
1600
  <div class="score-info">
1361
1601
  <div class="score-bar">
1362
1602
  <div>
1363
- <span class="total">${w(e.total,1)}</span>
1603
+ <span class="total">${A(e.total,1)}</span>
1364
1604
  <span class="over"> / ${e.maxScore}</span>
1365
- ${typeof e.percentage=="number"?t`<small style="margin-left: 0.5rem; color: var(--roxy-muted)">
1366
- ${Ur(e.percentage,1)}
1367
- </small>`:n}
1605
+ ${typeof e.percentage=="number"?s`<small style="margin-left: 0.5rem; color: var(--roxy-muted)">
1606
+ ${ar(e.percentage,1)}
1607
+ </small>`:l}
1368
1608
  </div>
1369
- ${e.recommendation?t`<span class="recommendation">${e.recommendation}</span>`:n}
1609
+ ${e.recommendation?s`<span class="recommendation">${e.recommendation}</span>`:l}
1370
1610
  </div>
1371
1611
  </div>
1372
- <div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${a}">
1612
+ <div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}">
1373
1613
  <svg viewBox="0 0 100 100" aria-hidden="true">
1374
1614
  <circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8"/>
1375
1615
  <circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${c}" stroke-width="8"
1376
- stroke-dasharray="${m},${y}" stroke-linecap="round"
1616
+ stroke-dasharray="${m},${g}" stroke-linecap="round"
1377
1617
  transform="rotate(-90 50 50)"/>
1378
- <text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${a}</text>
1618
+ <text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text>
1379
1619
  <text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${o}</text>
1380
1620
  </svg>
1381
1621
  </div>
1382
1622
  </div>
1383
1623
 
1384
- ${r.length>0?t`<table>
1624
+ ${t.length>0?s`<table>
1385
1625
  <thead>
1386
1626
  <tr>
1387
1627
  <th>Category</th>
@@ -1390,22 +1630,22 @@
1390
1630
  </tr>
1391
1631
  </thead>
1392
1632
  <tbody>
1393
- ${r.map(h=>{let b=h.score??0,E=h.maxScore??Mt(h.category),$=E?b/E*100:0;return t`<tr>
1633
+ ${t.map(h=>{let u=h.score??0,k=h.maxScore??sa(h.category),$=k?u/k*100:0;return s`<tr>
1394
1634
  <td>${h.category}</td>
1395
1635
  <td class="bar-cell">
1396
1636
  <div class="mini-bar">
1397
1637
  <span style="width: ${$}%"></span>
1398
1638
  </div>
1399
1639
  </td>
1400
- <td class="score">${w(b,1)} / ${E}</td>
1640
+ <td class="score">${A(u,1)} / ${k}</td>
1401
1641
  </tr>`})}
1402
1642
  </tbody>
1403
- </table>`:n}
1404
- ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?t`<div class="tags">
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>`)}
1407
- </div>`:n}
1408
- </article>`}};oe.styles=[v,x`
1643
+ </table>`:l}
1644
+ ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?s`<div class="tags">
1645
+ ${e.doshas?.map(h=>s`<span class="dosha">${h}</span>`)}
1646
+ ${e.doshaCancellations?.map(h=>s`<span class="cancel" title=${h.reason}>${h.dosha} cancelled</span>`)}
1647
+ </div>`:l}
1648
+ </article>`}};me.styles=[v,f`
1409
1649
  .card {
1410
1650
  background: var(--roxy-bg, #fff);
1411
1651
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1526,48 +1766,48 @@
1526
1766
  background: color-mix(in srgb, var(--roxy-success, #16a34a) 18%, transparent);
1527
1767
  color: var(--roxy-success-fg, #166534);
1528
1768
  }
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">
1769
+ `],p([y({attribute:!1})],me.prototype,"data",2),me=p([b("roxy-guna-milan")],me);function sa(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var Q=class extends x{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 r=e;return{hex:r.hexagram,lines:r.lines,changingLinePositions:r.changingLinePositions,resultingHexagram:r.resultingHexagram}}let t=e;return{hex:t.hexagram,dailyMessage:t.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return s`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:t,lines:r,changingLinePositions:o,dailyMessage:i,resultingHexagram:d}=e,c=r??this.derivedLines(t),m=new Set(o??[]);return s`<article class="card" aria-label="I Ching hexagram">
1530
1770
  <div class="glyphs">
1531
- ${r.symbol?t`<div class="symbol">${r.symbol}</div>`:n}
1771
+ ${t.symbol?s`<div class="symbol">${t.symbol}</div>`:l}
1532
1772
  <div class="lines" aria-hidden="true">
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":""}`}">
1534
- ${$?S`<span class="seg"></span><span class="seg"></span>`:S`<span class="seg"></span>`}
1773
+ ${c.slice().reverse().map((g,h)=>{let u=c.length-1-h+1,k=m.has(u),$=g===6||g===8;return s`<div class="line ${`${$?"broken":"solid"}${k?" changing":""}`}">
1774
+ ${$?w`<span class="seg"></span><span class="seg"></span>`:w`<span class="seg"></span>`}
1535
1775
  </div>`})}
1536
1776
  </div>
1537
1777
  </div>
1538
1778
  <div>
1539
1779
  <h2 class="title">
1540
- ${r.number?t`${r.number}. `:n}${r.english??r.chinese??"Hexagram"}
1780
+ ${t.number?s`${t.number}. `:l}${t.english??t.chinese??"Hexagram"}
1541
1781
  </h2>
1542
1782
  <p class="subtitle">
1543
- ${r.chinese?t`${r.chinese}`:n}
1544
- ${r.pinyin?t` · ${r.pinyin}`:n}
1783
+ ${t.chinese?s`${t.chinese}`:l}
1784
+ ${t.pinyin?s` · ${t.pinyin}`:l}
1545
1785
  </p>
1546
1786
  <div class="trigrams">
1547
- ${r.upperTrigram?t`<div>
1787
+ ${t.upperTrigram?s`<div>
1548
1788
  Upper
1549
1789
  <span class="tri-glyph"
1550
- >${hr[r.upperTrigram]??""}</span
1551
- >${r.upperTrigram}
1552
- </div>`:n}
1553
- ${r.lowerTrigram?t`<div>
1790
+ >${St[t.upperTrigram]??""}</span
1791
+ >${t.upperTrigram}
1792
+ </div>`:l}
1793
+ ${t.lowerTrigram?s`<div>
1554
1794
  Lower
1555
1795
  <span class="tri-glyph"
1556
- >${hr[r.lowerTrigram]??""}</span
1557
- >${r.lowerTrigram}
1558
- </div>`:n}
1796
+ >${St[t.lowerTrigram]??""}</span
1797
+ >${t.lowerTrigram}
1798
+ </div>`:l}
1559
1799
  </div>
1560
- ${r.judgment?t`<p class="judgment">${r.judgment}</p>`:n}
1561
- ${r.image?t`<p class="image">${r.image}</p>`:n}
1562
- ${l?t`<p class="message">${l}</p>`:n}
1563
- ${r.interpretation?.general?t`<p>${r.interpretation.general}</p>`:n}
1564
- ${m.size>0?t`<div class="changing">
1565
- Changing lines: ${Array.from(m).sort((y,h)=>y-h).join(", ")}.
1566
- ${d?.english?t` Becomes hexagram ${d.number}
1567
- ${d.english}.`:n}
1568
- </div>`:n}
1800
+ ${t.judgment?s`<p class="judgment">${t.judgment}</p>`:l}
1801
+ ${t.image?s`<p class="image">${t.image}</p>`:l}
1802
+ ${i?s`<p class="message">${i}</p>`:l}
1803
+ ${t.interpretation?.general?s`<p>${t.interpretation.general}</p>`:l}
1804
+ ${m.size>0?s`<div class="changing">
1805
+ Changing lines: ${Array.from(m).sort((g,h)=>g-h).join(", ")}.
1806
+ ${d?.english?s` Becomes hexagram ${d.number}
1807
+ ${d.english}.`:l}
1808
+ </div>`:l}
1569
1809
  </div>
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`
1810
+ </article>`}derivedLines(e){let t=e.symbol.codePointAt(0)??0;if(t>=19904&&t<=19967){let r=t-19904,o=[];for(let i=0;i<6;i++){let d=r>>i&1;o.push(d?8:7)}return o}return Array.from({length:6},()=>7)}};Q.styles=[v,f`
1571
1811
  .card {
1572
1812
  background: var(--roxy-bg, #fff);
1573
1813
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1674,67 +1914,67 @@
1674
1914
  color: var(--roxy-accent-fg, #b45309);
1675
1915
  font-size: var(--roxy-text-sm, 0.875rem);
1676
1916
  }
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
1917
+ `],p([y({attribute:!1})],Q.prototype,"data",2),p([y({type:String,reflect:!0})],Q.prototype,"mode",2),Q=p([b("roxy-hexagram")],Q);var ee=class extends x{constructor(){super(...arguments);this.data=null;this.period="daily"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No horoscope data</div>`;let t=e.sign??"",r=t?G[E(t)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,i="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return s`<article
1678
1918
  class="card"
1679
- aria-label=${`${this.period} horoscope for ${r}`}
1919
+ aria-label=${`${this.period} horoscope for ${t}`}
1680
1920
  >
1681
1921
  <header class="head">
1682
- <span class="glyph" aria-hidden="true">${a}</span>
1922
+ <span class="glyph" aria-hidden="true">${r}</span>
1683
1923
  <div>
1684
- <h2 class="title">${r} ${this.period}</h2>
1685
- ${l?t`<div class="date">${l}</div>`:n}
1924
+ <h2 class="title">${t} ${this.period}</h2>
1925
+ ${i?s`<div class="date">${i}</div>`:l}
1686
1926
  </div>
1687
- ${o!==null?t`<span class="energy" aria-label=${`Energy ${o} of 10`}>
1927
+ ${o!==null?s`<span class="energy" aria-label=${`Energy ${o} of 10`}>
1688
1928
  Energy ${o}/10
1689
1929
  <span class="energy-bar"
1690
1930
  ><span style="width: ${o/10*100}%"></span
1691
1931
  ></span>
1692
- </span>`:n}
1932
+ </span>`:l}
1693
1933
  </header>
1694
1934
 
1695
- ${e.overview?t`<p class="overview">${e.overview}</p>`:n}
1935
+ ${e.overview?s`<p class="overview">${e.overview}</p>`:l}
1696
1936
 
1697
1937
  <div class="sections">
1698
- ${e.love?t`<div class="section">
1938
+ ${e.love?s`<div class="section">
1699
1939
  <h3>Love</h3>
1700
1940
  <p>${e.love}</p>
1701
- </div>`:n}
1702
- ${e.career?t`<div class="section">
1941
+ </div>`:l}
1942
+ ${e.career?s`<div class="section">
1703
1943
  <h3>Career</h3>
1704
1944
  <p>${e.career}</p>
1705
- </div>`:n}
1706
- ${e.health?t`<div class="section">
1945
+ </div>`:l}
1946
+ ${e.health?s`<div class="section">
1707
1947
  <h3>Health</h3>
1708
1948
  <p>${e.health}</p>
1709
- </div>`:n}
1710
- ${e.finance?t`<div class="section">
1949
+ </div>`:l}
1950
+ ${e.finance?s`<div class="section">
1711
1951
  <h3>Finance</h3>
1712
1952
  <p>${e.finance}</p>
1713
- </div>`:n}
1714
- ${"advice"in e&&e.advice?t`<div class="section">
1953
+ </div>`:l}
1954
+ ${"advice"in e&&e.advice?s`<div class="section">
1715
1955
  <h3>Advice</h3>
1716
1956
  <p>${e.advice}</p>
1717
- </div>`:n}
1957
+ </div>`:l}
1718
1958
  </div>
1719
1959
 
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">
1721
- ${d!==void 0?t`<span>Lucky number <strong>${d}</strong></span>`:n}
1722
- ${c?t`<span>Lucky color <strong>${c}</strong></span>`:n}
1723
- ${m.length?t`<span
1960
+ ${(()=>{let d="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,c="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],g="luckyDays"in e&&e.luckyDays?e.luckyDays:[],h=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&g.length===0&&h.length===0?l:s`<div class="lucky">
1961
+ ${d!==void 0?s`<span>Lucky number <strong>${d}</strong></span>`:l}
1962
+ ${c?s`<span>Lucky color <strong>${c}</strong></span>`:l}
1963
+ ${m.length?s`<span
1724
1964
  >Lucky numbers
1725
1965
  <strong>${m.join(", ")}</strong></span
1726
- >`:n}
1727
- ${y.length?t`<span
1728
- >Lucky days <strong>${y.join(", ")}</strong></span
1729
- >`:n}
1730
- ${h.length?t`<span class="compat-wrap">
1966
+ >`:l}
1967
+ ${g.length?s`<span
1968
+ >Lucky days <strong>${g.join(", ")}</strong></span
1969
+ >`:l}
1970
+ ${h.length?s`<span class="compat-wrap">
1731
1971
  Best with
1732
1972
  <span class="compat"
1733
- >${h.map(b=>t`<span>${b}</span>`)}</span
1973
+ >${h.map(u=>s`<span>${u}</span>`)}</span
1734
1974
  >
1735
- </span>`:n}
1975
+ </span>`:l}
1736
1976
  </div>`})()}
1737
- </article>`}};Y.styles=[v,x`
1977
+ </article>`}};ee.styles=[v,f`
1738
1978
  .card {
1739
1979
  background: var(--roxy-bg, #fff);
1740
1980
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1856,19 +2096,19 @@
1856
2096
  font-size: var(--roxy-text-xs, 0.75rem);
1857
2097
  text-transform: capitalize;
1858
2098
  }
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">
2099
+ `],p([y({attribute:!1})],ee.prototype,"data",2),p([y({type:String,reflect:!0})],ee.prototype,"period",2),ee=p([b("roxy-horoscope-card")],ee);var te=class extends x{constructor(){super(...arguments);this.data=null;this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let t=(e.planets??[]).map(o=>({name:o.planet,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,kpNumber:o.kpNumber,retrograde:o.retrograde})),r=e.nodes;for(let[o,i]of[["Rahu",r?.rahu],["Ketu",r?.ketu]])i&&t.push({name:o,sign:i.sign,house:i.house,nakshatra:i.nakshatra,starLord:i.starLord,subLord:i.subLord,subSubLord:i.subSubLord,retrograde:!0});return t}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let t=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${t}`)?.focus()})}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,t=e.ascendant;return s`<div class="wrap" aria-label="KP chart" tabindex="0">
1860
2100
  <header class="head">
1861
2101
  <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}
2102
+ ${t?s`<div class="asc">
2103
+ Ascendant: <strong>${t.sign??""}</strong>
2104
+ ${t.nakshatra?s`· ${t.nakshatra}`:l}
2105
+ ${t.subLord?s`· sub lord ${t.subLord}`:l}
2106
+ ${typeof t.kpNumber=="number"?s`· KP ${t.kpNumber}`:l}
2107
+ </div>`:l}
2108
+ ${typeof e.meta?.ayanamsa=="number"?s`<div class="ayan">
2109
+ ${e.meta.ayanamsaType??"Ayanamsa"}: ${A(e.meta.ayanamsa,4)}°
2110
+ ${e.meta.houseSystem?s`· ${e.meta.houseSystem} houses`:l}
2111
+ </div>`:l}
1872
2112
  </header>
1873
2113
 
1874
2114
  <div
@@ -1877,23 +2117,23 @@
1877
2117
  aria-label="KP chart views"
1878
2118
  @keydown=${this.onTabKeyDown}
1879
2119
  >
1880
- ${["planets","cusps"].map(a=>t`<button
2120
+ ${["planets","cusps"].map(r=>s`<button
1881
2121
  class="tab"
1882
2122
  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}}
2123
+ id="tab-${r}"
2124
+ aria-selected=${this.activeTab===r?"true":"false"}
2125
+ aria-controls="panel-${r}"
2126
+ tabindex=${this.activeTab===r?"0":"-1"}
2127
+ @click=${()=>{this.activeTab=r}}
1888
2128
  >
1889
- ${a==="planets"?"Planets":"Cusps"}
2129
+ ${r==="planets"?"Planets":"Cusps"}
1890
2130
  </button>`)}
1891
2131
  </div>
1892
2132
 
1893
2133
  <div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">
1894
2134
  ${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}
1895
2135
  </div>
1896
- </div>`}renderPlanets(){let e=this.bodies();return e.length?t`<table role="table" aria-label="KP planets and nodes">
2136
+ </div>`}renderPlanets(){let e=this.bodies();return e.length?s`<table role="table" aria-label="KP planets and nodes">
1897
2137
  <thead>
1898
2138
  <tr>
1899
2139
  <th scope="col">Body</th>
@@ -1907,20 +2147,20 @@
1907
2147
  </tr>
1908
2148
  </thead>
1909
2149
  <tbody>
1910
- ${e.map(r=>t`<tr>
2150
+ ${e.map(t=>s`<tr>
1911
2151
  <td class="body">
1912
- ${r.name}${r.retrograde?t`<span class="retro">R</span>`:n}
2152
+ ${t.name}${t.retrograde?s`<span class="retro">R</span>`:l}
1913
2153
  </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>
2154
+ <td>${t.sign??""}</td>
2155
+ <td class="num">${typeof t.house=="number"?t.house:""}</td>
2156
+ <td>${t.nakshatra??""}</td>
2157
+ <td>${t.starLord??""}</td>
2158
+ <td>${t.subLord??""}</td>
2159
+ <td>${t.subSubLord??""}</td>
2160
+ <td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td>
1921
2161
  </tr>`)}
1922
2162
  </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">
2163
+ </table>`:s`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?s`<table role="table" aria-label="KP Placidus cusps">
1924
2164
  <thead>
1925
2165
  <tr>
1926
2166
  <th scope="col">House</th>
@@ -1934,18 +2174,18 @@
1934
2174
  </tr>
1935
2175
  </thead>
1936
2176
  <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>
2177
+ ${e.map(t=>s`<tr>
2178
+ <td class="body num">${t.house}</td>
2179
+ <td>${t.sign??""}</td>
2180
+ <td>${t.signLord??""}</td>
2181
+ <td>${t.nakshatra??""}</td>
2182
+ <td>${t.starLord??""}</td>
2183
+ <td>${t.subLord??""}</td>
2184
+ <td>${t.subSubLord??""}</td>
2185
+ <td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td>
1946
2186
  </tr>`)}
1947
2187
  </tbody>
1948
- </table>`:t`<p class="roxy-empty" role="status">No cusps</p>`}};F.styles=[v,x`
2188
+ </table>`:s`<p class="roxy-empty" role="status">No cusps</p>`}};te.styles=[v,f`
1949
2189
  .wrap {
1950
2190
  border: 1px solid var(--roxy-border, #e4e4e7);
1951
2191
  border-radius: var(--roxy-radius-md, 8px);
@@ -2035,14 +2275,14 @@
2035
2275
  .num {
2036
2276
  font-variant-numeric: tabular-nums;
2037
2277
  }
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
2278
+ `],p([y({attribute:!1})],te.prototype,"data",2),p([z()],te.prototype,"activeTab",2),te=p([b("roxy-kp-chart")],te);var he=class extends x{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return s`<div
2039
2279
  class="wrap"
2040
2280
  aria-label="KP planets table"
2041
2281
  tabindex="0"
2042
2282
  >
2043
2283
  <header class="head">
2044
2284
  <h2 class="title">KP planets</h2>
2045
- ${typeof this.data.ayanamsa=="number"?t`<span class="ayanamsa">Ayanamsa: ${w(this.data.ayanamsa,2)}°</span>`:n}
2285
+ ${typeof this.data.ayanamsa=="number"?s`<span class="ayanamsa">Ayanamsa: ${A(this.data.ayanamsa,2)}°</span>`:l}
2046
2286
  </header>
2047
2287
  <table role="table">
2048
2288
  <thead>
@@ -2058,22 +2298,22 @@
2058
2298
  </tr>
2059
2299
  </thead>
2060
2300
  <tbody>
2061
- ${e.map(r=>t`<tr>
2301
+ ${e.map(t=>s`<tr>
2062
2302
  <td class="planet">
2063
- ${r.planet}
2064
- ${r.retrograde?t`<span class="retro">R</span>`:n}
2303
+ ${t.planet}
2304
+ ${t.retrograde?s`<span class="retro">R</span>`:l}
2065
2305
  </td>
2066
- <td>${r.sign??""}</td>
2067
- <td>${r.signLord??""}</td>
2068
- <td>${r.nakshatra??""}</td>
2069
- <td>${r.nakshatraLord??""}</td>
2070
- <td>${r.subLord??""}</td>
2071
- <td>${r.subSubLord??""}</td>
2072
- <td>${r.kpNumber??""}</td>
2306
+ <td>${t.sign??""}</td>
2307
+ <td>${t.signLord??""}</td>
2308
+ <td>${t.nakshatra??""}</td>
2309
+ <td>${t.nakshatraLord??""}</td>
2310
+ <td>${t.subLord??""}</td>
2311
+ <td>${t.subSubLord??""}</td>
2312
+ <td>${t.kpNumber??""}</td>
2073
2313
  </tr>`)}
2074
2314
  </tbody>
2075
2315
  </table>
2076
- </div>`}};ie.styles=[v,x`
2316
+ </div>`}};he.styles=[v,f`
2077
2317
  .wrap {
2078
2318
  border: 1px solid var(--roxy-border, #e4e4e7);
2079
2319
  border-radius: var(--roxy-radius-md, 8px);
@@ -2132,10 +2372,10 @@
2132
2372
  font-size: var(--roxy-text-xs, 0.75rem);
2133
2373
  margin-left: 4px;
2134
2374
  }
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">
2375
+ `],p([y({attribute:!1})],he.prototype,"data",2),he=p([b("roxy-kp-planets-table")],he);var ge=class extends x{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,t=e.significators??[];return s`<div class="wrap" aria-label="KP ruling planets">
2136
2376
  <header>
2137
2377
  <h2 class="title">KP ruling planets</h2>
2138
- ${e.dayLord?t`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:n}
2378
+ ${e.dayLord?s`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:l}
2139
2379
  </header>
2140
2380
 
2141
2381
  <div class="groups">
@@ -2159,12 +2399,12 @@
2159
2399
  </div>
2160
2400
  </div>
2161
2401
 
2162
- ${e.rulingPlanets?.length?t`<div class="rp-list" role="list" aria-label="Ruling planets by strength">
2402
+ ${e.rulingPlanets?.length?s`<div class="rp-list" role="list" aria-label="Ruling planets by strength">
2163
2403
  <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}
2404
+ ${e.rulingPlanets.map((r,o)=>s`<span class="rp" role="listitem"><span class="rank">${o+1}</span> ${r}</span>`)}
2405
+ </div>`:l}
2166
2406
 
2167
- ${r.length?t`<table aria-label="House significators">
2407
+ ${t.length?s`<table aria-label="House significators">
2168
2408
  <thead>
2169
2409
  <tr>
2170
2410
  <th scope="col">Planet</th>
@@ -2172,13 +2412,13 @@
2172
2412
  </tr>
2173
2413
  </thead>
2174
2414
  <tbody>
2175
- ${r.map(a=>t`<tr>
2176
- <td>${a.planet}</td>
2177
- <td>${(a.signifies??[]).join(", ")}</td>
2415
+ ${t.map(r=>s`<tr>
2416
+ <td>${r.planet}</td>
2417
+ <td>${(r.signifies??[]).join(", ")}</td>
2178
2418
  </tr>`)}
2179
2419
  </tbody>
2180
- </table>`:n}
2181
- </div>`}};ne.styles=[v,x`
2420
+ </table>`:l}
2421
+ </div>`}};ge.styles=[v,f`
2182
2422
  .wrap {
2183
2423
  border: 1px solid var(--roxy-border, #e4e4e7);
2184
2424
  border-radius: var(--roxy-radius-md, 8px);
@@ -2274,7 +2514,7 @@
2274
2514
  font-size: var(--roxy-text-xs, 0.75rem);
2275
2515
  letter-spacing: 0.04em;
2276
2516
  }
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">
2517
+ `],p([y({attribute:!1})],ge.prototype,"data",2),ge=p([b("roxy-kp-ruling-planets")],ge);function lr(n,a){let e,t=((...r)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...r)},a)});return t.cancel=()=>{e&&(clearTimeout(e),e=void 0)},t}var _=class extends x{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=lr(e=>{this.fetchResults(e)},300);this.onInput=e=>{let t=e.target.value;if(this.query=t,t.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(t)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let t=this.results[this.highlight]??this.results[0];t&&this.select(t)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let t=new AbortController;this.abortController=t,this.isLoading=!0;try{let r=new URL(this.endpoint);r.searchParams.set("q",e),r.searchParams.set("limit","8");let o={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let i=this.publishableKey??this.apiKey;i&&(o["X-API-Key"]=i);let d=await fetch(r,{headers:o,signal:t.signal});if(!d.ok)throw new Error(`HTTP ${d.status}`);let c=await d.json();if(t.signal.aborted)return;this.results=c.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(r){if(r?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===t&&(this.abortController=void 0),t.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return s`<div class="field">
2278
2518
  <input
2279
2519
  type="text"
2280
2520
  role="combobox"
@@ -2289,33 +2529,33 @@
2289
2529
  @keydown=${this.onKeyDown}
2290
2530
  @focus=${()=>{this.results.length>0&&(this.isOpen=!0)}}
2291
2531
  />
2292
- ${this.isLoading?t`<span class="spinner" role="status" aria-label="Loading"></span>`:n}
2293
- ${this.isOpen?t`<ul
2532
+ ${this.isLoading?s`<span class="spinner" role="status" aria-label="Loading"></span>`:l}
2533
+ ${this.isOpen?s`<ul
2294
2534
  id="roxy-location-listbox"
2295
2535
  class="results"
2296
2536
  role="listbox"
2297
2537
  >
2298
- ${this.results.length===0?t`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>t`<li role="presentation">
2538
+ ${this.results.length===0?s`<li class="empty" role="status">No cities found</li>`:this.results.map((e,t)=>s`<li role="presentation">
2299
2539
  <button
2300
2540
  type="button"
2301
2541
  class="option"
2302
2542
  role="option"
2303
- id=${`roxy-location-option-${r}`}
2304
- aria-selected=${this.highlight===r?"true":"false"}
2543
+ id=${`roxy-location-option-${t}`}
2544
+ aria-selected=${this.highlight===t?"true":"false"}
2305
2545
  @click=${()=>this.select(e)}
2306
- @mouseenter=${()=>{this.highlight=r}}
2546
+ @mouseenter=${()=>{this.highlight=t}}
2307
2547
  >
2308
2548
  <span class="city">${e.city}</span>
2309
2549
  <span class="where"
2310
- >${e.province?t`${e.province}, `:""}${e.country}</span
2550
+ >${e.province?s`${e.province}, `:""}${e.country}</span
2311
2551
  >
2312
2552
  <span class="tz"
2313
2553
  >UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span
2314
2554
  >
2315
2555
  </button>
2316
2556
  </li>`)}
2317
- </ul>`:n}
2318
- </div>`}};R.styles=[v,x`
2557
+ </ul>`:l}
2558
+ </div>`}};_.styles=[v,f`
2319
2559
  :host {
2320
2560
  display: block;
2321
2561
  position: relative;
@@ -2416,49 +2656,49 @@
2416
2656
  color: var(--roxy-muted, #71717a);
2417
2657
  font-size: var(--roxy-text-sm, 0.875rem);
2418
2658
  }
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
2659
+ `],p([y({type:String,attribute:"api-key"})],_.prototype,"apiKey",2),p([y({type:String,attribute:"publishable-key"})],_.prototype,"publishableKey",2),p([y({type:String})],_.prototype,"endpoint",2),p([y({type:String})],_.prototype,"placeholder",2),p([y({type:String,attribute:"default-value"})],_.prototype,"defaultValue",2),p([z()],_.prototype,"query",2),p([z()],_.prototype,"results",2),p([z()],_.prototype,"isOpen",2),p([z()],_.prototype,"isLoading",2),p([z()],_.prototype,"highlight",2),_=p([b("roxy-location-search")],_);var re=class extends x{constructor(){super(...arguments);this.data=null;this.mode="current"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No moon phase data</div>`;let t="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&t.length>0){let r="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return s`<article
2420
2660
  class="card"
2421
2661
  aria-label="Moon phase calendar"
2422
2662
  >
2423
- <h2 class="label">${a??"Moon phases"} ${o??""}</h2>
2663
+ <h2 class="label">${r??"Moon phases"} ${o??""}</h2>
2424
2664
  <div class="list" role="list">
2425
- ${r.map(l=>this.renderListItem(l))}
2665
+ ${t.map(i=>this.renderListItem(i))}
2426
2666
  </div>
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">
2667
+ </article>`}return"phase"in e?this.renderSingle(e):l}renderSingle(e){let t=dr(e.phase);return s`<article class="card" aria-label="Current moon phase">
2428
2668
  <div class="hero">
2429
- <span class="emoji" aria-hidden="true">${r}</span>
2669
+ <span class="emoji" aria-hidden="true">${t}</span>
2430
2670
  <div>
2431
2671
  <h2 class="label">${e.phase??"Moon"}</h2>
2432
- ${e.date?t`<div class="date">${e.date}</div>`:n}
2672
+ ${e.date?s`<div class="date">${e.date}</div>`:l}
2433
2673
  </div>
2434
2674
  </div>
2435
2675
  <div class="stats">
2436
- ${typeof e.illumination=="number"?t`<div>
2676
+ ${typeof e.illumination=="number"?s`<div>
2437
2677
  <span>Illumination</span>
2438
- <strong>${Dt(e.illumination)}</strong>
2439
- </div>`:n}
2440
- ${typeof e.age=="number"?t`<div>
2678
+ <strong>${oa(e.illumination)}</strong>
2679
+ </div>`:l}
2680
+ ${typeof e.age=="number"?s`<div>
2441
2681
  <span>Age</span>
2442
- <strong>${w(e.age,1)} days</strong>
2443
- </div>`:n}
2444
- ${e.sign?t`<div>
2682
+ <strong>${A(e.age,1)} days</strong>
2683
+ </div>`:l}
2684
+ ${e.sign?s`<div>
2445
2685
  <span>Sign</span>
2446
2686
  <strong>${e.sign}</strong>
2447
- </div>`:n}
2448
- ${typeof e.distance=="number"?t`<div>
2687
+ </div>`:l}
2688
+ ${typeof e.distance=="number"?s`<div>
2449
2689
  <span>Distance</span>
2450
2690
  <strong>${(e.distance/1e3).toFixed(0)}k km</strong>
2451
- </div>`:n}
2691
+ </div>`:l}
2452
2692
  </div>
2453
- ${e.meaning?.description?t`<p class="meaning">${e.meaning.description}</p>`:n}
2454
- ${e.meaning?.keywords?.length?t`<div class="keywords">
2455
- ${e.meaning.keywords.map(a=>t`<span>${a}</span>`)}
2456
- </div>`:n}
2457
- </article>`}renderListItem(e){let r=Wr(e.phase);return t`<div class="list-item" role="listitem">
2458
- <span aria-hidden="true">${r}</span>
2693
+ ${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l}
2694
+ ${e.meaning?.keywords?.length?s`<div class="keywords">
2695
+ ${e.meaning.keywords.map(r=>s`<span>${r}</span>`)}
2696
+ </div>`:l}
2697
+ </article>`}renderListItem(e){let t=dr(e.phase);return s`<div class="list-item" role="listitem">
2698
+ <span aria-hidden="true">${t}</span>
2459
2699
  <span>${e.phase}</span>
2460
2700
  <span>${e.date??""}</span>
2461
- </div>`}};V.styles=[v,x`
2701
+ </div>`}};re.styles=[v,f`
2462
2702
  .card {
2463
2703
  background: var(--roxy-bg, #fff);
2464
2704
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -2540,33 +2780,33 @@
2540
2780
  .list-item:last-child {
2541
2781
  border-bottom: none;
2542
2782
  }
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}`}>
2783
+ `],p([y({attribute:!1})],re.prototype,"data",2),p([y({type:String,reflect:!0})],re.prototype,"mode",2),re=p([b("roxy-moon-phase")],re);function dr(n){return n?er[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function oa(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var ye=class extends x{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,t=e.remedies;return s`<article class="wrap" aria-label=${`Nakshatra ${e.name}`}>
2544
2784
  <header class="head">
2545
2785
  <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}
2786
+ ${typeof e.number=="number"?s`<span class="number">Nakshatra ${e.number} of 27</span>`:l}
2787
+ ${e.range?s`<span class="range">${e.range}</span>`:l}
2548
2788
  </header>
2549
2789
 
2550
2790
  <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}
2791
+ ${e.lord?s`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:l}
2792
+ ${e.deity?s`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:l}
2793
+ ${e.symbol?s`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:l}
2554
2794
  </dl>
2555
2795
 
2556
- ${e.characteristics?t`<div class="section">
2796
+ ${e.characteristics?s`<div class="section">
2557
2797
  <h3>Characteristics</h3>
2558
2798
  <p>${e.characteristics}</p>
2559
- </div>`:n}
2799
+ </div>`:l}
2560
2800
 
2561
- ${r?t`<div class="section">
2801
+ ${t?s`<div class="section">
2562
2802
  <h3>Remedies</h3>
2563
2803
  <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}
2804
+ ${t.mantras?s`<div class="remedy"><strong>Mantras:</strong> ${t.mantras}</div>`:l}
2805
+ ${t.gemstones?s`<div class="remedy"><strong>Gemstones:</strong> ${t.gemstones}</div>`:l}
2806
+ ${t.rituals?s`<div class="remedy"><strong>Rituals:</strong> ${t.rituals}</div>`:l}
2567
2807
  </div>
2568
- </div>`:n}
2569
- </article>`}};le.styles=[v,x`
2808
+ </div>`:l}
2809
+ </article>`}};ye.styles=[v,f`
2570
2810
  .wrap {
2571
2811
  border: 1px solid var(--roxy-border, #e4e4e7);
2572
2812
  border-radius: var(--roxy-radius-md, 8px);
@@ -2642,12 +2882,12 @@
2642
2882
  color: var(--roxy-muted, #71717a);
2643
2883
  font-weight: var(--roxy-weight-bold, 600);
2644
2884
  }
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">
2885
+ `],p([y({attribute:!1})],ye.prototype,"data",2),ye=p([b("roxy-nakshatra-card")],ye);var Tt=420,S=Tt/2,Ne=164,Pt=146,Ve=120,ze=96,na=178,ia=196,K=class extends x{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 s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),t=this.data.aspects??[],r=this.view;return s`<div class="wrap">
2646
2886
  <header>
2647
2887
  <h2 class="title">Natal chart</h2>
2648
- ${this.data.birthDetails?t`<div class="meta">
2888
+ ${this.data.birthDetails?s`<div class="meta">
2649
2889
  ${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}
2650
- </div>`:n}
2890
+ </div>`:l}
2651
2891
  </header>
2652
2892
  <div
2653
2893
  class="tablist"
@@ -2655,32 +2895,32 @@
2655
2895
  aria-label="Natal chart views"
2656
2896
  @keydown=${this.onTabKeyDown}
2657
2897
  >
2658
- ${["wheel","grid"].map(o=>t`<button
2898
+ ${["wheel","grid"].map(o=>s`<button
2659
2899
  class="tab"
2660
2900
  role="tab"
2661
2901
  id="tab-${o}"
2662
- aria-selected=${a===o?"true":"false"}
2902
+ aria-selected=${r===o?"true":"false"}
2663
2903
  aria-controls="panel-${o}"
2664
- tabindex=${a===o?"0":"-1"}
2904
+ tabindex=${r===o?"0":"-1"}
2665
2905
  @click=${()=>{this.view=o}}
2666
2906
  >
2667
2907
  ${o==="wheel"?"Wheel":"Aspect grid"}
2668
2908
  </button>`)}
2669
2909
  </div>
2670
- <div id="panel-${a}" role="tabpanel" aria-labelledby="tab-${a}">
2671
- ${a==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}
2910
+ <div id="panel-${r}" role="tabpanel" aria-labelledby="tab-${r}">
2911
+ ${r==="wheel"?this.renderWheel(e,t):this.renderAspectGrid(e,t)}
2672
2912
  </div>
2673
2913
  <div class="legend">
2674
2914
  <span>${e.length} planets</span>
2675
- <span>${r.length} aspects</span>
2676
- ${this.data.houseSystem?t`<span>${this.data.houseSystem} houses</span>`:n}
2915
+ <span>${t.length} aspects</span>
2916
+ ${this.data.houseSystem?s`<span>${this.data.houseSystem} houses</span>`:l}
2677
2917
  <span><span class="legend-swatch" style="background: var(--roxy-success)"></span>harmonious</span>
2678
2918
  <span><span class="legend-swatch" style="background: var(--roxy-danger)"></span>challenging</span>
2679
2919
  </div>
2680
2920
  ${this.renderDetails()}
2681
2921
  ${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}"
2922
+ </div>`}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.view=this.view==="wheel"?"grid":"wheel";let t=this.view;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${t}`)?.focus()})}renderWheel(e,t){return s`<svg
2923
+ viewBox="0 0 ${Tt} ${Tt}"
2684
2924
  role="img"
2685
2925
  aria-label="Natal chart wheel with twelve houses, planets, and aspects"
2686
2926
  >
@@ -2689,86 +2929,87 @@
2689
2929
  Twelve zodiac sign segments around a circular wheel. Planet glyphs are
2690
2930
  placed at their ecliptic longitudes. Aspect lines connect related planets.
2691
2931
  </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" />
2932
+ <circle class="wheel-line" cx=${S} cy=${S} r=${Ne} stroke-width="1.5" />
2933
+ <circle class="wheel-line" cx=${S} cy=${S} r=${Pt-14} stroke-width="0.8" />
2934
+ <circle class="wheel-line" cx=${S} cy=${S} r=${Ve} stroke-width="1" />
2935
+ <circle class="wheel-line" cx=${S} cy=${S} r=${ze-16} stroke-width="0.5" />
2696
2936
  ${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()}
2697
2937
  ${this.renderHouseNumbers()} ${this.renderCuspDegrees()}
2698
- ${this.renderAspects(e,r)} ${this.renderPlanets(e)}
2938
+ ${this.renderAspects(e,t)} ${this.renderPlanets(e)}
2699
2939
  ${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">
2940
+ </svg>`}renderAspectGrid(e,t){let r=e.map(i=>E(i.name)),o=new Map;for(let i of t){let d=[E(i.planet1),E(i.planet2)].sort().join("|");o.set(d,i)}return r.length===0?s`<p class="roxy-empty" role="status">No planets to grid</p>`:s`<div class="grid-scroll">
2701
2941
  <table class="aspect-grid" aria-label="Planet by planet aspect grid">
2702
2942
  <thead>
2703
2943
  <tr>
2704
2944
  <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>`})}
2945
+ ${r.slice(0,-1).map(i=>{let d=R[i]??i.slice(0,2);return s`<th scope="col" title=${i}>${d}</th>`})}
2706
2946
  </tr>
2707
2947
  </thead>
2708
2948
  <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>
2949
+ ${r.slice(1).map((i,d)=>{let c=R[i]??i.slice(0,2);return s`<tr>
2950
+ <th scope="row" title=${i}>${c}</th>
2951
+ ${r.slice(0,d+1).map(m=>{let g=o.get([i,m].sort().join("|"));if(!g)return s`<td class="empty"></td>`;let h=Re(g),u=kt[h]??kt[h.replace(/-/g,"")]??h.slice(0,3),k=qe[h]??"aspect-other",$=A(g.orb,1);return s`<td class=${`cell ${k}`} title=${`${i} ${h} ${m}${$?` (orb ${$}\xB0)`:""}`}>
2952
+ <span class="asp">${u}</span>
2713
2953
  </td>`})}
2714
- ${a.slice(d+1,-1).map(()=>t`<td class="empty"></td>`)}
2954
+ ${r.slice(d+1,-1).map(()=>s`<td class="empty"></td>`)}
2715
2955
  </tr>`})}
2716
2956
  </tbody>
2717
2957
  </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`
2958
+ </div>`}renderAngles(){let e=this.getAscendant(),t=this.getMidheaven(),r=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Et(e),"DSC")];t!==null&&(r.push(this.renderAngleMark(t,"MC")),r.push(this.renderAngleMark(Et(t),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&r.push(this.renderAngleMark(I(o),"PoF"));let i=this.data?.vertex?.longitude;return typeof i=="number"&&r.push(this.renderAngleMark(I(i),"Vtx")),r}renderAngleMark(e,t){let r=this.toAngle(e),o=L(S,S,Ne,r),i=L(S,S,na,r),d=L(S,S,ia,r);return w`
2719
2959
  <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>
2960
+ <line class="angle-tick" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />
2961
+ <text class="angle-marker" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${t}</text>
2722
2962
  </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>
2734
- <span class="pill pill--muted">Neutral ${r.neutral}</span>
2735
- </div>`:n}
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>`})}
2738
- </div>`:n}
2739
- ${r?.summary?t`<p class="summary">${r.summary}</p>`:n}
2963
+ `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(r=>r.longitude):Array.from({length:12},(r,o)=>this.getAscendant()+o*30)).map(r=>{let o=this.toAngle(r),i=L(S,S,Ve,o),d=L(S,S,Ne,o);return w`<line class="wheel-line" x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} stroke-width="0.8" />`})}renderSigns(){return M.map((e,t)=>{let r=this.toAngle(t*30+15),o=L(S,S,Pt,r);return w`<text class="sign-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${G[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((r,o)=>{let i=e[(o+1)%12],d=or(r.longitude,i?i.longitude:r.longitude+30),c=L(S,S,Ve-12,this.toAngle(d));return w`<text class="house-num" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${r.number}</text>`});let t=Math.floor(this.getAscendant()/30);return Array.from({length:12},(r,o)=>{let i=this.toAngle(o*30+15),d=L(S,S,Ve-12,i),c=(o-t+12)%12+1;return w`<text class="house-num" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${c}</text>`})}renderTicks(){let e=[];for(let t=0;t<360;t+=5){let r=this.toAngle(t),o=t%30===0,i=o?Pt-14:Ne-5,d=L(S,S,i,r),c=L(S,S,Ne,r);e.push(w`<line class=${o?"tick tick-major":"tick"} x1=${d.x} y1=${d.y} x2=${c.x} y2=${c.y} stroke-width=${o?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?l:e.map(t=>{let r=this.toAngle(t.longitude),o=L(S,S,Ve+9,r),i=B(t.longitude);return w`<text class="cusp-deg" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${i.degree}°${String(i.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let r=e.filter(i=>Number.isFinite(i.longitude)).map(i=>({p:i,trueLon:I(i.longitude),displayLon:I(i.longitude)})).sort((i,d)=>i.trueLon-d.trueLon);for(let i=1;i<r.length;i++){let d=r[i-1],c=r[i];if(!d||!c)continue;let m=d.displayLon+7;c.displayLon<m&&(c.displayLon=m)}let o=r[r.length-1];if(o&&o.displayLon>360){let i=o.displayLon-360;for(let d of r)d.displayLon-=i}return r.map(({p:i,trueLon:d,displayLon:c})=>{let m=this.toAngle(d),g=this.toAngle(c),h=L(S,S,ze,g),u=L(S,S,ze-13,g),k=L(S,S,Ne-4,m),$=L(S,S,ze+8,g),$e=R[E(i.name)]??i.name.slice(0,2),Ye=B(i.longitude),_e=i.isRetrograde===!0,Ue=`${Ye.degree}\xB0${String(Ye.minute).padStart(2,"0")}'`,Fe=Math.abs(c-d)>.5;return w`<g>
2964
+ ${Fe?w`<line class="planet-leader" x1=${k.x} y1=${k.y} x2=${$.x} y2=${$.y} />`:l}
2965
+ <text class="planet-glyph" x=${h.x} y=${h.y} text-anchor="middle" dominant-baseline="central"><title>${i.name}${_e?" retrograde":""} - ${Ue} ${i.sign??""}</title>${$e}</text>
2966
+ <text class="planet-deg" x=${u.x} y=${u.y} text-anchor="middle" dominant-baseline="central">${Ue}${_e?w`<tspan class="retro"> ℞</tspan>`:l}</text>
2967
+ </g>`})}renderDetails(){let e=this.data?.summary,t=this.data?.aspectsInterpretation;if(!e&&!t)return l;let r=e?.retrogradePlanets??[];return s`<div class="details">
2968
+ ${e?.dominantElement||e?.dominantModality?s`<div class="pill-row">
2969
+ ${e.dominantElement?s`<span class="pill">Dominant element: ${e.dominantElement}</span>`:l}
2970
+ ${e.dominantModality?s`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:l}
2971
+ </div>`:l}
2972
+ ${t?s`<div class="pill-row">
2973
+ <span class="pill pill--success">Harmonious ${t.harmonious}</span>
2974
+ <span class="pill pill--danger">Challenging ${t.challenging}</span>
2975
+ <span class="pill pill--muted">Neutral ${t.neutral}</span>
2976
+ </div>`:l}
2977
+ ${r.length>0?s`<div class="pill-row">
2978
+ ${r.map(o=>{let i=R[o]??o.slice(0,2);return s`<span class="pill pill--muted">${i} ${o} R</span>`})}
2979
+ </div>`:l}
2980
+ ${t?.summary?s`<p class="summary">${t.summary}</p>`:l}
2740
2981
  ${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">
2982
+ </div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return l;let t=["Fire","Earth","Air","Water"],r=["Cardinal","Fixed","Mutable"],o=M,i={};for(let d of t)i[d]={Cardinal:[],Fixed:[],Mutable:[]};for(let d of e){let c=o.indexOf(E(d.sign??""));if(c<0)continue;let m=t[c%4],g=r[c%3],h=R[E(d.name)]??E(d.name).slice(0,2);i[m]?.[g]?.push(h)}return s`<table class="em-grid" aria-label="Element and modality distribution">
2742
2983
  <thead>
2743
2984
  <tr>
2744
2985
  <th></th>
2745
- ${a.map(d=>t`<th scope="col">${d.slice(0,3)}</th>`)}
2986
+ ${r.map(d=>s`<th scope="col">${d.slice(0,3)}</th>`)}
2746
2987
  <th scope="col">Total</th>
2747
2988
  </tr>
2748
2989
  </thead>
2749
2990
  <tbody>
2750
- ${r.map(d=>{let c=a.reduce((m,y)=>m+(l[d]?.[y]?.length??0),0);return t`<tr>
2991
+ ${t.map(d=>{let c=r.reduce((m,g)=>m+(i[d]?.[g]?.length??0),0);return s`<tr>
2751
2992
  <th scope="row">${d}</th>
2752
- ${a.map(m=>t`<td>${(l[d]?.[m]??[]).join(" ")}</td>`)}
2993
+ ${r.map(m=>s`<td>${(i[d]?.[m]??[]).join(" ")}</td>`)}
2753
2994
  <td class="em-total">${c}</td>
2754
2995
  </tr>`})}
2755
2996
  <tr>
2756
2997
  <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>`)}
2998
+ ${r.map(d=>s`<td class="em-total">${t.reduce((c,m)=>c+(i[m]?.[d]?.length??0),0)}</td>`)}
2758
2999
  <td class="em-total">${e.length}</td>
2759
3000
  </tr>
2760
3001
  </tbody>
2761
- </table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?n:t`<section class="interpretations">
3002
+ </table>`}renderInterpretations(){let e=this.getPlanets().filter(t=>t.interpretation);return e.length===0?l:s`<section class="interpretations">
2762
3003
  <h3>Planet readings</h3>
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}>
2764
- <summary>${l} ${r.name} <small>${r.sign??""} ${d}</small></summary>
3004
+ ${e.map((t,r)=>{let o=t.interpretation,i=R[E(t.name)]??"",d=A(t.degree??0,1);return s`<details class="interp-card" name="natal-planet-readings" ?open=${r===0}>
3005
+ <summary>${i} ${t.name} <small>${t.sign??""} ${d}</small></summary>
2765
3006
  <div class="interp-body">
2766
- ${o.summary?t`<p class="interp-summary">${o.summary}</p>`:n}
2767
- ${o.detailed?t`<p class="interp-detail">${o.detailed}</p>`:n}
2768
- ${o.keywords?.length?t`<div class="interp-keywords">${o.keywords.map(c=>t`<span class="kw">${c}</span>`)}</div>`:n}
3007
+ ${o.summary?s`<p class="interp-summary">${o.summary}</p>`:l}
3008
+ ${o.detailed?s`<p class="interp-detail">${o.detailed}</p>`:l}
3009
+ ${o.keywords?.length?s`<div class="interp-keywords">${o.keywords.map(c=>s`<span class="kw">${c}</span>`)}</div>`:l}
2769
3010
  </div>
2770
3011
  </details>`})}
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`
3012
+ </section>`}renderAspects(e,t){let r=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let i=E(o.name);i&&r.set(i,o.longitude)}return t.map(o=>{let i=r.get(E(o.planet1)),d=r.get(E(o.planet2));if(i===void 0||d===void 0)return l;let c=L(S,S,ze-18,this.toAngle(i)),m=L(S,S,ze-18,this.toAngle(d)),g=Re(o),h=qe[g]??"aspect-other",u=A(o.orb,1);return w`<line class=${`aspect ${h}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${g||""} ${o.planet2}${u?` (orb ${u}\xB0)`:""}</title></line>`})}};K.styles=[v,f`
2772
3013
  .wrap {
2773
3014
  width: 100%;
2774
3015
  display: grid;
@@ -2790,7 +3031,8 @@
2790
3031
  svg {
2791
3032
  display: block;
2792
3033
  width: 100%;
2793
- max-width: 360px;
3034
+ max-width: 560px;
3035
+ aspect-ratio: 1 / 1;
2794
3036
  height: auto;
2795
3037
  margin: 0 auto;
2796
3038
  }
@@ -2819,10 +3061,33 @@
2819
3061
  font-family: var(--roxy-font-sans);
2820
3062
  }
2821
3063
 
3064
+ /* Below 480px the chart container shrinks to ~320px on phones.
3065
+ * Bump in-SVG text up proportionally so the 7px degree band
3066
+ * does not collapse below ~6px on screen.
3067
+ */
3068
+ @container (max-width: 480px) {
3069
+ .sign-glyph,
3070
+ .planet-glyph {
3071
+ font-size: 18px;
3072
+ }
3073
+ .planet-deg {
3074
+ font-size: 10px;
3075
+ }
3076
+ .house-num {
3077
+ font-size: 12px;
3078
+ }
3079
+ }
3080
+
2822
3081
  .planet-deg .retro {
2823
3082
  fill: var(--roxy-danger, #dc2626);
2824
3083
  }
2825
3084
 
3085
+ .planet-leader {
3086
+ stroke: var(--roxy-accent, #f59e0b);
3087
+ stroke-width: 0.5;
3088
+ opacity: 0.55;
3089
+ }
3090
+
2826
3091
  .house-num {
2827
3092
  fill: var(--roxy-muted, #71717a);
2828
3093
  font-size: 9px;
@@ -3081,45 +3346,45 @@
3081
3346
  color: var(--roxy-accent-fg, #b45309);
3082
3347
  font-size: var(--roxy-text-xs, 0.75rem);
3083
3348
  }
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}>
3349
+ `],p([y({attribute:!1})],K.prototype,"data",2),p([y({type:String,attribute:"house-system",reflect:!0})],K.prototype,"houseSystem",2),p([z()],K.prototype,"view",2),K=p([b("roxy-natal-chart")],K);var ae=class extends x{constructor(){super(...arguments);this.data=null;this.type="life-path"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No numerology data</div>`;let t=la[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,t):"personalYear"in e?this.renderPersonalYear(e,t):this.renderNumberCard(e,t)}renderNumberCard(e,t){let r=e.meaning?.keywords??[];return s`<article class="card" aria-label=${t}>
3085
3350
  <div class="hero">
3086
- ${typeof e.number=="number"?t`<div class="numeral">${e.number}</div>`:n}
3351
+ ${typeof e.number=="number"?s`<div class="numeral">${e.number}</div>`:l}
3087
3352
  <div>
3088
- <p class="label">${r}</p>
3089
- ${e.meaning?.title?t`<h2 class="title">${e.meaning.title}</h2>`:n}
3353
+ <p class="label">${t}</p>
3354
+ ${e.meaning?.title?s`<h2 class="title">${e.meaning.title}</h2>`:l}
3090
3355
  </div>
3091
3356
  </div>
3092
- ${e.meaning?.description?t`<p class="meaning">${e.meaning.description}</p>`:n}
3093
- ${e.calculation?t`<pre class="calc">${e.calculation}</pre>`:n}
3094
- ${a.length>0?t`<div class="chips">
3095
- ${a.map(o=>t`<span>${o}</span>`)}
3096
- </div>`:n}
3097
- ${e.hasKarmicDebt&&e.karmicDebtNumber?t`<div class="karmic">
3357
+ ${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l}
3358
+ ${e.calculation?s`<pre class="calc">${e.calculation}</pre>`:l}
3359
+ ${r.length>0?s`<div class="chips">
3360
+ ${r.map(o=>s`<span>${o}</span>`)}
3361
+ </div>`:l}
3362
+ ${e.hasKarmicDebt&&e.karmicDebtNumber?s`<div class="karmic">
3098
3363
  Karmic debt ${e.karmicDebtNumber}.
3099
- ${jt(e.karmicDebtMeaning)}
3100
- </div>`:n}
3101
- </article>`}renderPersonalYear(e,r){return t`<article class="card" aria-label=${r}>
3364
+ ${da(e.karmicDebtMeaning)}
3365
+ </div>`:l}
3366
+ </article>`}renderPersonalYear(e,t){return s`<article class="card" aria-label=${t}>
3102
3367
  <div class="hero">
3103
- ${typeof e.personalYear=="number"?t`<div class="numeral">${e.personalYear}</div>`:n}
3368
+ ${typeof e.personalYear=="number"?s`<div class="numeral">${e.personalYear}</div>`:l}
3104
3369
  <div>
3105
- <p class="label">${r}</p>
3106
- ${e.theme?t`<h2 class="title">${e.theme}</h2>`:n}
3370
+ <p class="label">${t}</p>
3371
+ ${e.theme?s`<h2 class="title">${e.theme}</h2>`:l}
3107
3372
  </div>
3108
3373
  </div>
3109
- ${e.forecast?t`<p class="meaning">${e.forecast}</p>`:n}
3110
- ${e.advice?t`<p>${e.advice}</p>`:n}
3111
- </article>`}renderChart(e,r){let a=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return t`<article class="card" aria-label=${r}>
3374
+ ${e.forecast?s`<p class="meaning">${e.forecast}</p>`:l}
3375
+ ${e.advice?s`<p>${e.advice}</p>`:l}
3376
+ </article>`}renderChart(e,t){let r=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return s`<article class="card" aria-label=${t}>
3112
3377
  <div>
3113
- <p class="label">${r}</p>
3114
- ${e.profile?.name?t`<h2 class="title">${e.profile.name}</h2>`:n}
3378
+ <p class="label">${t}</p>
3379
+ ${e.profile?.name?s`<h2 class="title">${e.profile.name}</h2>`:l}
3115
3380
  </div>
3116
- ${a.length>0?t`<div class="cores">
3117
- ${a.map(([o,l])=>t`<div class="item">
3118
- <span>${te(o)}</span>
3119
- <strong>${l.number??""}</strong>
3381
+ ${r.length>0?s`<div class="cores">
3382
+ ${r.map(([o,i])=>s`<div class="item">
3383
+ <span>${ce(o)}</span>
3384
+ <strong>${i.number??""}</strong>
3120
3385
  </div>`)}
3121
- </div>`:n}
3122
- </article>`}};W.styles=[v,x`
3386
+ </div>`:l}
3387
+ </article>`}};ae.styles=[v,f`
3123
3388
  .card {
3124
3389
  background: var(--roxy-bg, #fff);
3125
3390
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -3215,56 +3480,70 @@
3215
3480
  font-size: var(--roxy-text-sm, 0.875rem);
3216
3481
  color: var(--roxy-fg, #0a0a0a);
3217
3482
  }
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">
3483
+ `],p([y({attribute:!1})],ae.prototype,"data",2),p([y({type:String,reflect:!0})],ae.prototype,"type",2),ae=p([b("roxy-numerology-card")],ae);var la={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function da(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var se=class extends x{constructor(){super(...arguments);this.data=null;this.detail="detailed"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No panchang data</div>`;let t="sunrise"in e?e:null,r=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];t&&r.push(["Vara",this.formatPart(t.vara)]);let o=t?[["Brahma Muhurta",t.brahmaMuhurta],["Abhijit Muhurta",t.abhijitMuhurta],["Vijaya Muhurta",t.vijayaMuhurta],["Godhuli Muhurta",t.godhuliMuhurta],["Nishita Muhurta",t.nishitaMuhurta],["Pratah Sandhya",t.pratahSandhya],["Sayahna Sandhya",t.sayahnaSandhya]]:[],i=t?[["Rahu Kaal",t.rahuKaal],["Yamaganda",t.yamaganda],["Gulika",t.gulika]]:[],d=t&&"transitions"in t?t.transitions:void 0;return s`<div class="wrap" aria-label="Panchang">
3219
3484
  <header class="head">
3220
3485
  <h2 class="title">Panchang</h2>
3221
- <span class="date">${r?Ke(r.date):""}</span>
3486
+ <span class="date">${t?rt(t.date):""}</span>
3222
3487
  </header>
3223
3488
  <table>
3224
3489
  <tbody>
3225
- ${a.map(([d,c])=>t`<tr>
3226
- <th>${d}</th>
3227
- <td>${c}</td>
3490
+ ${r.map(([c,m])=>s`<tr>
3491
+ <th>${c}</th>
3492
+ <td>${m}</td>
3228
3493
  </tr>`)}
3229
- ${r?.sunrise?t`<tr>
3494
+ ${t?.sunrise?s`<tr>
3230
3495
  <th>Sunrise</th>
3231
- <td>${G(r.sunrise)}</td>
3232
- </tr>`:n}
3233
- ${r?.sunset?t`<tr>
3496
+ <td>${j(t.sunrise)}</td>
3497
+ </tr>`:l}
3498
+ ${t?.sunset?s`<tr>
3234
3499
  <th>Sunset</th>
3235
- <td>${G(r.sunset)}</td>
3236
- </tr>`:n}
3237
- ${r?.moonrise?t`<tr>
3500
+ <td>${j(t.sunset)}</td>
3501
+ </tr>`:l}
3502
+ ${t?.moonrise?s`<tr>
3238
3503
  <th>Moonrise</th>
3239
- <td>${G(r.moonrise)}</td>
3240
- </tr>`:n}
3241
- ${r?.moonset?t`<tr>
3504
+ <td>${j(t.moonrise)}</td>
3505
+ </tr>`:l}
3506
+ ${t?.moonset?s`<tr>
3242
3507
  <th>Moonset</th>
3243
- <td>${G(r.moonset)}</td>
3244
- </tr>`:n}
3508
+ <td>${j(t.moonset)}</td>
3509
+ </tr>`:l}
3245
3510
  </tbody>
3246
3511
  </table>
3247
- ${this.detail==="detailed"&&(o.some(d=>!!d[1])||l.some(d=>!!d[1]))?t`
3512
+ ${d?s`
3513
+ <div class="section">Next transitions</div>
3514
+ <table>
3515
+ <tbody>
3516
+ ${this.renderTransitionRow("Tithi",d.tithi)}
3517
+ ${this.renderTransitionRow("Nakshatra",d.nakshatra)}
3518
+ ${this.renderTransitionRow("Yoga",d.yoga)}
3519
+ ${this.renderTransitionRow("Karana",d.karana)}
3520
+ </tbody>
3521
+ </table>
3522
+ `:l}
3523
+ ${this.detail==="detailed"&&(o.some(c=>!!c[1])||i.some(c=>!!c[1]))?s`
3248
3524
  <div class="section">Auspicious muhurtas</div>
3249
3525
  <table>
3250
3526
  <tbody>
3251
- ${o.filter(([,d])=>!!d).map(([d,c])=>t`<tr>
3252
- <th>${d}</th>
3253
- <td>${gr(c)}</td>
3527
+ ${o.filter(([,c])=>!!c).map(([c,m])=>s`<tr>
3528
+ <th>${c}</th>
3529
+ <td>${At(m)}</td>
3254
3530
  </tr>`)}
3255
3531
  </tbody>
3256
3532
  </table>
3257
3533
  <div class="section">Inauspicious periods</div>
3258
3534
  <table>
3259
3535
  <tbody>
3260
- ${l.filter(([,d])=>!!d).map(([d,c])=>t`<tr>
3261
- <th>${d}</th>
3262
- <td>${gr(c)}</td>
3536
+ ${i.filter(([,c])=>!!c).map(([c,m])=>s`<tr>
3537
+ <th>${c}</th>
3538
+ <td>${At(m)}</td>
3263
3539
  </tr>`)}
3264
3540
  </tbody>
3265
3541
  </table>
3266
- `:n}
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`
3542
+ `:l}
3543
+ </div>`}renderTransitionRow(e,t){if(!t?.endsAt)return l;let r=j(t.endsAt),o=t.next?` \u2192 ${t.next}`:"";return s`<tr>
3544
+ <th>${e}</th>
3545
+ <td>ends ${r}${o}</td>
3546
+ </tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let t=e;return[t.name,t.paksha?`(${t.paksha} paksha)`:"",t.lord?`\xB7 ${t.lord}`:"",t.phase].filter(Boolean).join(" ")}return String(e)}};se.styles=[v,f`
3268
3547
  .wrap {
3269
3548
  border: 1px solid var(--roxy-border, #e4e4e7);
3270
3549
  border-radius: var(--roxy-radius-md, 8px);
@@ -3322,46 +3601,46 @@
3322
3601
  text-transform: uppercase;
3323
3602
  letter-spacing: 0.06em;
3324
3603
  }
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">
3604
+ `],p([y({attribute:!1})],se.prototype,"data",2),p([y({type:String,reflect:!0})],se.prototype,"detail",2),se=p([b("roxy-panchang-table")],se);var Rt=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],ue=class extends x{constructor(){super(...arguments);this.data=null}render(){if(!this.data?.planets?.length)return s`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((t,r)=>t.relativeRank-r.relativeRank);return s`<div class="wrap" aria-label="Shadbala planetary strength">
3326
3605
  <div class="head">
3327
3606
  <h2 class="title">Shadbala</h2>
3328
3607
  <p class="subtitle">${e.length} planets ranked by strength</p>
3329
3608
  </div>
3330
3609
 
3331
3610
  <div role="list" aria-label="Planet strength bars">
3332
- ${e.map(r=>this.renderPlanetRow(r))}
3611
+ ${e.map(t=>this.renderPlanetRow(t))}
3333
3612
  </div>
3334
3613
 
3335
3614
  <div class="legend" aria-label="Strength component legend">
3336
- ${br.map(r=>t`<div class="legend-row">
3615
+ ${Rt.map(t=>s`<div class="legend-row">
3337
3616
  <span
3338
3617
  class="legend-swatch"
3339
- style="background: ${r.color}"
3618
+ style="background: ${t.color}"
3340
3619
  aria-hidden="true"
3341
3620
  ></span>
3342
- ${r.label}
3621
+ ${t.label}
3343
3622
  </div>`)}
3344
3623
  </div>
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">
3624
+ </div>`}renderPlanetRow(e){let t=R[E(e.planet)]??"",r=Rt.map(g=>Math.max(0,e[g.key])),o=r.reduce((g,h)=>g+h,0),i=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,d=i?"adequacy-badge--adequate":"adequacy-badge--weak",c=i?"adequate":"weak",m=A(e.totalRupas,2)&&A(e.minRequired,2)?`${A(e.totalRupas,2)} / ${A(e.minRequired,2)} R`:"";return s`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala">
3346
3625
  <div class="planet-label">
3347
- <span class="glyph" aria-hidden="true">${r}</span>
3626
+ <span class="glyph" aria-hidden="true">${t}</span>
3348
3627
  ${e.planet}
3349
3628
  <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span>
3350
3629
  </div>
3351
3630
  <div class="bar-wrap">
3352
3631
  <div class="bar" role="img" aria-label="Strength components for ${e.planet}">
3353
- ${o>0?br.map((y,h)=>{let b=a[h];if(b<=0)return n;let E=b/o*100;return t`<div
3632
+ ${o>0?Rt.map((g,h)=>{let u=r[h];if(u<=0)return l;let k=u/o*100;return s`<div
3354
3633
  class="bar-segment"
3355
- style="flex-grow: ${E}; background: ${y.color};"
3356
- title="${y.label}: ${w(b,1)}"
3357
- ></div>`}):n}
3634
+ style="flex-grow: ${k}; background: ${g.color};"
3635
+ title="${g.label}: ${A(u,1)}"
3636
+ ></div>`}):l}
3358
3637
  </div>
3359
3638
  </div>
3360
3639
  <div class="pills">
3361
- ${m?t`<span class="rupas-label">${m}</span>`:n}
3640
+ ${m?s`<span class="rupas-label">${m}</span>`:l}
3362
3641
  <span class="${`adequacy-badge ${d}`}">${c}</span>
3363
3642
  </div>
3364
- </div>`}};de.styles=[v,x`
3643
+ </div>`}};ue.styles=[v,f`
3365
3644
  .wrap {
3366
3645
  display: grid;
3367
3646
  gap: var(--roxy-space-md, 1rem);
@@ -3507,18 +3786,18 @@
3507
3786
  justify-content: flex-start;
3508
3787
  }
3509
3788
  }
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
3789
+ `],p([y({attribute:!1})],ue.prototype,"data",2),ue=p([b("roxy-shadbala-table")],ue);var Mt=360,T=Mt/2,Nt=170,ca=154,zt=124,Me=96,xe=class extends x{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:t,compatibilityScore:r,analysis:o}=this.data,i=this.data.interAspects??[],d=e?.planets??[],c=t?.planets??[],m=typeof r=="number"?Math.round(r):void 0,g=o?.overall,h=o?.strengths??[],u=o?.challenges??[];return d.length>0&&c.length>0?s`<div
3511
3790
  class="wrap"
3512
3791
  aria-label="Synastry compatibility chart"
3513
3792
  >
3514
3793
  <div class="head">
3515
3794
  <h2 class="title">Synastry</h2>
3516
- ${typeof m=="number"?t`<span class="score" aria-label=${`Score ${m} of 100`}
3795
+ ${typeof m=="number"?s`<span class="score" aria-label=${`Score ${m} of 100`}
3517
3796
  >${m} / 100</span
3518
- >`:n}
3797
+ >`:l}
3519
3798
  </div>
3520
3799
  <svg
3521
- viewBox="0 0 ${$r} ${$r}"
3800
+ viewBox="0 0 ${Mt} ${Mt}"
3522
3801
  role="img"
3523
3802
  aria-label="Dual chart wheel comparing two natal charts"
3524
3803
  >
@@ -3527,7 +3806,7 @@
3527
3806
  class="wheel-line"
3528
3807
  cx=${T}
3529
3808
  cy=${T}
3530
- r=${Jr}
3809
+ r=${Nt}
3531
3810
  stroke-width="1.5"
3532
3811
  />
3533
3812
  <circle
@@ -3545,8 +3824,9 @@
3545
3824
  stroke-width="0.6"
3546
3825
  />
3547
3826
  ${this.renderSpokes()} ${this.renderSigns()}
3548
- ${this.renderInterAspectLines(d,c,l)}
3549
- ${this.renderRing(d,Xr,"p1")} ${this.renderRing(c,Me,"p2")}
3827
+ ${this.renderInterAspectLines(d,c,i)}
3828
+ ${this.renderRing(d,zt,"p1",1)} ${this.renderRing(c,Me,"p2",2)}
3829
+ ${this.renderAscendants(this.data)}
3550
3830
  </svg>
3551
3831
  <div class="legend-row">
3552
3832
  <span><span class="swatch" style="background: var(--roxy-accent)"></span>Person 1</span>
@@ -3554,31 +3834,31 @@
3554
3834
  <span><span class="swatch" style="background: var(--roxy-success)"></span>harmonious</span>
3555
3835
  <span><span class="swatch" style="background: var(--roxy-danger)"></span>challenging</span>
3556
3836
  </div>
3557
- ${y?t`<p class="summary">${y}</p>`:n}
3558
- ${l.length>0?this.renderAspects(l):n}
3559
- ${h.length>0||b.length>0?t`<div class="lists">
3560
- ${h.length?t`<div>
3837
+ ${g?s`<p class="summary">${g}</p>`:l}
3838
+ ${i.length>0?this.renderAspects(i):l}
3839
+ ${h.length>0||u.length>0?s`<div class="lists">
3840
+ ${h.length?s`<div>
3561
3841
  <h3>Strengths</h3>
3562
3842
  <ul>
3563
- ${h.map($=>t`<li>${$}</li>`)}
3843
+ ${h.map($=>s`<li>${$}</li>`)}
3564
3844
  </ul>
3565
- </div>`:n}
3566
- ${b.length?t`<div>
3845
+ </div>`:l}
3846
+ ${u.length?s`<div>
3567
3847
  <h3>Challenges</h3>
3568
3848
  <ul>
3569
- ${b.map($=>t`<li>${$}</li>`)}
3849
+ ${u.map($=>s`<li>${$}</li>`)}
3570
3850
  </ul>
3571
- </div>`:n}
3572
- </div>`:n}
3573
- </div>`:t`<div
3851
+ </div>`:l}
3852
+ </div>`:l}
3853
+ </div>`:s`<div
3574
3854
  class="wrap"
3575
3855
  aria-label="Synastry compatibility chart"
3576
3856
  >
3577
3857
  <div class="head">
3578
3858
  <h2 class="title">Synastry</h2>
3579
- ${typeof m=="number"?t`<span class="score" aria-label=${`Score ${m} of 100`}
3859
+ ${typeof m=="number"?s`<span class="score" aria-label=${`Score ${m} of 100`}
3580
3860
  >${m} / 100</span
3581
- >`:n}
3861
+ >`:l}
3582
3862
  </div>
3583
3863
  <div class="missing-planets" role="status">
3584
3864
  Synastry response missing planet positions. Pass
@@ -3586,23 +3866,29 @@
3586
3866
  <code>person2.planets</code> arrays from the natal-chart endpoint, or
3587
3867
  use the <code>&lt;roxy-data&gt;</code> fallback.
3588
3868
  </div>
3589
- ${y?t`<p class="summary">${y}</p>`:n}
3590
- ${l.length>0?this.renderAspects(l):n}
3591
- ${h.length>0||b.length>0?t`<div class="lists">
3592
- ${h.length?t`<div>
3869
+ ${g?s`<p class="summary">${g}</p>`:l}
3870
+ ${i.length>0?this.renderAspects(i):l}
3871
+ ${h.length>0||u.length>0?s`<div class="lists">
3872
+ ${h.length?s`<div>
3593
3873
  <h3>Strengths</h3>
3594
3874
  <ul>
3595
- ${h.map($=>t`<li>${$}</li>`)}
3875
+ ${h.map($=>s`<li>${$}</li>`)}
3596
3876
  </ul>
3597
- </div>`:n}
3598
- ${b.length?t`<div>
3877
+ </div>`:l}
3878
+ ${u.length?s`<div>
3599
3879
  <h3>Challenges</h3>
3600
3880
  <ul>
3601
- ${b.map($=>t`<li>${$}</li>`)}
3881
+ ${u.map($=>s`<li>${$}</li>`)}
3602
3882
  </ul>
3603
- </div>`:n}
3604
- </div>`:n}
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>
3883
+ </div>`:l}
3884
+ </div>`:l}
3885
+ </div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,t)=>{let r=this.toAngle(t*30),o=L(T,T,Me-14,r),i=L(T,T,Nt,r);return w`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.6" />`})}renderSigns(){return M.map((e,t)=>{let r=this.toAngle(t*30+15),o=L(T,T,ca,r);return w`<text class="sign" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${G[e]}</text>`})}renderRing(e,t,r,o){return e.map(i=>{if(!Number.isFinite(i.longitude))return l;let d=this.toAngle(i.longitude),c=L(T,T,t,d),g=L(T,T,t+(o===1?-12:-10),d),h=R[E(i.name)]??i.name.slice(0,2),u=B(i.longitude),k=i.isRetrograde===!0,$=`${u.degree}\xB0${String(u.minute).padStart(2,"0")}'`,$e=`${i.name}${k?" retrograde":""} - ${$} ${u.sign}`;return w`<g>
3886
+ <text class=${r} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central"><title>${$e}</title>${h}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${o}</tspan></text>
3887
+ <text class="planet-deg" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central">${u.degree}°${k?w`<tspan class="retro"> ℞</tspan>`:l}</text>
3888
+ </g>`})}renderAscendants(e){let t=[],r=(o,i)=>{if(!o)return;let d=M.findIndex(k=>k.toLowerCase()===o.sign.toLowerCase());if(d===-1)return;let c=d*30+o.degree,m=this.toAngle(c),g=i===1?zt+14:Me+14,h=L(T,T,g,m),u=L(T,T,Nt+14,m);t.push(w`<g>
3889
+ <line class="asc-tick" x1=${h.x} y1=${h.y} x2=${u.x} y2=${u.y} />
3890
+ <text class="asc-label" x=${u.x} y=${u.y} text-anchor="middle" dominant-baseline="central">Asc${i}</text>
3891
+ </g>`)};return r(e.person1?.ascendant,1),r(e.person2?.ascendant,2),t}renderInterAspectLines(e,t,r){let o=(i,d)=>{let c=E(d);for(let m of i)if(E(m.name)===c&&typeof m.longitude=="number")return m.longitude};return r.map(i=>{let d=o(e,i.planet1),c=o(t,i.planet2);if(d===void 0||c===void 0)return l;let m=L(T,T,zt-12,this.toAngle(d)),g=L(T,T,Me+8,this.toAngle(c)),h=Re(i),u=qe[h]??"aspect-other",k=A(i.orb,1);return w`<line class=${`aspect ${u}`} x1=${m.x} y1=${m.y} x2=${g.x} y2=${g.y}><title>${i.planet1} ${h} ${i.planet2}${k?` (orb ${k}\xB0)`:""}</title></line>`})}renderAspects(e){return s`<table>
3606
3892
  <thead>
3607
3893
  <tr>
3608
3894
  <th>Planet 1</th>
@@ -3613,15 +3899,15 @@
3613
3899
  </tr>
3614
3900
  </thead>
3615
3901
  <tbody>
3616
- ${e.slice(0,12).map(r=>t`<tr>
3617
- <td>${r.planet1}</td>
3618
- <td>${r.planet2}</td>
3619
- <td>${we(r)||""}</td>
3620
- <td class="orb">${w(r.orb,1)}</td>
3621
- <td>${Bt(r.strength)}</td>
3902
+ ${e.slice(0,12).map(t=>s`<tr>
3903
+ <td>${t.planet1}</td>
3904
+ <td>${t.planet2}</td>
3905
+ <td>${Re(t)||""}</td>
3906
+ <td class="orb">${A(t.orb,1)}</td>
3907
+ <td>${pa(t.strength)}</td>
3622
3908
  </tr>`)}
3623
3909
  </tbody>
3624
- </table>`}};ce.styles=[v,x`
3910
+ </table>`}};xe.styles=[v,f`
3625
3911
  .wrap {
3626
3912
  display: grid;
3627
3913
  gap: var(--roxy-space-md, 1rem);
@@ -3651,7 +3937,9 @@
3651
3937
  svg {
3652
3938
  display: block;
3653
3939
  width: 100%;
3654
- max-width: 400px;
3940
+ max-width: 560px;
3941
+ aspect-ratio: 1 / 1;
3942
+ height: auto;
3655
3943
  margin: 0 auto;
3656
3944
  }
3657
3945
 
@@ -3673,6 +3961,31 @@
3673
3961
  font-weight: 600;
3674
3962
  font-size: 13px;
3675
3963
  }
3964
+ .person-tag {
3965
+ font-size: 7px;
3966
+ font-weight: 700;
3967
+ opacity: 0.85;
3968
+ }
3969
+ .planet-deg {
3970
+ fill: var(--roxy-muted, #71717a);
3971
+ font-size: 7px;
3972
+ font-family: var(--roxy-font-sans);
3973
+ }
3974
+ .planet-deg .retro {
3975
+ fill: var(--roxy-danger, #dc2626);
3976
+ }
3977
+ .asc-tick {
3978
+ stroke: var(--roxy-accent-fg, #b45309);
3979
+ stroke-width: 1;
3980
+ opacity: 0.75;
3981
+ }
3982
+ .asc-label {
3983
+ fill: var(--roxy-accent-fg, #b45309);
3984
+ font-size: 9px;
3985
+ font-weight: 700;
3986
+ font-family: var(--roxy-font-sans);
3987
+ letter-spacing: 0.04em;
3988
+ }
3676
3989
  .aspect {
3677
3990
  stroke-width: 0.8;
3678
3991
  fill: none;
@@ -3773,33 +4086,33 @@
3773
4086
  padding: 0 4px;
3774
4087
  border-radius: 4px;
3775
4088
  }
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"}>
4089
+ `],p([y({attribute:!1})],xe.prototype,"data",2),xe=p([b("roxy-synastry-chart")],xe);function pa(n){return typeof n=="number"?Math.round(n).toString():""}var oe=class extends x{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):s`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let t=e.card,r=this.flipped!==!!t.reversed,o=t.keywords??[];return s`<article class="card" aria-label=${t.name??"Tarot card"}>
3777
4090
  <div class="image-wrap">
3778
- ${r.imageUrl?t`<img
3779
- class=${`image ${a?"reversed":""}`}
3780
- src=${r.imageUrl}
3781
- alt=${r.name??"Tarot card"}
4091
+ ${t.imageUrl?s`<img
4092
+ class=${`image ${r?"reversed":""}`}
4093
+ src=${t.imageUrl}
4094
+ alt=${t.name??"Tarot card"}
3782
4095
  tabindex="0"
3783
4096
  @click=${this.toggleFlip}
3784
- @keydown=${l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),this.toggleFlip())}}
3785
- />`:t`<div
3786
- class=${`image ${a?"reversed":""}`}
4097
+ @keydown=${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}
4098
+ />`:s`<div
4099
+ class=${`image ${r?"reversed":""}`}
3787
4100
  style="aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)"
3788
4101
  >
3789
- ${r.name??"?"}
4102
+ ${t.name??"?"}
3790
4103
  </div>`}
3791
4104
  </div>
3792
4105
  <div>
3793
4106
  <div class="meta">
3794
- ${r.arcana?t`${r.arcana} arcana`:n}
3795
- ${a?t` · reversed`:n}
4107
+ ${t.arcana?s`${t.arcana} arcana`:l}
4108
+ ${r?s` · reversed`:l}
3796
4109
  </div>
3797
- <h2 class="title">${r.name??"Tarot card"}</h2>
3798
- ${e.dailyMessage?t`<p class="message">${e.dailyMessage}</p>`:n}
3799
- ${r.meaning?t`<p>${r.meaning}</p>`:n}
3800
- ${o.length>0?t`<div class="chips">
3801
- ${o.map(l=>t`<span>${l}</span>`)}
3802
- </div>`:n}
4110
+ <h2 class="title">${t.name??"Tarot card"}</h2>
4111
+ ${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:l}
4112
+ ${t.meaning?s`<p>${t.meaning}</p>`:l}
4113
+ ${o.length>0?s`<div class="chips">
4114
+ ${o.map(i=>s`<span>${i}</span>`)}
4115
+ </div>`:l}
3803
4116
  <button
3804
4117
  class="flip"
3805
4118
  type="button"
@@ -3809,17 +4122,17 @@
3809
4122
  Flip card
3810
4123
  </button>
3811
4124
  </div>
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"}>
4125
+ </article>`}renderFullCard(e){let t=this.flipped,r=t?e.reversed:e.upright,o=t?e.keywords?.reversed??[]:e.keywords?.upright??[];return s`<article class="card" aria-label=${e.name??"Tarot card"}>
3813
4126
  <div class="image-wrap">
3814
- ${e.imageUrl?t`<img
3815
- class=${`image ${r?"reversed":""}`}
4127
+ ${e.imageUrl?s`<img
4128
+ class=${`image ${t?"reversed":""}`}
3816
4129
  src=${e.imageUrl}
3817
4130
  alt=${e.name??"Tarot card"}
3818
4131
  tabindex="0"
3819
4132
  @click=${this.toggleFlip}
3820
- @keydown=${l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),this.toggleFlip())}}
3821
- />`:t`<div
3822
- class=${`image ${r?"reversed":""}`}
4133
+ @keydown=${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}
4134
+ />`:s`<div
4135
+ class=${`image ${t?"reversed":""}`}
3823
4136
  style="aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)"
3824
4137
  >
3825
4138
  ${e.name??"?"}
@@ -3827,15 +4140,15 @@
3827
4140
  </div>
3828
4141
  <div>
3829
4142
  <div class="meta">
3830
- ${e.arcana?t`${e.arcana} arcana`:n}
3831
- ${e.number!==void 0&&e.number!==null?t` · ${e.number}`:n}
3832
- ${r?t` · reversed`:n}
4143
+ ${e.arcana?s`${e.arcana} arcana`:l}
4144
+ ${e.number!==void 0&&e.number!==null?s` · ${e.number}`:l}
4145
+ ${t?s` · reversed`:l}
3833
4146
  </div>
3834
4147
  <h2 class="title">${e.name??"Tarot card"}</h2>
3835
- ${a?.description?t`<p>${a.description}</p>`:n}
3836
- ${o.length>0?t`<div class="chips">
3837
- ${o.map(l=>t`<span>${l}</span>`)}
3838
- </div>`:n}
4148
+ ${r?.description?s`<p>${r.description}</p>`:l}
4149
+ ${o.length>0?s`<div class="chips">
4150
+ ${o.map(i=>s`<span>${i}</span>`)}
4151
+ </div>`:l}
3839
4152
  <button
3840
4153
  class="flip"
3841
4154
  type="button"
@@ -3845,7 +4158,7 @@
3845
4158
  Flip card
3846
4159
  </button>
3847
4160
  </div>
3848
- </article>`}};X.styles=[v,x`
4161
+ </article>`}};oe.styles=[v,f`
3849
4162
  .card {
3850
4163
  background: var(--roxy-bg, #fff);
3851
4164
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -3935,51 +4248,51 @@
3935
4248
  .flip:hover {
3936
4249
  transform: scale(1.02);
3937
4250
  }
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">
4251
+ `],p([y({attribute:!1})],oe.prototype,"data",2),p([z()],oe.prototype,"flipped",2),oe=p([b("roxy-tarot-card")],oe);var ne=class extends x{constructor(){super(...arguments);this.data=null;this.spread="three-card"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No tarot spread</div>`;let t="answer"in e,r="cards"in e&&!("spread"in e),o=r?[]:"positions"in e?e.positions??[]:[],i=r&&"cards"in e?e.cards:[],d=t?e.answer:void 0,c=t?e.strength:void 0,m="spread"in e?e.spread:this.spread.replace(/-/g," "),g="question"in e?e.question:void 0,h="summary"in e?e.summary:void 0,u=t?e.interpretation:void 0,k=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread">
3939
4252
  <header class="head">
3940
4253
  <h2 class="title">${m}</h2>
3941
- ${y?t`<span class="question">"${y}"</span>`:n}
4254
+ ${g?s`<span class="question">"${g}"</span>`:l}
3942
4255
  </header>
3943
- ${r?t`<div>
3944
- <span class=${`answer ${E}`}>${d}</span>
3945
- ${c?t`<small> · ${c}</small>`:n}
3946
- </div>`:n}
3947
- ${o.length>0?t`<div class="grid">
3948
- ${o.map($=>t`<div class="card">
4256
+ ${t?s`<div>
4257
+ <span class=${`answer ${k}`}>${d}</span>
4258
+ ${c?s`<small> · ${c}</small>`:l}
4259
+ </div>`:l}
4260
+ ${o.length>0?s`<div class="grid">
4261
+ ${o.map($=>s`<div class="card">
3949
4262
  <p class="label">${$.name??""}</p>
3950
4263
  <div class="image">
3951
- ${$.card?.imageUrl?t`<img
4264
+ ${$.card?.imageUrl?s`<img
3952
4265
  src=${$.card.imageUrl}
3953
4266
  alt=${$.card.name??"tarot card"}
3954
4267
  class=${$.card.reversed?"reversed":""}
3955
- />`:t`${$.card?.name??"?"}`}
4268
+ />`:s`${$.card?.name??"?"}`}
3956
4269
  </div>
3957
4270
  <p class="name">
3958
4271
  ${$.card?.name??""}
3959
- ${$.card?.reversed?t`<small>(reversed)</small>`:n}
4272
+ ${$.card?.reversed?s`<small>(reversed)</small>`:l}
3960
4273
  </p>
3961
- ${$.interpretation?t`<p class="interp">${$.interpretation}</p>`:n}
4274
+ ${$.interpretation?s`<p class="interp">${$.interpretation}</p>`:l}
3962
4275
  </div>`)}
3963
- </div>`:n}
3964
- ${l.length>0?t`<div class="grid">
3965
- ${l.map($=>t`<div class="card">
4276
+ </div>`:l}
4277
+ ${i.length>0?s`<div class="grid">
4278
+ ${i.map($=>s`<div class="card">
3966
4279
  <div class="image">
3967
- ${$.imageUrl?t`<img
4280
+ ${$.imageUrl?s`<img
3968
4281
  src=${$.imageUrl}
3969
4282
  alt=${$.name??"tarot card"}
3970
4283
  class=${$.reversed?"reversed":""}
3971
- />`:t`${$.name??"?"}`}
4284
+ />`:s`${$.name??"?"}`}
3972
4285
  </div>
3973
4286
  <p class="name">
3974
4287
  ${$.name??""}
3975
- ${$.reversed?t`<small>(reversed)</small>`:n}
4288
+ ${$.reversed?s`<small>(reversed)</small>`:l}
3976
4289
  </p>
3977
- ${$.meaning?t`<p class="interp">${$.meaning}</p>`:n}
4290
+ ${$.meaning?s`<p class="interp">${$.meaning}</p>`:l}
3978
4291
  </div>`)}
3979
- </div>`:n}
3980
- ${h?t`<p class="reading">${h}</p>`:n}
3981
- ${b?t`<p class="reading">${b}</p>`:n}
3982
- </article>`}};Z.styles=[v,x`
4292
+ </div>`:l}
4293
+ ${h?s`<p class="reading">${h}</p>`:l}
4294
+ ${u?s`<p class="reading">${u}</p>`:l}
4295
+ </article>`}};ne.styles=[v,f`
3983
4296
  .wrap {
3984
4297
  display: grid;
3985
4298
  gap: var(--roxy-space-md, 1rem);
@@ -4085,28 +4398,28 @@
4085
4398
  margin: 0;
4086
4399
  color: var(--roxy-fg, #0a0a0a);
4087
4400
  }
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">
4401
+ `],p([y({attribute:!1})],ne.prototype,"data",2),p([y({type:String,reflect:!0})],ne.prototype,"spread",2),ne=p([b("roxy-tarot-spread")],ne);var fe=class extends x{constructor(){super(...arguments);this.data=null}render(){if(!this.data?.transitPlanets?.length)return s`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:t,transitPlanets:r,transitAspects:o,summary:i}=this.data,d=[rt(e),j(t)].filter(Boolean).join(" ");return s`<div class="wrap" aria-label="Transit positions table">
4089
4402
  <div class="head">
4090
4403
  <h2 class="title">Transits</h2>
4091
- ${d?t`<p class="subtitle">${d}</p>`:n}
4404
+ ${d?s`<p class="subtitle">${d}</p>`:l}
4092
4405
  </div>
4093
4406
 
4094
- ${l?this.renderSummaryPills(l):n}
4407
+ ${i?this.renderSummaryPills(i):l}
4095
4408
 
4096
4409
  <div>
4097
4410
  <p class="section-label">Planet positions</p>
4098
4411
  <div class="overflow-scroll">
4099
- ${this.renderPlanetsTable(a)}
4412
+ ${this.renderPlanetsTable(r)}
4100
4413
  </div>
4101
4414
  </div>
4102
4415
 
4103
- ${o?.length?t`<div>
4416
+ ${o?.length?s`<div>
4104
4417
  <p class="section-label">Transit aspects</p>
4105
4418
  <div class="overflow-scroll">
4106
4419
  ${this.renderAspectsList(o)}
4107
4420
  </div>
4108
- </div>`:n}
4109
- </div>`}renderSummaryPills(e){return t`<div class="summary-pills" role="region" aria-label="Aspect summary">
4421
+ </div>`:l}
4422
+ </div>`}renderSummaryPills(e){return s`<div class="summary-pills" role="region" aria-label="Aspect summary">
4110
4423
  <span class="pill pill--muted">
4111
4424
  Total: ${e.totalAspects}
4112
4425
  </span>
@@ -4119,7 +4432,7 @@
4119
4432
  <span class="pill pill--muted">
4120
4433
  Neutral: ${e.neutral}
4121
4434
  </span>
4122
- </div>`}renderPlanetsTable(e){return t`<table class="planets-table">
4435
+ </div>`}renderPlanetsTable(e){return s`<table class="planets-table">
4123
4436
  <thead>
4124
4437
  <tr>
4125
4438
  <th scope="col">Planet</th>
@@ -4129,50 +4442,50 @@
4129
4442
  </tr>
4130
4443
  </thead>
4131
4444
  <tbody>
4132
- ${e.map(r=>{let a=L[A(r.name)]??"",o=N[A(r.sign)]??"",l=r.speed>=0?"\u2191":"\u2193";return t`<tr>
4445
+ ${e.map(t=>{let r=R[E(t.name)]??"",o=G[E(t.sign)]??"",i=t.speed>=0?"\u2191":"\u2193";return s`<tr>
4133
4446
  <td>
4134
4447
  <div class="planet-cell">
4135
- <span class="glyph" aria-hidden="true">${a}</span>
4136
- ${r.name}
4137
- ${r.isRetrograde?t`<span class="retro-badge" aria-label="retrograde">R</span>`:n}
4448
+ <span class="glyph" aria-hidden="true">${r}</span>
4449
+ ${t.name}
4450
+ ${t.isRetrograde?s`<span class="retro-badge" aria-label="retrograde">R</span>`:l}
4138
4451
  </div>
4139
4452
  </td>
4140
4453
  <td>
4141
4454
  <div class="planet-cell">
4142
4455
  <span class="glyph" aria-hidden="true">${o}</span>
4143
- ${r.sign}
4456
+ ${t.sign}
4144
4457
  </div>
4145
4458
  </td>
4146
- <td class="num">${w(r.degree,2)}</td>
4459
+ <td class="num">${A(t.degree,2)}</td>
4147
4460
  <td class="speed">
4148
- <span class="speed-arrow" aria-hidden="true">${l}</span>
4149
- ${w(Math.abs(r.speed),4)}
4461
+ <span class="speed-arrow" aria-hidden="true">${i}</span>
4462
+ ${A(Math.abs(t.speed),4)}
4150
4463
  </td>
4151
4464
  </tr>`})}
4152
4465
  </tbody>
4153
- </table>`}renderAspectsList(e){return t`<div role="list" aria-label="Transit aspects">
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}>
4466
+ </table>`}renderAspectsList(e){return s`<div role="list" aria-label="Transit aspects">
4467
+ ${e.map((t,r)=>{let o=R[E(t.transitPlanet)]??"",i=R[E(t.natalPlanet)]??"",d=(t.nature??"neutral").toLowerCase(),c=t.interpretation,m=(t.type??"").toLowerCase(),g=t.isApplying?"Applying":"Separating";return s`<details class="aspect-card" role="listitem" name="transit-aspects" ?open=${r===0}>
4155
4468
  <summary>
4156
4469
  <span aria-hidden="true">${o}</span>
4157
- ${r.transitPlanet}
4470
+ ${t.transitPlanet}
4158
4471
  <span class="nature-badge ${d}">${m}</span>
4159
- <span aria-hidden="true">${l}</span>
4160
- ${r.natalPlanet}
4472
+ <span aria-hidden="true">${i}</span>
4473
+ ${t.natalPlanet}
4161
4474
  <span class="meta">
4162
- ${y} · orb ${w(r.orb,2)}° · strength ${w(r.strength,1)}
4475
+ ${g} · orb ${A(t.orb,2)}° · strength ${A(t.strength,1)}
4163
4476
  </span>
4164
4477
  </summary>
4165
4478
  <div class="interp-body">
4166
- ${c?.summary?t`<p>${c.summary}</p>`:n}
4167
- ${c?.impact?t`<p><strong>Impact:</strong> ${c.impact}</p>`:n}
4168
- ${c?.timing?t`<p><strong>Timing:</strong> ${c.timing}</p>`:n}
4169
- ${c?.guidance?t`<p><strong>Guidance:</strong> ${c.guidance}</p>`:n}
4170
- ${c?.keywords?.length?t`<div class="interp-keywords">
4171
- ${c.keywords.map(h=>t`<span class="kw">${h}</span>`)}
4172
- </div>`:n}
4479
+ ${c?.summary?s`<p>${c.summary}</p>`:l}
4480
+ ${c?.impact?s`<p><strong>Impact:</strong> ${c.impact}</p>`:l}
4481
+ ${c?.timing?s`<p><strong>Timing:</strong> ${c.timing}</p>`:l}
4482
+ ${c?.guidance?s`<p><strong>Guidance:</strong> ${c.guidance}</p>`:l}
4483
+ ${c?.keywords?.length?s`<div class="interp-keywords">
4484
+ ${c.keywords.map(h=>s`<span class="kw">${h}</span>`)}
4485
+ </div>`:l}
4173
4486
  </div>
4174
4487
  </details>`})}
4175
- </div>`}};pe.styles=[v,x`
4488
+ </div>`}};fe.styles=[v,f`
4176
4489
  .wrap {
4177
4490
  display: grid;
4178
4491
  gap: var(--roxy-space-md, 1rem);
@@ -4368,68 +4681,21 @@
4368
4681
  background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
4369
4682
  color: var(--roxy-fg, #0a0a0a);
4370
4683
  }
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">
4372
- <h2 class="title">Vedic kundli</h2>
4684
+ `],p([y({attribute:!1})],fe.prototype,"data",2),fe=p([b("roxy-transits-table")],fe);var ie=class extends x{constructor(){super(...arguments);this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){return this.data?.meta?ot(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?s`<div class="wrap">
4685
+ <div class="header">
4686
+ <h2 class="title">Vedic kundli</h2>
4687
+ ${it(this.chartStyle,this.setStyle)}
4688
+ </div>
4373
4689
  <svg
4374
- viewBox="0 0 300 300"
4690
+ viewBox="0 0 400 400"
4691
+ preserveAspectRatio="xMidYMid meet"
4375
4692
  role="img"
4376
4693
  aria-label="Vedic birth chart with twelve sign houses"
4377
4694
  >
4378
4695
  <title>Vedic kundli</title>
4379
- ${a}
4380
- ${e.map(l=>o(l))}
4696
+ ${nt(e,this.chartStyle)}
4381
4697
  </svg>
4382
- </div>`}};Q.styles=[v,x`
4383
- .wrap {
4384
- display: grid;
4385
- gap: var(--roxy-space-md, 1rem);
4386
- }
4387
- .title {
4388
- font-size: var(--roxy-text-lg, 1.125rem);
4389
- font-weight: var(--roxy-weight-bold, 600);
4390
- margin: 0;
4391
- }
4392
- svg {
4393
- display: block;
4394
- width: 100%;
4395
- max-width: 360px;
4396
- margin: 0 auto;
4397
- }
4398
- .line {
4399
- fill: transparent;
4400
- stroke: var(--roxy-border, #e4e4e7);
4401
- }
4402
- .sign-text {
4403
- fill: var(--roxy-muted, #71717a);
4404
- font-size: 9px;
4405
- font-weight: 500;
4406
- font-family: var(--roxy-font-sans);
4407
- }
4408
- .planet-text {
4409
- fill: var(--roxy-fg, #0a0a0a);
4410
- font-size: 10px;
4411
- font-weight: 600;
4412
- font-family: var(--roxy-font-sans);
4413
- }
4414
- .house-num {
4415
- fill: var(--roxy-muted, #71717a);
4416
- font-size: 9px;
4417
- font-weight: 400;
4418
- font-family: var(--roxy-font-sans);
4419
- }
4420
- .lagna-marker {
4421
- fill: var(--roxy-accent-fg, #b45309);
4422
- font-size: 8px;
4423
- font-weight: 700;
4424
- font-family: var(--roxy-font-sans);
4425
- letter-spacing: 0.05em;
4426
- }
4427
- .lagna-bg {
4428
- fill: color-mix(in srgb, var(--roxy-accent, #f59e0b) 12%, transparent);
4429
- stroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
4430
- stroke-width: 0.8;
4431
- }
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">
4698
+ </div>`:s`<div class="roxy-empty" role="status">No kundli data</div>`}};ie.styles=[v,lt],p([y({attribute:!1})],ie.prototype,"data",2),p([y({type:String,reflect:!0,attribute:"chart-style"})],ie.prototype,"chartStyle",2),ie=p([b("roxy-vedic-kundli")],ie);var ma=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],be=class extends x{constructor(){super(...arguments);this.data=null}orderedRows(){let e=this.data?.meta??{},t=new Set,r=[];for(let o of ma){let i=e[o];i&&(r.push([o,i]),t.add(o))}for(let[o,i]of Object.entries(e))t.has(o)||r.push([o,i]);return r}render(){if(!this.data?.meta)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return s`<div class="wrap" aria-label="Vedic planetary positions" tabindex="0">
4433
4699
  <header class="head">
4434
4700
  <h2 class="title">Planetary positions</h2>
4435
4701
  </header>
@@ -4448,26 +4714,26 @@
4448
4714
  </tr>
4449
4715
  </thead>
4450
4716
  <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":""}>
4717
+ ${e.map(([t,r])=>{let o=(r.graha??t)==="Lagna",i=R[E(r.graha??t)]??"",d=G[E(r.rashi??"")]??"";return s`<tr class=${o?"lagna":""}>
4452
4718
  <td class="graha">
4453
- ${l?t`<span class="glyph">${l}</span>`:n}${a.graha??r}
4719
+ ${i?s`<span class="glyph">${i}</span>`:l}${r.graha??t}
4454
4720
  </td>
4455
4721
  <td>
4456
- ${d?t`<span class="glyph">${d}</span>`:n}${a.rashi??""}
4722
+ ${d?s`<span class="glyph">${d}</span>`:l}${r.rashi??""}
4457
4723
  </td>
4458
4724
  <td class="num">
4459
- ${typeof a.longitude=="number"?Ue(a.longitude):""}
4725
+ ${typeof r.longitude=="number"?at(r.longitude):""}
4460
4726
  </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>
4727
+ <td>${r.nakshatra?.name??""}</td>
4728
+ <td class="num">${r.nakshatra?.pada??""}</td>
4729
+ <td>${r.nakshatra?.lord??""}</td>
4730
+ <td class="num">${typeof r.house=="number"?r.house:""}</td>
4731
+ <td>${r.awastha??""}</td>
4732
+ <td>${r.isRetrograde?s`<span class="retro">R</span>`:l}</td>
4467
4733
  </tr>`})}
4468
4734
  </tbody>
4469
4735
  </table>
4470
- </div>`}};me.styles=[v,x`
4736
+ </div>`}};be.styles=[v,f`
4471
4737
  .wrap {
4472
4738
  border: 1px solid var(--roxy-border, #e4e4e7);
4473
4739
  border-radius: var(--roxy-radius-md, 8px);
@@ -4533,7 +4799,7 @@
4533
4799
  .num {
4534
4800
  font-variant-numeric: tabular-nums;
4535
4801
  }
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">
4802
+ `],p([y({attribute:!1})],be.prototype,"data",2),be=p([b("roxy-vedic-planets-table")],be);var ve=class extends x{constructor(){super(...arguments);this.data=null}rows(){let e=this.data;if(!e)return[];let t=(e.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,o]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])o&&t.push({name:r,sign:o.sign,longitude:o.longitude,isPoint:!0});return t}render(){if(!this.data?.planets)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return s`<div class="wrap" aria-label="Western planetary positions" tabindex="0">
4537
4803
  <header class="head">
4538
4804
  <h2 class="title">Planetary positions</h2>
4539
4805
  </header>
@@ -4548,25 +4814,25 @@
4548
4814
  </tr>
4549
4815
  </thead>
4550
4816
  <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":""}>
4817
+ ${e.map(t=>{let r=R[E(t.name)]??"",o=G[E(t.sign??"")]??"",i=typeof t.speed=="number"?A(t.speed,3):"";return s`<tr class=${t.isPoint?"point":""}>
4552
4818
  <td class="body">
4553
- ${a?t`<span class="glyph">${a}</span>`:n}${r.name}
4819
+ ${r?s`<span class="glyph">${r}</span>`:l}${t.name}
4554
4820
  </td>
4555
4821
  <td>
4556
- ${o?t`<span class="glyph">${o}</span>`:n}${r.sign??""}
4822
+ ${o?s`<span class="glyph">${o}</span>`:l}${t.sign??""}
4557
4823
  </td>
4558
4824
  <td class="num">
4559
- ${typeof r.longitude=="number"?Ue(r.longitude):""}
4825
+ ${typeof t.longitude=="number"?at(t.longitude):""}
4560
4826
  </td>
4561
- <td class="num">${typeof r.house=="number"?r.house:""}</td>
4827
+ <td class="num">${typeof t.house=="number"?t.house:""}</td>
4562
4828
  <td class="num">
4563
- ${l?t`${l}°/day`:n}
4564
- ${r.isRetrograde?t`<span class="retro"> ℞</span>`:n}
4829
+ ${i?s`${i}°/day`:l}
4830
+ ${t.isRetrograde?s`<span class="retro"> ℞</span>`:l}
4565
4831
  </td>
4566
4832
  </tr>`})}
4567
4833
  </tbody>
4568
4834
  </table>
4569
- </div>`}};he.styles=[v,x`
4835
+ </div>`}};ve.styles=[v,f`
4570
4836
  .wrap {
4571
4837
  border: 1px solid var(--roxy-border, #e4e4e7);
4572
4838
  border-radius: var(--roxy-radius-md, 8px);
@@ -4626,20 +4892,20 @@
4626
4892
  .num {
4627
4893
  font-variant-numeric: tabular-nums;
4628
4894
  }
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">
4895
+ `],p([y({attribute:!1})],ve.prototype,"data",2),ve=p([b("roxy-western-planets-table")],ve);var le=class extends x{constructor(){super(...arguments);this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let t=`quality-chip quality-${e}`;return s`<span class=${t}>${e}</span>`}renderDetailCard(e){return s`<div class="detail-card">
4630
4896
  <p class="detail-name">
4631
4897
  ${e.name}
4632
- ${e.quality?this.renderQualityChip(e.quality):n}
4898
+ ${e.quality?this.renderQualityChip(e.quality):l}
4633
4899
  </p>
4634
- ${e.description?t`<p class="description">${e.description}</p>`:n}
4635
- ${e.result?t`<details>
4900
+ ${e.description?s`<p class="description">${e.description}</p>`:l}
4901
+ ${e.result?s`<details>
4636
4902
  <summary>Effects</summary>
4637
4903
  <div class="result-body">${e.result}</div>
4638
- </details>`:n}
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">
4904
+ </details>`:l}
4905
+ </div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,t=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let r=e;return s`<div class="wrap">${this.renderDetailCard(r)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let r=e.yogas;if(r.length>0&&"description"in r[0]){let m=r,g=t?m.filter(u=>u.name.toLowerCase().includes(t)):m,h=e.total;return s`<div class="wrap">
4640
4906
  <div class="head">
4641
4907
  <h2 class="title">Yoga catalog</h2>
4642
- ${h!==void 0?t`<span class="count">${h} total</span>`:n}
4908
+ ${h!==void 0?s`<span class="count">${h} total</span>`:l}
4643
4909
  </div>
4644
4910
  <div class="search-wrap">
4645
4911
  <input
@@ -4657,12 +4923,12 @@
4657
4923
  aria-live="polite"
4658
4924
  aria-label="Yoga results"
4659
4925
  >
4660
- ${y.length>0?y.map(b=>this.renderDetailCard(b)):t`<p class="no-results">No yogas match your search.</p>`}
4926
+ ${g.length>0?g.map(u=>this.renderDetailCard(u)):s`<p class="no-results">No yogas match your search.</p>`}
4661
4927
  </div>
4662
- </div>`}let l=a,d=r?l.filter(m=>m.name.toLowerCase().includes(r)):l,c=e.total;return t`<div class="wrap">
4928
+ </div>`}let i=r,d=t?i.filter(m=>m.name.toLowerCase().includes(t)):i,c=e.total;return s`<div class="wrap">
4663
4929
  <div class="head">
4664
4930
  <h2 class="title">Yoga catalog</h2>
4665
- ${c!==void 0?t`<span class="count">${c} total</span>`:n}
4931
+ ${c!==void 0?s`<span class="count">${c} total</span>`:l}
4666
4932
  </div>
4667
4933
  <div class="search-wrap">
4668
4934
  <input
@@ -4680,12 +4946,12 @@
4680
4946
  aria-live="polite"
4681
4947
  aria-label="Yoga results"
4682
4948
  >
4683
- ${d.length>0?d.map(m=>t`<div class="yoga-chip">
4949
+ ${d.length>0?d.map(m=>s`<div class="yoga-chip">
4684
4950
  ${m.name}
4685
4951
  <span class="yoga-id">${m.id}</span>
4686
- </div>`):t`<p class="no-results">No yogas match your search.</p>`}
4952
+ </div>`):s`<p class="no-results">No yogas match your search.</p>`}
4687
4953
  </div>
4688
- </div>`}return t`<div class="roxy-empty" role="status">No yoga data</div>`}};ee.styles=[v,x`
4954
+ </div>`}return s`<div class="roxy-empty" role="status">No yoga data</div>`}};le.styles=[v,f`
4689
4955
  .wrap {
4690
4956
  display: grid;
4691
4957
  gap: var(--roxy-space-md, 1rem);
@@ -4833,7 +5099,7 @@
4833
5099
  display: grid;
4834
5100
  gap: var(--roxy-space-sm, 0.5rem);
4835
5101
  }
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);})();
5102
+ `],p([y({attribute:!1})],le.prototype,"data",2),p([z()],le.prototype,"filter",2),le=p([b("roxy-yoga-list")],le);var dt=[{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 cr="0.4.0";var ha=dt.map(n=>n.slug);return yr(ga);})();
4837
5103
  /*! Bundled license information:
4838
5104
 
4839
5105
  @lit/reactive-element/css-tag.js: