@roxyapi/ui 0.1.3 → 0.2.1

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 (161) hide show
  1. package/AGENTS.md +6 -0
  2. package/README.md +9 -3
  3. package/dist/cdn/components/ashtakavarga-grid.js +349 -0
  4. package/dist/cdn/components/ashtakavarga-grid.js.map +7 -0
  5. package/dist/cdn/components/choghadiya-grid.js +239 -0
  6. package/dist/cdn/components/choghadiya-grid.js.map +7 -0
  7. package/dist/cdn/components/compatibility-card.js +6 -6
  8. package/dist/cdn/components/compatibility-card.js.map +1 -1
  9. package/dist/cdn/components/dasha-timeline.js +4 -4
  10. package/dist/cdn/components/dasha-timeline.js.map +1 -1
  11. package/dist/cdn/components/data.js +9 -9
  12. package/dist/cdn/components/data.js.map +4 -4
  13. package/dist/cdn/components/divisional-chart.js +279 -0
  14. package/dist/cdn/components/divisional-chart.js.map +7 -0
  15. package/dist/cdn/components/dosha-card.js +39 -39
  16. package/dist/cdn/components/dosha-card.js.map +3 -3
  17. package/dist/cdn/components/endpoint-form.js +8 -8
  18. package/dist/cdn/components/endpoint-form.js.map +4 -4
  19. package/dist/cdn/components/guna-milan.js +64 -22
  20. package/dist/cdn/components/guna-milan.js.map +3 -3
  21. package/dist/cdn/components/hexagram.js +9 -9
  22. package/dist/cdn/components/hexagram.js.map +3 -3
  23. package/dist/cdn/components/horoscope-card.js +28 -21
  24. package/dist/cdn/components/horoscope-card.js.map +4 -4
  25. package/dist/cdn/components/kp-planets-table.js +4 -4
  26. package/dist/cdn/components/kp-planets-table.js.map +1 -1
  27. package/dist/cdn/components/location-search.js.map +2 -2
  28. package/dist/cdn/components/moon-phase.js +13 -13
  29. package/dist/cdn/components/moon-phase.js.map +3 -3
  30. package/dist/cdn/components/natal-chart.js +196 -22
  31. package/dist/cdn/components/natal-chart.js.map +4 -4
  32. package/dist/cdn/components/numerology-card.js +6 -6
  33. package/dist/cdn/components/numerology-card.js.map +4 -4
  34. package/dist/cdn/components/panchang-table.js +9 -9
  35. package/dist/cdn/components/panchang-table.js.map +1 -1
  36. package/dist/cdn/components/shadbala-table.js +312 -0
  37. package/dist/cdn/components/shadbala-table.js.map +7 -0
  38. package/dist/cdn/components/synastry-chart.js +21 -21
  39. package/dist/cdn/components/synastry-chart.js.map +4 -4
  40. package/dist/cdn/components/transits-table.js +396 -0
  41. package/dist/cdn/components/transits-table.js.map +7 -0
  42. package/dist/cdn/components/vedic-kundli.js +51 -29
  43. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  44. package/dist/cdn/components/yoga-list.js +334 -0
  45. package/dist/cdn/components/yoga-list.js.map +7 -0
  46. package/dist/cdn/roxy-ui.js +1877 -522
  47. package/dist/cdn/roxy-ui.js.map +4 -4
  48. package/dist/components/ashtakavarga-grid.d.ts +26 -0
  49. package/dist/components/ashtakavarga-grid.d.ts.map +1 -0
  50. package/dist/components/ashtakavarga-grid.js +457 -0
  51. package/dist/components/ashtakavarga-grid.js.map +7 -0
  52. package/dist/components/choghadiya-grid.d.ts +19 -0
  53. package/dist/components/choghadiya-grid.d.ts.map +1 -0
  54. package/dist/components/choghadiya-grid.js +304 -0
  55. package/dist/components/choghadiya-grid.js.map +7 -0
  56. package/dist/components/compatibility-card.js.map +1 -1
  57. package/dist/components/dasha-timeline.js.map +1 -1
  58. package/dist/components/data.d.ts +5 -7
  59. package/dist/components/data.d.ts.map +1 -1
  60. package/dist/components/data.js +7 -5
  61. package/dist/components/data.js.map +3 -3
  62. package/dist/components/divisional-chart.d.ts +20 -0
  63. package/dist/components/divisional-chart.d.ts.map +1 -0
  64. package/dist/components/divisional-chart.js +471 -0
  65. package/dist/components/divisional-chart.js.map +7 -0
  66. package/dist/components/dosha-card.d.ts.map +1 -1
  67. package/dist/components/dosha-card.js +33 -30
  68. package/dist/components/dosha-card.js.map +2 -2
  69. package/dist/components/endpoint-form.d.ts.map +1 -1
  70. package/dist/components/endpoint-form.js +5 -3
  71. package/dist/components/endpoint-form.js.map +3 -3
  72. package/dist/components/guna-milan.d.ts.map +1 -1
  73. package/dist/components/guna-milan.js +61 -12
  74. package/dist/components/guna-milan.js.map +3 -3
  75. package/dist/components/hexagram.js +17 -0
  76. package/dist/components/hexagram.js.map +2 -2
  77. package/dist/components/horoscope-card.d.ts.map +1 -1
  78. package/dist/components/horoscope-card.js +30 -3
  79. package/dist/components/horoscope-card.js.map +3 -3
  80. package/dist/components/kp-planets-table.js.map +1 -1
  81. package/dist/components/location-search.d.ts +2 -3
  82. package/dist/components/location-search.d.ts.map +1 -1
  83. package/dist/components/location-search.js.map +2 -2
  84. package/dist/components/moon-phase.js +17 -0
  85. package/dist/components/moon-phase.js.map +2 -2
  86. package/dist/components/natal-chart.d.ts +2 -0
  87. package/dist/components/natal-chart.d.ts.map +1 -1
  88. package/dist/components/natal-chart.js +243 -36
  89. package/dist/components/natal-chart.js.map +3 -3
  90. package/dist/components/numerology-card.d.ts.map +1 -1
  91. package/dist/components/numerology-card.js +5 -3
  92. package/dist/components/numerology-card.js.map +3 -3
  93. package/dist/components/panchang-table.js.map +1 -1
  94. package/dist/components/shadbala-table.d.ts +18 -0
  95. package/dist/components/shadbala-table.d.ts.map +1 -0
  96. package/dist/components/shadbala-table.js +400 -0
  97. package/dist/components/shadbala-table.js.map +7 -0
  98. package/dist/components/synastry-chart.d.ts.map +1 -1
  99. package/dist/components/synastry-chart.js +34 -29
  100. package/dist/components/synastry-chart.js.map +3 -3
  101. package/dist/components/transits-table.d.ts +21 -0
  102. package/dist/components/transits-table.d.ts.map +1 -0
  103. package/dist/components/transits-table.js +520 -0
  104. package/dist/components/transits-table.js.map +7 -0
  105. package/dist/components/vedic-kundli.d.ts +3 -6
  106. package/dist/components/vedic-kundli.d.ts.map +1 -1
  107. package/dist/components/vedic-kundli.js +132 -80
  108. package/dist/components/vedic-kundli.js.map +3 -3
  109. package/dist/components/yoga-list.d.ts +29 -0
  110. package/dist/components/yoga-list.d.ts.map +1 -0
  111. package/dist/components/yoga-list.js +389 -0
  112. package/dist/components/yoga-list.js.map +7 -0
  113. package/dist/index.cjs +2707 -980
  114. package/dist/index.cjs.map +4 -4
  115. package/dist/index.d.ts +7 -2
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +2714 -987
  118. package/dist/index.js.map +4 -4
  119. package/dist/manifest.d.ts +4 -10
  120. package/dist/manifest.d.ts.map +1 -1
  121. package/dist/manifest.json +7 -2
  122. package/dist/styles/tokens.css +26 -0
  123. package/dist/tokens/index.d.ts +6 -0
  124. package/dist/tokens/index.d.ts.map +1 -1
  125. package/dist/types/types.gen.d.ts +2 -2
  126. package/dist/utils/format.d.ts +15 -1
  127. package/dist/utils/format.d.ts.map +1 -1
  128. package/dist/utils/kundli-render.d.ts +63 -0
  129. package/dist/utils/kundli-render.d.ts.map +1 -0
  130. package/dist/utils/string.d.ts +14 -0
  131. package/dist/utils/string.d.ts.map +1 -0
  132. package/dist/version.d.ts +1 -1
  133. package/package.json +1 -1
  134. package/src/components/ashtakavarga-grid.ts +354 -0
  135. package/src/components/choghadiya-grid.ts +185 -0
  136. package/src/components/data.ts +8 -15
  137. package/src/components/divisional-chart.ts +214 -0
  138. package/src/components/dosha-card.ts +53 -36
  139. package/src/components/endpoint-form.ts +1 -7
  140. package/src/components/guna-milan.ts +74 -16
  141. package/src/components/horoscope-card.ts +8 -4
  142. package/src/components/location-search.ts +2 -3
  143. package/src/components/natal-chart.ts +251 -42
  144. package/src/components/numerology-card.ts +1 -7
  145. package/src/components/shadbala-table.ts +286 -0
  146. package/src/components/synastry-chart.ts +13 -39
  147. package/src/components/transits-table.ts +358 -0
  148. package/src/components/vedic-kundli.ts +38 -143
  149. package/src/components/yoga-list.ts +328 -0
  150. package/src/index.ts +8 -6
  151. package/src/manifest.ts +74 -100
  152. package/src/styles/tokens.css +26 -0
  153. package/src/tokens/index.ts +9 -0
  154. package/src/types/types.gen.ts +2 -2
  155. package/src/utils/format.ts +21 -3
  156. package/src/utils/kundli-render.ts +197 -0
  157. package/src/utils/string.ts +23 -0
  158. package/src/version.ts +1 -1
  159. package/dist/utils/motion.d.ts +0 -13
  160. package/dist/utils/motion.d.ts.map +0 -1
  161. package/src/utils/motion.ts +0 -18
@@ -1,6 +1,6 @@
1
- "use strict";var RoxyUI=(()=>{var he=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var St=Object.getOwnPropertyNames;var kt=Object.prototype.hasOwnProperty;var At=(i,r)=>{for(var e in r)he(i,e,{get:r[e],enumerable:!0})},Ct=(i,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of St(r))!kt.call(i,a)&&a!==e&&he(i,a,{get:()=>r[a],enumerable:!(t=Ke(r,a))||t.enumerable});return i};var Et=i=>Ct(he({},"__esModule",{value:!0}),i),p=(i,r,e,t)=>{for(var a=t>1?void 0:t?Ke(r,e):r,o=i.length-1,n;o>=0;o--)(n=i[o])&&(a=(t?n(r,e,a):n(a))||a);return t&&a&&he(r,e,a),a};var yr={};At(yr,{ROXY_COMPONENTS:()=>Se,ROXY_UI_COMPONENTS:()=>gr,ROXY_UI_VERSION:()=>wt,RoxyBiorhythmChart:()=>T,RoxyCompatibilityCard:()=>N,RoxyDashaTimeline:()=>M,RoxyData:()=>z,RoxyDoshaCard:()=>D,RoxyEndpointForm:()=>R,RoxyGunaMilan:()=>V,RoxyHexagram:()=>O,RoxyHoroscopeCard:()=>H,RoxyKpPlanetsTable:()=>F,RoxyLocationSearch:()=>_,RoxyMoonPhase:()=>G,RoxyNatalChart:()=>j,RoxyNumerologyCard:()=>I,RoxyPanchangTable:()=>U,RoxySynastryChart:()=>W,RoxyTarotCard:()=>B,RoxyTarotSpread:()=>q,RoxyVedicKundli:()=>K});var ue=globalThis,ge=ue.ShadowRoot&&(ue.ShadyCSS===void 0||ue.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,ke=Symbol(),Ye=new WeakMap,se=class{constructor(r,e,t){if(this._$cssResult$=!0,t!==ke)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=r,this.t=e}get styleSheet(){let r=this.o,e=this.t;if(ge&&r===void 0){let t=e!==void 0&&e.length===1;t&&(r=Ye.get(e)),r===void 0&&((this.o=r=new CSSStyleSheet).replaceSync(this.cssText),t&&Ye.set(e,r))}return r}toString(){return this.cssText}},Ve=i=>new se(typeof i=="string"?i:i+"",void 0,ke),v=(i,...r)=>{let e=i.length===1?i[0]:r.reduce((t,a,o)=>t+(n=>{if(n._$cssResult$===!0)return n.cssText;if(typeof n=="number")return n;throw Error("Value passed to 'css' function must be a 'css' function result: "+n+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(a)+i[o+1],i[0]);return new se(e,i,ke)},Fe=(i,r)=>{if(ge)i.adoptedStyleSheets=r.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of r){let t=document.createElement("style"),a=ue.litNonce;a!==void 0&&t.setAttribute("nonce",a),t.textContent=e.cssText,i.appendChild(t)}},Ae=ge?i=>i:i=>i instanceof CSSStyleSheet?(r=>{let e="";for(let t of r.cssRules)e+=t.cssText;return Ve(e)})(i):i;var{is:_t,defineProperty:Rt,getOwnPropertyDescriptor:Pt,getOwnPropertyNames:Lt,getOwnPropertySymbols:Tt,getPrototypeOf:Nt}=Object,ye=globalThis,We=ye.trustedTypes,Mt=We?We.emptyScript:"",zt=ye.reactiveElementPolyfillSupport,oe=(i,r)=>i,ie={toAttribute(i,r){switch(r){case Boolean:i=i?Mt:null;break;case Object:case Array:i=i==null?i:JSON.stringify(i)}return i},fromAttribute(i,r){let e=i;switch(r){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}},xe=(i,r)=>!_t(i,r),Je={attribute:!0,type:String,converter:ie,reflect:!1,useDefault:!1,hasChanged:xe};Symbol.metadata??=Symbol("metadata"),ye.litPropertyMetadata??=new WeakMap;var L=class extends HTMLElement{static addInitializer(r){this._$Ei(),(this.l??=[]).push(r)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(r,e=Je){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(r)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(r,e),!e.noAccessor){let t=Symbol(),a=this.getPropertyDescriptor(r,t,e);a!==void 0&&Rt(this.prototype,r,a)}}static getPropertyDescriptor(r,e,t){let{get:a,set:o}=Pt(this.prototype,r)??{get(){return this[e]},set(n){this[e]=n}};return{get:a,set(n){let c=a?.call(this);o?.call(this,n),this.requestUpdate(r,c,t)},configurable:!0,enumerable:!0}}static getPropertyOptions(r){return this.elementProperties.get(r)??Je}static _$Ei(){if(this.hasOwnProperty(oe("elementProperties")))return;let r=Nt(this);r.finalize(),r.l!==void 0&&(this.l=[...r.l]),this.elementProperties=new Map(r.elementProperties)}static finalize(){if(this.hasOwnProperty(oe("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(oe("properties"))){let e=this.properties,t=[...Lt(e),...Tt(e)];for(let a of t)this.createProperty(a,e[a])}let r=this[Symbol.metadata];if(r!==null){let e=litPropertyMetadata.get(r);if(e!==void 0)for(let[t,a]of e)this.elementProperties.set(t,a)}this._$Eh=new Map;for(let[e,t]of this.elementProperties){let a=this._$Eu(e,t);a!==void 0&&this._$Eh.set(a,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(r){let e=[];if(Array.isArray(r)){let t=new Set(r.flat(1/0).reverse());for(let a of t)e.unshift(Ae(a))}else r!==void 0&&e.push(Ae(r));return e}static _$Eu(r,e){let t=e.attribute;return t===!1?void 0:typeof t=="string"?t:typeof r=="string"?r.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(r=>this.enableUpdating=r),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(r=>r(this))}addController(r){(this._$EO??=new Set).add(r),this.renderRoot!==void 0&&this.isConnected&&r.hostConnected?.()}removeController(r){this._$EO?.delete(r)}_$E_(){let r=new Map,e=this.constructor.elementProperties;for(let t of e.keys())this.hasOwnProperty(t)&&(r.set(t,this[t]),delete this[t]);r.size>0&&(this._$Ep=r)}createRenderRoot(){let r=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Fe(r,this.constructor.elementStyles),r}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(r=>r.hostConnected?.())}enableUpdating(r){}disconnectedCallback(){this._$EO?.forEach(r=>r.hostDisconnected?.())}attributeChangedCallback(r,e,t){this._$AK(r,t)}_$ET(r,e){let t=this.constructor.elementProperties.get(r),a=this.constructor._$Eu(r,t);if(a!==void 0&&t.reflect===!0){let o=(t.converter?.toAttribute!==void 0?t.converter:ie).toAttribute(e,t.type);this._$Em=r,o==null?this.removeAttribute(a):this.setAttribute(a,o),this._$Em=null}}_$AK(r,e){let t=this.constructor,a=t._$Eh.get(r);if(a!==void 0&&this._$Em!==a){let o=t.getPropertyOptions(a),n=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:ie;this._$Em=a;let c=n.fromAttribute(e,o.type);this[a]=c??this._$Ej?.get(a)??c,this._$Em=null}}requestUpdate(r,e,t,a=!1,o){if(r!==void 0){let n=this.constructor;if(a===!1&&(o=this[r]),t??=n.getPropertyOptions(r),!((t.hasChanged??xe)(o,e)||t.useDefault&&t.reflect&&o===this._$Ej?.get(r)&&!this.hasAttribute(n._$Eu(r,t))))return;this.C(r,e,t)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(r,e,{useDefault:t,reflect:a,wrapped:o},n){t&&!(this._$Ej??=new Map).has(r)&&(this._$Ej.set(r,n??e??this[r]),o!==!0||n!==void 0)||(this._$AL.has(r)||(this.hasUpdated||t||(e=void 0),this._$AL.set(r,e)),a===!0&&this._$Em!==r&&(this._$Eq??=new Set).add(r))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let r=this.scheduleUpdate();return r!=null&&await r,!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 t=this.constructor.elementProperties;if(t.size>0)for(let[a,o]of t){let{wrapped:n}=o,c=this[a];n!==!0||this._$AL.has(a)||c===void 0||this.C(a,void 0,o,c)}}let r=!1,e=this._$AL;try{r=this.shouldUpdate(e),r?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(t){throw r=!1,this._$EM(),t}r&&this._$AE(e)}willUpdate(r){}_$AE(r){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(r)),this.updated(r)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(r){return!0}update(r){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(r){}firstUpdated(r){}};L.elementStyles=[],L.shadowRootOptions={mode:"open"},L[oe("elementProperties")]=new Map,L[oe("finalized")]=new Map,zt?.({ReactiveElement:L}),(ye.reactiveElementVersions??=[]).push("2.1.2");var Te=globalThis,Xe=i=>i,fe=Te.trustedTypes,Ze=fe?fe.createPolicy("lit-html",{createHTML:i=>i}):void 0,st="$lit$",Y=`lit$${Math.random().toFixed(9).slice(2)}$`,ot="?"+Y,Dt=`<${ot}>`,Z=document,le=()=>Z.createComment(""),ce=i=>i===null||typeof i!="object"&&typeof i!="function",Ne=Array.isArray,Ot=i=>Ne(i)||typeof i?.[Symbol.iterator]=="function",Ce=`[
2
- \f\r]`,ne=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Qe=/-->/g,et=/>/g,J=RegExp(`>|${Ce}(?:([^\\s"'>=/]+)(${Ce}*=${Ce}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),tt=/'/g,rt=/"/g,it=/^(?:script|style|textarea|title)$/i,Me=i=>(r,...e)=>({_$litType$:i,strings:r,values:e}),s=Me(1),k=Me(2),wr=Me(3),Q=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),at=new WeakMap,X=Z.createTreeWalker(Z,129);function nt(i,r){if(!Ne(i)||!i.hasOwnProperty("raw"))throw Error("invalid template strings array");return Ze!==void 0?Ze.createHTML(r):r}var Ht=(i,r)=>{let e=i.length-1,t=[],a,o=r===2?"<svg>":r===3?"<math>":"",n=ne;for(let c=0;c<e;c++){let d=i[c],m,g,u=-1,f=0;for(;f<d.length&&(n.lastIndex=f,g=n.exec(d),g!==null);)f=n.lastIndex,n===ne?g[1]==="!--"?n=Qe:g[1]!==void 0?n=et:g[2]!==void 0?(it.test(g[2])&&(a=RegExp("</"+g[2],"g")),n=J):g[3]!==void 0&&(n=J):n===J?g[0]===">"?(n=a??ne,u=-1):g[1]===void 0?u=-2:(u=n.lastIndex-g[2].length,m=g[1],n=g[3]===void 0?J:g[3]==='"'?rt:tt):n===rt||n===tt?n=J:n===Qe||n===et?n=ne:(n=J,a=void 0);let w=n===J&&i[c+1].startsWith("/>")?" ":"";o+=n===ne?d+Dt:u>=0?(t.push(m),d.slice(0,u)+st+d.slice(u)+Y+w):d+Y+(u===-2?c:w)}return[nt(i,o+(i[e]||"<?>")+(r===2?"</svg>":r===3?"</math>":"")),t]},de=class i{constructor({strings:r,_$litType$:e},t){let a;this.parts=[];let o=0,n=0,c=r.length-1,d=this.parts,[m,g]=Ht(r,e);if(this.el=i.createElement(m,t),X.currentNode=this.el.content,e===2||e===3){let u=this.el.content.firstChild;u.replaceWith(...u.childNodes)}for(;(a=X.nextNode())!==null&&d.length<c;){if(a.nodeType===1){if(a.hasAttributes())for(let u of a.getAttributeNames())if(u.endsWith(st)){let f=g[n++],w=a.getAttribute(u).split(Y),x=/([.?@])?(.*)/.exec(f);d.push({type:1,index:o,name:x[2],strings:w,ctor:x[1]==="."?_e:x[1]==="?"?Re:x[1]==="@"?Pe:re}),a.removeAttribute(u)}else u.startsWith(Y)&&(d.push({type:6,index:o}),a.removeAttribute(u));if(it.test(a.tagName)){let u=a.textContent.split(Y),f=u.length-1;if(f>0){a.textContent=fe?fe.emptyScript:"";for(let w=0;w<f;w++)a.append(u[w],le()),X.nextNode(),d.push({type:2,index:++o});a.append(u[f],le())}}}else if(a.nodeType===8)if(a.data===ot)d.push({type:2,index:o});else{let u=-1;for(;(u=a.data.indexOf(Y,u+1))!==-1;)d.push({type:7,index:o}),u+=Y.length-1}o++}}static createElement(r,e){let t=Z.createElement("template");return t.innerHTML=r,t}};function te(i,r,e=i,t){if(r===Q)return r;let a=t!==void 0?e._$Co?.[t]:e._$Cl,o=ce(r)?void 0:r._$litDirective$;return a?.constructor!==o&&(a?._$AO?.(!1),o===void 0?a=void 0:(a=new o(i),a._$AT(i,e,t)),t!==void 0?(e._$Co??=[])[t]=a:e._$Cl=a),a!==void 0&&(r=te(i,a._$AS(i,r.values),a,t)),r}var Ee=class{constructor(r,e){this._$AV=[],this._$AN=void 0,this._$AD=r,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(r){let{el:{content:e},parts:t}=this._$AD,a=(r?.creationScope??Z).importNode(e,!0);X.currentNode=a;let o=X.nextNode(),n=0,c=0,d=t[0];for(;d!==void 0;){if(n===d.index){let m;d.type===2?m=new pe(o,o.nextSibling,this,r):d.type===1?m=new d.ctor(o,d.name,d.strings,this,r):d.type===6&&(m=new Le(o,this,r)),this._$AV.push(m),d=t[++c]}n!==d?.index&&(o=X.nextNode(),n++)}return X.currentNode=Z,a}p(r){let e=0;for(let t of this._$AV)t!==void 0&&(t.strings!==void 0?(t._$AI(r,t,e),e+=t.strings.length-2):t._$AI(r[e])),e++}},pe=class i{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(r,e,t,a){this.type=2,this._$AH=l,this._$AN=void 0,this._$AA=r,this._$AB=e,this._$AM=t,this.options=a,this._$Cv=a?.isConnected??!0}get parentNode(){let r=this._$AA.parentNode,e=this._$AM;return e!==void 0&&r?.nodeType===11&&(r=e.parentNode),r}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(r,e=this){r=te(this,r,e),ce(r)?r===l||r==null||r===""?(this._$AH!==l&&this._$AR(),this._$AH=l):r!==this._$AH&&r!==Q&&this._(r):r._$litType$!==void 0?this.$(r):r.nodeType!==void 0?this.T(r):Ot(r)?this.k(r):this._(r)}O(r){return this._$AA.parentNode.insertBefore(r,this._$AB)}T(r){this._$AH!==r&&(this._$AR(),this._$AH=this.O(r))}_(r){this._$AH!==l&&ce(this._$AH)?this._$AA.nextSibling.data=r:this.T(Z.createTextNode(r)),this._$AH=r}$(r){let{values:e,_$litType$:t}=r,a=typeof t=="number"?this._$AC(r):(t.el===void 0&&(t.el=de.createElement(nt(t.h,t.h[0]),this.options)),t);if(this._$AH?._$AD===a)this._$AH.p(e);else{let o=new Ee(a,this),n=o.u(this.options);o.p(e),this.T(n),this._$AH=o}}_$AC(r){let e=at.get(r.strings);return e===void 0&&at.set(r.strings,e=new de(r)),e}k(r){Ne(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,t,a=0;for(let o of r)a===e.length?e.push(t=new i(this.O(le()),this.O(le()),this,this.options)):t=e[a],t._$AI(o),a++;a<e.length&&(this._$AR(t&&t._$AB.nextSibling,a),e.length=a)}_$AR(r=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);r!==this._$AB;){let t=Xe(r).nextSibling;Xe(r).remove(),r=t}}setConnected(r){this._$AM===void 0&&(this._$Cv=r,this._$AP?.(r))}},re=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(r,e,t,a,o){this.type=1,this._$AH=l,this._$AN=void 0,this.element=r,this.name=e,this._$AM=a,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(r,e=this,t,a){let o=this.strings,n=!1;if(o===void 0)r=te(this,r,e,0),n=!ce(r)||r!==this._$AH&&r!==Q,n&&(this._$AH=r);else{let c=r,d,m;for(r=o[0],d=0;d<o.length-1;d++)m=te(this,c[t+d],e,d),m===Q&&(m=this._$AH[d]),n||=!ce(m)||m!==this._$AH[d],m===l?r=l:r!==l&&(r+=(m??"")+o[d+1]),this._$AH[d]=m}n&&!a&&this.j(r)}j(r){r===l?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,r??"")}},_e=class extends re{constructor(){super(...arguments),this.type=3}j(r){this.element[this.name]=r===l?void 0:r}},Re=class extends re{constructor(){super(...arguments),this.type=4}j(r){this.element.toggleAttribute(this.name,!!r&&r!==l)}},Pe=class extends re{constructor(r,e,t,a,o){super(r,e,t,a,o),this.type=5}_$AI(r,e=this){if((r=te(this,r,e,0)??l)===Q)return;let t=this._$AH,a=r===l&&t!==l||r.capture!==t.capture||r.once!==t.once||r.passive!==t.passive,o=r!==l&&(t===l||a);a&&this.element.removeEventListener(this.name,this,t),o&&this.element.addEventListener(this.name,this,r),this._$AH=r}handleEvent(r){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,r):this._$AH.handleEvent(r)}},Le=class{constructor(r,e,t){this.element=r,this.type=6,this._$AN=void 0,this._$AM=e,this.options=t}get _$AU(){return this._$AM._$AU}_$AI(r){te(this,r)}};var Gt=Te.litHtmlPolyfillSupport;Gt?.(de,pe),(Te.litHtmlVersions??=[]).push("3.3.2");var lt=(i,r,e)=>{let t=e?.renderBefore??r,a=t._$litPart$;if(a===void 0){let o=e?.renderBefore??null;t._$litPart$=a=new pe(r.insertBefore(le(),o),o,void 0,e??{})}return a._$AI(i),a};var ze=globalThis,y=class extends L{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let r=super.createRenderRoot();return this.renderOptions.renderBefore??=r.firstChild,r}update(r){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(r),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Q}};y._$litElement$=!0,y.finalized=!0,ze.litElementHydrateSupport?.({LitElement:y});var jt=ze.litElementPolyfillSupport;jt?.({LitElement:y});(ze.litElementVersions??=[]).push("4.2.2");var b=i=>(r,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(i,r)}):customElements.define(i,r)};var It={attribute:!0,type:String,converter:ie,reflect:!1,hasChanged:xe},Ut=(i=It,r,e)=>{let{kind:t,metadata:a}=e,o=globalThis.litPropertyMetadata.get(a);if(o===void 0&&globalThis.litPropertyMetadata.set(a,o=new Map),t==="setter"&&((i=Object.create(i)).wrapped=!0),o.set(e.name,i),t==="accessor"){let{name:n}=e;return{set(c){let d=r.get.call(this);r.set.call(this,c),this.requestUpdate(n,d,i,!0,c)},init(c){return c!==void 0&&this.C(n,void 0,i,c),c}}}if(t==="setter"){let{name:n}=e;return function(c){let d=this[n];r.call(this,c),this.requestUpdate(n,d,i,!0,c)}}throw Error("Unsupported decorator location: "+t)};function h(i){return(r,e)=>typeof e=="object"?Ut(i,r,e):((t,a,o)=>{let n=a.hasOwnProperty(o);return a.constructor.createProperty(o,t),n?Object.getOwnPropertyDescriptor(a,o):void 0})(i,r,e)}function P(i){return h({...i,state:!0,attribute:!1})}var $=v`
1
+ "use strict";var RoxyUI=(()=>{var Ae=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var Gt=Object.getOwnPropertyNames;var jt=Object.prototype.hasOwnProperty;var It=(i,r)=>{for(var e in r)Ae(i,e,{get:r[e],enumerable:!0})},Bt=(i,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of Gt(r))!jt.call(i,s)&&s!==e&&Ae(i,s,{get:()=>r[s],enumerable:!(t=mt(r,s))||t.enumerable});return i};var qt=i=>Bt(Ae({},"__esModule",{value:!0}),i),c=(i,r,e,t)=>{for(var s=t>1?void 0:t?mt(r,e):r,o=i.length-1,l;o>=0;o--)(l=i[o])&&(s=(t?l(r,e,s):l(s))||s);return t&&s&&Ae(r,e,s),s};var Cr={};It(Cr,{ROXY_COMPONENTS:()=>Be,ROXY_UI_COMPONENTS:()=>Ar,ROXY_UI_VERSION:()=>Ht,RoxyAshtakavargaGrid:()=>M,RoxyBiorhythmChart:()=>D,RoxyChoghadiyaGrid:()=>te,RoxyCompatibilityCard:()=>H,RoxyDashaTimeline:()=>G,RoxyData:()=>j,RoxyDivisionalChart:()=>I,RoxyDoshaCard:()=>B,RoxyEndpointForm:()=>_,RoxyGunaMilan:()=>re,RoxyHexagram:()=>q,RoxyHoroscopeCard:()=>U,RoxyKpPlanetsTable:()=>ae,RoxyLocationSearch:()=>T,RoxyMoonPhase:()=>Y,RoxyNatalChart:()=>K,RoxyNumerologyCard:()=>V,RoxyPanchangTable:()=>F,RoxyShadbalaTable:()=>se,RoxySynastryChart:()=>oe,RoxyTarotCard:()=>W,RoxyTarotSpread:()=>J,RoxyTransitsTable:()=>ie,RoxyVedicKundli:()=>X,RoxyYogaList:()=>Z});var Ce=globalThis,Ee=Ce.ShadowRoot&&(Ce.ShadyCSS===void 0||Ce.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,qe=Symbol(),ht=new WeakMap,ye=class{constructor(r,e,t){if(this._$cssResult$=!0,t!==qe)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=r,this.t=e}get styleSheet(){let r=this.o,e=this.t;if(Ee&&r===void 0){let t=e!==void 0&&e.length===1;t&&(r=ht.get(e)),r===void 0&&((this.o=r=new CSSStyleSheet).replaceSync(this.cssText),t&&ht.set(e,r))}return r}toString(){return this.cssText}},gt=i=>new ye(typeof i=="string"?i:i+"",void 0,qe),x=(i,...r)=>{let e=i.length===1?i[0]:r.reduce((t,s,o)=>t+(l=>{if(l._$cssResult$===!0)return l.cssText;if(typeof l=="number")return l;throw Error("Value passed to 'css' function must be a 'css' function result: "+l+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(s)+i[o+1],i[0]);return new ye(e,i,qe)},yt=(i,r)=>{if(Ee)i.adoptedStyleSheets=r.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of r){let t=document.createElement("style"),s=Ce.litNonce;s!==void 0&&t.setAttribute("nonce",s),t.textContent=e.cssText,i.appendChild(t)}},Ue=Ee?i=>i:i=>i instanceof CSSStyleSheet?(r=>{let e="";for(let t of r.cssRules)e+=t.cssText;return gt(e)})(i):i;var{is:Ut,defineProperty:Yt,getOwnPropertyDescriptor:Kt,getOwnPropertyNames:Vt,getOwnPropertySymbols:Ft,getPrototypeOf:Wt}=Object,Re=globalThis,ut=Re.trustedTypes,Jt=ut?ut.emptyScript:"",Xt=Re.reactiveElementPolyfillSupport,ue=(i,r)=>i,xe={toAttribute(i,r){switch(r){case Boolean:i=i?Jt:null;break;case Object:case Array:i=i==null?i:JSON.stringify(i)}return i},fromAttribute(i,r){let e=i;switch(r){case Boolean:e=i!==null;break;case Number:e=i===null?null:Number(i);break;case Object:case Array:try{e=JSON.parse(i)}catch{e=null}}return e}},Pe=(i,r)=>!Ut(i,r),xt={attribute:!0,type:String,converter:xe,reflect:!1,useDefault:!1,hasChanged:Pe};Symbol.metadata??=Symbol("metadata"),Re.litPropertyMetadata??=new WeakMap;var z=class extends HTMLElement{static addInitializer(r){this._$Ei(),(this.l??=[]).push(r)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(r,e=xt){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(r)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(r,e),!e.noAccessor){let t=Symbol(),s=this.getPropertyDescriptor(r,t,e);s!==void 0&&Yt(this.prototype,r,s)}}static getPropertyDescriptor(r,e,t){let{get:s,set:o}=Kt(this.prototype,r)??{get(){return this[e]},set(l){this[e]=l}};return{get:s,set(l){let d=s?.call(this);o?.call(this,l),this.requestUpdate(r,d,t)},configurable:!0,enumerable:!0}}static getPropertyOptions(r){return this.elementProperties.get(r)??xt}static _$Ei(){if(this.hasOwnProperty(ue("elementProperties")))return;let r=Wt(this);r.finalize(),r.l!==void 0&&(this.l=[...r.l]),this.elementProperties=new Map(r.elementProperties)}static finalize(){if(this.hasOwnProperty(ue("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(ue("properties"))){let e=this.properties,t=[...Vt(e),...Ft(e)];for(let s of t)this.createProperty(s,e[s])}let r=this[Symbol.metadata];if(r!==null){let e=litPropertyMetadata.get(r);if(e!==void 0)for(let[t,s]of e)this.elementProperties.set(t,s)}this._$Eh=new Map;for(let[e,t]of this.elementProperties){let s=this._$Eu(e,t);s!==void 0&&this._$Eh.set(s,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(r){let e=[];if(Array.isArray(r)){let t=new Set(r.flat(1/0).reverse());for(let s of t)e.unshift(Ue(s))}else r!==void 0&&e.push(Ue(r));return e}static _$Eu(r,e){let t=e.attribute;return t===!1?void 0:typeof t=="string"?t:typeof r=="string"?r.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(r=>this.enableUpdating=r),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(r=>r(this))}addController(r){(this._$EO??=new Set).add(r),this.renderRoot!==void 0&&this.isConnected&&r.hostConnected?.()}removeController(r){this._$EO?.delete(r)}_$E_(){let r=new Map,e=this.constructor.elementProperties;for(let t of e.keys())this.hasOwnProperty(t)&&(r.set(t,this[t]),delete this[t]);r.size>0&&(this._$Ep=r)}createRenderRoot(){let r=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return yt(r,this.constructor.elementStyles),r}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(r=>r.hostConnected?.())}enableUpdating(r){}disconnectedCallback(){this._$EO?.forEach(r=>r.hostDisconnected?.())}attributeChangedCallback(r,e,t){this._$AK(r,t)}_$ET(r,e){let t=this.constructor.elementProperties.get(r),s=this.constructor._$Eu(r,t);if(s!==void 0&&t.reflect===!0){let o=(t.converter?.toAttribute!==void 0?t.converter:xe).toAttribute(e,t.type);this._$Em=r,o==null?this.removeAttribute(s):this.setAttribute(s,o),this._$Em=null}}_$AK(r,e){let t=this.constructor,s=t._$Eh.get(r);if(s!==void 0&&this._$Em!==s){let o=t.getPropertyOptions(s),l=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:xe;this._$Em=s;let d=l.fromAttribute(e,o.type);this[s]=d??this._$Ej?.get(s)??d,this._$Em=null}}requestUpdate(r,e,t,s=!1,o){if(r!==void 0){let l=this.constructor;if(s===!1&&(o=this[r]),t??=l.getPropertyOptions(r),!((t.hasChanged??Pe)(o,e)||t.useDefault&&t.reflect&&o===this._$Ej?.get(r)&&!this.hasAttribute(l._$Eu(r,t))))return;this.C(r,e,t)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(r,e,{useDefault:t,reflect:s,wrapped:o},l){t&&!(this._$Ej??=new Map).has(r)&&(this._$Ej.set(r,l??e??this[r]),o!==!0||l!==void 0)||(this._$AL.has(r)||(this.hasUpdated||t||(e=void 0),this._$AL.set(r,e)),s===!0&&this._$Em!==r&&(this._$Eq??=new Set).add(r))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let r=this.scheduleUpdate();return r!=null&&await r,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[s,o]of this._$Ep)this[s]=o;this._$Ep=void 0}let t=this.constructor.elementProperties;if(t.size>0)for(let[s,o]of t){let{wrapped:l}=o,d=this[s];l!==!0||this._$AL.has(s)||d===void 0||this.C(s,void 0,o,d)}}let r=!1,e=this._$AL;try{r=this.shouldUpdate(e),r?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(t){throw r=!1,this._$EM(),t}r&&this._$AE(e)}willUpdate(r){}_$AE(r){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(r)),this.updated(r)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(r){return!0}update(r){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(r){}firstUpdated(r){}};z.elementStyles=[],z.shadowRootOptions={mode:"open"},z[ue("elementProperties")]=new Map,z[ue("finalized")]=new Map,Xt?.({ReactiveElement:z}),(Re.reactiveElementVersions??=[]).push("2.1.2");var Xe=globalThis,ft=i=>i,Te=Xe.trustedTypes,vt=Te?Te.createPolicy("lit-html",{createHTML:i=>i}):void 0,At="$lit$",Q=`lit$${Math.random().toFixed(9).slice(2)}$`,Ct="?"+Q,Zt=`<${Ct}>`,de=document,ve=()=>de.createComment(""),be=i=>i===null||typeof i!="object"&&typeof i!="function",Ze=Array.isArray,Qt=i=>Ze(i)||typeof i?.[Symbol.iterator]=="function",Ye=`[
2
+ \f\r]`,fe=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,bt=/-->/g,$t=/>/g,ne=RegExp(`>|${Ye}(?:([^\\s"'>=/]+)(${Ye}*=${Ye}*(?:[^
3
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),wt=/'/g,kt=/"/g,Et=/^(?:script|style|textarea|title)$/i,Qe=i=>(r,...e)=>({_$litType$:i,strings:r,values:e}),a=Qe(1),S=Qe(2),_r=Qe(3),ce=Symbol.for("lit-noChange"),n=Symbol.for("lit-nothing"),St=new WeakMap,le=de.createTreeWalker(de,129);function Rt(i,r){if(!Ze(i)||!i.hasOwnProperty("raw"))throw Error("invalid template strings array");return vt!==void 0?vt.createHTML(r):r}var er=(i,r)=>{let e=i.length-1,t=[],s,o=r===2?"<svg>":r===3?"<math>":"",l=fe;for(let d=0;d<e;d++){let p=i[d],m,h,g=-1,f=0;for(;f<p.length&&(l.lastIndex=f,h=l.exec(p),h!==null);)f=l.lastIndex,l===fe?h[1]==="!--"?l=bt:h[1]!==void 0?l=$t:h[2]!==void 0?(Et.test(h[2])&&(s=RegExp("</"+h[2],"g")),l=ne):h[3]!==void 0&&(l=ne):l===ne?h[0]===">"?(l=s??fe,g=-1):h[1]===void 0?g=-2:(g=l.lastIndex-h[2].length,m=h[1],l=h[3]===void 0?ne:h[3]==='"'?kt:wt):l===kt||l===wt?l=ne:l===bt||l===$t?l=fe:(l=ne,s=void 0);let k=l===ne&&i[d+1].startsWith("/>")?" ":"";o+=l===fe?p+Zt:g>=0?(t.push(m),p.slice(0,g)+At+p.slice(g)+Q+k):p+Q+(g===-2?d:k)}return[Rt(i,o+(i[e]||"<?>")+(r===2?"</svg>":r===3?"</math>":"")),t]},$e=class i{constructor({strings:r,_$litType$:e},t){let s;this.parts=[];let o=0,l=0,d=r.length-1,p=this.parts,[m,h]=er(r,e);if(this.el=i.createElement(m,t),le.currentNode=this.el.content,e===2||e===3){let g=this.el.content.firstChild;g.replaceWith(...g.childNodes)}for(;(s=le.nextNode())!==null&&p.length<d;){if(s.nodeType===1){if(s.hasAttributes())for(let g of s.getAttributeNames())if(g.endsWith(At)){let f=h[l++],k=s.getAttribute(g).split(Q),$=/([.?@])?(.*)/.exec(f);p.push({type:1,index:o,name:$[2],strings:k,ctor:$[1]==="."?Ve:$[1]==="?"?Fe:$[1]==="@"?We:ge}),s.removeAttribute(g)}else g.startsWith(Q)&&(p.push({type:6,index:o}),s.removeAttribute(g));if(Et.test(s.tagName)){let g=s.textContent.split(Q),f=g.length-1;if(f>0){s.textContent=Te?Te.emptyScript:"";for(let k=0;k<f;k++)s.append(g[k],ve()),le.nextNode(),p.push({type:2,index:++o});s.append(g[f],ve())}}}else if(s.nodeType===8)if(s.data===Ct)p.push({type:2,index:o});else{let g=-1;for(;(g=s.data.indexOf(Q,g+1))!==-1;)p.push({type:7,index:o}),g+=Q.length-1}o++}}static createElement(r,e){let t=de.createElement("template");return t.innerHTML=r,t}};function he(i,r,e=i,t){if(r===ce)return r;let s=t!==void 0?e._$Co?.[t]:e._$Cl,o=be(r)?void 0:r._$litDirective$;return s?.constructor!==o&&(s?._$AO?.(!1),o===void 0?s=void 0:(s=new o(i),s._$AT(i,e,t)),t!==void 0?(e._$Co??=[])[t]=s:e._$Cl=s),s!==void 0&&(r=he(i,s._$AS(i,r.values),s,t)),r}var Ke=class{constructor(r,e){this._$AV=[],this._$AN=void 0,this._$AD=r,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(r){let{el:{content:e},parts:t}=this._$AD,s=(r?.creationScope??de).importNode(e,!0);le.currentNode=s;let o=le.nextNode(),l=0,d=0,p=t[0];for(;p!==void 0;){if(l===p.index){let m;p.type===2?m=new we(o,o.nextSibling,this,r):p.type===1?m=new p.ctor(o,p.name,p.strings,this,r):p.type===6&&(m=new Je(o,this,r)),this._$AV.push(m),p=t[++d]}l!==p?.index&&(o=le.nextNode(),l++)}return le.currentNode=de,s}p(r){let e=0;for(let t of this._$AV)t!==void 0&&(t.strings!==void 0?(t._$AI(r,t,e),e+=t.strings.length-2):t._$AI(r[e])),e++}},we=class i{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(r,e,t,s){this.type=2,this._$AH=n,this._$AN=void 0,this._$AA=r,this._$AB=e,this._$AM=t,this.options=s,this._$Cv=s?.isConnected??!0}get parentNode(){let r=this._$AA.parentNode,e=this._$AM;return e!==void 0&&r?.nodeType===11&&(r=e.parentNode),r}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(r,e=this){r=he(this,r,e),be(r)?r===n||r==null||r===""?(this._$AH!==n&&this._$AR(),this._$AH=n):r!==this._$AH&&r!==ce&&this._(r):r._$litType$!==void 0?this.$(r):r.nodeType!==void 0?this.T(r):Qt(r)?this.k(r):this._(r)}O(r){return this._$AA.parentNode.insertBefore(r,this._$AB)}T(r){this._$AH!==r&&(this._$AR(),this._$AH=this.O(r))}_(r){this._$AH!==n&&be(this._$AH)?this._$AA.nextSibling.data=r:this.T(de.createTextNode(r)),this._$AH=r}$(r){let{values:e,_$litType$:t}=r,s=typeof t=="number"?this._$AC(r):(t.el===void 0&&(t.el=$e.createElement(Rt(t.h,t.h[0]),this.options)),t);if(this._$AH?._$AD===s)this._$AH.p(e);else{let o=new Ke(s,this),l=o.u(this.options);o.p(e),this.T(l),this._$AH=o}}_$AC(r){let e=St.get(r.strings);return e===void 0&&St.set(r.strings,e=new $e(r)),e}k(r){Ze(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,t,s=0;for(let o of r)s===e.length?e.push(t=new i(this.O(ve()),this.O(ve()),this,this.options)):t=e[s],t._$AI(o),s++;s<e.length&&(this._$AR(t&&t._$AB.nextSibling,s),e.length=s)}_$AR(r=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);r!==this._$AB;){let t=ft(r).nextSibling;ft(r).remove(),r=t}}setConnected(r){this._$AM===void 0&&(this._$Cv=r,this._$AP?.(r))}},ge=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(r,e,t,s,o){this.type=1,this._$AH=n,this._$AN=void 0,this.element=r,this.name=e,this._$AM=s,this.options=o,t.length>2||t[0]!==""||t[1]!==""?(this._$AH=Array(t.length-1).fill(new String),this.strings=t):this._$AH=n}_$AI(r,e=this,t,s){let o=this.strings,l=!1;if(o===void 0)r=he(this,r,e,0),l=!be(r)||r!==this._$AH&&r!==ce,l&&(this._$AH=r);else{let d=r,p,m;for(r=o[0],p=0;p<o.length-1;p++)m=he(this,d[t+p],e,p),m===ce&&(m=this._$AH[p]),l||=!be(m)||m!==this._$AH[p],m===n?r=n:r!==n&&(r+=(m??"")+o[p+1]),this._$AH[p]=m}l&&!s&&this.j(r)}j(r){r===n?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,r??"")}},Ve=class extends ge{constructor(){super(...arguments),this.type=3}j(r){this.element[this.name]=r===n?void 0:r}},Fe=class extends ge{constructor(){super(...arguments),this.type=4}j(r){this.element.toggleAttribute(this.name,!!r&&r!==n)}},We=class extends ge{constructor(r,e,t,s,o){super(r,e,t,s,o),this.type=5}_$AI(r,e=this){if((r=he(this,r,e,0)??n)===ce)return;let t=this._$AH,s=r===n&&t!==n||r.capture!==t.capture||r.once!==t.once||r.passive!==t.passive,o=r!==n&&(t===n||s);s&&this.element.removeEventListener(this.name,this,t),o&&this.element.addEventListener(this.name,this,r),this._$AH=r}handleEvent(r){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,r):this._$AH.handleEvent(r)}},Je=class{constructor(r,e,t){this.element=r,this.type=6,this._$AN=void 0,this._$AM=e,this.options=t}get _$AU(){return this._$AM._$AU}_$AI(r){he(this,r)}};var tr=Xe.litHtmlPolyfillSupport;tr?.($e,we),(Xe.litHtmlVersions??=[]).push("3.3.2");var Pt=(i,r,e)=>{let t=e?.renderBefore??r,s=t._$litPart$;if(s===void 0){let o=e?.renderBefore??null;t._$litPart$=s=new we(r.insertBefore(ve(),o),o,void 0,e??{})}return s._$AI(i),s};var et=globalThis,u=class extends z{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let r=super.createRenderRoot();return this.renderOptions.renderBefore??=r.firstChild,r}update(r){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(r),this._$Do=Pt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return ce}};u._$litElement$=!0,u.finalized=!0,et.litElementHydrateSupport?.({LitElement:u});var rr=et.litElementPolyfillSupport;rr?.({LitElement:u});(et.litElementVersions??=[]).push("4.2.2");var v=i=>(r,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(i,r)}):customElements.define(i,r)};var ar={attribute:!0,type:String,converter:xe,reflect:!1,hasChanged:Pe},sr=(i=ar,r,e)=>{let{kind:t,metadata:s}=e,o=globalThis.litPropertyMetadata.get(s);if(o===void 0&&globalThis.litPropertyMetadata.set(s,o=new Map),t==="setter"&&((i=Object.create(i)).wrapped=!0),o.set(e.name,i),t==="accessor"){let{name:l}=e;return{set(d){let p=r.get.call(this);r.set.call(this,d),this.requestUpdate(l,p,i,!0,d)},init(d){return d!==void 0&&this.C(l,void 0,i,d),d}}}if(t==="setter"){let{name:l}=e;return function(d){let p=this[l];r.call(this,d),this.requestUpdate(l,p,i,!0,d)}}throw Error("Unsupported decorator location: "+t)};function y(i){return(r,e)=>typeof e=="object"?sr(i,r,e):((t,s,o)=>{let l=s.hasOwnProperty(o);return s.constructor.createProperty(o,t),l?Object.getOwnPropertyDescriptor(s,o):void 0})(i,r,e)}function E(i){return y({...i,state:!0,attribute:!1})}var L={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},tt={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"},rt={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},pe=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],_e=pe.map(i=>i.toLowerCase());var at={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"},Tt={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var b=x`
4
4
  :host {
5
5
  display: block;
6
6
  container-type: inline-size;
@@ -82,32 +82,254 @@
82
82
  outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
83
83
  outline-offset: 2px;
84
84
  }
85
- `;var ct={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},T=class extends y{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??{},a=Object.entries(t).map(([o,n])=>{let c=typeof n=="number"?n:0,d=Math.abs(c)>1?c/100:c;return[o,d]});return s`<section class="wrap" aria-label="Daily biorhythm">
85
+ `;var or={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},me=["sarva","bhinna","pinda"],M=class extends u{constructor(){super(...arguments);this.data=null;this.activeTab="sarva"}render(){if(!this.data)return a`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return a`<div class="wrap" aria-label="Ashtakavarga grid">
86
+ <div class="head">
87
+ <h2 class="title">Ashtakavarga</h2>
88
+ ${e.length?a`<p class="subtitle">${e.length} signs</p>`:n}
89
+ </div>
90
+
91
+ <div
92
+ class="tablist"
93
+ role="tablist"
94
+ aria-label="Ashtakavarga views"
95
+ @keydown=${this.onTabKeyDown}
96
+ >
97
+ ${me.map(t=>a`<button
98
+ class="tab"
99
+ role="tab"
100
+ id="tab-${t}"
101
+ aria-selected=${this.activeTab===t?"true":"false"}
102
+ aria-controls="panel-${t}"
103
+ tabindex=${this.activeTab===t?"0":"-1"}
104
+ @click=${()=>{this.activeTab=t}}
105
+ >
106
+ ${or[t]}
107
+ </button>`)}
108
+ </div>
109
+
110
+ <div
111
+ id="panel-${this.activeTab}"
112
+ role="tabpanel"
113
+ aria-labelledby="tab-${this.activeTab}"
114
+ >
115
+ ${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}
116
+ </div>
117
+ </div>`}onTabKeyDown(e){let t=me.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=me[(t+1)%me.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=me[(t-1+me.length)%me.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}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 t=this.data.sarvashtakavarga;return t?a`<div class="overflow-scroll">
118
+ <table aria-label="Sarvashtakavarga bindu counts per sign">
119
+ <thead>
120
+ <tr>
121
+ <th scope="col">Sign</th>
122
+ <th scope="col">Bindus</th>
123
+ </tr>
124
+ </thead>
125
+ <tbody>
126
+ ${e.map((s,o)=>{let l=t.bindus[o]??0,d=this.heatClass(l);return a`<tr>
127
+ <td>
128
+ <div class="planet-cell">
129
+ <span class="glyph" aria-hidden="true">${N[s]??""}</span>
130
+ ${s}
131
+ </div>
132
+ </td>
133
+ <td class="${`heat-cell ${d}`}">${l}</td>
134
+ </tr>`})}
135
+ </tbody>
136
+ <tfoot>
137
+ <tr class="total-row">
138
+ <td>Total</td>
139
+ <td>${t.total}</td>
140
+ </tr>
141
+ </tfoot>
142
+ </table>
143
+ </div>`:a`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let t=this.data.bhinnashtakavarga;return t?.length?a`<div class="overflow-scroll">
144
+ <table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid">
145
+ <thead>
146
+ <tr>
147
+ <th scope="col">Planet</th>
148
+ ${e.map(s=>a`<th scope="col" title=${s}>${N[s]??s.slice(0,2)}</th>`)}
149
+ <th scope="col">Total</th>
150
+ </tr>
151
+ </thead>
152
+ <tbody>
153
+ ${t.map(s=>a`<tr>
154
+ <td>${s.planet}</td>
155
+ ${s.bindus.map(o=>{let l=this.heatClass(o);return a`<td class="${`heat-cell ${l}`}">${o}</td>`})}
156
+ <td>${s.total}</td>
157
+ </tr>`)}
158
+ </tbody>
159
+ </table>
160
+ </div>`:a`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?a`<div class="overflow-scroll">
161
+ <table aria-label="Shodhya Pinda planet strength scores">
162
+ <thead>
163
+ <tr>
164
+ <th scope="col">Planet</th>
165
+ <th scope="col">Rashi Pinda</th>
166
+ <th scope="col">Graha Pinda</th>
167
+ <th scope="col">Shodhya Pinda</th>
168
+ </tr>
169
+ </thead>
170
+ <tbody>
171
+ ${e.map(t=>a`<tr>
172
+ <td>${t.planet}</td>
173
+ <td>${t.rashiPinda}</td>
174
+ <td>${t.grahaPinda}</td>
175
+ <td>${t.shodhyaPinda}</td>
176
+ </tr>`)}
177
+ </tbody>
178
+ </table>
179
+ </div>`:a`<p class="roxy-empty">No shodhya pinda data</p>`}};M.styles=[b,x`
180
+ .wrap {
181
+ display: grid;
182
+ gap: var(--roxy-space-md, 1rem);
183
+ }
184
+
185
+ .head {
186
+ display: flex;
187
+ justify-content: space-between;
188
+ align-items: baseline;
189
+ gap: var(--roxy-space-md, 1rem);
190
+ flex-wrap: wrap;
191
+ }
192
+
193
+ .title {
194
+ font-size: var(--roxy-text-lg, 1.125rem);
195
+ font-weight: var(--roxy-weight-bold, 600);
196
+ margin: 0;
197
+ }
198
+
199
+ .subtitle {
200
+ color: var(--roxy-muted, #71717a);
201
+ font-size: var(--roxy-text-sm, 0.875rem);
202
+ margin: 0;
203
+ }
204
+
205
+ /* Tabs */
206
+ .tablist {
207
+ display: flex;
208
+ gap: 2px;
209
+ border-bottom: 2px solid var(--roxy-border, #e4e4e7);
210
+ }
211
+
212
+ .tab {
213
+ padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
214
+ font-size: var(--roxy-text-sm, 0.875rem);
215
+ background: none;
216
+ border: none;
217
+ border-bottom: 2px solid transparent;
218
+ margin-bottom: -2px;
219
+ cursor: pointer;
220
+ color: var(--roxy-muted, #71717a);
221
+ font-family: inherit;
222
+ transition: color var(--roxy-motion-duration, 200ms) var(--roxy-motion-easing, ease);
223
+ }
224
+
225
+ .tab[aria-selected='true'] {
226
+ color: var(--roxy-accent-fg, #b45309);
227
+ border-bottom-color: var(--roxy-accent, #f59e0b);
228
+ font-weight: var(--roxy-weight-bold, 600);
229
+ }
230
+
231
+ .tab:hover:not([aria-selected='true']) {
232
+ color: var(--roxy-fg, #0a0a0a);
233
+ }
234
+
235
+ /* Tables */
236
+ .overflow-scroll {
237
+ overflow-x: auto;
238
+ -webkit-overflow-scrolling: touch;
239
+ }
240
+
241
+ table {
242
+ width: 100%;
243
+ border-collapse: collapse;
244
+ font-size: var(--roxy-text-sm, 0.875rem);
245
+ }
246
+
247
+ th,
248
+ td {
249
+ padding: var(--roxy-space-sm, 0.5rem);
250
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
251
+ text-align: center;
252
+ }
253
+
254
+ th {
255
+ color: var(--roxy-muted, #71717a);
256
+ font-weight: var(--roxy-weight-bold, 600);
257
+ text-transform: uppercase;
258
+ font-size: var(--roxy-text-xs, 0.75rem);
259
+ letter-spacing: 0.06em;
260
+ }
261
+
262
+ td:first-child,
263
+ th:first-child {
264
+ text-align: left;
265
+ }
266
+
267
+ .glyph {
268
+ font-size: 1.1em;
269
+ margin-right: 3px;
270
+ line-height: 1;
271
+ }
272
+
273
+ .planet-cell {
274
+ display: flex;
275
+ align-items: center;
276
+ gap: 4px;
277
+ white-space: nowrap;
278
+ }
279
+
280
+ .total-row td {
281
+ font-weight: var(--roxy-weight-bold, 600);
282
+ border-top: 2px solid var(--roxy-border, #e4e4e7);
283
+ border-bottom: none;
284
+ }
285
+
286
+ /* Heat cells */
287
+ .heat-cell {
288
+ border-radius: var(--roxy-radius-sm, 4px);
289
+ font-weight: var(--roxy-weight-bold, 600);
290
+ min-width: 2rem;
291
+ font-variant-numeric: tabular-nums;
292
+ }
293
+
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); }
301
+
302
+ /* Bhinna grid: planet header column narrower */
303
+ .bhinna-table th:first-child,
304
+ .bhinna-table td:first-child {
305
+ min-width: 5rem;
306
+ }
307
+ `],c([y({attribute:!1})],M.prototype,"data",2),c([E()],M.prototype,"activeTab",2),M=c([v("roxy-ashtakavarga-grid")],M);var Lt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},D=class extends u{constructor(){super(...arguments);this.data=null;this.mode="daily"}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):a`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let t=e.quickRead??{},s=Object.entries(t).map(([o,l])=>{let d=typeof l=="number"?l:0,p=Math.abs(d)>1?d/100:d;return[o,p]});return a`<section class="wrap" aria-label="Daily biorhythm">
86
308
  <header class="head">
87
309
  <h2 class="title">Biorhythm</h2>
88
- ${typeof e.energyRating=="number"?s`<span class="energy">Energy ${e.energyRating}/10</span>`:l}
310
+ ${typeof e.energyRating=="number"?a`<span class="energy">Energy ${e.energyRating}/10</span>`:n}
89
311
  </header>
90
312
  <div class="bars" role="list">
91
- ${a.map(([o,n])=>{let c=(n+1)/2*100,d=ct[o]??"var(--roxy-accent, #f59e0b)";return s`<div class="bar" role="listitem">
313
+ ${s.map(([o,l])=>{let d=(l+1)/2*100,p=Lt[o]??"var(--roxy-accent, #f59e0b)";return a`<div class="bar" role="listitem">
92
314
  <span style="text-transform: capitalize">${o}</span>
93
315
  <span class="track">
94
316
  <span
95
317
  class="fill"
96
- style="width: ${c}%; background: ${d}"
318
+ style="width: ${d}%; background: ${p}"
97
319
  ></span>
98
320
  </span>
99
- <span class="value">${Math.round(n*100)}%</span>
321
+ <span class="value">${Math.round(l*100)}%</span>
100
322
  </div>`})}
101
323
  </div>
102
- ${e.dailyMessage?s`<p class="advice">${e.dailyMessage}</p>`:l}
103
- ${e.advice?s`<p class="advice">${e.advice}</p>`:l}
104
- </section>`}renderForecast(e){let t=e.days??[];if(t.length===0)return s`<div class="roxy-empty" role="status">No forecast</div>`;let a=600,o=160,n=a/Math.max(t.length-1,1),c=["physical","emotional","intellectual","intuitive"];return s`<section class="wrap" aria-label="Biorhythm forecast">
324
+ ${e.dailyMessage?a`<p class="advice">${e.dailyMessage}</p>`:n}
325
+ ${e.advice?a`<p class="advice">${e.advice}</p>`:n}
326
+ </section>`}renderForecast(e){let t=e.days??[];if(t.length===0)return a`<div class="roxy-empty" role="status">No forecast</div>`;let s=600,o=160,l=s/Math.max(t.length-1,1),d=["physical","emotional","intellectual","intuitive"];return a`<section class="wrap" aria-label="Biorhythm forecast">
105
327
  <header class="head">
106
328
  <h2 class="title">Forecast</h2>
107
329
  <span class="energy">${e.startDate} - ${e.endDate}</span>
108
330
  </header>
109
331
  <svg
110
- viewBox="0 0 ${a} ${o}"
332
+ viewBox="0 0 ${s} ${o}"
111
333
  role="img"
112
334
  aria-label="Biorhythm cycle lines across the forecast window"
113
335
  >
@@ -115,25 +337,25 @@
115
337
  <line
116
338
  x1="0"
117
339
  y1=${o/2}
118
- x2=${a}
340
+ x2=${s}
119
341
  y2=${o/2}
120
342
  stroke="var(--roxy-border, #e4e4e7)"
121
343
  stroke-width="1"
122
344
  />
123
- ${c.map(d=>{let m=t.map((u,f)=>{let w=u[d]??0,x=f*n,qe=o/2-w/100*(o/2-8);return`${x.toFixed(2)},${qe.toFixed(2)}`}).join(" "),g=ct[d]??"#475569";return k`<polyline points=${m} fill="none" stroke=${g} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}
345
+ ${d.map(p=>{let m=t.map((g,f)=>{let k=g[p]??0,$=f*l,pt=o/2-k/100*(o/2-8);return`${$.toFixed(2)},${pt.toFixed(2)}`}).join(" "),h=Lt[p]??"#475569";return S`<polyline points=${m} fill="none" stroke=${h} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}
124
346
  </svg>
125
- ${e.summary?.periodAdvice?s`<p class="advice">${e.summary.periodAdvice}</p>`:l}
126
- </section>`}renderCritical(e){return s`<section class="wrap" aria-label="Critical days">
347
+ ${e.summary?.periodAdvice?a`<p class="advice">${e.summary.periodAdvice}</p>`:n}
348
+ </section>`}renderCritical(e){return a`<section class="wrap" aria-label="Critical days">
127
349
  <header class="head">
128
350
  <h2 class="title">Critical days</h2>
129
351
  <span class="energy">${e.totalCriticalDays} total</span>
130
352
  </header>
131
353
  <div>
132
- ${e.criticalDays.map(t=>s`<span class="crit"
354
+ ${e.criticalDays.map(t=>a`<span class="crit"
133
355
  >${t.date} · ${t.cycle} ${t.severity}</span
134
356
  >`)}
135
357
  </div>
136
- </section>`}};T.styles=[$,v`
358
+ </section>`}};D.styles=[b,x`
137
359
  .wrap {
138
360
  display: grid;
139
361
  gap: var(--roxy-space-md, 1rem);
@@ -209,55 +431,167 @@
209
431
  display: inline-block;
210
432
  margin: 2px;
211
433
  }
212
- `],p([h({attribute:!1})],T.prototype,"data",2),p([h({type:String,reflect:!0})],T.prototype,"mode",2),T=p([b("roxy-biorhythm-chart")],T);function ee(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,t=new Date(e);return Number.isNaN(t.getTime())?i:t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function dt(i){if(typeof i!="string"||i.length===0)return"";let r=new Date(/^\d{4}-\d{2}-\d{2}$/.test(i)?`${i}T00:00:00`:i);return Number.isNaN(r.getTime())?i:r.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function De(i){if(!i)return"";let r=ee(i.start),e=ee(i.end);return r&&e?`${r} - ${e}`:r||e||""}function A(i,r=1){return typeof i!="number"||!Number.isFinite(i)?"":i.toFixed(r).replace(/\.?0+$/,"")}function pt(i,r=1){let e=A(i,r);return e?`${e}%`:""}var N=class extends y{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[a,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(t[a]=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,a=this.getBreakdown(),o="rating"in e?e.rating:void 0,n="archetype"in e?e.archetype:void 0,c="advice"in e?e.advice:void 0,d="summary"in e?e.summary:void 0,m="interpretation"in e?e.interpretation:void 0,g="strengths"in e?e.strengths:void 0,u="challenges"in e?e.challenges:void 0,f="keyAspects"in e?e.keyAspects:void 0;return s`<article
434
+ `],c([y({attribute:!1})],D.prototype,"data",2),c([y({type:String,reflect:!0})],D.prototype,"mode",2),D=c([v("roxy-biorhythm-chart")],D);function C(i){return i?i.charAt(0).toUpperCase()+i.slice(1).toLowerCase():""}function ee(i){return i.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,r=>r.toUpperCase())}function _t(i){try{let r=new Date(i);return Number.isNaN(r.getTime())?i:r.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return i}}var te=class extends u{constructor(){super(...arguments);this.data=null}renderTile(e){let t=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",s=L[C(e.lord)]??"",o=`${_t(e.start)} - ${_t(e.end)}`;return a`<div class="cho-tile ${t}" role="listitem">
435
+ <span class="tile-name">${e.name}</span>
436
+ <span class="tile-time" aria-label="Time range">${o}</span>
437
+ <span class="tile-lord">
438
+ ${s?a`<span aria-hidden="true">${s}</span>`:n}
439
+ ${e.lord}
440
+ </span>
441
+ </div>`}render(){if(!this.data)return a`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:t,nightChoghadiya:s}=this.data;return a`<div class="wrap">
442
+ <div class="header">
443
+ <h2 class="title">Choghadiya</h2>
444
+ ${e?a`<p class="subtitle">${e}</p>`:n}
445
+ </div>
446
+
447
+ <div class="cho-grid">
448
+ <section class="period-col" aria-label="Day muhurta periods">
449
+ <h3 class="period-heading">Day</h3>
450
+ <div role="list" aria-label="Daytime choghadiya">
451
+ ${t&&t.length>0?t.map(o=>this.renderTile(o)):a`<p class="roxy-empty" role="status">No daytime periods</p>`}
452
+ </div>
453
+ </section>
454
+
455
+ <section class="period-col" aria-label="Night muhurta periods">
456
+ <h3 class="period-heading">Night</h3>
457
+ <div role="list" aria-label="Nighttime choghadiya">
458
+ ${s&&s.length>0?s.map(o=>this.renderTile(o)):a`<p class="roxy-empty" role="status">No nighttime periods</p>`}
459
+ </div>
460
+ </section>
461
+ </div>
462
+ </div>`}};te.styles=[b,x`
463
+ .wrap {
464
+ display: grid;
465
+ gap: var(--roxy-space-md, 1rem);
466
+ }
467
+ .header {
468
+ display: grid;
469
+ gap: var(--roxy-space-xs, 0.25rem);
470
+ }
471
+ .title {
472
+ font-size: var(--roxy-text-lg, 1.125rem);
473
+ font-weight: var(--roxy-weight-bold, 600);
474
+ margin: 0;
475
+ }
476
+ .subtitle {
477
+ font-size: var(--roxy-text-sm, 0.875rem);
478
+ color: var(--roxy-muted, #71717a);
479
+ margin: 0;
480
+ }
481
+ .cho-grid {
482
+ display: grid;
483
+ grid-template-columns: 1fr;
484
+ gap: var(--roxy-space-md, 1rem);
485
+ }
486
+ @media (min-width: 720px) {
487
+ .cho-grid {
488
+ grid-template-columns: 1fr 1fr;
489
+ }
490
+ }
491
+ .period-col {
492
+ display: grid;
493
+ gap: var(--roxy-space-xs, 0.25rem);
494
+ }
495
+ .period-heading {
496
+ font-size: var(--roxy-text-base, 1rem);
497
+ font-weight: var(--roxy-weight-bold, 600);
498
+ margin: 0 0 var(--roxy-space-xs, 0.25rem);
499
+ color: var(--roxy-fg, #0a0a0a);
500
+ }
501
+ .cho-tile {
502
+ display: grid;
503
+ grid-template-columns: 1fr auto;
504
+ align-items: center;
505
+ gap: 0.25em 0.75em;
506
+ padding: 0.55em 0.85em;
507
+ border: 1px solid var(--roxy-border, #e4e4e7);
508
+ border-radius: var(--roxy-radius-md, 8px);
509
+ }
510
+ .cho-tile.good {
511
+ background: color-mix(in srgb, var(--roxy-success, #22c55e) 18%, transparent);
512
+ border-color: color-mix(in srgb, var(--roxy-success, #22c55e) 45%, transparent);
513
+ color: var(--roxy-fg, #0a0a0a);
514
+ }
515
+ .cho-tile.bad {
516
+ background: color-mix(in srgb, var(--roxy-danger, #ef4444) 18%, transparent);
517
+ border-color: color-mix(in srgb, var(--roxy-danger, #ef4444) 45%, transparent);
518
+ color: var(--roxy-fg, #0a0a0a);
519
+ }
520
+ .cho-tile.neutral {
521
+ background: transparent;
522
+ color: var(--roxy-fg, #0a0a0a);
523
+ }
524
+ .tile-name {
525
+ font-size: var(--roxy-text-base, 1rem);
526
+ font-weight: var(--roxy-weight-bold, 600);
527
+ grid-column: 1;
528
+ }
529
+ .tile-time {
530
+ font-size: var(--roxy-text-xs, 0.75rem);
531
+ opacity: 0.8;
532
+ white-space: nowrap;
533
+ grid-column: 2;
534
+ grid-row: 1 / 3;
535
+ text-align: right;
536
+ align-self: center;
537
+ }
538
+ .tile-lord {
539
+ font-size: var(--roxy-text-sm, 0.875rem);
540
+ opacity: 0.85;
541
+ grid-column: 1;
542
+ display: flex;
543
+ align-items: center;
544
+ gap: 0.25em;
545
+ }
546
+ `],c([y({attribute:!1})],te.prototype,"data",2),te=c([v("roxy-choghadiya-grid")],te);function O(i){if(typeof i!="string"||i.length===0||/^\d{4}-\d{2}-\d{2}$/.test(i))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(i)?`1970-01-01T${i}`:i,t=new Date(e);return Number.isNaN(t.getTime())?i:t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Ne(i){if(typeof i!="string"||i.length===0)return"";let r=new Date(/^\d{4}-\d{2}-\d{2}$/.test(i)?`${i}T00:00:00`:i);return Number.isNaN(r.getTime())?i:r.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function st(i){if(!i)return"";let r=O(i.start),e=O(i.end);return r&&e?`${r} - ${e}`:r||e||""}function w(i,r=1){return typeof i!="number"||!Number.isFinite(i)?"":i.toFixed(r).replace(/\.?0+$/,"")}function Nt(i,r=1){let e=w(i,r);return e?`${e}%`:""}var ze={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function ke(i){return(i.type??"").toLowerCase().replace(/_/g,"-")}var H=class extends u{constructor(){super(...arguments);this.data=null;this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let t={};for(let[s,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(t[s]=o);return t}return{}}render(){let e=this.data;if(!e)return a`<div class="roxy-empty" role="status">No compatibility data</div>`;let t=e.overallScore,s=this.getBreakdown(),o="rating"in e?e.rating:void 0,l="archetype"in e?e.archetype:void 0,d="advice"in e?e.advice:void 0,p="summary"in e?e.summary:void 0,m="interpretation"in e?e.interpretation:void 0,h="strengths"in e?e.strengths:void 0,g="challenges"in e?e.challenges:void 0,f="keyAspects"in e?e.keyAspects:void 0;return a`<article
213
547
  class="card"
214
548
  aria-label=${`Compatibility (${this.mode})`}
215
549
  >
216
550
  <div class="head">
217
551
  <h2>${this.mode} compatibility</h2>
218
552
  <div>
219
- ${typeof t=="number"?s`<div class="score">${A(t,0)}</div>`:l}
220
- ${o?s`<div class="rating">${o}</div>`:l}
553
+ ${typeof t=="number"?a`<div class="score">${w(t,0)}</div>`:n}
554
+ ${o?a`<div class="rating">${o}</div>`:n}
221
555
  </div>
222
556
  </div>
223
557
 
224
- ${Object.keys(a).length>0?s`<div role="list">
225
- ${Object.entries(a).map(([w,x])=>s`<div class="bar-row" role="listitem">
226
- <span style="text-transform: capitalize">${w}</span>
558
+ ${Object.keys(s).length>0?a`<div role="list">
559
+ ${Object.entries(s).map(([k,$])=>a`<div class="bar-row" role="listitem">
560
+ <span style="text-transform: capitalize">${k}</span>
227
561
  <span class="bar"
228
- ><span style="width: ${Math.max(0,Math.min(100,x))}%"></span
562
+ ><span style="width: ${Math.max(0,Math.min(100,$))}%"></span
229
563
  ></span>
230
- <span>${A(x,0)}</span>
564
+ <span>${w($,0)}</span>
231
565
  </div>`)}
232
- </div>`:l}
233
- ${n?s`<p>
234
- <span class="archetype">${n.label}</span>
235
- ${n.description?s` · ${n.description}`:l}
236
- </p>`:l}
237
- ${d?s`<p>${d}</p>`:l}
238
- ${m&&!d?s`<p>${m}</p>`:l}
239
- ${c?s`<p>${c}</p>`:l}
240
- ${(g?.length??0)>0||(u?.length??0)>0?s`<div class="lists">
241
- ${g?.length?s`<div>
566
+ </div>`:n}
567
+ ${l?a`<p>
568
+ <span class="archetype">${l.label}</span>
569
+ ${l.description?a` · ${l.description}`:n}
570
+ </p>`:n}
571
+ ${p?a`<p>${p}</p>`:n}
572
+ ${m&&!p?a`<p>${m}</p>`:n}
573
+ ${d?a`<p>${d}</p>`:n}
574
+ ${(h?.length??0)>0||(g?.length??0)>0?a`<div class="lists">
575
+ ${h?.length?a`<div>
242
576
  <h3>Strengths</h3>
243
577
  <ul>
244
- ${g.map(w=>s`<li>${w}</li>`)}
578
+ ${h.map(k=>a`<li>${k}</li>`)}
245
579
  </ul>
246
- </div>`:l}
247
- ${u?.length?s`<div>
580
+ </div>`:n}
581
+ ${g?.length?a`<div>
248
582
  <h3>Challenges</h3>
249
583
  <ul>
250
- ${u.map(w=>s`<li>${w}</li>`)}
584
+ ${g.map(k=>a`<li>${k}</li>`)}
251
585
  </ul>
252
- </div>`:l}
253
- </div>`:l}
254
- ${f?.length?s`<div>
586
+ </div>`:n}
587
+ </div>`:n}
588
+ ${f?.length?a`<div>
255
589
  <h3 style="margin: 0 0 0.25rem; font-size: var(--roxy-text-xs); color: var(--roxy-muted); text-transform: uppercase; letter-spacing: 0.06em;">Key aspects</h3>
256
590
  <ul style="margin: 0; padding-left: 1rem; font-size: var(--roxy-text-sm);">
257
- ${f.slice(0,6).map(w=>s`<li>${Bt(w)}</li>`)}
591
+ ${f.slice(0,6).map(k=>a`<li>${ir(k)}</li>`)}
258
592
  </ul>
259
- </div>`:l}
260
- </article>`}};N.styles=[$,v`
593
+ </div>`:n}
594
+ </article>`}};H.styles=[b,x`
261
595
  .card {
262
596
  background: var(--roxy-bg, #fff);
263
597
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -341,45 +675,45 @@
341
675
  margin: 0;
342
676
  padding-left: var(--roxy-space-md, 1rem);
343
677
  }
344
- `],p([h({attribute:!1})],N.prototype,"data",2),p([h({type:String,reflect:!0})],N.prototype,"mode",2),N=p([b("roxy-compatibility-card")],N);function Bt(i){let r=i.type.toLowerCase().replace(/_/g,"-"),e=typeof i.orb=="number"?` (orb ${A(i.orb,1)}\xB0)`:"",t=[i.planet1,r,i.planet2].filter(Boolean).join(" ");return i.description?`${t}${e} \xB7 ${i.description}`:`${t}${e}`}var M=class extends y{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),a=t.length?Math.max(...t.map(o=>o.durationYears)):0;return s`<div class="wrap" aria-label="Dasha timeline">
678
+ `],c([y({attribute:!1})],H.prototype,"data",2),c([y({type:String,reflect:!0})],H.prototype,"mode",2),H=c([v("roxy-compatibility-card")],H);function ir(i){let r=i.type.toLowerCase().replace(/_/g,"-"),e=typeof i.orb=="number"?` (orb ${w(i.orb,1)}\xB0)`:"",t=[i.planet1,r,i.planet2].filter(Boolean).join(" ");return i.description?`${t}${e} \xB7 ${i.description}`:`${t}${e}`}var G=class extends u{constructor(){super(...arguments);this.data=null;this.period="current"}render(){let e=this.data;if(!e)return a`<div class="roxy-empty" role="status">No dasha data</div>`;let t=this.collectPeriods(e),s=t.length?Math.max(...t.map(o=>o.durationYears)):0;return a`<div class="wrap" aria-label="Dasha timeline">
345
679
  <header class="head">
346
680
  <h2 class="title">
347
681
  ${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}
348
682
  </h2>
349
- ${"nakshatraName"in e&&e.nakshatraName?s`<div class="nakshatra">
683
+ ${"nakshatraName"in e&&e.nakshatraName?a`<div class="nakshatra">
350
684
  Moon nakshatra: ${e.nakshatraName}
351
- ${"nakshatraLord"in e&&e.nakshatraLord?s`(lord ${e.nakshatraLord})`:l}
352
- </div>`:l}
685
+ ${"nakshatraLord"in e&&e.nakshatraLord?a`(lord ${e.nakshatraLord})`:n}
686
+ </div>`:n}
353
687
  </header>
354
688
 
355
- ${this.period==="current"?this.renderCurrent(e):l}
356
- ${t.length>0?s`<div class="timeline" role="list">
357
- ${t.map(o=>this.renderBar(o,a))}
358
- </div>`:l}
359
- </div>`}renderCurrent(e){return"mahadasha"in e?s`<div class="current">
360
- ${"mahadasha"in e&&e.mahadasha?s`<div>
689
+ ${this.period==="current"?this.renderCurrent(e):n}
690
+ ${t.length>0?a`<div class="timeline" role="list">
691
+ ${t.map(o=>this.renderBar(o,s))}
692
+ </div>`:n}
693
+ </div>`}renderCurrent(e){return"mahadasha"in e?a`<div class="current">
694
+ ${"mahadasha"in e&&e.mahadasha?a`<div>
361
695
  <span>Mahadasha</span>
362
696
  <strong>${e.mahadasha.planet}</strong>
363
- ${"remainingInMahadasha"in e&&e.remainingInMahadasha?s`<small>${A(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:l}
364
- </div>`:l}
365
- ${"antardasha"in e&&e.antardasha?s`<div>
697
+ ${"remainingInMahadasha"in e&&e.remainingInMahadasha?a`<small>${w(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:n}
698
+ </div>`:n}
699
+ ${"antardasha"in e&&e.antardasha?a`<div>
366
700
  <span>Antardasha</span>
367
701
  <strong>${e.antardasha.planet}</strong>
368
- ${"remainingInAntardasha"in e&&e.remainingInAntardasha?s`<small>${A(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:l}
369
- </div>`:l}
370
- ${"pratyantardasha"in e&&e.pratyantardasha?s`<div>
702
+ ${"remainingInAntardasha"in e&&e.remainingInAntardasha?a`<small>${w(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:n}
703
+ </div>`:n}
704
+ ${"pratyantardasha"in e&&e.pratyantardasha?a`<div>
371
705
  <span>Pratyantardasha</span>
372
706
  <strong>${e.pratyantardasha.planet}</strong>
373
- ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?s`<small>${A(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:l}
374
- </div>`:l}
375
- </div>`:l}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}renderBar(e,t){let a=e.durationYears,o=t>0?a/t*100:0;return s`<div class="bar" role="listitem">
707
+ ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?a`<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,t){let s=e.durationYears,o=t>0?s/t*100:0;return a`<div class="bar" role="listitem">
376
710
  <span>${e.planet}</span>
377
711
  <span class="bar-track"><span style="width: ${o}%"></span></span>
378
712
  <span class="dates">
379
- ${e.startDate?mt(e.startDate):""}
380
- ${e.endDate?s`- ${mt(e.endDate)}`:""}
713
+ ${e.startDate?zt(e.startDate):""}
714
+ ${e.endDate?a`- ${zt(e.endDate)}`:""}
381
715
  </span>
382
- </div>`}};M.styles=[$,v`
716
+ </div>`}};G.styles=[b,x`
383
717
  .wrap {
384
718
  display: grid;
385
719
  gap: var(--roxy-space-md, 1rem);
@@ -454,44 +788,44 @@
454
788
  font-variant-numeric: tabular-nums;
455
789
  text-align: right;
456
790
  }
457
- `],p([h({attribute:!1})],M.prototype,"data",2),p([h({type:String,reflect:!0})],M.prototype,"period",2),M=p([b("roxy-dasha-timeline")],M);function mt(i){let r=i.match(/^(\d{4})/);return r?r[1]:i}var qt=["title","name","label","heading","overview","summary"],Kt=["imageUrl","image","icon","symbol"],Yt=["imageUrl","image"],Vt=6,z=class extends y{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>=Vt?s`<div class="roxy-empty" role="status">…</div>`:s`<div
791
+ `],c([y({attribute:!1})],G.prototype,"data",2),c([y({type:String,reflect:!0})],G.prototype,"period",2),G=c([v("roxy-dasha-timeline")],G);function zt(i){let r=i.match(/^(\d{4})/);return r?r[1]:i}var nr=["title","name","label","heading","overview","summary"],lr=["imageUrl","image","icon","symbol"],dr=["imageUrl","image"],cr=6,j=class extends u{constructor(){super(...arguments);this.data=null;this.depth=0}render(){return this.data==null?a`<div class="roxy-empty" role="status">No data</div>`:this.depth>=cr?a`<div class="roxy-empty" role="status">…</div>`:a`<div
458
792
  class="roxy-card"
459
793
  aria-label="Generic data display"
460
794
  >
461
795
  ${this.renderValue(this.data)}
462
- </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">
463
- ${e.map(o=>s`<li>${String(o)}</li>`)}
464
- </ul>`:e.every(o=>o!==null&&typeof o=="object"&&!Array.isArray(o))?this.renderTable(e):s`<ol>
465
- ${e.map(o=>s`<li>${this.renderValue(o)}</li>`)}
466
- </ol>`}renderTable(e){let t=this.collectKeys(e);return s`<table class="roxy-table" role="table">
796
+ </div>`}renderValue(e){return e==null?n:typeof e=="string"?a`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?a`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?a`<div class="roxy-empty" role="status">Empty list</div>`:e.every(o=>o===null||["string","number","boolean"].includes(typeof o))?a`<ul class="roxy-chips">
797
+ ${e.map(o=>a`<li>${String(o)}</li>`)}
798
+ </ul>`:e.every(o=>o!==null&&typeof o=="object"&&!Array.isArray(o))?this.renderTable(e):a`<ol>
799
+ ${e.map(o=>a`<li>${this.renderValue(o)}</li>`)}
800
+ </ol>`}renderTable(e){let t=this.collectKeys(e);return a`<table class="roxy-table" role="table">
467
801
  <thead>
468
802
  <tr>
469
- ${t.map(a=>s`<th>${this.humanize(a)}</th>`)}
803
+ ${t.map(s=>a`<th>${ee(s)}</th>`)}
470
804
  </tr>
471
805
  </thead>
472
806
  <tbody>
473
- ${e.map(a=>s`<tr>
474
- ${t.map(o=>s`<td>${this.formatPrimitive(a[o])}</td>`)}
807
+ ${e.map(s=>a`<tr>
808
+ ${t.map(o=>a`<td>${this.formatPrimitive(s[o])}</td>`)}
475
809
  </tr>`)}
476
810
  </tbody>
477
- </table>`}renderObject(e){let t=qt.find(c=>typeof e[c]=="string"),a=Kt.find(c=>typeof e[c]=="string"&&e[c].startsWith("http")),o=t!=="summary"&&typeof e.summary=="string"?"summary":null,n=Object.entries(e).filter(([c,d])=>c!==t&&c!==o&&!Yt.includes(c)&&d!==null&&d!==void 0);return s`
478
- ${a?s`<img
811
+ </table>`}renderObject(e){let t=nr.find(d=>typeof e[d]=="string"),s=lr.find(d=>typeof e[d]=="string"&&e[d].startsWith("http")),o=t!=="summary"&&typeof e.summary=="string"?"summary":null,l=Object.entries(e).filter(([d,p])=>d!==t&&d!==o&&!dr.includes(d)&&p!==null&&p!==void 0);return a`
812
+ ${s?a`<img
479
813
  class="roxy-image"
480
- src=${String(e[a])}
814
+ src=${String(e[s])}
481
815
  alt=${t?String(e[t]):"illustration"}
482
816
  loading="lazy"
483
- />`:l}
484
- ${t?s`<h3 class="roxy-title">${e[t]}</h3>`:l}
485
- ${o?s`<p class="roxy-summary">${e[o]}</p>`:l}
486
- ${n.length>0?s`<dl class="roxy-rows">
487
- ${n.map(([c,d])=>s`
488
- <dt>${this.humanize(c)}</dt>
489
- <dd>${this.renderField(d)}</dd>
817
+ />`:n}
818
+ ${t?a`<h3 class="roxy-title">${e[t]}</h3>`:n}
819
+ ${o?a`<p class="roxy-summary">${e[o]}</p>`:n}
820
+ ${l.length>0?a`<dl class="roxy-rows">
821
+ ${l.map(([d,p])=>a`
822
+ <dt>${ee(d)}</dt>
823
+ <dd>${this.renderField(p)}</dd>
490
824
  `)}
491
- </dl>`:l}
492
- `}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))?s`<ul class="roxy-chips">
493
- ${e.map(a=>s`<li>${String(a)}</li>`)}
494
- </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 a of e)for(let o of Object.keys(a))t.add(o);return Array.from(t)}humanize(e){return e.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,t=>t.toUpperCase())}};z.styles=[$,v`
825
+ </dl>`:n}
826
+ `}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(s=>["string","number","boolean"].includes(typeof s))?a`<ul class="roxy-chips">
827
+ ${e.map(s=>a`<li>${String(s)}</li>`)}
828
+ </ul>`:a`<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 s of e)for(let o of Object.keys(s))t.add(o);return Array.from(t)}};j.styles=[b,x`
495
829
  .roxy-card {
496
830
  background: var(--roxy-bg, #fff);
497
831
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -585,105 +919,257 @@
585
919
  margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
586
920
  text-transform: capitalize;
587
921
  }
588
- `],p([h({attribute:!1})],z.prototype,"data",2),p([h({attribute:!1})],z.prototype,"depth",2),z=p([b("roxy-data")],z);var Ft={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},D=class extends y{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,a=Ft[this.type]??this.type,o=(e.severity??"").toLowerCase();return s`<article
589
- class="card"
590
- aria-label=${a}
591
- >
592
- <header class="head">
593
- <h2 class="title">${a}</h2>
594
- <div style="display:flex; gap:0.5rem; align-items:center;">
595
- <span class=${`badge ${t?"present":"absent"}`}>
596
- ${t?"Present":"Absent"}
597
- </span>
598
- ${e.severity?s`<span
599
- class=${`severity ${o}`}
600
- role="img"
601
- aria-label=${`Severity ${e.severity}`}
602
- >
603
- <span></span><span></span><span></span>
604
- </span>`:l}
605
- </div>
606
- </header>
607
- ${e.description?s`<p class="description">${e.description}</p>`:l}
608
- ${this.renderEffects(e)}
609
- ${e.remedies&&e.remedies.length>0?s`<div>
610
- <h3>Remedies</h3>
611
- <ul>
612
- ${e.remedies.map(n=>s`<li>${n}</li>`)}
613
- </ul>
614
- </div>`:l}
615
- ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?s`<div>
616
- <h3>Exceptions</h3>
617
- <ul>
618
- ${e.exceptions.map(n=>s`<li>${n}</li>`)}
619
- </ul>
620
- </div>`:l}
621
- </article>`}renderEffects(e){if(!e.effects)return l;let t=Object.entries(e.effects).filter(([,a])=>typeof a=="string"&&a.length>0);return t.length===0?l:s`<div class="effects">
622
- ${t.map(([a,o])=>s`<div>
623
- <h3>${a}</h3>
624
- <p>${o}</p>
625
- </div>`)}
626
- </div>`}};D.styles=[$,v`
627
- .card {
628
- background: var(--roxy-bg, #fff);
629
- border: 1px solid var(--roxy-border, #e4e4e7);
630
- border-radius: var(--roxy-radius-md, 8px);
631
- padding: var(--roxy-space-lg, 1.5rem);
632
- box-shadow: var(--roxy-shadow-sm);
922
+ `],c([y({attribute:!1})],j.prototype,"data",2),c([y({attribute:!1})],j.prototype,"depth",2),j=c([v("roxy-data")],j);var Me=Object.fromEntries(pe.map(i=>[i.toLowerCase(),i])),pr={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}},mr={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}},hr={1:{x:150,y:60},2:{x:225,y:100},3:{x:255,y:150},4:{x:225,y:200},5:{x:150,y:240},6:{x:75,y:200},7:{x:45,y:150},8:{x:75,y:100},9:{x:100,y:80},10:{x:150,y:108},11:{x:200,y:80},12:{x:200,y:220}};function De(i){let r=pr[i.number],e=mr[i.number];if(!r||!e)return n;let t=rt[i.sign]??"",s=i.planets;return S`
923
+ <g>
924
+ ${i.isLagna?S`<rect
925
+ class="lagna-bg"
926
+ x=${r.x-30} y=${r.y-28}
927
+ width="60" height="56" rx="6"
928
+ />`:n}
929
+ ${t?S`<text class="sign-text" x=${e.x} y=${e.y} text-anchor="middle" dominant-baseline="central">${t}</text>`:n}
930
+ ${i.isLagna?S`<text class="lagna-marker" x=${r.x} y=${r.y-18} text-anchor="middle" dominant-baseline="central">LAGNA</text>`:n}
931
+ ${s.map((o,l)=>{let d=tt[C(o)]??o.slice(0,2),p=13,g=(i.isLagna?r.y+8:r.y)-(s.length-1)*p/2+l*p;return S`<text class="planet-text" x=${r.x} y=${g} text-anchor="middle" dominant-baseline="central">${d}</text>`})}
932
+ </g>
933
+ `}function Oe(){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 He(i){let r=hr[i.number];if(!r)return n;let e=rt[i.sign]??"",t=i.planets;return S`
942
+ <g>
943
+ ${i.isLagna?S`<circle class="lagna-bg" cx=${r.x} cy=${r.y} r="22" />`:n}
944
+ ${e?S`<text class="sign-text" x=${r.x} y=${r.y-10} text-anchor="middle" dominant-baseline="central">${e}</text>`:n}
945
+ <text class="house-num" x=${r.x} y=${r.y+2} text-anchor="middle" dominant-baseline="central">${i.number}</text>
946
+ ${t.map((s,o)=>{let l=tt[C(s)]??s.slice(0,2),d=11,m=r.y+14-(t.length-1)*d/2+o*d;return S`<text class="planet-text" x=${r.x} y=${m} text-anchor="middle" dominant-baseline="central">${l}</text>`})}
947
+ </g>
948
+ `}function Ge(){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
+ `}var I=class extends u{constructor(){super(...arguments);this.data=null;this.chartStyle="south"}buildHouses(){if(!this.data)return[];let e=this.data.chart,s=(this.data.chart.meta??{}).Lagna?.rashi??"",o=[];for(let l=0;l<12;l++){let d=_e[l],m=(e[d]?.signs??[]).map(g=>g.graha).filter(Boolean),h=Me[d]??"";o.push({number:l+1,sign:h,planets:m,isLagna:s?s.toLowerCase()===h.toLowerCase():!1})}return o}render(){if(!this.data)return a`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:e,vargottama:t}=this.data,s=this.buildHouses(),o=this.chartStyle==="north";return a`<div class="wrap">
960
+ <div class="header">
961
+ <h2 class="title">
962
+ D${e.number} ${e.name}
963
+ ${e.sanskritName&&e.sanskritName!==e.name?a`<span class="division-meta"> · ${e.sanskritName}</span>`:n}
964
+ </h2>
965
+ ${e.significance?a`<p class="significance">${e.significance}</p>`:n}
966
+ </div>
967
+
968
+ <svg
969
+ viewBox="0 0 300 300"
970
+ role="img"
971
+ aria-label="D${e.number} ${e.name} divisional chart with twelve sign houses"
972
+ >
973
+ <title>D${e.number} ${e.name}</title>
974
+ ${o?Oe():Ge()}
975
+ ${o?s.map(l=>He(l)):s.map(l=>De(l))}
976
+ </svg>
977
+
978
+ ${t&&t.length>0?a`<div class="vargottama-row" role="list" aria-label="Vargottama planets">
979
+ <span class="vargottama-label">Vargottama:</span>
980
+ ${t.map(l=>a`<span class="vargottama-pill" role="listitem">
981
+ ${L[l]??""} ${l}
982
+ </span>`)}
983
+ </div>`:n}
984
+ </div>`}};I.styles=[b,x`
985
+ .wrap {
633
986
  display: grid;
634
987
  gap: var(--roxy-space-md, 1rem);
635
988
  }
636
- .head {
637
- display: flex;
638
- align-items: center;
639
- justify-content: space-between;
640
- gap: var(--roxy-space-md, 1rem);
641
- flex-wrap: wrap;
989
+ .header {
990
+ display: grid;
991
+ gap: var(--roxy-space-xs, 0.25rem);
642
992
  }
643
993
  .title {
644
- margin: 0;
645
994
  font-size: var(--roxy-text-lg, 1.125rem);
646
995
  font-weight: var(--roxy-weight-bold, 600);
647
- text-transform: capitalize;
996
+ margin: 0;
648
997
  }
649
- .badge {
650
- display: inline-flex;
651
- align-items: center;
652
- gap: var(--roxy-space-xs, 0.25rem);
653
- padding: 4px 10px;
654
- border-radius: var(--roxy-radius-full, 9999px);
655
- font-size: var(--roxy-text-xs, 0.75rem);
656
- font-weight: var(--roxy-weight-bold, 600);
657
- text-transform: uppercase;
658
- letter-spacing: 0.06em;
998
+ .division-meta {
999
+ font-size: var(--roxy-text-sm, 0.875rem);
1000
+ color: var(--roxy-muted, #71717a);
1001
+ margin: 0;
659
1002
  }
660
- .badge.absent {
661
- background: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);
662
- color: var(--roxy-success-fg, #166534);
1003
+ .significance {
1004
+ font-size: var(--roxy-text-sm, 0.875rem);
1005
+ color: var(--roxy-muted, #71717a);
1006
+ border-left: 2px solid var(--roxy-border, #e4e4e7);
1007
+ padding-left: var(--roxy-space-sm, 0.5rem);
1008
+ margin: 0;
663
1009
  }
664
- .badge.present {
665
- background: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);
666
- color: var(--roxy-danger-fg, #991b1b);
1010
+ svg {
1011
+ display: block;
1012
+ width: 100%;
1013
+ max-width: 360px;
1014
+ margin: 0 auto;
667
1015
  }
668
- .severity {
669
- display: flex;
670
- align-items: center;
671
- gap: 4px;
1016
+ .line {
1017
+ fill: transparent;
1018
+ stroke: var(--roxy-border, #e4e4e7);
672
1019
  }
673
- .severity span {
674
- width: 14px;
675
- height: 4px;
676
- border-radius: 2px;
677
- background: var(--roxy-border, #e4e4e7);
1020
+ .sign-text {
1021
+ fill: var(--roxy-muted, #71717a);
1022
+ font-size: 9px;
1023
+ font-weight: 500;
1024
+ font-family: var(--roxy-font-sans);
1025
+ }
1026
+ .planet-text {
1027
+ fill: var(--roxy-fg, #0a0a0a);
1028
+ font-size: 11px;
1029
+ font-weight: 600;
1030
+ font-family: var(--roxy-font-sans);
1031
+ }
1032
+ .house-num {
1033
+ fill: var(--roxy-muted, #71717a);
1034
+ font-size: 9px;
1035
+ font-weight: 400;
1036
+ font-family: var(--roxy-font-sans);
1037
+ }
1038
+ .lagna-marker {
1039
+ fill: var(--roxy-accent-fg, #b45309);
1040
+ font-size: 8px;
1041
+ font-weight: 700;
1042
+ font-family: var(--roxy-font-sans);
1043
+ letter-spacing: 0.05em;
1044
+ }
1045
+ .lagna-bg {
1046
+ fill: color-mix(in srgb, var(--roxy-accent, #f59e0b) 12%, transparent);
1047
+ stroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
1048
+ stroke-width: 0.8;
1049
+ }
1050
+ .vargottama-row {
1051
+ display: flex;
1052
+ flex-wrap: wrap;
1053
+ gap: var(--roxy-space-xs, 0.25rem);
1054
+ align-items: center;
1055
+ }
1056
+ .vargottama-label {
1057
+ font-size: var(--roxy-text-sm, 0.875rem);
1058
+ color: var(--roxy-muted, #71717a);
1059
+ font-weight: 500;
1060
+ margin-right: var(--roxy-space-xs, 0.25rem);
1061
+ }
1062
+ .vargottama-pill {
1063
+ display: inline-flex;
1064
+ align-items: center;
1065
+ gap: 0.2em;
1066
+ font-size: var(--roxy-text-sm, 0.875rem);
1067
+ font-weight: 600;
1068
+ padding: 0.15em 0.6em;
1069
+ border-radius: 999px;
1070
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 22%, transparent);
1071
+ color: var(--roxy-fg, #0a0a0a);
1072
+ border: 1px solid color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
1073
+ }
1074
+ `],c([y({attribute:!1})],I.prototype,"data",2),c([y({type:String,reflect:!0,attribute:"chart-style"})],I.prototype,"chartStyle",2),I=c([v("roxy-divisional-chart")],I);var gr={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},B=class extends u{constructor(){super(...arguments);this.data=null;this.type="manglik"}render(){let e=this.data;if(!e)return a`<div class="roxy-empty" role="status">No dosha data</div>`;let t=!!e.present,s=gr[this.type]??this.type,o=(e.severity??"").toLowerCase(),l=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=l*33,p=l===3?"var(--roxy-danger)":l===2?"var(--roxy-warning)":l===1?"var(--roxy-success)":"transparent";return a`<article
1075
+ class="card"
1076
+ aria-label=${s}
1077
+ >
1078
+ <header class="head">
1079
+ <h2 class="title">${s}</h2>
1080
+ <span class=${`badge ${t?"present":"absent"}`}>
1081
+ ${t?"Present":"Absent"}
1082
+ </span>
1083
+ </header>
1084
+ ${e.severity?a`<div
1085
+ class="severity-bar"
1086
+ role="meter"
1087
+ aria-valuemin="0"
1088
+ aria-valuemax="3"
1089
+ aria-valuenow="${l}"
1090
+ aria-label="Severity ${e.severity}"
1091
+ >
1092
+ <span class="severity-fill" style="width: ${d}%; background: ${p};"></span>
1093
+ </div>`:n}
1094
+ ${e.description?a`<p class="description">${e.description}</p>`:n}
1095
+ ${this.renderEffects(e)}
1096
+ ${e.remedies&&e.remedies.length>0?a`<div>
1097
+ <h3>Remedies</h3>
1098
+ <ul>
1099
+ ${e.remedies.map(m=>a`<li>${m}</li>`)}
1100
+ </ul>
1101
+ </div>`:n}
1102
+ ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?a`<div>
1103
+ <h3>Exceptions</h3>
1104
+ <ul>
1105
+ ${e.exceptions.map(m=>a`<li>${m}</li>`)}
1106
+ </ul>
1107
+ </div>`:n}
1108
+ </article>`}renderEffects(e){if(!e.effects)return n;let t=Object.entries(e.effects).filter(([,s])=>typeof s=="string"&&s.length>0);return t.length===0?n:a`<div class="effects">
1109
+ ${t.map(([s,o])=>a`<div>
1110
+ <h3>${s}</h3>
1111
+ <p>${o}</p>
1112
+ </div>`)}
1113
+ </div>`}};B.styles=[b,x`
1114
+ .card {
1115
+ background: var(--roxy-bg, #fff);
1116
+ border: 1px solid var(--roxy-border, #e4e4e7);
1117
+ border-radius: var(--roxy-radius-md, 8px);
1118
+ padding: var(--roxy-space-lg, 1.5rem);
1119
+ box-shadow: var(--roxy-shadow-sm);
1120
+ display: grid;
1121
+ gap: var(--roxy-space-md, 1rem);
1122
+ }
1123
+ .head {
1124
+ display: flex;
1125
+ align-items: center;
1126
+ justify-content: space-between;
1127
+ gap: var(--roxy-space-md, 1rem);
1128
+ flex-wrap: wrap;
1129
+ }
1130
+ .title {
1131
+ margin: 0;
1132
+ font-size: var(--roxy-text-lg, 1.125rem);
1133
+ font-weight: var(--roxy-weight-bold, 600);
1134
+ text-transform: capitalize;
1135
+ }
1136
+ .badge {
1137
+ display: inline-flex;
1138
+ align-items: center;
1139
+ gap: var(--roxy-space-xs, 0.25rem);
1140
+ padding: 4px 10px;
1141
+ border-radius: var(--roxy-radius-full, 9999px);
1142
+ font-size: var(--roxy-text-xs, 0.75rem);
1143
+ font-weight: var(--roxy-weight-bold, 600);
1144
+ text-transform: uppercase;
1145
+ letter-spacing: 0.06em;
1146
+ }
1147
+ .badge.absent {
1148
+ background: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);
1149
+ color: var(--roxy-success-fg, #166534);
1150
+ }
1151
+ .badge.present {
1152
+ background: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);
1153
+ color: var(--roxy-danger-fg, #991b1b);
678
1154
  }
679
- .severity.mild span:nth-child(1) {
680
- background: var(--roxy-warning, #ea580c);
1155
+ .severity-bar {
1156
+ position: relative;
1157
+ width: 100%;
1158
+ height: 8px;
1159
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 30%, transparent);
1160
+ border-radius: 4px;
1161
+ overflow: hidden;
681
1162
  }
682
- .severity.moderate span:nth-child(-n + 2) {
683
- background: var(--roxy-warning, #ea580c);
1163
+ .severity-fill {
1164
+ display: block;
1165
+ height: 100%;
1166
+ transition: width var(--roxy-motion-duration, 200ms) ease-out;
1167
+ border-radius: 4px;
684
1168
  }
685
- .severity.severe span {
686
- background: var(--roxy-danger, #dc2626);
1169
+ @media (prefers-reduced-motion: reduce) {
1170
+ .severity-fill {
1171
+ transition: none;
1172
+ }
687
1173
  }
688
1174
 
689
1175
  .description {
@@ -712,24 +1198,24 @@
712
1198
  margin: 0;
713
1199
  font-size: var(--roxy-text-sm, 0.875rem);
714
1200
  }
715
- `],p([h({attribute:!1})],D.prototype,"data",2),p([h({type:String,reflect:!0})],D.prototype,"type",2),D=p([b("roxy-dosha-card")],D);var Oe=new Map;async function Wt(i){let r=Oe.get(i);return r||(r=fetch(i).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Oe.delete(i),e}),Oe.set(i,r)),r}var R=class extends y{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(a=>a.required).filter(a=>this.values[a.name]===void 0||this.values[a.name]==="");if(t.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:t.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 Wt(this.specUrl),t=`/${this.endpoint.replace(/^\//,"")}`,a=e.paths?.[t]?.[this.method.toLowerCase()];if(!a)throw new Error(`Endpoint ${this.method} ${t} not found in OpenAPI spec`);let o=e.components?.schemas??{},n=[],c;if(a.requestBody){let m=a.requestBody.content?.["application/json"]?.schema;c=this.resolve(m,o)}if(c?.properties){let m=new Set(c.required??[]);for(let[g,u]of Object.entries(c.properties)){let f=this.resolve(u,o)??{};n.push({name:g,type:this.fieldType(f),required:m.has(g),description:f.description,enum:f.enum,min:f.minimum,max:f.maximum,default:f.default})}}for(let m of a.parameters??[])if(m.in==="path"||m.in==="query"){let g=this.resolve(m.schema,o)??{};n.push({name:m.name,type:this.fieldType(g),required:!!m.required,description:g.description,enum:g.enum,default:g.default})}this.fields=n,this.hasLocation=n.some(m=>m.name==="latitude")&&n.some(m=>m.name==="longitude")&&n.some(m=>m.name==="timezone");let d={};for(let m of n)m.default!==void 0&&(d[m.name]=m.default);this.values=d,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 a=e.$ref.split("/").pop();return a?t[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,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">
1201
+ `],c([y({attribute:!1})],B.prototype,"data",2),c([y({type:String,reflect:!0})],B.prototype,"type",2),B=c([v("roxy-dosha-card")],B);var ot=new Map;async function yr(i){let r=ot.get(i);return r||(r=fetch(i).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw ot.delete(i),e}),ot.set(i,r)),r}var _=class extends u{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let 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(s=>s.required).filter(s=>this.values[s.name]===void 0||this.values[s.name]==="");if(t.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:t.map(s=>s.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await yr(this.specUrl),t=`/${this.endpoint.replace(/^\//,"")}`,s=e.paths?.[t]?.[this.method.toLowerCase()];if(!s)throw new Error(`Endpoint ${this.method} ${t} not found in OpenAPI spec`);let o=e.components?.schemas??{},l=[],d;if(s.requestBody){let m=s.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[h,g]of Object.entries(d.properties)){let f=this.resolve(g,o)??{};l.push({name:h,type:this.fieldType(f),required:m.has(h),description:f.description,enum:f.enum,min:f.minimum,max:f.maximum,default:f.default})}}for(let m of s.parameters??[])if(m.in==="path"||m.in==="query"){let h=this.resolve(m.schema,o)??{};l.push({name:m.name,type:this.fieldType(h),required:!!m.required,description:h.description,enum:h.enum,default:h.default})}this.fields=l,this.hasLocation=l.some(m=>m.name==="latitude")&&l.some(m=>m.name==="longitude")&&l.some(m=>m.name==="timezone");let p={};for(let m of l)m.default!==void 0&&(p[m.name]=m.default);this.values=p,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 s=e.$ref.split("/").pop();return s?t[s]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,t){this.values={...this.values,[e]:t}}render(){if(!this.loaded)return a`<form><div class="roxy-skeleton" style="height: 8rem"></div></form>`;if(this.specError)return a`<div class="spec-error" role="alert">
716
1202
  Schema load failed: ${this.specError}
717
1203
  <button type="button" class="submit" @click=${this.retryLoadSchema}>Retry</button>
718
- </div>`;let e=t=>{if(this.hasLocation&&(t.name==="latitude"||t.name==="longitude"||t.name==="timezone"))return l;let a=`roxy-form-${t.name}`;return s`<div class="field">
719
- <label for=${a}>
720
- ${ht(t.name)}${t.required?s`<span class="req" aria-hidden="true">*</span>`:l}
1204
+ </div>`;let e=t=>{if(this.hasLocation&&(t.name==="latitude"||t.name==="longitude"||t.name==="timezone"))return n;let s=`roxy-form-${t.name}`;return a`<div class="field">
1205
+ <label for=${s}>
1206
+ ${ee(t.name)}${t.required?a`<span class="req" aria-hidden="true">*</span>`:n}
721
1207
  </label>
722
- ${t.enum?s`<select
723
- id=${a}
1208
+ ${t.enum?a`<select
1209
+ id=${s}
724
1210
  ?required=${t.required}
725
1211
  @change=${o=>this.setValue(t.name,o.target.value)}
726
1212
  >
727
1213
  <option value="">Choose</option>
728
- ${t.enum.map(o=>s`<option value=${o} ?selected=${this.values[t.name]===o}>
1214
+ ${t.enum.map(o=>a`<option value=${o} ?selected=${this.values[t.name]===o}>
729
1215
  ${o}
730
1216
  </option>`)}
731
- </select>`:s`<input
732
- id=${a}
1217
+ </select>`:a`<input
1218
+ id=${s}
733
1219
  type=${this.htmlType(t.type)}
734
1220
  ?required=${t.required}
735
1221
  min=${t.min??""}
@@ -738,10 +1224,10 @@
738
1224
  .value=${this.values[t.name]??""}
739
1225
  @input=${o=>this.setValue(t.name,this.coerce(t.type,o.target.value))}
740
1226
  />`}
741
- ${t.description?s`<small class="help">${t.description}</small>`:l}
742
- </div>`};return s`<form @submit=${this.onSubmit}>
743
- <h2 class="title">${ht(this.endpoint.split("/").pop()??"")}</h2>
744
- ${this.hasLocation?s`<div class="location-block">
1227
+ ${t.description?a`<small class="help">${t.description}</small>`:n}
1228
+ </div>`};return a`<form @submit=${this.onSubmit}>
1229
+ <h2 class="title">${ee(this.endpoint.split("/").pop()??"")}</h2>
1230
+ ${this.hasLocation?a`<div class="location-block">
745
1231
  <label>Birth location</label>
746
1232
  <roxy-location-search
747
1233
  @roxy-location-select=${this.onLocation}
@@ -750,12 +1236,12 @@
750
1236
  <small class="help">
751
1237
  Required: latitude, longitude, timezone. Pick a city to autofill.
752
1238
  </small>
753
- </div>`:l}
1239
+ </div>`:n}
754
1240
  <div class="fields">
755
1241
  ${this.fields.map(t=>e(t))}
756
1242
  </div>
757
1243
  <button class="submit" type="submit">${this.submitLabel}</button>
758
- </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 a=Number(t);return Number.isFinite(a)?a:void 0}return t}}};R.styles=[$,v`
1244
+ </form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,t){if(t!==""){if(e==="number"){let s=Number(t);return Number.isFinite(s)?s:void 0}return t}}};_.styles=[b,x`
759
1245
  form {
760
1246
  display: grid;
761
1247
  gap: var(--roxy-space-md, 1rem);
@@ -857,19 +1343,33 @@
857
1343
  color: var(--roxy-danger-fg, #991b1b);
858
1344
  font-size: var(--roxy-text-sm, 0.875rem);
859
1345
  }
860
- `],p([h({type:String,attribute:"data-endpoint"})],R.prototype,"endpoint",2),p([h({type:String})],R.prototype,"method",2),p([h({type:String,attribute:"spec-url"})],R.prototype,"specUrl",2),p([h({type:String,attribute:"submit-label"})],R.prototype,"submitLabel",2),p([P()],R.prototype,"fields",2),p([P()],R.prototype,"values",2),p([P()],R.prototype,"hasLocation",2),p([P()],R.prototype,"loaded",2),p([P()],R.prototype,"specError",2),R=p([b("roxy-endpoint-form")],R);function ht(i){return i.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,r=>r.toUpperCase())}var V=class extends y{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(a=>a?.category!==void 0);return s`<article class="card" aria-label="Guna Milan score">
861
- <div class="score-bar">
862
- <div>
863
- <span class="total">${A(e.total,1)}</span>
864
- <span class="over"> / ${e.maxScore}</span>
865
- ${typeof e.percentage=="number"?s`<small style="margin-left: 0.5rem; color: var(--roxy-muted)">
866
- ${pt(e.percentage,1)}
867
- </small>`:l}
1346
+ `],c([y({type:String,attribute:"data-endpoint"})],_.prototype,"endpoint",2),c([y({type:String})],_.prototype,"method",2),c([y({type:String,attribute:"spec-url"})],_.prototype,"specUrl",2),c([y({type:String,attribute:"submit-label"})],_.prototype,"submitLabel",2),c([E()],_.prototype,"fields",2),c([E()],_.prototype,"values",2),c([E()],_.prototype,"hasLocation",2),c([E()],_.prototype,"loaded",2),c([E()],_.prototype,"specError",2),_=c([v("roxy-endpoint-form")],_);var re=class extends u{constructor(){super(...arguments);this.data=null}render(){let e=this.data;if(!e)return a`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let t=(e.breakdown??[]).filter(g=>g?.category!==void 0),s=e.total??0,o=e.maxScore??36,l=s/o*100,d="color-mix(in srgb, var(--roxy-border) 50%, transparent)",p=l>=70?"var(--roxy-success)":l>=50?"var(--roxy-warning)":"var(--roxy-danger)",m=l*2.827,h=(100-l)*2.827;return a`<article class="card" aria-label="Guna Milan score">
1347
+ <div class="score-header">
1348
+ <div class="score-info">
1349
+ <div class="score-bar">
1350
+ <div>
1351
+ <span class="total">${w(e.total,1)}</span>
1352
+ <span class="over"> / ${e.maxScore}</span>
1353
+ ${typeof e.percentage=="number"?a`<small style="margin-left: 0.5rem; color: var(--roxy-muted)">
1354
+ ${Nt(e.percentage,1)}
1355
+ </small>`:n}
1356
+ </div>
1357
+ ${e.recommendation?a`<span class="recommendation">${e.recommendation}</span>`:n}
1358
+ </div>
1359
+ </div>
1360
+ <div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${s}">
1361
+ <svg viewBox="0 0 100 100" aria-hidden="true">
1362
+ <circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8"/>
1363
+ <circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${p}" stroke-width="8"
1364
+ stroke-dasharray="${m},${h}" stroke-linecap="round"
1365
+ transform="rotate(-90 50 50)"/>
1366
+ <text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${s}</text>
1367
+ <text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${o}</text>
1368
+ </svg>
868
1369
  </div>
869
- ${e.recommendation?s`<span class="recommendation">${e.recommendation}</span>`:l}
870
1370
  </div>
871
1371
 
872
- ${t.length>0?s`<table>
1372
+ ${t.length>0?a`<table>
873
1373
  <thead>
874
1374
  <tr>
875
1375
  <th>Category</th>
@@ -878,22 +1378,22 @@
878
1378
  </tr>
879
1379
  </thead>
880
1380
  <tbody>
881
- ${t.map(a=>{let o=a.score??0,n=a.maxScore??Jt(a.category),c=n?o/n*100:0;return s`<tr>
882
- <td>${a.category}</td>
1381
+ ${t.map(g=>{let f=g.score??0,k=g.maxScore??ur(g.category),$=k?f/k*100:0;return a`<tr>
1382
+ <td>${g.category}</td>
883
1383
  <td class="bar-cell">
884
1384
  <div class="mini-bar">
885
- <span style="width: ${c}%"></span>
1385
+ <span style="width: ${$}%"></span>
886
1386
  </div>
887
1387
  </td>
888
- <td class="score">${A(o,1)} / ${n}</td>
1388
+ <td class="score">${w(f,1)} / ${k}</td>
889
1389
  </tr>`})}
890
1390
  </tbody>
891
- </table>`:l}
892
- ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?s`<div class="tags">
893
- ${e.doshas?.map(a=>s`<span class="dosha">${a}</span>`)}
894
- ${e.doshaCancellations?.map(a=>s`<span class="cancel" title=${a.reason}>${a.dosha} cancelled</span>`)}
895
- </div>`:l}
896
- </article>`}};V.styles=[$,v`
1391
+ </table>`:n}
1392
+ ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?a`<div class="tags">
1393
+ ${e.doshas?.map(g=>a`<span class="dosha">${g}</span>`)}
1394
+ ${e.doshaCancellations?.map(g=>a`<span class="cancel" title=${g.reason}>${g.dosha} cancelled</span>`)}
1395
+ </div>`:n}
1396
+ </article>`}};re.styles=[b,x`
897
1397
  .card {
898
1398
  background: var(--roxy-bg, #fff);
899
1399
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -904,6 +1404,14 @@
904
1404
  gap: var(--roxy-space-md, 1rem);
905
1405
  }
906
1406
 
1407
+ .score-header {
1408
+ display: flex;
1409
+ align-items: center;
1410
+ gap: 1rem;
1411
+ }
1412
+ .score-info {
1413
+ flex: 1;
1414
+ }
907
1415
  .score-bar {
908
1416
  display: grid;
909
1417
  grid-template-columns: 1fr auto;
@@ -925,6 +1433,26 @@
925
1433
  font-size: var(--roxy-text-sm, 0.875rem);
926
1434
  color: var(--roxy-secondary, #475569);
927
1435
  }
1436
+ .score-ring {
1437
+ width: 120px;
1438
+ height: 120px;
1439
+ flex-shrink: 0;
1440
+ }
1441
+ .score-ring svg {
1442
+ width: 100%;
1443
+ height: 100%;
1444
+ }
1445
+ .score-ring .ring-text {
1446
+ font-size: 22px;
1447
+ font-weight: 700;
1448
+ fill: var(--roxy-fg, #0a0a0a);
1449
+ font-family: var(--roxy-font-sans);
1450
+ }
1451
+ .score-ring .ring-max {
1452
+ font-size: 10px;
1453
+ fill: var(--roxy-muted, #71717a);
1454
+ font-family: var(--roxy-font-sans);
1455
+ }
928
1456
 
929
1457
  table {
930
1458
  width: 100%;
@@ -986,48 +1514,48 @@
986
1514
  background: color-mix(in srgb, var(--roxy-success, #16a34a) 18%, transparent);
987
1515
  color: var(--roxy-success-fg, #166534);
988
1516
  }
989
- `],p([h({attribute:!1})],V.prototype,"data",2),V=p([b("roxy-guna-milan")],V);function Jt(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 be={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"},ut={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"},ae={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},gt={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"};var He={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"},yt={"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 O=class extends y{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 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:a,changingLinePositions:o,dailyMessage:n,resultingHexagram:c}=e,d=a??this.derivedLines(t),m=new Set(o??[]);return s`<article class="card" aria-label="I Ching hexagram">
1517
+ `],c([y({attribute:!1})],re.prototype,"data",2),re=c([v("roxy-guna-milan")],re);function ur(i){if(!i)return 1;switch(i.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var q=class extends u{constructor(){super(...arguments);this.data=null;this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let s=e;return{hex:s.hexagram,lines:s.lines,changingLinePositions:s.changingLinePositions,resultingHexagram:s.resultingHexagram}}let t=e;return{hex:t.hexagram,dailyMessage:t.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return a`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:t,lines:s,changingLinePositions:o,dailyMessage:l,resultingHexagram:d}=e,p=s??this.derivedLines(t),m=new Set(o??[]);return a`<article class="card" aria-label="I Ching hexagram">
990
1518
  <div class="glyphs">
991
- ${t.symbol?s`<div class="symbol">${t.symbol}</div>`:l}
1519
+ ${t.symbol?a`<div class="symbol">${t.symbol}</div>`:n}
992
1520
  <div class="lines" aria-hidden="true">
993
- ${d.slice().reverse().map((g,u)=>{let f=d.length-1-u+1,w=m.has(f),x=g===6||g===8;return s`<div class="line ${`${x?"broken":"solid"}${w?" changing":""}`}">
994
- ${x?k`<span class="seg"></span><span class="seg"></span>`:k`<span class="seg"></span>`}
1521
+ ${p.slice().reverse().map((h,g)=>{let f=p.length-1-g+1,k=m.has(f),$=h===6||h===8;return a`<div class="line ${`${$?"broken":"solid"}${k?" changing":""}`}">
1522
+ ${$?S`<span class="seg"></span><span class="seg"></span>`:S`<span class="seg"></span>`}
995
1523
  </div>`})}
996
1524
  </div>
997
1525
  </div>
998
1526
  <div>
999
1527
  <h2 class="title">
1000
- ${t.number?s`${t.number}. `:l}${t.english??t.chinese??"Hexagram"}
1528
+ ${t.number?a`${t.number}. `:n}${t.english??t.chinese??"Hexagram"}
1001
1529
  </h2>
1002
1530
  <p class="subtitle">
1003
- ${t.chinese?s`${t.chinese}`:l}
1004
- ${t.pinyin?s` · ${t.pinyin}`:l}
1531
+ ${t.chinese?a`${t.chinese}`:n}
1532
+ ${t.pinyin?a` · ${t.pinyin}`:n}
1005
1533
  </p>
1006
1534
  <div class="trigrams">
1007
- ${t.upperTrigram?s`<div>
1535
+ ${t.upperTrigram?a`<div>
1008
1536
  Upper
1009
1537
  <span class="tri-glyph"
1010
- >${He[t.upperTrigram]??""}</span
1538
+ >${at[t.upperTrigram]??""}</span
1011
1539
  >${t.upperTrigram}
1012
- </div>`:l}
1013
- ${t.lowerTrigram?s`<div>
1540
+ </div>`:n}
1541
+ ${t.lowerTrigram?a`<div>
1014
1542
  Lower
1015
1543
  <span class="tri-glyph"
1016
- >${He[t.lowerTrigram]??""}</span
1544
+ >${at[t.lowerTrigram]??""}</span
1017
1545
  >${t.lowerTrigram}
1018
- </div>`:l}
1546
+ </div>`:n}
1019
1547
  </div>
1020
- ${t.judgment?s`<p class="judgment">${t.judgment}</p>`:l}
1021
- ${t.image?s`<p class="image">${t.image}</p>`:l}
1022
- ${n?s`<p class="message">${n}</p>`:l}
1023
- ${t.interpretation?.general?s`<p>${t.interpretation.general}</p>`:l}
1024
- ${m.size>0?s`<div class="changing">
1025
- Changing lines: ${Array.from(m).sort((g,u)=>g-u).join(", ")}.
1026
- ${c?.english?s` Becomes hexagram ${c.number}
1027
- ${c.english}.`:l}
1028
- </div>`:l}
1548
+ ${t.judgment?a`<p class="judgment">${t.judgment}</p>`:n}
1549
+ ${t.image?a`<p class="image">${t.image}</p>`:n}
1550
+ ${l?a`<p class="message">${l}</p>`:n}
1551
+ ${t.interpretation?.general?a`<p>${t.interpretation.general}</p>`:n}
1552
+ ${m.size>0?a`<div class="changing">
1553
+ Changing lines: ${Array.from(m).sort((h,g)=>h-g).join(", ")}.
1554
+ ${d?.english?a` Becomes hexagram ${d.number}
1555
+ ${d.english}.`:n}
1556
+ </div>`:n}
1029
1557
  </div>
1030
- </article>`}derivedLines(e){let t=e.symbol.codePointAt(0)??0;if(t>=19904&&t<=19967){let a=t-19904,o=[];for(let n=0;n<6;n++){let c=a>>n&1;o.push(c?8:7)}return o}return Array.from({length:6},()=>7)}};O.styles=[$,v`
1558
+ </article>`}derivedLines(e){let t=e.symbol.codePointAt(0)??0;if(t>=19904&&t<=19967){let s=t-19904,o=[];for(let l=0;l<6;l++){let d=s>>l&1;o.push(d?8:7)}return o}return Array.from({length:6},()=>7)}};q.styles=[b,x`
1031
1559
  .card {
1032
1560
  background: var(--roxy-bg, #fff);
1033
1561
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1134,67 +1662,67 @@
1134
1662
  color: var(--roxy-accent-fg, #b45309);
1135
1663
  font-size: var(--roxy-text-sm, 0.875rem);
1136
1664
  }
1137
- `],p([h({attribute:!1})],O.prototype,"data",2),p([h({type:String,reflect:!0})],O.prototype,"mode",2),O=p([b("roxy-hexagram")],O);var H=class extends y{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??"",a=t?ae[Xt(t)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,n="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return s`<article
1665
+ `],c([y({attribute:!1})],q.prototype,"data",2),c([y({type:String,reflect:!0})],q.prototype,"mode",2),q=c([v("roxy-hexagram")],q);var U=class extends u{constructor(){super(...arguments);this.data=null;this.period="daily"}render(){let e=this.data;if(!e)return a`<div class="roxy-empty" role="status">No horoscope data</div>`;let t=e.sign??"",s=t?N[C(t)]??"":"",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 a`<article
1138
1666
  class="card"
1139
1667
  aria-label=${`${this.period} horoscope for ${t}`}
1140
1668
  >
1141
1669
  <header class="head">
1142
- <span class="glyph" aria-hidden="true">${a}</span>
1670
+ <span class="glyph" aria-hidden="true">${s}</span>
1143
1671
  <div>
1144
1672
  <h2 class="title">${t} ${this.period}</h2>
1145
- ${n?s`<div class="date">${n}</div>`:l}
1673
+ ${l?a`<div class="date">${l}</div>`:n}
1146
1674
  </div>
1147
- ${o!==null?s`<span class="energy" aria-label=${`Energy ${o} of 10`}>
1675
+ ${o!==null?a`<span class="energy" aria-label=${`Energy ${o} of 10`}>
1148
1676
  Energy ${o}/10
1149
1677
  <span class="energy-bar"
1150
1678
  ><span style="width: ${o/10*100}%"></span
1151
1679
  ></span>
1152
- </span>`:l}
1680
+ </span>`:n}
1153
1681
  </header>
1154
1682
 
1155
- ${e.overview?s`<p class="overview">${e.overview}</p>`:l}
1683
+ ${e.overview?a`<p class="overview">${e.overview}</p>`:n}
1156
1684
 
1157
1685
  <div class="sections">
1158
- ${e.love?s`<div class="section">
1686
+ ${e.love?a`<div class="section">
1159
1687
  <h3>Love</h3>
1160
1688
  <p>${e.love}</p>
1161
- </div>`:l}
1162
- ${e.career?s`<div class="section">
1689
+ </div>`:n}
1690
+ ${e.career?a`<div class="section">
1163
1691
  <h3>Career</h3>
1164
1692
  <p>${e.career}</p>
1165
- </div>`:l}
1166
- ${e.health?s`<div class="section">
1693
+ </div>`:n}
1694
+ ${e.health?a`<div class="section">
1167
1695
  <h3>Health</h3>
1168
1696
  <p>${e.health}</p>
1169
- </div>`:l}
1170
- ${e.finance?s`<div class="section">
1697
+ </div>`:n}
1698
+ ${e.finance?a`<div class="section">
1171
1699
  <h3>Finance</h3>
1172
1700
  <p>${e.finance}</p>
1173
- </div>`:l}
1174
- ${"advice"in e&&e.advice?s`<div class="section">
1701
+ </div>`:n}
1702
+ ${"advice"in e&&e.advice?a`<div class="section">
1175
1703
  <h3>Advice</h3>
1176
1704
  <p>${e.advice}</p>
1177
- </div>`:l}
1705
+ </div>`:n}
1178
1706
  </div>
1179
1707
 
1180
- ${(()=>{let c="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,d="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],g="luckyDays"in e&&e.luckyDays?e.luckyDays:[],u=e.compatibleSigns??[];return c===void 0&&!d&&m.length===0&&g.length===0&&u.length===0?l:s`<div class="lucky">
1181
- ${c!==void 0?s`<span>Lucky number <strong>${c}</strong></span>`:l}
1182
- ${d?s`<span>Lucky color <strong>${d}</strong></span>`:l}
1183
- ${m.length?s`<span
1708
+ ${(()=>{let d="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,p="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],h="luckyDays"in e&&e.luckyDays?e.luckyDays:[],g=e.compatibleSigns??[];return d===void 0&&!p&&m.length===0&&h.length===0&&g.length===0?n:a`<div class="lucky">
1709
+ ${d!==void 0?a`<span>Lucky number <strong>${d}</strong></span>`:n}
1710
+ ${p?a`<span>Lucky color <strong>${p}</strong></span>`:n}
1711
+ ${m.length?a`<span
1184
1712
  >Lucky numbers
1185
1713
  <strong>${m.join(", ")}</strong></span
1186
- >`:l}
1187
- ${g.length?s`<span
1188
- >Lucky days <strong>${g.join(", ")}</strong></span
1189
- >`:l}
1190
- ${u.length?s`<span class="compat-wrap">
1714
+ >`:n}
1715
+ ${h.length?a`<span
1716
+ >Lucky days <strong>${h.join(", ")}</strong></span
1717
+ >`:n}
1718
+ ${g.length?a`<span class="compat-wrap">
1191
1719
  Best with
1192
1720
  <span class="compat"
1193
- >${u.map(f=>s`<span>${f}</span>`)}</span
1721
+ >${g.map(f=>a`<span>${f}</span>`)}</span
1194
1722
  >
1195
- </span>`:l}
1723
+ </span>`:n}
1196
1724
  </div>`})()}
1197
- </article>`}};H.styles=[$,v`
1725
+ </article>`}};U.styles=[b,x`
1198
1726
  .card {
1199
1727
  background: var(--roxy-bg, #fff);
1200
1728
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1296,6 +1824,13 @@
1296
1824
  font-weight: var(--roxy-weight-bold, 600);
1297
1825
  }
1298
1826
 
1827
+ .compat-wrap {
1828
+ width: 100%;
1829
+ display: flex;
1830
+ align-items: center;
1831
+ flex-wrap: wrap;
1832
+ gap: var(--roxy-space-xs, 0.25rem);
1833
+ }
1299
1834
  .compat {
1300
1835
  display: flex;
1301
1836
  flex-wrap: wrap;
@@ -1309,14 +1844,14 @@
1309
1844
  font-size: var(--roxy-text-xs, 0.75rem);
1310
1845
  text-transform: capitalize;
1311
1846
  }
1312
- `],p([h({attribute:!1})],H.prototype,"data",2),p([h({type:String,reflect:!0})],H.prototype,"period",2),H=p([b("roxy-horoscope-card")],H);function Xt(i){return i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()}var F=class extends y{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
1847
+ `],c([y({attribute:!1})],U.prototype,"data",2),c([y({type:String,reflect:!0})],U.prototype,"period",2),U=c([v("roxy-horoscope-card")],U);var ae=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return a`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return a`<div
1313
1848
  class="wrap"
1314
1849
  aria-label="KP planets table"
1315
1850
  tabindex="0"
1316
1851
  >
1317
1852
  <header class="head">
1318
1853
  <h2 class="title">KP planets</h2>
1319
- ${typeof this.data.ayanamsa=="number"?s`<span class="ayanamsa">Ayanamsa: ${A(this.data.ayanamsa,2)}°</span>`:l}
1854
+ ${typeof this.data.ayanamsa=="number"?a`<span class="ayanamsa">Ayanamsa: ${w(this.data.ayanamsa,2)}°</span>`:n}
1320
1855
  </header>
1321
1856
  <table role="table">
1322
1857
  <thead>
@@ -1332,10 +1867,10 @@
1332
1867
  </tr>
1333
1868
  </thead>
1334
1869
  <tbody>
1335
- ${e.map(t=>s`<tr>
1870
+ ${e.map(t=>a`<tr>
1336
1871
  <td class="planet">
1337
1872
  ${t.planet}
1338
- ${t.retrograde?s`<span class="retro">R</span>`:l}
1873
+ ${t.retrograde?a`<span class="retro">R</span>`:n}
1339
1874
  </td>
1340
1875
  <td>${t.sign??""}</td>
1341
1876
  <td>${t.signLord??""}</td>
@@ -1347,7 +1882,7 @@
1347
1882
  </tr>`)}
1348
1883
  </tbody>
1349
1884
  </table>
1350
- </div>`}};F.styles=[$,v`
1885
+ </div>`}};ae.styles=[b,x`
1351
1886
  .wrap {
1352
1887
  border: 1px solid var(--roxy-border, #e4e4e7);
1353
1888
  border-radius: var(--roxy-radius-md, 8px);
@@ -1406,7 +1941,7 @@
1406
1941
  font-size: var(--roxy-text-xs, 0.75rem);
1407
1942
  margin-left: 4px;
1408
1943
  }
1409
- `],p([h({attribute:!1})],F.prototype,"data",2),F=p([b("roxy-kp-planets-table")],F);function xt(i,r){let e,t=((...a)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,i(...a)},r)});return t.cancel=()=>{e&&(clearTimeout(e),e=void 0)},t}var _=class extends y{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=xt(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 a=new URL(this.endpoint);a.searchParams.set("q",e),a.searchParams.set("limit","8");let o={Accept:"application/json"};this.apiKey&&(o["X-API-Key"]=this.apiKey),this.publishableKey&&(o["X-API-Key"]=this.publishableKey);let n=await fetch(a,{headers:o,signal:t.signal});if(!n.ok)throw new Error(`HTTP ${n.status}`);let c=await n.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(a){if(a?.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">
1944
+ `],c([y({attribute:!1})],ae.prototype,"data",2),ae=c([v("roxy-kp-planets-table")],ae);function je(i,r){let e,t=((...s)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,i(...s)},r)});return t.cancel=()=>{e&&(clearTimeout(e),e=void 0)},t}var T=class extends u{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=je(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 s=new URL(this.endpoint);s.searchParams.set("q",e),s.searchParams.set("limit","8");let o={Accept:"application/json"};this.apiKey&&(o["X-API-Key"]=this.apiKey),this.publishableKey&&(o["X-API-Key"]=this.publishableKey);let l=await fetch(s,{headers:o,signal:t.signal});if(!l.ok)throw new Error(`HTTP ${l.status}`);let d=await l.json();if(t.signal.aborted)return;this.results=d.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(s){if(s?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===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 a`<div class="field">
1410
1945
  <input
1411
1946
  type="text"
1412
1947
  role="combobox"
@@ -1420,13 +1955,13 @@
1420
1955
  @keydown=${this.onKeyDown}
1421
1956
  @focus=${()=>{this.results.length>0&&(this.isOpen=!0)}}
1422
1957
  />
1423
- ${this.isLoading?s`<span class="spinner" role="status" aria-label="Loading"></span>`:l}
1424
- ${this.isOpen?s`<ul
1958
+ ${this.isLoading?a`<span class="spinner" role="status" aria-label="Loading"></span>`:n}
1959
+ ${this.isOpen?a`<ul
1425
1960
  id="roxy-location-listbox"
1426
1961
  class="results"
1427
1962
  role="listbox"
1428
1963
  >
1429
- ${this.results.length===0?s`<li class="empty" role="status">No cities found</li>`:this.results.map((e,t)=>s`<li role="presentation">
1964
+ ${this.results.length===0?a`<li class="empty" role="status">No cities found</li>`:this.results.map((e,t)=>a`<li role="presentation">
1430
1965
  <button
1431
1966
  type="button"
1432
1967
  class="option"
@@ -1437,15 +1972,15 @@
1437
1972
  >
1438
1973
  <span class="city">${e.city}</span>
1439
1974
  <span class="where"
1440
- >${e.province?s`${e.province}, `:""}${e.country}</span
1975
+ >${e.province?a`${e.province}, `:""}${e.country}</span
1441
1976
  >
1442
1977
  <span class="tz"
1443
1978
  >UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span
1444
1979
  >
1445
1980
  </button>
1446
1981
  </li>`)}
1447
- </ul>`:l}
1448
- </div>`}};_.styles=[$,v`
1982
+ </ul>`:n}
1983
+ </div>`}};T.styles=[b,x`
1449
1984
  :host {
1450
1985
  display: block;
1451
1986
  position: relative;
@@ -1546,49 +2081,49 @@
1546
2081
  color: var(--roxy-muted, #71717a);
1547
2082
  font-size: var(--roxy-text-sm, 0.875rem);
1548
2083
  }
1549
- `],p([h({type:String,attribute:"api-key"})],_.prototype,"apiKey",2),p([h({type:String,attribute:"publishable-key"})],_.prototype,"publishableKey",2),p([h({type:String})],_.prototype,"endpoint",2),p([h({type:String})],_.prototype,"placeholder",2),p([h({type:String,attribute:"default-value"})],_.prototype,"defaultValue",2),p([P()],_.prototype,"query",2),p([P()],_.prototype,"results",2),p([P()],_.prototype,"isOpen",2),p([P()],_.prototype,"isLoading",2),p([P()],_.prototype,"highlight",2),_=p([b("roxy-location-search")],_);var G=class extends y{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 a="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return s`<article
2084
+ `],c([y({type:String,attribute:"api-key"})],T.prototype,"apiKey",2),c([y({type:String,attribute:"publishable-key"})],T.prototype,"publishableKey",2),c([y({type:String})],T.prototype,"endpoint",2),c([y({type:String})],T.prototype,"placeholder",2),c([y({type:String,attribute:"default-value"})],T.prototype,"defaultValue",2),c([E()],T.prototype,"query",2),c([E()],T.prototype,"results",2),c([E()],T.prototype,"isOpen",2),c([E()],T.prototype,"isLoading",2),c([E()],T.prototype,"highlight",2),T=c([v("roxy-location-search")],T);var Y=class extends u{constructor(){super(...arguments);this.data=null;this.mode="current"}render(){let e=this.data;if(!e)return a`<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 s="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return a`<article
1550
2085
  class="card"
1551
2086
  aria-label="Moon phase calendar"
1552
2087
  >
1553
- <h2 class="label">${a??"Moon phases"} ${o??""}</h2>
2088
+ <h2 class="label">${s??"Moon phases"} ${o??""}</h2>
1554
2089
  <div class="list" role="list">
1555
- ${t.map(n=>this.renderListItem(n))}
2090
+ ${t.map(l=>this.renderListItem(l))}
1556
2091
  </div>
1557
- </article>`}return"phase"in e?this.renderSingle(e):l}renderSingle(e){let t=ft(e.phase);return s`<article class="card" aria-label="Current moon phase">
2092
+ </article>`}return"phase"in e?this.renderSingle(e):n}renderSingle(e){let t=Mt(e.phase);return a`<article class="card" aria-label="Current moon phase">
1558
2093
  <div class="hero">
1559
2094
  <span class="emoji" aria-hidden="true">${t}</span>
1560
2095
  <div>
1561
2096
  <h2 class="label">${e.phase??"Moon"}</h2>
1562
- ${e.date?s`<div class="date">${e.date}</div>`:l}
2097
+ ${e.date?a`<div class="date">${e.date}</div>`:n}
1563
2098
  </div>
1564
2099
  </div>
1565
2100
  <div class="stats">
1566
- ${typeof e.illumination=="number"?s`<div>
2101
+ ${typeof e.illumination=="number"?a`<div>
1567
2102
  <span>Illumination</span>
1568
- <strong>${Zt(e.illumination)}</strong>
1569
- </div>`:l}
1570
- ${typeof e.age=="number"?s`<div>
2103
+ <strong>${xr(e.illumination)}</strong>
2104
+ </div>`:n}
2105
+ ${typeof e.age=="number"?a`<div>
1571
2106
  <span>Age</span>
1572
- <strong>${A(e.age,1)} days</strong>
1573
- </div>`:l}
1574
- ${e.sign?s`<div>
2107
+ <strong>${w(e.age,1)} days</strong>
2108
+ </div>`:n}
2109
+ ${e.sign?a`<div>
1575
2110
  <span>Sign</span>
1576
2111
  <strong>${e.sign}</strong>
1577
- </div>`:l}
1578
- ${typeof e.distance=="number"?s`<div>
2112
+ </div>`:n}
2113
+ ${typeof e.distance=="number"?a`<div>
1579
2114
  <span>Distance</span>
1580
2115
  <strong>${(e.distance/1e3).toFixed(0)}k km</strong>
1581
- </div>`:l}
2116
+ </div>`:n}
1582
2117
  </div>
1583
- ${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l}
1584
- ${e.meaning?.keywords?.length?s`<div class="keywords">
1585
- ${e.meaning.keywords.map(a=>s`<span>${a}</span>`)}
1586
- </div>`:l}
1587
- </article>`}renderListItem(e){let t=ft(e.phase);return s`<div class="list-item" role="listitem">
2118
+ ${e.meaning?.description?a`<p class="meaning">${e.meaning.description}</p>`:n}
2119
+ ${e.meaning?.keywords?.length?a`<div class="keywords">
2120
+ ${e.meaning.keywords.map(s=>a`<span>${s}</span>`)}
2121
+ </div>`:n}
2122
+ </article>`}renderListItem(e){let t=Mt(e.phase);return a`<div class="list-item" role="listitem">
1588
2123
  <span aria-hidden="true">${t}</span>
1589
2124
  <span>${e.phase}</span>
1590
2125
  <span>${e.date??""}</span>
1591
- </div>`}};G.styles=[$,v`
2126
+ </div>`}};Y.styles=[b,x`
1592
2127
  .card {
1593
2128
  background: var(--roxy-bg, #fff);
1594
2129
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1670,15 +2205,15 @@
1670
2205
  .list-item:last-child {
1671
2206
  border-bottom: none;
1672
2207
  }
1673
- `],p([h({attribute:!1})],G.prototype,"data",2),p([h({type:String,reflect:!0})],G.prototype,"mode",2),G=p([b("roxy-moon-phase")],G);function ft(i){return i?yt[i.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Zt(i){let r=i<=1?i*100:i;return`${Math.round(r)}%`}function C(i,r,e,t){let a=t*Math.PI/180;return{x:i+e*Math.cos(a),y:r+e*Math.sin(a)}}var Ie=384,S=Ie/2,Ge=150,Qt=134,je=110,$e=88,er=162,tr=176,j=class extends y{constructor(){super(...arguments);this.data=null;this.houseSystem="placidus"}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),t=this.data.aspects??[];return s`<div class="wrap">
2208
+ `],c([y({attribute:!1})],Y.prototype,"data",2),c([y({type:String,reflect:!0})],Y.prototype,"mode",2),Y=c([v("roxy-moon-phase")],Y);function Mt(i){return i?Tt[i.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function xr(i){let r=i<=1?i*100:i;return`${Math.round(r)}%`}function R(i,r,e,t){let s=t*Math.PI/180;return{x:i+e*Math.cos(s),y:r+e*Math.sin(s)}}var lt=420,A=lt/2,it=164,fr=146,nt=120,Ie=96,vr=178,br=196,K=class extends u{constructor(){super(...arguments);this.data=null;this.houseSystem="placidus"}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return a`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),t=this.data.aspects??[];return a`<div class="wrap">
1674
2209
  <header>
1675
2210
  <h2 class="title">Natal chart</h2>
1676
- ${this.data.birthDetails?s`<div class="meta">
2211
+ ${this.data.birthDetails?a`<div class="meta">
1677
2212
  ${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}
1678
- </div>`:l}
2213
+ </div>`:n}
1679
2214
  </header>
1680
2215
  <svg
1681
- viewBox="0 0 ${Ie} ${Ie}"
2216
+ viewBox="0 0 ${lt} ${lt}"
1682
2217
  role="img"
1683
2218
  aria-label="Natal chart wheel with twelve houses, planets, and aspects"
1684
2219
  >
@@ -1689,23 +2224,23 @@
1689
2224
  </desc>
1690
2225
  <circle
1691
2226
  class="wheel-line"
1692
- cx=${S}
1693
- cy=${S}
1694
- r=${Ge}
2227
+ cx=${A}
2228
+ cy=${A}
2229
+ r=${it}
1695
2230
  stroke-width="1.5"
1696
2231
  />
1697
2232
  <circle
1698
2233
  class="wheel-line"
1699
- cx=${S}
1700
- cy=${S}
1701
- r=${je}
2234
+ cx=${A}
2235
+ cy=${A}
2236
+ r=${nt}
1702
2237
  stroke-width="1"
1703
2238
  />
1704
2239
  <circle
1705
2240
  class="wheel-line"
1706
- cx=${S}
1707
- cy=${S}
1708
- r=${$e-16}
2241
+ cx=${A}
2242
+ cy=${A}
2243
+ r=${Ie-16}
1709
2244
  stroke-width="0.5"
1710
2245
  />
1711
2246
  ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()}
@@ -1718,12 +2253,56 @@
1718
2253
  <span><span class="legend-swatch" style="background: var(--roxy-success)"></span>harmonious</span>
1719
2254
  <span><span class="legend-swatch" style="background: var(--roxy-danger)"></span>challenging</span>
1720
2255
  </div>
1721
- </div>`}renderAngles(){let e=this.getAscendant(),t=this.getMidheaven(),a=[this.renderAngleMark(e,"ASC")];return t!==null&&a.push(this.renderAngleMark(t,"MC")),a}renderAngleMark(e,t){let a=this.toAngle(e),o=C(S,S,Ge,a),n=C(S,S,er,a),c=C(S,S,tr,a);return k`
2256
+ ${this.renderDetails()}
2257
+ ${this.renderInterpretations()}
2258
+ </div>`}renderAngles(){let e=this.getAscendant(),t=this.getMidheaven(),s=[this.renderAngleMark(e,"ASC")];return t!==null&&s.push(this.renderAngleMark(t,"MC")),s}renderAngleMark(e,t){let s=this.toAngle(e),o=R(A,A,it,s),l=R(A,A,vr,s),d=R(A,A,br,s);return S`
1722
2259
  <g>
1723
- <line class="angle-tick" x1=${o.x} y1=${o.y} x2=${n.x} y2=${n.y} />
1724
- <text class="angle-marker" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${t}</text>
2260
+ <line class="angle-tick" x1=${o.x} y1=${o.y} x2=${l.x} y2=${l.y} />
2261
+ <text class="angle-marker" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${t}</text>
1725
2262
  </g>
1726
- `}renderSpokes(){return Array.from({length:12},(e,t)=>{let a=this.toAngle(t*30),o=C(S,S,je,a),n=C(S,S,Ge,a);return k`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${n.x} y2=${n.y} stroke-width="0.8" />`})}renderSigns(){return["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"].map((t,a)=>{let o=this.toAngle(a*30+15),n=C(S,S,Qt,o);return k`<text class="sign-glyph" x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central">${ae[t]}</text>`})}renderHouseNumbers(){let e=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,a)=>{let o=this.toAngle(a*30+15),n=C(S,S,je-12,o),c=(a-e+12)%12+1;return k`<text class="house-num" x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central">${c}</text>`})}renderPlanets(e){return e.map(t=>{if(!Number.isFinite(t.longitude))return l;let a=this.toAngle(t.longitude),o=C(S,S,$e,a),n=be[we(t.name)]??t.name.slice(0,2),c=t.isRetrograde?" R":"",d=c?`${n}\u1D3F`:n;return k`<text class="planet-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central"><title>${t.name}${c}</title>${d}</text>`})}renderAspects(e,t){let a=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let n=we(o.name);n&&a.set(n,o.longitude)}return t.map(o=>{let n=a.get(we(o.planet1)),c=a.get(we(o.planet2));if(n===void 0||c===void 0)return l;let d=C(S,S,$e-18,this.toAngle(n)),m=C(S,S,$e-18,this.toAngle(c)),g=ar(o),u=rr[g]??"aspect-other",f=A(o.orb,1);return k`<line class=${`aspect ${u}`} x1=${d.x} y1=${d.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${g||""} ${o.planet2}${f?` (orb ${f}\xB0)`:""}</title></line>`})}};j.styles=[$,v`
2263
+ `}renderSpokes(){return Array.from({length:12},(e,t)=>{let s=this.toAngle(t*30),o=R(A,A,nt,s),l=R(A,A,it,s);return S`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${l.x} y2=${l.y} stroke-width="0.8" />`})}renderSigns(){return pe.map((e,t)=>{let s=this.toAngle(t*30+15),o=R(A,A,fr,s);return S`<text class="sign-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${N[e]}</text>`})}renderHouseNumbers(){let e=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,s)=>{let o=this.toAngle(s*30+15),l=R(A,A,nt-12,o),d=(s-e+12)%12+1;return S`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${d}</text>`})}renderPlanets(e){return e.map(t=>{if(!Number.isFinite(t.longitude))return n;let s=this.toAngle(t.longitude),o=R(A,A,Ie,s),l=L[C(t.name)]??t.name.slice(0,2),d=t.isRetrograde?" R":"",p=d?`${l}\u1D3F`:l;return S`<text class="planet-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central"><title>${t.name}${d}</title>${p}</text>`})}renderDetails(){let e=this.data?.summary,t=this.data?.aspectsInterpretation;if(!e&&!t)return n;let s=e?.retrogradePlanets??[],o=e?.elementDistribution??{},l=e?.modalityDistribution??{},d=Math.max(1,...Object.values(o)),p=Math.max(1,...Object.values(l));return a`<div class="details">
2264
+ ${e?.dominantElement||e?.dominantModality?a`<div class="pill-row">
2265
+ ${e.dominantElement?a`<span class="pill">Dominant element: ${e.dominantElement}</span>`:n}
2266
+ ${e.dominantModality?a`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:n}
2267
+ </div>`:n}
2268
+ ${t?a`<div class="pill-row">
2269
+ <span class="pill pill--success">Harmonious ${t.harmonious}</span>
2270
+ <span class="pill pill--danger">Challenging ${t.challenging}</span>
2271
+ <span class="pill pill--muted">Neutral ${t.neutral}</span>
2272
+ </div>`:n}
2273
+ ${s.length>0?a`<div class="pill-row">
2274
+ ${s.map(m=>{let h=L[m]??m.slice(0,2);return a`<span class="pill pill--muted">${h} ${m} R</span>`})}
2275
+ </div>`:n}
2276
+ ${t?.summary?a`<p class="summary">${t.summary}</p>`:n}
2277
+ ${Object.keys(o).length>0||Object.keys(l).length>0?a`<div class="dist-grid">
2278
+ ${Object.keys(o).length>0?a`<div class="dist-section">
2279
+ <h3>Elements</h3>
2280
+ ${Object.entries(o).map(([m,h])=>a`<div class="dist-row">
2281
+ <span>${m}</span>
2282
+ <div class="dist-bar"><span style="width: ${Math.round(h/d*100)}%"></span></div>
2283
+ <span>${h}</span>
2284
+ </div>`)}
2285
+ </div>`:n}
2286
+ ${Object.keys(l).length>0?a`<div class="dist-section">
2287
+ <h3>Modalities</h3>
2288
+ ${Object.entries(l).map(([m,h])=>a`<div class="dist-row">
2289
+ <span>${m}</span>
2290
+ <div class="dist-bar"><span style="width: ${Math.round(h/p*100)}%"></span></div>
2291
+ <span>${h}</span>
2292
+ </div>`)}
2293
+ </div>`:n}
2294
+ </div>`:n}
2295
+ </div>`}renderInterpretations(){let e=this.getPlanets().filter(t=>t.interpretation);return e.length===0?n:a`<section class="interpretations">
2296
+ <h3>Planet readings</h3>
2297
+ ${e.map(t=>{let s=t.interpretation,o=L[C(t.name)]??"",l=w(t.degree??0,1);return a`<details class="interp-card">
2298
+ <summary>${o} ${t.name} <small>${t.sign??""} ${l}</small></summary>
2299
+ <div class="interp-body">
2300
+ ${s.summary?a`<p class="interp-summary">${s.summary}</p>`:n}
2301
+ ${s.detailed?a`<p class="interp-detail">${s.detailed}</p>`:n}
2302
+ ${s.keywords?.length?a`<div class="interp-keywords">${s.keywords.map(d=>a`<span class="kw">${d}</span>`)}</div>`:n}
2303
+ </div>
2304
+ </details>`})}
2305
+ </section>`}renderAspects(e,t){let s=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let l=C(o.name);l&&s.set(l,o.longitude)}return t.map(o=>{let l=s.get(C(o.planet1)),d=s.get(C(o.planet2));if(l===void 0||d===void 0)return n;let p=R(A,A,Ie-18,this.toAngle(l)),m=R(A,A,Ie-18,this.toAngle(d)),h=ke(o),g=ze[h]??"aspect-other",f=w(o.orb,1);return S`<line class=${`aspect ${g}`} x1=${p.x} y1=${p.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${h||""} ${o.planet2}${f?` (orb ${f}\xB0)`:""}</title></line>`})}};K.styles=[b,x`
1727
2306
  .wrap {
1728
2307
  width: 100%;
1729
2308
  display: grid;
@@ -1822,45 +2401,175 @@
1822
2401
  margin-right: 4px;
1823
2402
  vertical-align: middle;
1824
2403
  }
1825
- `],p([h({attribute:!1})],j.prototype,"data",2),p([h({type:String,attribute:"house-system",reflect:!0})],j.prototype,"houseSystem",2),j=p([b("roxy-natal-chart")],j);function we(i){return i?i.charAt(0).toUpperCase()+i.slice(1).toLowerCase():""}var rr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function ar(i){return(i.type??"").toLowerCase().replace(/_/g,"-")}var I=class extends y{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=sr[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 a=e.meaning?.keywords??[];return s`<article class="card" aria-label=${t}>
2404
+
2405
+ .details {
2406
+ margin-top: var(--roxy-space-md, 1rem);
2407
+ }
2408
+
2409
+ .pill-row {
2410
+ display: flex;
2411
+ flex-wrap: wrap;
2412
+ gap: var(--roxy-space-xs, 0.25rem);
2413
+ margin-bottom: var(--roxy-space-xs, 0.25rem);
2414
+ }
2415
+
2416
+ .pill {
2417
+ padding: 2px 8px;
2418
+ border-radius: var(--roxy-radius-sm, 4px);
2419
+ font-size: var(--roxy-text-xs, 0.75rem);
2420
+ background: color-mix(in srgb, var(--roxy-fg, #0f172a) 8%, transparent);
2421
+ color: var(--roxy-fg, #0f172a);
2422
+ }
2423
+
2424
+ .pill--success {
2425
+ background: color-mix(in srgb, var(--roxy-success, #16a34a) 15%, transparent);
2426
+ color: var(--roxy-success, #16a34a);
2427
+ }
2428
+
2429
+ .pill--danger {
2430
+ background: color-mix(in srgb, var(--roxy-danger, #dc2626) 15%, transparent);
2431
+ color: var(--roxy-danger, #dc2626);
2432
+ }
2433
+
2434
+ .pill--muted {
2435
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
2436
+ color: var(--roxy-fg, #0a0a0a);
2437
+ }
2438
+
2439
+ .summary {
2440
+ color: var(--roxy-fg, #0f172a);
2441
+ font-size: var(--roxy-text-sm, 0.875rem);
2442
+ margin: var(--roxy-space-md, 1rem) 0;
2443
+ }
2444
+
2445
+ .dist-grid {
2446
+ display: grid;
2447
+ grid-template-columns: 1fr 1fr;
2448
+ gap: var(--roxy-space-md, 1rem);
2449
+ }
2450
+
2451
+ @container (max-width: 639px) {
2452
+ .dist-grid {
2453
+ grid-template-columns: 1fr;
2454
+ }
2455
+ }
2456
+
2457
+ .dist-section h3 {
2458
+ font-size: var(--roxy-text-xs, 0.75rem);
2459
+ font-weight: var(--roxy-weight-bold, 600);
2460
+ color: var(--roxy-muted, #71717a);
2461
+ margin: 0 0 var(--roxy-space-xs, 0.25rem);
2462
+ text-transform: uppercase;
2463
+ letter-spacing: 0.05em;
2464
+ }
2465
+
2466
+ .dist-row {
2467
+ display: grid;
2468
+ grid-template-columns: 4rem 1fr 1.5rem;
2469
+ align-items: center;
2470
+ gap: var(--roxy-space-xs, 0.25rem);
2471
+ font-size: var(--roxy-text-xs, 0.75rem);
2472
+ color: var(--roxy-fg, #0f172a);
2473
+ margin-bottom: 4px;
2474
+ }
2475
+
2476
+ .dist-bar {
2477
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 20%, transparent);
2478
+ height: 6px;
2479
+ border-radius: 3px;
2480
+ }
2481
+
2482
+ .dist-bar > span {
2483
+ display: block;
2484
+ height: 100%;
2485
+ background: var(--roxy-accent, #f59e0b);
2486
+ border-radius: 3px;
2487
+ }
2488
+
2489
+ .interpretations {
2490
+ margin-top: var(--roxy-space-md, 1rem);
2491
+ }
2492
+ .interpretations h3 {
2493
+ font-size: var(--roxy-text-sm, 0.875rem);
2494
+ font-weight: 600;
2495
+ color: var(--roxy-muted, #71717a);
2496
+ text-transform: uppercase;
2497
+ letter-spacing: 0.06em;
2498
+ margin: 0 0 var(--roxy-space-sm, 0.5rem);
2499
+ }
2500
+ .interp-card {
2501
+ border: 1px solid var(--roxy-border, #e4e4e7);
2502
+ border-radius: var(--roxy-radius-md, 8px);
2503
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
2504
+ margin-bottom: var(--roxy-space-xs, 0.25rem);
2505
+ }
2506
+ .interp-card summary {
2507
+ cursor: pointer;
2508
+ font-weight: 500;
2509
+ color: var(--roxy-fg, #0f172a);
2510
+ }
2511
+ .interp-card summary small {
2512
+ color: var(--roxy-muted, #71717a);
2513
+ margin-left: 0.5em;
2514
+ font-weight: 400;
2515
+ }
2516
+ .interp-body {
2517
+ margin-top: var(--roxy-space-xs, 0.25rem);
2518
+ color: var(--roxy-fg, #0f172a);
2519
+ font-size: var(--roxy-text-sm, 0.875rem);
2520
+ }
2521
+ .interp-keywords {
2522
+ display: flex;
2523
+ flex-wrap: wrap;
2524
+ gap: 0.25rem;
2525
+ margin-top: 0.5rem;
2526
+ }
2527
+ .interp-keywords .kw {
2528
+ padding: 1px 8px;
2529
+ border-radius: 9999px;
2530
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
2531
+ color: var(--roxy-accent-fg, #b45309);
2532
+ font-size: var(--roxy-text-xs, 0.75rem);
2533
+ }
2534
+ `],c([y({attribute:!1})],K.prototype,"data",2),c([y({type:String,attribute:"house-system",reflect:!0})],K.prototype,"houseSystem",2),K=c([v("roxy-natal-chart")],K);var V=class extends u{constructor(){super(...arguments);this.data=null;this.type="life-path"}render(){let e=this.data;if(!e)return a`<div class="roxy-empty" role="status">No numerology data</div>`;let t=$r[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 s=e.meaning?.keywords??[];return a`<article class="card" aria-label=${t}>
1826
2535
  <div class="hero">
1827
- ${typeof e.number=="number"?s`<div class="numeral">${e.number}</div>`:l}
2536
+ ${typeof e.number=="number"?a`<div class="numeral">${e.number}</div>`:n}
1828
2537
  <div>
1829
2538
  <p class="label">${t}</p>
1830
- ${e.meaning?.title?s`<h2 class="title">${e.meaning.title}</h2>`:l}
2539
+ ${e.meaning?.title?a`<h2 class="title">${e.meaning.title}</h2>`:n}
1831
2540
  </div>
1832
2541
  </div>
1833
- ${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l}
1834
- ${e.calculation?s`<pre class="calc">${e.calculation}</pre>`:l}
1835
- ${a.length>0?s`<div class="chips">
1836
- ${a.map(o=>s`<span>${o}</span>`)}
1837
- </div>`:l}
1838
- ${e.hasKarmicDebt&&e.karmicDebtNumber?s`<div class="karmic">
2542
+ ${e.meaning?.description?a`<p class="meaning">${e.meaning.description}</p>`:n}
2543
+ ${e.calculation?a`<pre class="calc">${e.calculation}</pre>`:n}
2544
+ ${s.length>0?a`<div class="chips">
2545
+ ${s.map(o=>a`<span>${o}</span>`)}
2546
+ </div>`:n}
2547
+ ${e.hasKarmicDebt&&e.karmicDebtNumber?a`<div class="karmic">
1839
2548
  Karmic debt ${e.karmicDebtNumber}.
1840
- ${or(e.karmicDebtMeaning)}
1841
- </div>`:l}
1842
- </article>`}renderPersonalYear(e,t){return s`<article class="card" aria-label=${t}>
2549
+ ${wr(e.karmicDebtMeaning)}
2550
+ </div>`:n}
2551
+ </article>`}renderPersonalYear(e,t){return a`<article class="card" aria-label=${t}>
1843
2552
  <div class="hero">
1844
- ${typeof e.personalYear=="number"?s`<div class="numeral">${e.personalYear}</div>`:l}
2553
+ ${typeof e.personalYear=="number"?a`<div class="numeral">${e.personalYear}</div>`:n}
1845
2554
  <div>
1846
2555
  <p class="label">${t}</p>
1847
- ${e.theme?s`<h2 class="title">${e.theme}</h2>`:l}
2556
+ ${e.theme?a`<h2 class="title">${e.theme}</h2>`:n}
1848
2557
  </div>
1849
2558
  </div>
1850
- ${e.forecast?s`<p class="meaning">${e.forecast}</p>`:l}
1851
- ${e.advice?s`<p>${e.advice}</p>`:l}
1852
- </article>`}renderChart(e,t){let a=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return s`<article class="card" aria-label=${t}>
2559
+ ${e.forecast?a`<p class="meaning">${e.forecast}</p>`:n}
2560
+ ${e.advice?a`<p>${e.advice}</p>`:n}
2561
+ </article>`}renderChart(e,t){let s=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return a`<article class="card" aria-label=${t}>
1853
2562
  <div>
1854
2563
  <p class="label">${t}</p>
1855
- ${e.profile?.name?s`<h2 class="title">${e.profile.name}</h2>`:l}
2564
+ ${e.profile?.name?a`<h2 class="title">${e.profile.name}</h2>`:n}
1856
2565
  </div>
1857
- ${a.length>0?s`<div class="cores">
1858
- ${a.map(([o,n])=>s`<div class="item">
1859
- <span>${ir(o)}</span>
1860
- <strong>${n.number??""}</strong>
2566
+ ${s.length>0?a`<div class="cores">
2567
+ ${s.map(([o,l])=>a`<div class="item">
2568
+ <span>${ee(o)}</span>
2569
+ <strong>${l.number??""}</strong>
1861
2570
  </div>`)}
1862
- </div>`:l}
1863
- </article>`}};I.styles=[$,v`
2571
+ </div>`:n}
2572
+ </article>`}};V.styles=[b,x`
1864
2573
  .card {
1865
2574
  background: var(--roxy-bg, #fff);
1866
2575
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -1956,56 +2665,56 @@
1956
2665
  font-size: var(--roxy-text-sm, 0.875rem);
1957
2666
  color: var(--roxy-fg, #0a0a0a);
1958
2667
  }
1959
- `],p([h({attribute:!1})],I.prototype,"data",2),p([h({type:String,reflect:!0})],I.prototype,"type",2),I=p([b("roxy-numerology-card")],I);var sr={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function or(i){return i?[i.description,i.challenge,i.resolution].filter(Boolean).join(" "):""}function ir(i){return i.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,r=>r.toUpperCase())}var U=class extends y{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,a=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];t&&a.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]]:[],n=t?[["Rahu Kaal",t.rahuKaal],["Yamaganda",t.yamaganda],["Gulika",t.gulika]]:[];return s`<div class="wrap" aria-label="Panchang">
2668
+ `],c([y({attribute:!1})],V.prototype,"data",2),c([y({type:String,reflect:!0})],V.prototype,"type",2),V=c([v("roxy-numerology-card")],V);var $r={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function wr(i){return i?[i.description,i.challenge,i.resolution].filter(Boolean).join(" "):""}var F=class extends u{constructor(){super(...arguments);this.data=null;this.detail="detailed"}render(){let e=this.data;if(!e)return a`<div class="roxy-empty" role="status">No panchang data</div>`;let t="sunrise"in e?e:null,s=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];t&&s.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]]:[],l=t?[["Rahu Kaal",t.rahuKaal],["Yamaganda",t.yamaganda],["Gulika",t.gulika]]:[];return a`<div class="wrap" aria-label="Panchang">
1960
2669
  <header class="head">
1961
2670
  <h2 class="title">Panchang</h2>
1962
- <span class="date">${t?dt(t.date):""}</span>
2671
+ <span class="date">${t?Ne(t.date):""}</span>
1963
2672
  </header>
1964
2673
  <table>
1965
2674
  <tbody>
1966
- ${a.map(([c,d])=>s`<tr>
1967
- <th>${c}</th>
1968
- <td>${d}</td>
2675
+ ${s.map(([d,p])=>a`<tr>
2676
+ <th>${d}</th>
2677
+ <td>${p}</td>
1969
2678
  </tr>`)}
1970
- ${t?.sunrise?s`<tr>
2679
+ ${t?.sunrise?a`<tr>
1971
2680
  <th>Sunrise</th>
1972
- <td>${ee(t.sunrise)}</td>
1973
- </tr>`:l}
1974
- ${t?.sunset?s`<tr>
2681
+ <td>${O(t.sunrise)}</td>
2682
+ </tr>`:n}
2683
+ ${t?.sunset?a`<tr>
1975
2684
  <th>Sunset</th>
1976
- <td>${ee(t.sunset)}</td>
1977
- </tr>`:l}
1978
- ${t?.moonrise?s`<tr>
2685
+ <td>${O(t.sunset)}</td>
2686
+ </tr>`:n}
2687
+ ${t?.moonrise?a`<tr>
1979
2688
  <th>Moonrise</th>
1980
- <td>${ee(t.moonrise)}</td>
1981
- </tr>`:l}
1982
- ${t?.moonset?s`<tr>
2689
+ <td>${O(t.moonrise)}</td>
2690
+ </tr>`:n}
2691
+ ${t?.moonset?a`<tr>
1983
2692
  <th>Moonset</th>
1984
- <td>${ee(t.moonset)}</td>
1985
- </tr>`:l}
2693
+ <td>${O(t.moonset)}</td>
2694
+ </tr>`:n}
1986
2695
  </tbody>
1987
2696
  </table>
1988
- ${this.detail==="detailed"&&(o.some(c=>!!c[1])||n.some(c=>!!c[1]))?s`
2697
+ ${this.detail==="detailed"&&(o.some(d=>!!d[1])||l.some(d=>!!d[1]))?a`
1989
2698
  <div class="section">Auspicious muhurtas</div>
1990
2699
  <table>
1991
2700
  <tbody>
1992
- ${o.filter(([,c])=>!!c).map(([c,d])=>s`<tr>
1993
- <th>${c}</th>
1994
- <td>${De(d)}</td>
2701
+ ${o.filter(([,d])=>!!d).map(([d,p])=>a`<tr>
2702
+ <th>${d}</th>
2703
+ <td>${st(p)}</td>
1995
2704
  </tr>`)}
1996
2705
  </tbody>
1997
2706
  </table>
1998
2707
  <div class="section">Inauspicious periods</div>
1999
2708
  <table>
2000
2709
  <tbody>
2001
- ${n.filter(([,c])=>!!c).map(([c,d])=>s`<tr>
2002
- <th>${c}</th>
2003
- <td>${De(d)}</td>
2710
+ ${l.filter(([,d])=>!!d).map(([d,p])=>a`<tr>
2711
+ <th>${d}</th>
2712
+ <td>${st(p)}</td>
2004
2713
  </tr>`)}
2005
2714
  </tbody>
2006
2715
  </table>
2007
- `:l}
2008
- </div>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let t=e;return[t.name,t.lord?`(${t.lord})`:"",t.phase].filter(Boolean).join(" ")}return String(e)}};U.styles=[$,v`
2716
+ `:n}
2717
+ </div>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let t=e;return[t.name,t.lord?`(${t.lord})`:"",t.phase].filter(Boolean).join(" ")}return String(e)}};F.styles=[b,x`
2009
2718
  .wrap {
2010
2719
  border: 1px solid var(--roxy-border, #e4e4e7);
2011
2720
  border-radius: var(--roxy-radius-md, 8px);
@@ -2063,78 +2772,263 @@
2063
2772
  text-transform: uppercase;
2064
2773
  letter-spacing: 0.06em;
2065
2774
  }
2066
- `],p([h({attribute:!1})],U.prototype,"data",2),p([h({type:String,reflect:!0})],U.prototype,"detail",2),U=p([b("roxy-panchang-table")],U);var Be=360,E=Be/2,vt=170,nr=154,bt=124,me=96,W=class extends y{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:a,analysis:o}=this.data,n=this.data.interAspects??[],c=e?.planets??[],d=t?.planets??[],m=typeof a=="number"?Math.round(a):void 0,g=o?.overall,u=o?.strengths??[],f=o?.challenges??[];return c.length>0&&d.length>0?s`<div
2067
- class="wrap"
2068
- aria-label="Synastry compatibility chart"
2069
- >
2775
+ `],c([y({attribute:!1})],F.prototype,"data",2),c([y({type:String,reflect:!0})],F.prototype,"detail",2),F=c([v("roxy-panchang-table")],F);var dt=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],se=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data?.planets?.length)return a`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((t,s)=>t.relativeRank-s.relativeRank);return a`<div class="wrap" aria-label="Shadbala planetary strength">
2070
2776
  <div class="head">
2071
- <h2 class="title">Synastry</h2>
2072
- ${typeof m=="number"?s`<span class="score" aria-label=${`Score ${m} of 100`}
2073
- >${m} / 100</span
2074
- >`:l}
2777
+ <h2 class="title">Shadbala</h2>
2778
+ <p class="subtitle">${e.length} planets ranked by strength</p>
2075
2779
  </div>
2076
- <svg
2077
- viewBox="0 0 ${Be} ${Be}"
2078
- role="img"
2079
- aria-label="Dual chart wheel comparing two natal charts"
2080
- >
2081
- <title>Synastry dual wheel</title>
2082
- <circle
2083
- class="wheel-line"
2084
- cx=${E}
2085
- cy=${E}
2086
- r=${vt}
2087
- stroke-width="1.5"
2088
- />
2089
- <circle
2090
- class="wheel-line"
2091
- cx=${E}
2092
- cy=${E}
2093
- r=${me+14}
2094
- stroke-width="0.8"
2095
- />
2096
- <circle
2097
- class="wheel-line"
2098
- cx=${E}
2099
- cy=${E}
2100
- r=${me-14}
2101
- stroke-width="0.6"
2102
- />
2103
- ${this.renderSpokes()} ${this.renderSigns()}
2104
- ${this.renderInterAspectLines(c,d,n)}
2105
- ${this.renderRing(c,bt,"p1")} ${this.renderRing(d,me,"p2")}
2106
- </svg>
2107
- <div class="legend-row">
2108
- <span><span class="swatch" style="background: var(--roxy-accent)"></span>Person 1</span>
2109
- <span><span class="swatch" style="background: var(--roxy-info)"></span>Person 2</span>
2110
- <span><span class="swatch" style="background: var(--roxy-success)"></span>harmonious</span>
2111
- <span><span class="swatch" style="background: var(--roxy-danger)"></span>challenging</span>
2780
+
2781
+ <div role="list" aria-label="Planet strength bars">
2782
+ ${e.map(t=>this.renderPlanetRow(t))}
2112
2783
  </div>
2113
- ${g?s`<p class="summary">${g}</p>`:l}
2114
- ${n.length>0?this.renderAspects(n):l}
2115
- ${u.length>0||f.length>0?s`<div class="lists">
2116
- ${u.length?s`<div>
2117
- <h3>Strengths</h3>
2118
- <ul>
2119
- ${u.map(x=>s`<li>${x}</li>`)}
2120
- </ul>
2121
- </div>`:l}
2122
- ${f.length?s`<div>
2123
- <h3>Challenges</h3>
2124
- <ul>
2125
- ${f.map(x=>s`<li>${x}</li>`)}
2784
+
2785
+ <div class="legend" aria-label="Strength component legend">
2786
+ ${dt.map(t=>a`<div class="legend-row">
2787
+ <span
2788
+ class="legend-swatch"
2789
+ style="background: ${t.color}"
2790
+ aria-hidden="true"
2791
+ ></span>
2792
+ ${t.label}
2793
+ </div>`)}
2794
+ </div>
2795
+ </div>`}renderPlanetRow(e){let t=L[C(e.planet)]??"",s=dt.map(h=>Math.max(0,e[h.key])),o=s.reduce((h,g)=>h+g,0),l=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,d=l?"adequacy-badge--adequate":"adequacy-badge--weak",p=l?"adequate":"weak",m=w(e.totalRupas,2)&&w(e.minRequired,2)?`${w(e.totalRupas,2)} / ${w(e.minRequired,2)} R`:"";return a`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala">
2796
+ <div class="planet-label">
2797
+ <span class="glyph" aria-hidden="true">${t}</span>
2798
+ ${e.planet}
2799
+ <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span>
2800
+ </div>
2801
+ <div class="bar-wrap">
2802
+ <div class="bar" role="img" aria-label="Strength components for ${e.planet}">
2803
+ ${o>0?dt.map((h,g)=>{let f=s[g];if(f<=0)return n;let k=f/o*100;return a`<div
2804
+ class="bar-segment"
2805
+ style="flex-grow: ${k}; background: ${h.color};"
2806
+ title="${h.label}: ${w(f,1)}"
2807
+ ></div>`}):n}
2808
+ </div>
2809
+ </div>
2810
+ <div class="pills">
2811
+ ${m?a`<span class="rupas-label">${m}</span>`:n}
2812
+ <span class="${`adequacy-badge ${d}`}">${p}</span>
2813
+ </div>
2814
+ </div>`}};se.styles=[b,x`
2815
+ .wrap {
2816
+ display: grid;
2817
+ gap: var(--roxy-space-md, 1rem);
2818
+ }
2819
+
2820
+ .head {
2821
+ display: flex;
2822
+ justify-content: space-between;
2823
+ align-items: baseline;
2824
+ gap: var(--roxy-space-md, 1rem);
2825
+ flex-wrap: wrap;
2826
+ }
2827
+
2828
+ .title {
2829
+ font-size: var(--roxy-text-lg, 1.125rem);
2830
+ font-weight: var(--roxy-weight-bold, 600);
2831
+ margin: 0;
2832
+ }
2833
+
2834
+ .subtitle {
2835
+ color: var(--roxy-muted, #71717a);
2836
+ font-size: var(--roxy-text-sm, 0.875rem);
2837
+ margin: 0;
2838
+ }
2839
+
2840
+ .planet-row {
2841
+ display: grid;
2842
+ grid-template-columns: 8rem 1fr auto;
2843
+ align-items: center;
2844
+ gap: var(--roxy-space-sm, 0.5rem);
2845
+ padding: var(--roxy-space-sm, 0.5rem) 0;
2846
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
2847
+ }
2848
+
2849
+ .planet-row:last-of-type {
2850
+ border-bottom: none;
2851
+ }
2852
+
2853
+ .planet-label {
2854
+ display: flex;
2855
+ align-items: center;
2856
+ gap: 6px;
2857
+ font-size: var(--roxy-text-sm, 0.875rem);
2858
+ font-weight: var(--roxy-weight-bold, 600);
2859
+ }
2860
+
2861
+ .glyph {
2862
+ font-size: 1.2em;
2863
+ line-height: 1;
2864
+ }
2865
+
2866
+ .bar-wrap {
2867
+ display: flex;
2868
+ flex-direction: column;
2869
+ gap: 4px;
2870
+ }
2871
+
2872
+ .bar {
2873
+ display: flex;
2874
+ height: 12px;
2875
+ border-radius: var(--roxy-radius-sm, 4px);
2876
+ overflow: hidden;
2877
+ background: var(--roxy-border, #e4e4e7);
2878
+ }
2879
+
2880
+ .bar-segment {
2881
+ height: 100%;
2882
+ transition: flex-grow var(--roxy-motion-duration, 200ms)
2883
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
2884
+ }
2885
+
2886
+ .pills {
2887
+ display: flex;
2888
+ flex-direction: column;
2889
+ align-items: flex-end;
2890
+ gap: 4px;
2891
+ }
2892
+
2893
+ .rupas-label {
2894
+ font-variant-numeric: tabular-nums;
2895
+ font-size: var(--roxy-text-xs, 0.75rem);
2896
+ color: var(--roxy-muted, #71717a);
2897
+ white-space: nowrap;
2898
+ }
2899
+
2900
+ .adequacy-badge {
2901
+ display: inline-block;
2902
+ padding: 1px 6px;
2903
+ border-radius: var(--roxy-radius-full, 9999px);
2904
+ font-size: var(--roxy-text-xs, 0.75rem);
2905
+ font-weight: var(--roxy-weight-bold, 600);
2906
+ }
2907
+
2908
+ .adequacy-badge--adequate {
2909
+ background: color-mix(in srgb, var(--roxy-success, #16a34a) 12%, transparent);
2910
+ color: var(--roxy-success-fg, #166534);
2911
+ }
2912
+
2913
+ .adequacy-badge--weak {
2914
+ background: color-mix(in srgb, var(--roxy-danger, #dc2626) 12%, transparent);
2915
+ color: var(--roxy-danger-fg, #991b1b);
2916
+ }
2917
+
2918
+ .rank-badge {
2919
+ font-size: var(--roxy-text-xs, 0.75rem);
2920
+ color: var(--roxy-accent-fg, #b45309);
2921
+ font-weight: var(--roxy-weight-bold, 600);
2922
+ }
2923
+
2924
+ .legend {
2925
+ display: flex;
2926
+ flex-wrap: wrap;
2927
+ gap: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
2928
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
2929
+ padding-top: var(--roxy-space-sm, 0.5rem);
2930
+ }
2931
+
2932
+ .legend-row {
2933
+ display: flex;
2934
+ align-items: center;
2935
+ gap: 6px;
2936
+ font-size: var(--roxy-text-xs, 0.75rem);
2937
+ color: var(--roxy-muted, #71717a);
2938
+ }
2939
+
2940
+ .legend-swatch {
2941
+ display: inline-block;
2942
+ width: 10px;
2943
+ height: 10px;
2944
+ border-radius: var(--roxy-radius-sm, 4px);
2945
+ flex-shrink: 0;
2946
+ }
2947
+
2948
+ @container (max-width: 480px) {
2949
+ .planet-row {
2950
+ grid-template-columns: 6rem 1fr;
2951
+ grid-template-rows: auto auto;
2952
+ }
2953
+ .pills {
2954
+ grid-column: 1 / -1;
2955
+ flex-direction: row;
2956
+ align-items: center;
2957
+ justify-content: flex-start;
2958
+ }
2959
+ }
2960
+ `],c([y({attribute:!1})],se.prototype,"data",2),se=c([v("roxy-shadbala-table")],se);var ct=360,P=ct/2,Dt=170,kr=154,Ot=124,Se=96,oe=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return a`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:t,compatibilityScore:s,analysis:o}=this.data,l=this.data.interAspects??[],d=e?.planets??[],p=t?.planets??[],m=typeof s=="number"?Math.round(s):void 0,h=o?.overall,g=o?.strengths??[],f=o?.challenges??[];return d.length>0&&p.length>0?a`<div
2961
+ class="wrap"
2962
+ aria-label="Synastry compatibility chart"
2963
+ >
2964
+ <div class="head">
2965
+ <h2 class="title">Synastry</h2>
2966
+ ${typeof m=="number"?a`<span class="score" aria-label=${`Score ${m} of 100`}
2967
+ >${m} / 100</span
2968
+ >`:n}
2969
+ </div>
2970
+ <svg
2971
+ viewBox="0 0 ${ct} ${ct}"
2972
+ role="img"
2973
+ aria-label="Dual chart wheel comparing two natal charts"
2974
+ >
2975
+ <title>Synastry dual wheel</title>
2976
+ <circle
2977
+ class="wheel-line"
2978
+ cx=${P}
2979
+ cy=${P}
2980
+ r=${Dt}
2981
+ stroke-width="1.5"
2982
+ />
2983
+ <circle
2984
+ class="wheel-line"
2985
+ cx=${P}
2986
+ cy=${P}
2987
+ r=${Se+14}
2988
+ stroke-width="0.8"
2989
+ />
2990
+ <circle
2991
+ class="wheel-line"
2992
+ cx=${P}
2993
+ cy=${P}
2994
+ r=${Se-14}
2995
+ stroke-width="0.6"
2996
+ />
2997
+ ${this.renderSpokes()} ${this.renderSigns()}
2998
+ ${this.renderInterAspectLines(d,p,l)}
2999
+ ${this.renderRing(d,Ot,"p1")} ${this.renderRing(p,Se,"p2")}
3000
+ </svg>
3001
+ <div class="legend-row">
3002
+ <span><span class="swatch" style="background: var(--roxy-accent)"></span>Person 1</span>
3003
+ <span><span class="swatch" style="background: var(--roxy-info)"></span>Person 2</span>
3004
+ <span><span class="swatch" style="background: var(--roxy-success)"></span>harmonious</span>
3005
+ <span><span class="swatch" style="background: var(--roxy-danger)"></span>challenging</span>
3006
+ </div>
3007
+ ${h?a`<p class="summary">${h}</p>`:n}
3008
+ ${l.length>0?this.renderAspects(l):n}
3009
+ ${g.length>0||f.length>0?a`<div class="lists">
3010
+ ${g.length?a`<div>
3011
+ <h3>Strengths</h3>
3012
+ <ul>
3013
+ ${g.map($=>a`<li>${$}</li>`)}
2126
3014
  </ul>
2127
- </div>`:l}
2128
- </div>`:l}
2129
- </div>`:s`<div
3015
+ </div>`:n}
3016
+ ${f.length?a`<div>
3017
+ <h3>Challenges</h3>
3018
+ <ul>
3019
+ ${f.map($=>a`<li>${$}</li>`)}
3020
+ </ul>
3021
+ </div>`:n}
3022
+ </div>`:n}
3023
+ </div>`:a`<div
2130
3024
  class="wrap"
2131
3025
  aria-label="Synastry compatibility chart"
2132
3026
  >
2133
3027
  <div class="head">
2134
3028
  <h2 class="title">Synastry</h2>
2135
- ${typeof m=="number"?s`<span class="score" aria-label=${`Score ${m} of 100`}
3029
+ ${typeof m=="number"?a`<span class="score" aria-label=${`Score ${m} of 100`}
2136
3030
  >${m} / 100</span
2137
- >`:l}
3031
+ >`:n}
2138
3032
  </div>
2139
3033
  <div class="missing-planets" role="status">
2140
3034
  Synastry response missing planet positions. Pass
@@ -2142,23 +3036,23 @@
2142
3036
  <code>person2.planets</code> arrays from the natal-chart endpoint, or
2143
3037
  use the <code>&lt;roxy-data&gt;</code> fallback.
2144
3038
  </div>
2145
- ${g?s`<p class="summary">${g}</p>`:l}
2146
- ${n.length>0?this.renderAspects(n):l}
2147
- ${u.length>0||f.length>0?s`<div class="lists">
2148
- ${u.length?s`<div>
3039
+ ${h?a`<p class="summary">${h}</p>`:n}
3040
+ ${l.length>0?this.renderAspects(l):n}
3041
+ ${g.length>0||f.length>0?a`<div class="lists">
3042
+ ${g.length?a`<div>
2149
3043
  <h3>Strengths</h3>
2150
3044
  <ul>
2151
- ${u.map(x=>s`<li>${x}</li>`)}
3045
+ ${g.map($=>a`<li>${$}</li>`)}
2152
3046
  </ul>
2153
- </div>`:l}
2154
- ${f.length?s`<div>
3047
+ </div>`:n}
3048
+ ${f.length?a`<div>
2155
3049
  <h3>Challenges</h3>
2156
3050
  <ul>
2157
- ${f.map(x=>s`<li>${x}</li>`)}
3051
+ ${f.map($=>a`<li>${$}</li>`)}
2158
3052
  </ul>
2159
- </div>`:l}
2160
- </div>`:l}
2161
- </div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,t)=>{let a=this.toAngle(t*30),o=C(E,E,me-14,a),n=C(E,E,vt,a);return k`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${n.x} y2=${n.y} stroke-width="0.6" />`})}renderSigns(){return["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"].map((t,a)=>{let o=this.toAngle(a*30+15),n=C(E,E,nr,o);return k`<text class="sign" x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central">${ae[t]}</text>`})}renderRing(e,t,a){return e.map(o=>{if(!Number.isFinite(o.longitude))return l;let n=C(E,E,t,this.toAngle(o.longitude)),c=be[Ue(o.name)]??o.name.slice(0,2);return k`<text class=${a} x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}</title>${c}</text>`})}renderInterAspectLines(e,t,a){let o=(n,c)=>{let d=Ue(c);for(let m of n)if(Ue(m.name)===d&&typeof m.longitude=="number")return m.longitude};return a.map(n=>{let c=o(e,n.planet1),d=o(t,n.planet2);if(c===void 0||d===void 0)return l;let m=C(E,E,bt-12,this.toAngle(c)),g=C(E,E,me+8,this.toAngle(d)),u=$t(n),f=lr[u]??"aspect-other",w=A(n.orb,1);return k`<line class=${`aspect ${f}`} x1=${m.x} y1=${m.y} x2=${g.x} y2=${g.y}><title>${n.planet1} ${u} ${n.planet2}${w?` (orb ${w}\xB0)`:""}</title></line>`})}renderAspects(e){return s`<table>
3053
+ </div>`:n}
3054
+ </div>`:n}
3055
+ </div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,t)=>{let s=this.toAngle(t*30),o=R(P,P,Se-14,s),l=R(P,P,Dt,s);return S`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${l.x} y2=${l.y} stroke-width="0.6" />`})}renderSigns(){return pe.map((e,t)=>{let s=this.toAngle(t*30+15),o=R(P,P,kr,s);return S`<text class="sign" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${N[e]}</text>`})}renderRing(e,t,s){return e.map(o=>{if(!Number.isFinite(o.longitude))return n;let l=R(P,P,t,this.toAngle(o.longitude)),d=L[C(o.name)]??o.name.slice(0,2);return S`<text class=${s} x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}</title>${d}</text>`})}renderInterAspectLines(e,t,s){let o=(l,d)=>{let p=C(d);for(let m of l)if(C(m.name)===p&&typeof m.longitude=="number")return m.longitude};return s.map(l=>{let d=o(e,l.planet1),p=o(t,l.planet2);if(d===void 0||p===void 0)return n;let m=R(P,P,Ot-12,this.toAngle(d)),h=R(P,P,Se+8,this.toAngle(p)),g=ke(l),f=ze[g]??"aspect-other",k=w(l.orb,1);return S`<line class=${`aspect ${f}`} x1=${m.x} y1=${m.y} x2=${h.x} y2=${h.y}><title>${l.planet1} ${g} ${l.planet2}${k?` (orb ${k}\xB0)`:""}</title></line>`})}renderAspects(e){return a`<table>
2162
3056
  <thead>
2163
3057
  <tr>
2164
3058
  <th>Planet 1</th>
@@ -2169,15 +3063,15 @@
2169
3063
  </tr>
2170
3064
  </thead>
2171
3065
  <tbody>
2172
- ${e.slice(0,12).map(t=>s`<tr>
3066
+ ${e.slice(0,12).map(t=>a`<tr>
2173
3067
  <td>${t.planet1}</td>
2174
3068
  <td>${t.planet2}</td>
2175
- <td>${$t(t)||""}</td>
2176
- <td class="orb">${A(t.orb,1)}</td>
2177
- <td>${cr(t.strength)}</td>
3069
+ <td>${ke(t)||""}</td>
3070
+ <td class="orb">${w(t.orb,1)}</td>
3071
+ <td>${Sr(t.strength)}</td>
2178
3072
  </tr>`)}
2179
3073
  </tbody>
2180
- </table>`}};W.styles=[$,v`
3074
+ </table>`}};oe.styles=[b,x`
2181
3075
  .wrap {
2182
3076
  display: grid;
2183
3077
  gap: var(--roxy-space-md, 1rem);
@@ -2329,17 +3223,17 @@
2329
3223
  padding: 0 4px;
2330
3224
  border-radius: 4px;
2331
3225
  }
2332
- `],p([h({attribute:!1})],W.prototype,"data",2),W=p([b("roxy-synastry-chart")],W);function Ue(i){return i?i.charAt(0).toUpperCase()+i.slice(1).toLowerCase():""}var lr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function $t(i){return(i.type??"").toLowerCase().replace(/_/g,"-")}function cr(i){return typeof i=="number"?Math.round(i).toString():""}var B=class extends y{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,a=this.flipped!==!!t.reversed,o=t.keywords??[];return s`<article class="card" aria-label=${t.name??"Tarot card"}>
3226
+ `],c([y({attribute:!1})],oe.prototype,"data",2),oe=c([v("roxy-synastry-chart")],oe);function Sr(i){return typeof i=="number"?Math.round(i).toString():""}var W=class extends u{constructor(){super(...arguments);this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):a`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let t=e.card,s=this.flipped!==!!t.reversed,o=t.keywords??[];return a`<article class="card" aria-label=${t.name??"Tarot card"}>
2333
3227
  <div class="image-wrap">
2334
- ${t.imageUrl?s`<img
2335
- class=${`image ${a?"reversed":""}`}
3228
+ ${t.imageUrl?a`<img
3229
+ class=${`image ${s?"reversed":""}`}
2336
3230
  src=${t.imageUrl}
2337
3231
  alt=${t.name??"Tarot card"}
2338
3232
  tabindex="0"
2339
3233
  @click=${this.toggleFlip}
2340
- @keydown=${n=>{(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),this.toggleFlip())}}
2341
- />`:s`<div
2342
- class=${`image ${a?"reversed":""}`}
3234
+ @keydown=${l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),this.toggleFlip())}}
3235
+ />`:a`<div
3236
+ class=${`image ${s?"reversed":""}`}
2343
3237
  style="aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)"
2344
3238
  >
2345
3239
  ${t.name??"?"}
@@ -2347,15 +3241,15 @@
2347
3241
  </div>
2348
3242
  <div>
2349
3243
  <div class="meta">
2350
- ${t.arcana?s`${t.arcana} arcana`:l}
2351
- ${a?s` · reversed`:l}
3244
+ ${t.arcana?a`${t.arcana} arcana`:n}
3245
+ ${s?a` · reversed`:n}
2352
3246
  </div>
2353
3247
  <h2 class="title">${t.name??"Tarot card"}</h2>
2354
- ${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:l}
2355
- ${t.meaning?s`<p>${t.meaning}</p>`:l}
2356
- ${o.length>0?s`<div class="chips">
2357
- ${o.map(n=>s`<span>${n}</span>`)}
2358
- </div>`:l}
3248
+ ${e.dailyMessage?a`<p class="message">${e.dailyMessage}</p>`:n}
3249
+ ${t.meaning?a`<p>${t.meaning}</p>`:n}
3250
+ ${o.length>0?a`<div class="chips">
3251
+ ${o.map(l=>a`<span>${l}</span>`)}
3252
+ </div>`:n}
2359
3253
  <button
2360
3254
  class="flip"
2361
3255
  type="button"
@@ -2365,16 +3259,16 @@
2365
3259
  Flip card
2366
3260
  </button>
2367
3261
  </div>
2368
- </article>`}renderFullCard(e){let t=this.flipped,a=t?e.reversed:e.upright,o=t?e.keywords?.reversed??[]:e.keywords?.upright??[];return s`<article class="card" aria-label=${e.name??"Tarot card"}>
3262
+ </article>`}renderFullCard(e){let t=this.flipped,s=t?e.reversed:e.upright,o=t?e.keywords?.reversed??[]:e.keywords?.upright??[];return a`<article class="card" aria-label=${e.name??"Tarot card"}>
2369
3263
  <div class="image-wrap">
2370
- ${e.imageUrl?s`<img
3264
+ ${e.imageUrl?a`<img
2371
3265
  class=${`image ${t?"reversed":""}`}
2372
3266
  src=${e.imageUrl}
2373
3267
  alt=${e.name??"Tarot card"}
2374
3268
  tabindex="0"
2375
3269
  @click=${this.toggleFlip}
2376
- @keydown=${n=>{(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),this.toggleFlip())}}
2377
- />`:s`<div
3270
+ @keydown=${l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),this.toggleFlip())}}
3271
+ />`:a`<div
2378
3272
  class=${`image ${t?"reversed":""}`}
2379
3273
  style="aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)"
2380
3274
  >
@@ -2383,15 +3277,15 @@
2383
3277
  </div>
2384
3278
  <div>
2385
3279
  <div class="meta">
2386
- ${e.arcana?s`${e.arcana} arcana`:l}
2387
- ${e.number!==void 0&&e.number!==null?s` · ${e.number}`:l}
2388
- ${t?s` · reversed`:l}
3280
+ ${e.arcana?a`${e.arcana} arcana`:n}
3281
+ ${e.number!==void 0&&e.number!==null?a` · ${e.number}`:n}
3282
+ ${t?a` · reversed`:n}
2389
3283
  </div>
2390
3284
  <h2 class="title">${e.name??"Tarot card"}</h2>
2391
- ${a?.description?s`<p>${a.description}</p>`:l}
2392
- ${o.length>0?s`<div class="chips">
2393
- ${o.map(n=>s`<span>${n}</span>`)}
2394
- </div>`:l}
3285
+ ${s?.description?a`<p>${s.description}</p>`:n}
3286
+ ${o.length>0?a`<div class="chips">
3287
+ ${o.map(l=>a`<span>${l}</span>`)}
3288
+ </div>`:n}
2395
3289
  <button
2396
3290
  class="flip"
2397
3291
  type="button"
@@ -2401,7 +3295,7 @@
2401
3295
  Flip card
2402
3296
  </button>
2403
3297
  </div>
2404
- </article>`}};B.styles=[$,v`
3298
+ </article>`}};W.styles=[b,x`
2405
3299
  .card {
2406
3300
  background: var(--roxy-bg, #fff);
2407
3301
  border: 1px solid var(--roxy-border, #e4e4e7);
@@ -2491,51 +3385,51 @@
2491
3385
  .flip:hover {
2492
3386
  transform: scale(1.02);
2493
3387
  }
2494
- `],p([h({attribute:!1})],B.prototype,"data",2),p([P()],B.prototype,"flipped",2),B=p([b("roxy-tarot-card")],B);var q=class extends y{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,a="cards"in e&&!("spread"in e),o=a?[]:"positions"in e?e.positions??[]:[],n=a&&"cards"in e?e.cards:[],c=t?e.answer:void 0,d=t?e.strength:void 0,m="spread"in e?e.spread:this.spread.replace(/-/g," "),g="question"in e?e.question:void 0,u="summary"in e?e.summary:void 0,f=t?e.interpretation:void 0,w=c?c.toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread">
3388
+ `],c([y({attribute:!1})],W.prototype,"data",2),c([E()],W.prototype,"flipped",2),W=c([v("roxy-tarot-card")],W);var J=class extends u{constructor(){super(...arguments);this.data=null;this.spread="three-card"}render(){let e=this.data;if(!e)return a`<div class="roxy-empty" role="status">No tarot spread</div>`;let t="answer"in e,s="cards"in e&&!("spread"in e),o=s?[]:"positions"in e?e.positions??[]:[],l=s&&"cards"in e?e.cards:[],d=t?e.answer:void 0,p=t?e.strength:void 0,m="spread"in e?e.spread:this.spread.replace(/-/g," "),h="question"in e?e.question:void 0,g="summary"in e?e.summary:void 0,f=t?e.interpretation:void 0,k=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return a`<article class="wrap" aria-label="Tarot spread">
2495
3389
  <header class="head">
2496
3390
  <h2 class="title">${m}</h2>
2497
- ${g?s`<span class="question">"${g}"</span>`:l}
3391
+ ${h?a`<span class="question">"${h}"</span>`:n}
2498
3392
  </header>
2499
- ${t?s`<div>
2500
- <span class=${`answer ${w}`}>${c}</span>
2501
- ${d?s`<small> · ${d}</small>`:l}
2502
- </div>`:l}
2503
- ${o.length>0?s`<div class="grid">
2504
- ${o.map(x=>s`<div class="card">
2505
- <p class="label">${x.name??""}</p>
3393
+ ${t?a`<div>
3394
+ <span class=${`answer ${k}`}>${d}</span>
3395
+ ${p?a`<small> · ${p}</small>`:n}
3396
+ </div>`:n}
3397
+ ${o.length>0?a`<div class="grid">
3398
+ ${o.map($=>a`<div class="card">
3399
+ <p class="label">${$.name??""}</p>
2506
3400
  <div class="image">
2507
- ${x.card?.imageUrl?s`<img
2508
- src=${x.card.imageUrl}
2509
- alt=${x.card.name??"tarot card"}
2510
- class=${x.card.reversed?"reversed":""}
2511
- />`:s`${x.card?.name??"?"}`}
3401
+ ${$.card?.imageUrl?a`<img
3402
+ src=${$.card.imageUrl}
3403
+ alt=${$.card.name??"tarot card"}
3404
+ class=${$.card.reversed?"reversed":""}
3405
+ />`:a`${$.card?.name??"?"}`}
2512
3406
  </div>
2513
3407
  <p class="name">
2514
- ${x.card?.name??""}
2515
- ${x.card?.reversed?s`<small>(reversed)</small>`:l}
3408
+ ${$.card?.name??""}
3409
+ ${$.card?.reversed?a`<small>(reversed)</small>`:n}
2516
3410
  </p>
2517
- ${x.interpretation?s`<p class="interp">${x.interpretation}</p>`:l}
3411
+ ${$.interpretation?a`<p class="interp">${$.interpretation}</p>`:n}
2518
3412
  </div>`)}
2519
- </div>`:l}
2520
- ${n.length>0?s`<div class="grid">
2521
- ${n.map(x=>s`<div class="card">
3413
+ </div>`:n}
3414
+ ${l.length>0?a`<div class="grid">
3415
+ ${l.map($=>a`<div class="card">
2522
3416
  <div class="image">
2523
- ${x.imageUrl?s`<img
2524
- src=${x.imageUrl}
2525
- alt=${x.name??"tarot card"}
2526
- class=${x.reversed?"reversed":""}
2527
- />`:s`${x.name??"?"}`}
3417
+ ${$.imageUrl?a`<img
3418
+ src=${$.imageUrl}
3419
+ alt=${$.name??"tarot card"}
3420
+ class=${$.reversed?"reversed":""}
3421
+ />`:a`${$.name??"?"}`}
2528
3422
  </div>
2529
3423
  <p class="name">
2530
- ${x.name??""}
2531
- ${x.reversed?s`<small>(reversed)</small>`:l}
3424
+ ${$.name??""}
3425
+ ${$.reversed?a`<small>(reversed)</small>`:n}
2532
3426
  </p>
2533
- ${x.meaning?s`<p class="interp">${x.meaning}</p>`:l}
3427
+ ${$.meaning?a`<p class="interp">${$.meaning}</p>`:n}
2534
3428
  </div>`)}
2535
- </div>`:l}
2536
- ${u?s`<p class="reading">${u}</p>`:l}
2537
- ${f?s`<p class="reading">${f}</p>`:l}
2538
- </article>`}};q.styles=[$,v`
3429
+ </div>`:n}
3430
+ ${g?a`<p class="reading">${g}</p>`:n}
3431
+ ${f?a`<p class="reading">${f}</p>`:n}
3432
+ </article>`}};J.styles=[b,x`
2539
3433
  .wrap {
2540
3434
  display: grid;
2541
3435
  gap: var(--roxy-space-md, 1rem);
@@ -2641,7 +3535,276 @@
2641
3535
  margin: 0;
2642
3536
  color: var(--roxy-fg, #0a0a0a);
2643
3537
  }
2644
- `],p([h({attribute:!1})],q.prototype,"data",2),p([h({type:String,reflect:!0})],q.prototype,"spread",2),q=p([b("roxy-tarot-spread")],q);var dr={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}},pr={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}},mr=["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"],hr={aries:"Aries",taurus:"Taurus",gemini:"Gemini",cancer:"Cancer",leo:"Leo",virgo:"Virgo",libra:"Libra",scorpio:"Scorpio",sagittarius:"Sagittarius",capricorn:"Capricorn",aquarius:"Aquarius",pisces:"Pisces"},K=class extends y{constructor(){super(...arguments);this.data=null;this.chartStyle="south"}buildHouses(){if(!this.data)return[];let e=this.data,t=[];for(let a=0;a<12;a++){let o=mr[a],c=(e[o]?.signs??[]).map(d=>d.graha).filter(Boolean);t.push({house:a+1,sign:hr[o]??"",planets:c})}return t}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No kundli data</div>`;let e=this.buildHouses();return s`<div class="wrap">
3538
+ `],c([y({attribute:!1})],J.prototype,"data",2),c([y({type:String,reflect:!0})],J.prototype,"spread",2),J=c([v("roxy-tarot-spread")],J);var ie=class extends u{constructor(){super(...arguments);this.data=null}render(){if(!this.data?.transitPlanets?.length)return a`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:t,transitPlanets:s,transitAspects:o,summary:l}=this.data,d=[Ne(e),O(t)].filter(Boolean).join(" ");return a`<div class="wrap" aria-label="Transit positions table">
3539
+ <div class="head">
3540
+ <h2 class="title">Transits</h2>
3541
+ ${d?a`<p class="subtitle">${d}</p>`:n}
3542
+ </div>
3543
+
3544
+ ${l?this.renderSummaryPills(l):n}
3545
+
3546
+ <div>
3547
+ <p class="section-label">Planet positions</p>
3548
+ <div class="overflow-scroll">
3549
+ ${this.renderPlanetsTable(s)}
3550
+ </div>
3551
+ </div>
3552
+
3553
+ ${o?.length?a`<div>
3554
+ <p class="section-label">Transit aspects</p>
3555
+ <div class="overflow-scroll">
3556
+ ${this.renderAspectsTable(o)}
3557
+ </div>
3558
+ </div>`:n}
3559
+ </div>`}renderSummaryPills(e){return a`<div class="summary-pills" role="region" aria-label="Aspect summary">
3560
+ <span class="pill pill--muted">
3561
+ Total: ${e.totalAspects}
3562
+ </span>
3563
+ <span class="pill pill--success">
3564
+ Harmonious: ${e.harmonious}
3565
+ </span>
3566
+ <span class="pill pill--danger">
3567
+ Challenging: ${e.challenging}
3568
+ </span>
3569
+ <span class="pill pill--muted">
3570
+ Neutral: ${e.neutral}
3571
+ </span>
3572
+ </div>`}renderPlanetsTable(e){return a`<table class="planets-table">
3573
+ <thead>
3574
+ <tr>
3575
+ <th scope="col">Planet</th>
3576
+ <th scope="col">Sign</th>
3577
+ <th scope="col">Degree</th>
3578
+ <th scope="col">Speed</th>
3579
+ </tr>
3580
+ </thead>
3581
+ <tbody>
3582
+ ${e.map(t=>{let s=L[C(t.name)]??"",o=N[C(t.sign)]??"",l=t.speed>=0?"\u2191":"\u2193";return a`<tr>
3583
+ <td>
3584
+ <div class="planet-cell">
3585
+ <span class="glyph" aria-hidden="true">${s}</span>
3586
+ ${t.name}
3587
+ ${t.isRetrograde?a`<span class="retro-badge" aria-label="retrograde">R</span>`:n}
3588
+ </div>
3589
+ </td>
3590
+ <td>
3591
+ <div class="planet-cell">
3592
+ <span class="glyph" aria-hidden="true">${o}</span>
3593
+ ${t.sign}
3594
+ </div>
3595
+ </td>
3596
+ <td class="num">${w(t.degree,2)}</td>
3597
+ <td class="speed">
3598
+ <span class="speed-arrow" aria-hidden="true">${l}</span>
3599
+ ${w(Math.abs(t.speed),4)}
3600
+ </td>
3601
+ </tr>`})}
3602
+ </tbody>
3603
+ </table>`}renderAspectsTable(e){return a`<table class="aspects-table">
3604
+ <thead>
3605
+ <tr>
3606
+ <th scope="col">Transit Planet</th>
3607
+ <th scope="col">Natal Planet</th>
3608
+ <th scope="col">Type</th>
3609
+ <th scope="col">Orb</th>
3610
+ <th scope="col">Status</th>
3611
+ <th scope="col">Strength</th>
3612
+ </tr>
3613
+ </thead>
3614
+ <tbody>
3615
+ ${e.map(t=>{let s=L[C(t.transitPlanet)]??"",o=L[C(t.natalPlanet)]??"",l=`nature-${(t.nature??"").toLowerCase()}`,d=t.interpretation?.summary??"";return a`<tr class=${d?"aspect-row":"aspect-row no-interp"}>
3616
+ <td>
3617
+ <div class="arrow-cell">
3618
+ <span class="glyph" aria-hidden="true">${s}</span>
3619
+ ${t.transitPlanet}
3620
+ </div>
3621
+ </td>
3622
+ <td>
3623
+ <div class="arrow-cell">
3624
+ <span class="glyph" aria-hidden="true">${o}</span>
3625
+ ${t.natalPlanet}
3626
+ </div>
3627
+ </td>
3628
+ <td class=${l}>${(t.type??"").toLowerCase()}</td>
3629
+ <td class="num">${w(t.orb,2)}</td>
3630
+ <td>${t.isApplying?"Applying":"Separating"}</td>
3631
+ <td class="num">${w(t.strength,1)}</td>
3632
+ </tr>
3633
+ ${d?a`<tr class="interp-row">
3634
+ <td colspan="6">${d}</td>
3635
+ </tr>`:n}`})}
3636
+ </tbody>
3637
+ </table>`}};ie.styles=[b,x`
3638
+ .wrap {
3639
+ display: grid;
3640
+ gap: var(--roxy-space-md, 1rem);
3641
+ }
3642
+
3643
+ .head {
3644
+ display: flex;
3645
+ justify-content: space-between;
3646
+ align-items: baseline;
3647
+ gap: var(--roxy-space-md, 1rem);
3648
+ flex-wrap: wrap;
3649
+ }
3650
+
3651
+ .title {
3652
+ font-size: var(--roxy-text-lg, 1.125rem);
3653
+ font-weight: var(--roxy-weight-bold, 600);
3654
+ margin: 0;
3655
+ }
3656
+
3657
+ .subtitle {
3658
+ color: var(--roxy-muted, #71717a);
3659
+ font-size: var(--roxy-text-sm, 0.875rem);
3660
+ margin: 0;
3661
+ }
3662
+
3663
+ .summary-pills {
3664
+ display: flex;
3665
+ flex-wrap: wrap;
3666
+ gap: var(--roxy-space-sm, 0.5rem);
3667
+ }
3668
+
3669
+ .pill {
3670
+ display: inline-flex;
3671
+ align-items: center;
3672
+ gap: 4px;
3673
+ padding: 2px var(--roxy-space-sm, 0.5rem);
3674
+ border-radius: var(--roxy-radius-full, 9999px);
3675
+ font-size: var(--roxy-text-xs, 0.75rem);
3676
+ font-weight: var(--roxy-weight-bold, 600);
3677
+ border: 1px solid currentColor;
3678
+ }
3679
+
3680
+ .pill--muted {
3681
+ color: var(--roxy-fg, #0a0a0a);
3682
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
3683
+ }
3684
+
3685
+ .pill--success {
3686
+ color: var(--roxy-success-fg, #166534);
3687
+ background: color-mix(in srgb, var(--roxy-success, #16a34a) 10%, transparent);
3688
+ }
3689
+
3690
+ .pill--danger {
3691
+ color: var(--roxy-danger-fg, #991b1b);
3692
+ background: color-mix(in srgb, var(--roxy-danger, #dc2626) 10%, transparent);
3693
+ }
3694
+
3695
+ table {
3696
+ width: 100%;
3697
+ border-collapse: collapse;
3698
+ font-size: var(--roxy-text-sm, 0.875rem);
3699
+ }
3700
+
3701
+ th,
3702
+ td {
3703
+ padding: var(--roxy-space-sm, 0.5rem);
3704
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
3705
+ text-align: left;
3706
+ }
3707
+
3708
+ th {
3709
+ color: var(--roxy-muted, #71717a);
3710
+ font-weight: var(--roxy-weight-bold, 600);
3711
+ text-transform: uppercase;
3712
+ font-size: var(--roxy-text-xs, 0.75rem);
3713
+ letter-spacing: 0.06em;
3714
+ }
3715
+
3716
+ .section-label {
3717
+ font-size: var(--roxy-text-xs, 0.75rem);
3718
+ color: var(--roxy-muted, #71717a);
3719
+ text-transform: uppercase;
3720
+ letter-spacing: 0.06em;
3721
+ font-weight: var(--roxy-weight-bold, 600);
3722
+ margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
3723
+ }
3724
+
3725
+ .glyph {
3726
+ font-size: 1.1em;
3727
+ margin-right: 2px;
3728
+ line-height: 1;
3729
+ }
3730
+
3731
+ .planet-cell {
3732
+ display: flex;
3733
+ align-items: center;
3734
+ gap: 4px;
3735
+ white-space: nowrap;
3736
+ }
3737
+
3738
+ .retro-badge {
3739
+ display: inline-block;
3740
+ font-size: 0.7em;
3741
+ padding: 1px 4px;
3742
+ border-radius: var(--roxy-radius-sm, 4px);
3743
+ background: color-mix(in srgb, var(--roxy-warning, #ea580c) 12%, transparent);
3744
+ color: var(--roxy-warning-fg, #9a3412);
3745
+ font-weight: var(--roxy-weight-bold, 600);
3746
+ margin-left: 2px;
3747
+ vertical-align: middle;
3748
+ }
3749
+
3750
+ .speed {
3751
+ font-variant-numeric: tabular-nums;
3752
+ color: var(--roxy-muted, #71717a);
3753
+ white-space: nowrap;
3754
+ }
3755
+
3756
+ .speed-arrow {
3757
+ font-size: 0.85em;
3758
+ }
3759
+
3760
+ td.num {
3761
+ font-variant-numeric: tabular-nums;
3762
+ color: var(--roxy-muted, #71717a);
3763
+ }
3764
+
3765
+ .nature-harmonious {
3766
+ color: var(--roxy-success-fg, #166534);
3767
+ }
3768
+
3769
+ .nature-challenging {
3770
+ color: var(--roxy-danger-fg, #991b1b);
3771
+ }
3772
+
3773
+ .nature-neutral {
3774
+ color: var(--roxy-muted, #71717a);
3775
+ }
3776
+
3777
+ .arrow-cell {
3778
+ display: inline-flex;
3779
+ align-items: center;
3780
+ gap: 4px;
3781
+ white-space: nowrap;
3782
+ }
3783
+
3784
+ .interp-row td {
3785
+ padding-top: 0;
3786
+ padding-bottom: var(--roxy-space-sm, 0.5rem);
3787
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
3788
+ color: var(--roxy-secondary, #475569);
3789
+ font-size: var(--roxy-text-xs, 0.75rem);
3790
+ line-height: 1.45;
3791
+ }
3792
+
3793
+ .aspect-row td {
3794
+ border-bottom: none;
3795
+ padding-bottom: 4px;
3796
+ }
3797
+
3798
+ .aspect-row.no-interp td {
3799
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
3800
+ padding-bottom: var(--roxy-space-sm, 0.5rem);
3801
+ }
3802
+
3803
+ .overflow-scroll {
3804
+ overflow-x: auto;
3805
+ -webkit-overflow-scrolling: touch;
3806
+ }
3807
+ `],c([y({attribute:!1})],ie.prototype,"data",2),ie=c([v("roxy-transits-table")],ie);var X=class extends u{constructor(){super(...arguments);this.data=null;this.chartStyle="south"}buildHouses(){if(!this.data)return[];let e=this.data,t=this.data?.meta?.Lagna?.rashi??"",s=[];for(let o=0;o<12;o++){let l=_e[o],p=(e[l]?.signs??[]).map(h=>h.graha).filter(Boolean),m=Me[l]??"";s.push({number:o+1,sign:m,planets:p,isLagna:t?t.toLowerCase()===m.toLowerCase():!1})}return s}render(){if(!this.data)return a`<div class="roxy-empty" role="status">No kundli data</div>`;let e=this.buildHouses(),t=this.chartStyle==="north";return a`<div class="wrap">
2645
3808
  <h2 class="title">Vedic kundli</h2>
2646
3809
  <svg
2647
3810
  viewBox="0 0 300 300"
@@ -2649,31 +3812,10 @@
2649
3812
  aria-label="Vedic birth chart with twelve sign houses"
2650
3813
  >
2651
3814
  <title>Vedic kundli</title>
2652
- <polygon class="line" points="150,10 290,150 150,290 10,150" stroke-width="1.5" />
2653
- <polygon
2654
- class="line"
2655
- points="220,80 220,220 80,220 80,80"
2656
- stroke-width="1"
2657
- fill="none"
2658
- />
2659
- <line class="line" x1="150" y1="10" x2="80" y2="80" stroke-width="1" />
2660
- <line class="line" x1="150" y1="10" x2="220" y2="80" stroke-width="1" />
2661
- <line class="line" x1="290" y1="150" x2="220" y2="80" stroke-width="1" />
2662
- <line class="line" x1="290" y1="150" x2="220" y2="220" stroke-width="1" />
2663
- <line class="line" x1="150" y1="290" x2="220" y2="220" stroke-width="1" />
2664
- <line class="line" x1="150" y1="290" x2="80" y2="220" stroke-width="1" />
2665
- <line class="line" x1="10" y1="150" x2="80" y2="220" stroke-width="1" />
2666
- <line class="line" x1="10" y1="150" x2="80" y2="80" stroke-width="1" />
2667
- ${e.map(t=>this.renderHouseGroup(t))}
3815
+ ${t?Oe():Ge()}
3816
+ ${t?e.map(s=>He(s)):e.map(s=>De(s))}
2668
3817
  </svg>
2669
- </div>`}isLagna(e){let t=this.data?.meta?.Lagna?.rashi;return t?t.toLowerCase()===e.sign.toLowerCase():!1}renderHouseGroup(e){let t=dr[e.house],a=pr[e.house];if(!t||!a)return l;let o=gt[e.sign]??"",n=e.planets??[],c=this.isLagna(e);return k`
2670
- <g>
2671
- ${c?k`<rect class="lagna-bg" x=${t.x-30} y=${t.y-28} width="60" height="56" rx="6" />`:l}
2672
- ${o?k`<text class="sign-text" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${o}</text>`:l}
2673
- ${c?k`<text class="lagna-marker" x=${t.x} y=${t.y-18} text-anchor="middle" dominant-baseline="central">LAGNA</text>`:l}
2674
- ${n.map((d,m)=>{let g=ut[ur(d)]??d.slice(0,2),u=13,x=(c?t.y+8:t.y)-(n.length-1)*u/2+m*u;return k`<text class="planet-text" x=${t.x} y=${x} text-anchor="middle" dominant-baseline="central">${g}</text>`})}
2675
- </g>
2676
- `}};K.styles=[$,v`
3818
+ </div>`}};X.styles=[b,x`
2677
3819
  .wrap {
2678
3820
  display: grid;
2679
3821
  gap: var(--roxy-space-md, 1rem);
@@ -2705,6 +3847,12 @@
2705
3847
  font-weight: 600;
2706
3848
  font-family: var(--roxy-font-sans);
2707
3849
  }
3850
+ .house-num {
3851
+ fill: var(--roxy-muted, #71717a);
3852
+ font-size: 9px;
3853
+ font-weight: 400;
3854
+ font-family: var(--roxy-font-sans);
3855
+ }
2708
3856
  .lagna-marker {
2709
3857
  fill: var(--roxy-accent-fg, #b45309);
2710
3858
  font-size: 8px;
@@ -2717,7 +3865,214 @@
2717
3865
  stroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
2718
3866
  stroke-width: 0.8;
2719
3867
  }
2720
- `],p([h({attribute:!1})],K.prototype,"data",2),p([h({type:String,reflect:!0,attribute:"chart-style"})],K.prototype,"chartStyle",2),K=p([b("roxy-vedic-kundli")],K);function ur(i){return i?i.charAt(0).toUpperCase()+i.slice(1).toLowerCase():""}var Se=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",domain:"astrology",heading:"Natal chart",endpoints:["astrology.generateNatalChart"],description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",domain:"astrology",heading:"Daily horoscope",endpoints:["astrology.getDailyHoroscope","astrology.getWeeklyHoroscope","astrology.getMonthlyHoroscope"],description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",domain:"astrology",heading:"Synastry",endpoints:["astrology.calculateSynastry"],description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",domain:"astrology",heading:"Compatibility score",endpoints:["astrology.calculateCompatibility","numerology.calculateNumCompatibility","biorhythm.calculateBioCompatibility"],description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",domain:"astrology",heading:"Moon phase",endpoints:["astrology.getCurrentMoonPhase","astrology.getUpcomingMoonPhases","astrology.getMoonCalendar"],description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",domain:"vedic",heading:"Vedic kundli",endpoints:["vedicAstrology.generateBirthChart"],description:"South or North Indian Vedic kundli for /vedic-astrology/birth-chart",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South or North Indian kundli",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",domain:"vedic",heading:"Panchang",endpoints:["vedicAstrology.getBasicPanchang","vedicAstrology.getDetailedPanchang"],description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",domain:"vedic",heading:"Vimshottari dasha",endpoints:["vedicAstrology.getCurrentDasha","vedicAstrology.getMajorDashas","vedicAstrology.getSubDashas"],description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",domain:"vedic",heading:"Manglik dosha",endpoints:["vedicAstrology.checkManglikDosha","vedicAstrology.checkKalsarpaDosha","vedicAstrology.checkSadhesati"],description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",domain:"vedic",heading:"Guna milan",endpoints:["vedicAstrology.calculateGunMilan"],description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",domain:"vedic",heading:"KP planets",endpoints:["vedicAstrology.getKpPlanets"],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:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",domain:"numerology",heading:"Life path number",endpoints:["numerology.calculateLifePath","numerology.calculateExpression","numerology.calculatePersonalYear","numerology.generateNumerologyChart"],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",domain:"tarot",heading:"Daily tarot card",endpoints:["tarot.getCard","tarot.getDailyCard"],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",domain:"tarot",heading:"Three-card spread",endpoints:["tarot.castThreeCard","tarot.castCelticCross","tarot.castLoveSpread","tarot.castYesNo","tarot.drawCards"],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",domain:"biorhythm",heading:"Daily biorhythm",endpoints:["biorhythm.getDailyBiorhythm","biorhythm.getForecast","biorhythm.getCriticalDays"],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",domain:"iching",heading:"I Ching hexagram",endpoints:["iching.getHexagram","iching.castReading","iching.getDailyHexagram","iching.castDailyReading","iching.getRandomHexagram"],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",domain:"utility",heading:"Schema-driven form",endpoints:[],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",domain:"utility",heading:"City search",endpoints:["location.searchCities"],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",domain:"utility",heading:"Generic renderer",endpoints:[],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 wt="0.1.3";var gr=Se.map(i=>i.slug);return Et(yr);})();
3868
+ `],c([y({attribute:!1})],X.prototype,"data",2),c([y({type:String,reflect:!0,attribute:"chart-style"})],X.prototype,"chartStyle",2),X=c([v("roxy-vedic-kundli")],X);var Z=class extends u{constructor(){super(...arguments);this.data=null;this.filter="";this.handleInput=je(e=>{this.filter=e.target.value},200)}renderQualityChip(e){let t=`quality-chip quality-${e}`;return a`<span class=${t}>${e}</span>`}renderDetailCard(e){return a`<div class="detail-card">
3869
+ <p class="detail-name">
3870
+ ${e.name}
3871
+ ${e.quality?this.renderQualityChip(e.quality):n}
3872
+ </p>
3873
+ ${e.description?a`<p class="description">${e.description}</p>`:n}
3874
+ ${e.result?a`<details>
3875
+ <summary>Effects</summary>
3876
+ <div class="result-body">${e.result}</div>
3877
+ </details>`:n}
3878
+ </div>`}render(){if(!this.data)return a`<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 s=e;return a`<div class="wrap">${this.renderDetailCard(s)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let s=e.yogas;if(s.length>0&&"description"in s[0]){let m=s,h=t?m.filter(f=>f.name.toLowerCase().includes(t)):m,g=e.total;return a`<div class="wrap">
3879
+ <div class="head">
3880
+ <h2 class="title">Yoga catalog</h2>
3881
+ ${g!==void 0?a`<span class="count">${g} total</span>`:n}
3882
+ </div>
3883
+ <div class="search-wrap">
3884
+ <input
3885
+ class="search"
3886
+ type="search"
3887
+ placeholder="Filter yogas..."
3888
+ aria-label="Filter yoga list by name"
3889
+ .value=${this.filter}
3890
+ @input=${this.handleInput}
3891
+ />
3892
+ </div>
3893
+ <div
3894
+ class="detail-grid"
3895
+ role="region"
3896
+ aria-live="polite"
3897
+ aria-label="Yoga results"
3898
+ >
3899
+ ${h.length>0?h.map(f=>this.renderDetailCard(f)):a`<p class="no-results">No yogas match your search.</p>`}
3900
+ </div>
3901
+ </div>`}let l=s,d=t?l.filter(m=>m.name.toLowerCase().includes(t)):l,p=e.total;return a`<div class="wrap">
3902
+ <div class="head">
3903
+ <h2 class="title">Yoga catalog</h2>
3904
+ ${p!==void 0?a`<span class="count">${p} total</span>`:n}
3905
+ </div>
3906
+ <div class="search-wrap">
3907
+ <input
3908
+ class="search"
3909
+ type="search"
3910
+ placeholder="Filter yogas..."
3911
+ aria-label="Filter yoga list by name"
3912
+ .value=${this.filter}
3913
+ @input=${this.handleInput}
3914
+ />
3915
+ </div>
3916
+ <div
3917
+ class="grid"
3918
+ role="region"
3919
+ aria-live="polite"
3920
+ aria-label="Yoga results"
3921
+ >
3922
+ ${d.length>0?d.map(m=>a`<div class="yoga-chip">
3923
+ ${m.name}
3924
+ <span class="yoga-id">${m.id}</span>
3925
+ </div>`):a`<p class="no-results">No yogas match your search.</p>`}
3926
+ </div>
3927
+ </div>`}return a`<div class="roxy-empty" role="status">No yoga data</div>`}};Z.styles=[b,x`
3928
+ .wrap {
3929
+ display: grid;
3930
+ gap: var(--roxy-space-md, 1rem);
3931
+ }
3932
+ .head {
3933
+ display: flex;
3934
+ justify-content: space-between;
3935
+ align-items: baseline;
3936
+ flex-wrap: wrap;
3937
+ gap: var(--roxy-space-sm, 0.5rem);
3938
+ }
3939
+ .title {
3940
+ font-size: var(--roxy-text-lg, 1.125rem);
3941
+ font-weight: var(--roxy-weight-bold, 600);
3942
+ margin: 0;
3943
+ }
3944
+ .count {
3945
+ font-size: var(--roxy-text-sm, 0.875rem);
3946
+ color: var(--roxy-muted, #71717a);
3947
+ }
3948
+ .search-wrap {
3949
+ display: flex;
3950
+ align-items: center;
3951
+ gap: var(--roxy-space-sm, 0.5rem);
3952
+ }
3953
+ .search {
3954
+ width: 100%;
3955
+ max-width: 280px;
3956
+ padding: 0.35em 0.75em;
3957
+ font-size: var(--roxy-text-sm, 0.875rem);
3958
+ font-family: var(--roxy-font-sans);
3959
+ border: 1px solid var(--roxy-border, #e4e4e7);
3960
+ border-radius: var(--roxy-radius-md, 8px);
3961
+ background: var(--roxy-bg, #fff);
3962
+ color: var(--roxy-fg, #0a0a0a);
3963
+ outline: none;
3964
+ }
3965
+ .search::placeholder {
3966
+ color: var(--roxy-fg, #0a0a0a);
3967
+ opacity: 0.65;
3968
+ }
3969
+ .search:focus {
3970
+ border-color: var(--roxy-accent, #f59e0b);
3971
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--roxy-accent, #f59e0b) 30%, transparent);
3972
+ }
3973
+ .grid {
3974
+ display: grid;
3975
+ gap: var(--roxy-space-sm, 0.5rem);
3976
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
3977
+ }
3978
+ .yoga-chip {
3979
+ padding: 0.4em 0.8em;
3980
+ border: 1px solid var(--roxy-border, #e4e4e7);
3981
+ border-radius: var(--roxy-radius-md, 8px);
3982
+ font-size: var(--roxy-text-sm, 0.875rem);
3983
+ background: var(--roxy-bg, #fff);
3984
+ color: var(--roxy-fg, #0a0a0a);
3985
+ word-break: break-word;
3986
+ }
3987
+ .yoga-chip .yoga-id {
3988
+ display: block;
3989
+ font-size: 0.7em;
3990
+ color: var(--roxy-fg, #0a0a0a);
3991
+ opacity: 0.75;
3992
+ margin-top: 0.15em;
3993
+ }
3994
+ .detail-card {
3995
+ border: 1px solid var(--roxy-border, #e4e4e7);
3996
+ border-radius: var(--roxy-radius-md, 8px);
3997
+ padding: var(--roxy-space-md, 1rem);
3998
+ background: var(--roxy-bg, #fff);
3999
+ display: grid;
4000
+ gap: var(--roxy-space-sm, 0.5rem);
4001
+ }
4002
+ .detail-name {
4003
+ font-size: var(--roxy-text-lg, 1.125rem);
4004
+ font-weight: var(--roxy-weight-bold, 600);
4005
+ margin: 0;
4006
+ display: flex;
4007
+ align-items: center;
4008
+ gap: var(--roxy-space-sm, 0.5rem);
4009
+ flex-wrap: wrap;
4010
+ }
4011
+ .quality-chip {
4012
+ display: inline-block;
4013
+ font-size: var(--roxy-text-xs, 0.75rem);
4014
+ font-weight: 600;
4015
+ padding: 0.15em 0.6em;
4016
+ border-radius: 999px;
4017
+ }
4018
+ .quality-Positive {
4019
+ background: color-mix(in srgb, var(--roxy-success, #22c55e) 18%, transparent);
4020
+ color: var(--roxy-success-fg, #15803d);
4021
+ border: 1px solid color-mix(in srgb, var(--roxy-success, #22c55e) 40%, transparent);
4022
+ }
4023
+ .quality-Negative {
4024
+ background: color-mix(in srgb, var(--roxy-danger, #ef4444) 18%, transparent);
4025
+ color: var(--roxy-danger-fg, #b91c1c);
4026
+ border: 1px solid color-mix(in srgb, var(--roxy-danger, #ef4444) 40%, transparent);
4027
+ }
4028
+ .quality-Both {
4029
+ background: color-mix(in srgb, var(--roxy-warning, #f59e0b) 18%, transparent);
4030
+ color: var(--roxy-warning-fg, #b45309);
4031
+ border: 1px solid color-mix(in srgb, var(--roxy-warning, #f59e0b) 40%, transparent);
4032
+ }
4033
+ .description {
4034
+ font-size: var(--roxy-text-sm, 0.875rem);
4035
+ color: var(--roxy-muted, #71717a);
4036
+ margin: 0;
4037
+ line-height: var(--roxy-leading-normal, 1.5);
4038
+ }
4039
+ details {
4040
+ font-size: var(--roxy-text-sm, 0.875rem);
4041
+ }
4042
+ details summary {
4043
+ cursor: pointer;
4044
+ color: var(--roxy-accent-fg, #b45309);
4045
+ font-weight: 500;
4046
+ padding: 0.25em 0;
4047
+ list-style: none;
4048
+ display: flex;
4049
+ align-items: center;
4050
+ gap: 0.4em;
4051
+ }
4052
+ details summary::before {
4053
+ content: '+';
4054
+ font-size: 1.1em;
4055
+ line-height: 1;
4056
+ }
4057
+ details[open] summary::before {
4058
+ content: '-';
4059
+ }
4060
+ details .result-body {
4061
+ padding-top: var(--roxy-space-xs, 0.25rem);
4062
+ color: var(--roxy-fg, #0a0a0a);
4063
+ line-height: var(--roxy-leading-normal, 1.5);
4064
+ }
4065
+ .no-results {
4066
+ color: var(--roxy-muted, #71717a);
4067
+ font-size: var(--roxy-text-sm, 0.875rem);
4068
+ padding: var(--roxy-space-md, 1rem) 0;
4069
+ text-align: center;
4070
+ }
4071
+ .detail-grid {
4072
+ display: grid;
4073
+ gap: var(--roxy-space-sm, 0.5rem);
4074
+ }
4075
+ `],c([y({attribute:!1})],Z.prototype,"data",2),c([E()],Z.prototype,"filter",2),Z=c([v("roxy-yoga-list")],Z);var Be=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South or North Indian Vedic kundli for /vedic-astrology/birth-chart",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South or North Indian kundli",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,personal-year,chart}",docsSummary:"Life path, expression, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Ht="0.2.1";var Ar=Be.map(i=>i.slug);return qt(Cr);})();
2721
4076
  /*! Bundled license information:
2722
4077
 
2723
4078
  @lit/reactive-element/css-tag.js: