@roxyapi/ui 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/AGENTS.md +54 -13
  2. package/README.md +33 -22
  3. package/THEMING.md +7 -5
  4. package/dist/cdn/components/angel-number-card.js +45 -0
  5. package/dist/cdn/components/angel-number-card.js.map +7 -0
  6. package/dist/cdn/components/angel-number-lookup.js +45 -0
  7. package/dist/cdn/components/angel-number-lookup.js.map +7 -0
  8. package/dist/cdn/components/ashtakavarga-grid.js +3 -3
  9. package/dist/cdn/components/ashtakavarga-grid.js.map +3 -3
  10. package/dist/cdn/components/biorhythm-chart.js +3 -3
  11. package/dist/cdn/components/biorhythm-chart.js.map +3 -3
  12. package/dist/cdn/components/bodygraph.js +8 -8
  13. package/dist/cdn/components/bodygraph.js.map +3 -3
  14. package/dist/cdn/components/choghadiya-grid.js +3 -3
  15. package/dist/cdn/components/choghadiya-grid.js.map +3 -3
  16. package/dist/cdn/components/compatibility-card.js +2 -2
  17. package/dist/cdn/components/compatibility-card.js.map +3 -3
  18. package/dist/cdn/components/crystal-grid.js +45 -0
  19. package/dist/cdn/components/crystal-grid.js.map +7 -0
  20. package/dist/cdn/components/dasha-timeline.js +2 -2
  21. package/dist/cdn/components/dasha-timeline.js.map +3 -3
  22. package/dist/cdn/components/data.js +2 -2
  23. package/dist/cdn/components/data.js.map +3 -3
  24. package/dist/cdn/components/divisional-chart.js +7 -7
  25. package/dist/cdn/components/divisional-chart.js.map +3 -3
  26. package/dist/cdn/components/dosha-card.js +3 -3
  27. package/dist/cdn/components/dosha-card.js.map +3 -3
  28. package/dist/cdn/components/dream-card.js +45 -0
  29. package/dist/cdn/components/dream-card.js.map +7 -0
  30. package/dist/cdn/components/forecast-timeline.js +3 -3
  31. package/dist/cdn/components/forecast-timeline.js.map +3 -3
  32. package/dist/cdn/components/guna-milan.js +3 -3
  33. package/dist/cdn/components/guna-milan.js.map +3 -3
  34. package/dist/cdn/components/hexagram.js +2 -2
  35. package/dist/cdn/components/hexagram.js.map +3 -3
  36. package/dist/cdn/components/horoscope-card.js +3 -3
  37. package/dist/cdn/components/horoscope-card.js.map +3 -3
  38. package/dist/cdn/components/kp-chart.js +2 -2
  39. package/dist/cdn/components/kp-chart.js.map +3 -3
  40. package/dist/cdn/components/kp-planets-table.js +3 -3
  41. package/dist/cdn/components/kp-planets-table.js.map +3 -3
  42. package/dist/cdn/components/kp-ruling-planets.js +3 -3
  43. package/dist/cdn/components/kp-ruling-planets.js.map +3 -3
  44. package/dist/cdn/components/moon-phase.js +3 -3
  45. package/dist/cdn/components/moon-phase.js.map +3 -3
  46. package/dist/cdn/components/nakshatra-card.js +3 -3
  47. package/dist/cdn/components/nakshatra-card.js.map +3 -3
  48. package/dist/cdn/components/natal-chart.js +2 -2
  49. package/dist/cdn/components/natal-chart.js.map +3 -3
  50. package/dist/cdn/components/numerology-card.js +3 -3
  51. package/dist/cdn/components/numerology-card.js.map +3 -3
  52. package/dist/cdn/components/panchang-table.js +2 -2
  53. package/dist/cdn/components/panchang-table.js.map +3 -3
  54. package/dist/cdn/components/shadbala-table.js +3 -3
  55. package/dist/cdn/components/shadbala-table.js.map +3 -3
  56. package/dist/cdn/components/synastry-chart.js +5 -5
  57. package/dist/cdn/components/synastry-chart.js.map +3 -3
  58. package/dist/cdn/components/tarot-card.js.map +3 -3
  59. package/dist/cdn/components/tarot-spread.js +3 -3
  60. package/dist/cdn/components/tarot-spread.js.map +3 -3
  61. package/dist/cdn/components/transits-table.js +3 -3
  62. package/dist/cdn/components/transits-table.js.map +3 -3
  63. package/dist/cdn/components/vedic-kundli.js +16 -16
  64. package/dist/cdn/components/vedic-kundli.js.map +3 -3
  65. package/dist/cdn/components/vedic-planets-table.js +3 -3
  66. package/dist/cdn/components/vedic-planets-table.js.map +3 -3
  67. package/dist/cdn/components/western-planets-table.js +2 -2
  68. package/dist/cdn/components/western-planets-table.js.map +3 -3
  69. package/dist/cdn/components/yoga-list.js +2 -2
  70. package/dist/cdn/components/yoga-list.js.map +3 -3
  71. package/dist/cdn/roxy-ui.js +289 -66
  72. package/dist/cdn/roxy-ui.js.map +4 -4
  73. package/dist/cdn.d.ts +8 -0
  74. package/dist/cdn.d.ts.map +1 -0
  75. package/dist/components/angel-number-card.d.ts +18 -0
  76. package/dist/components/angel-number-card.d.ts.map +1 -0
  77. package/dist/components/angel-number-card.js +2 -0
  78. package/dist/components/angel-number-card.js.map +7 -0
  79. package/dist/components/angel-number-lookup.d.ts +18 -0
  80. package/dist/components/angel-number-lookup.d.ts.map +1 -0
  81. package/dist/components/angel-number-lookup.js +2 -0
  82. package/dist/components/angel-number-lookup.js.map +7 -0
  83. package/dist/components/ashtakavarga-grid.js +1 -1
  84. package/dist/components/ashtakavarga-grid.js.map +3 -3
  85. package/dist/components/biorhythm-chart.js +1 -1
  86. package/dist/components/biorhythm-chart.js.map +3 -3
  87. package/dist/components/bodygraph.js +4 -4
  88. package/dist/components/bodygraph.js.map +3 -3
  89. package/dist/components/choghadiya-grid.js +1 -1
  90. package/dist/components/choghadiya-grid.js.map +3 -3
  91. package/dist/components/compatibility-card.js +1 -1
  92. package/dist/components/compatibility-card.js.map +3 -3
  93. package/dist/components/crystal-grid.d.ts +27 -0
  94. package/dist/components/crystal-grid.d.ts.map +1 -0
  95. package/dist/components/crystal-grid.js +2 -0
  96. package/dist/components/crystal-grid.js.map +7 -0
  97. package/dist/components/dasha-timeline.js +1 -1
  98. package/dist/components/dasha-timeline.js.map +3 -3
  99. package/dist/components/data.js +1 -1
  100. package/dist/components/data.js.map +3 -3
  101. package/dist/components/divisional-chart.js +34 -34
  102. package/dist/components/divisional-chart.js.map +3 -3
  103. package/dist/components/dosha-card.js +1 -1
  104. package/dist/components/dosha-card.js.map +3 -3
  105. package/dist/components/dream-card.d.ts +17 -0
  106. package/dist/components/dream-card.d.ts.map +1 -0
  107. package/dist/components/dream-card.js +2 -0
  108. package/dist/components/dream-card.js.map +7 -0
  109. package/dist/components/forecast-timeline.js.map +3 -3
  110. package/dist/components/guna-milan.js +1 -1
  111. package/dist/components/guna-milan.js.map +3 -3
  112. package/dist/components/hexagram.js +1 -1
  113. package/dist/components/hexagram.js.map +3 -3
  114. package/dist/components/horoscope-card.js +1 -1
  115. package/dist/components/horoscope-card.js.map +3 -3
  116. package/dist/components/kp-chart.js +1 -1
  117. package/dist/components/kp-chart.js.map +3 -3
  118. package/dist/components/kp-planets-table.js +1 -1
  119. package/dist/components/kp-planets-table.js.map +3 -3
  120. package/dist/components/kp-ruling-planets.js +1 -1
  121. package/dist/components/kp-ruling-planets.js.map +3 -3
  122. package/dist/components/moon-phase.js +1 -1
  123. package/dist/components/moon-phase.js.map +3 -3
  124. package/dist/components/nakshatra-card.js +1 -1
  125. package/dist/components/nakshatra-card.js.map +3 -3
  126. package/dist/components/natal-chart.js +5 -5
  127. package/dist/components/natal-chart.js.map +3 -3
  128. package/dist/components/numerology-card.d.ts +7 -3
  129. package/dist/components/numerology-card.d.ts.map +1 -1
  130. package/dist/components/numerology-card.js +1 -1
  131. package/dist/components/numerology-card.js.map +3 -3
  132. package/dist/components/panchang-table.js +1 -1
  133. package/dist/components/panchang-table.js.map +3 -3
  134. package/dist/components/shadbala-table.js +1 -1
  135. package/dist/components/shadbala-table.js.map +3 -3
  136. package/dist/components/synastry-chart.js +4 -4
  137. package/dist/components/synastry-chart.js.map +3 -3
  138. package/dist/components/tarot-card.js +1 -1
  139. package/dist/components/tarot-card.js.map +3 -3
  140. package/dist/components/tarot-spread.js +1 -1
  141. package/dist/components/tarot-spread.js.map +3 -3
  142. package/dist/components/transits-table.js +1 -1
  143. package/dist/components/transits-table.js.map +3 -3
  144. package/dist/components/vedic-kundli.d.ts +18 -0
  145. package/dist/components/vedic-kundli.d.ts.map +1 -1
  146. package/dist/components/vedic-kundli.js +62 -62
  147. package/dist/components/vedic-kundli.js.map +3 -3
  148. package/dist/components/vedic-planets-table.js +1 -1
  149. package/dist/components/vedic-planets-table.js.map +3 -3
  150. package/dist/components/western-planets-table.js +1 -1
  151. package/dist/components/western-planets-table.js.map +3 -3
  152. package/dist/components/yoga-list.js +1 -1
  153. package/dist/components/yoga-list.js.map +3 -3
  154. package/dist/index.cjs +74 -74
  155. package/dist/index.cjs.map +4 -4
  156. package/dist/index.d.ts +5 -0
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +74 -74
  159. package/dist/index.js.map +4 -4
  160. package/dist/manifest.d.ts.map +1 -1
  161. package/dist/manifest.json +28 -24
  162. package/dist/styles/tokens-css.d.ts +2 -0
  163. package/dist/styles/tokens-css.d.ts.map +1 -0
  164. package/dist/styles/tokens.css +26 -11
  165. package/dist/types/index.d.ts +1 -1
  166. package/dist/types/index.d.ts.map +1 -1
  167. package/dist/types/types.gen.d.ts +43 -26
  168. package/dist/types/types.gen.d.ts.map +1 -1
  169. package/dist/utils/inject-tokens.d.ts +16 -0
  170. package/dist/utils/inject-tokens.d.ts.map +1 -0
  171. package/dist/utils/kundli-render.d.ts +2 -1
  172. package/dist/utils/kundli-render.d.ts.map +1 -1
  173. package/dist/utils/markup-data.d.ts +34 -0
  174. package/dist/utils/markup-data.d.ts.map +1 -1
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.d.ts.map +1 -1
  177. package/package.json +1 -1
  178. package/src/cdn.ts +15 -0
  179. package/src/components/angel-number-card.ts +234 -0
  180. package/src/components/angel-number-lookup.ts +208 -0
  181. package/src/components/crystal-grid.ts +191 -0
  182. package/src/components/dream-card.ts +98 -0
  183. package/src/components/numerology-card.ts +22 -10
  184. package/src/components/vedic-kundli.ts +37 -2
  185. package/src/index.ts +14 -0
  186. package/src/manifest.ts +57 -5
  187. package/src/styles/tokens-css.ts +225 -0
  188. package/src/styles/tokens.css +26 -11
  189. package/src/types/index.ts +1 -1
  190. package/src/types/types.gen.ts +43 -26
  191. package/src/utils/inject-tokens.ts +27 -0
  192. package/src/utils/kundli-render.ts +9 -2
  193. package/src/utils/markup-data.ts +45 -0
  194. package/src/version.ts +1 -1
@@ -1,96 +1,319 @@
1
- "use strict";var RoxyUI=(()=>{var nt=Object.defineProperty;var Zt=Object.getOwnPropertyDescriptor;var zr=Object.getOwnPropertyNames;var _r=Object.prototype.hasOwnProperty;var Dr=(n,a)=>{for(var e in a)nt(n,e,{get:a[e],enumerable:!0})},Or=(n,a,e,t)=>{if(a&&typeof a=="object"||typeof a=="function")for(let r of zr(a))!_r.call(n,r)&&r!==e&&nt(n,r,{get:()=>a[r],enumerable:!(t=Zt(a,r))||t.enumerable});return n};var Hr=n=>Or(nt({},"__esModule",{value:!0}),n),p=(n,a,e,t)=>{for(var r=t>1?void 0:t?Zt(a,e):a,o=n.length-1,i;o>=0;o--)(i=n[o])&&(r=(t?i(a,e,r):i(r))||r);return t&&r&&nt(a,e,r),r};var rs={};Dr(rs,{ROXY_COMPONENTS:()=>St,ROXY_UI_COMPONENTS:()=>ts,ROXY_UI_VERSION:()=>Mr,RoxyAshtakavargaGrid:()=>W,RoxyBiorhythmChart:()=>J,RoxyBodygraph:()=>ue,RoxyChoghadiyaGrid:()=>ye,RoxyCompatibilityCard:()=>X,RoxyDashaTimeline:()=>Z,RoxyData:()=>Q,RoxyDivisionalChart:()=>te,RoxyDoshaCard:()=>re,RoxyEndpointForm:()=>H,RoxyForecastTimeline:()=>be,RoxyGunaMilan:()=>ve,RoxyHexagram:()=>ae,RoxyHoroscopeCard:()=>se,RoxyKpChart:()=>oe,RoxyKpPlanetsTable:()=>$e,RoxyKpRulingPlanets:()=>we,RoxyLocationSearch:()=>D,RoxyMoonPhase:()=>ne,RoxyNakshatraCard:()=>ke,RoxyNatalChart:()=>F,RoxyNumerologyCard:()=>ie,RoxyPanchangTable:()=>le,RoxyShadbalaTable:()=>Se,RoxySynastryChart:()=>Ae,RoxyTarotCard:()=>de,RoxyTarotSpread:()=>ce,RoxyTransitsTable:()=>pe,RoxyVedicKundli:()=>me,RoxyVedicPlanetsTable:()=>Ce,RoxyWesternPlanetsTable:()=>Pe,RoxyYogaList:()=>he});var it=globalThis,lt=it.ShadowRoot&&(it.ShadyCSS===void 0||it.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,At=Symbol(),Qt=new WeakMap,Ye=class{constructor(a,e,t){if(this._$cssResult$=!0,t!==At)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=a,this.t=e}get styleSheet(){let a=this.o,e=this.t;if(lt&&a===void 0){let t=e!==void 0&&e.length===1;t&&(a=Qt.get(e)),a===void 0&&((this.o=a=new CSSStyleSheet).replaceSync(this.cssText),t&&Qt.set(e,a))}return a}toString(){return this.cssText}},er=n=>new Ye(typeof n=="string"?n:n+"",void 0,At),x=(n,...a)=>{let e=n.length===1?n[0]:a.reduce((t,r,o)=>t+(i=>{if(i._$cssResult$===!0)return i.cssText;if(typeof i=="number")return i;throw Error("Value passed to 'css' function must be a 'css' function result: "+i+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(r)+n[o+1],n[0]);return new Ye(e,n,At)},tr=(n,a)=>{if(lt)n.adoptedStyleSheets=a.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of a){let t=document.createElement("style"),r=it.litNonce;r!==void 0&&t.setAttribute("nonce",r),t.textContent=e.cssText,n.appendChild(t)}},Ct=lt?n=>n:n=>n instanceof CSSStyleSheet?(a=>{let e="";for(let t of a.cssRules)e+=t.cssText;return er(e)})(n):n;var{is:Gr,defineProperty:Ir,getOwnPropertyDescriptor:jr,getOwnPropertyNames:Br,getOwnPropertySymbols:Kr,getPrototypeOf:qr}=Object,dt=globalThis,rr=dt.trustedTypes,Vr=rr?rr.emptyScript:"",Yr=dt.reactiveElementPolyfillSupport,Fe=(n,a)=>n,Ue={toAttribute(n,a){switch(a){case Boolean:n=n?Vr:null;break;case Object:case Array:n=n==null?n:JSON.stringify(n)}return n},fromAttribute(n,a){let e=n;switch(a){case Boolean:e=n!==null;break;case Number:e=n===null?null:Number(n);break;case Object:case Array:try{e=JSON.parse(n)}catch{e=null}}return e}},ct=(n,a)=>!Gr(n,a),ar={attribute:!0,type:String,converter:Ue,reflect:!1,useDefault:!1,hasChanged:ct};Symbol.metadata??=Symbol("metadata"),dt.litPropertyMetadata??=new WeakMap;var U=class extends HTMLElement{static addInitializer(a){this._$Ei(),(this.l??=[]).push(a)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(a,e=ar){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(a)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(a,e),!e.noAccessor){let t=Symbol(),r=this.getPropertyDescriptor(a,t,e);r!==void 0&&Ir(this.prototype,a,r)}}static getPropertyDescriptor(a,e,t){let{get:r,set:o}=jr(this.prototype,a)??{get(){return this[e]},set(i){this[e]=i}};return{get:r,set(i){let d=r?.call(this);o?.call(this,i),this.requestUpdate(a,d,t)},configurable:!0,enumerable:!0}}static getPropertyOptions(a){return this.elementProperties.get(a)??ar}static _$Ei(){if(this.hasOwnProperty(Fe("elementProperties")))return;let a=qr(this);a.finalize(),a.l!==void 0&&(this.l=[...a.l]),this.elementProperties=new Map(a.elementProperties)}static finalize(){if(this.hasOwnProperty(Fe("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(Fe("properties"))){let e=this.properties,t=[...Br(e),...Kr(e)];for(let r of t)this.createProperty(r,e[r])}let a=this[Symbol.metadata];if(a!==null){let e=litPropertyMetadata.get(a);if(e!==void 0)for(let[t,r]of e)this.elementProperties.set(t,r)}this._$Eh=new Map;for(let[e,t]of this.elementProperties){let r=this._$Eu(e,t);r!==void 0&&this._$Eh.set(r,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(a){let e=[];if(Array.isArray(a)){let t=new Set(a.flat(1/0).reverse());for(let r of t)e.unshift(Ct(r))}else a!==void 0&&e.push(Ct(a));return e}static _$Eu(a,e){let t=e.attribute;return t===!1?void 0:typeof t=="string"?t:typeof a=="string"?a.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(a=>this.enableUpdating=a),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(a=>a(this))}addController(a){(this._$EO??=new Set).add(a),this.renderRoot!==void 0&&this.isConnected&&a.hostConnected?.()}removeController(a){this._$EO?.delete(a)}_$E_(){let a=new Map,e=this.constructor.elementProperties;for(let t of e.keys())this.hasOwnProperty(t)&&(a.set(t,this[t]),delete this[t]);a.size>0&&(this._$Ep=a)}createRenderRoot(){let a=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return tr(a,this.constructor.elementStyles),a}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(a=>a.hostConnected?.())}enableUpdating(a){}disconnectedCallback(){this._$EO?.forEach(a=>a.hostDisconnected?.())}attributeChangedCallback(a,e,t){this._$AK(a,t)}_$ET(a,e){let t=this.constructor.elementProperties.get(a),r=this.constructor._$Eu(a,t);if(r!==void 0&&t.reflect===!0){let o=(t.converter?.toAttribute!==void 0?t.converter:Ue).toAttribute(e,t.type);this._$Em=a,o==null?this.removeAttribute(r):this.setAttribute(r,o),this._$Em=null}}_$AK(a,e){let t=this.constructor,r=t._$Eh.get(a);if(r!==void 0&&this._$Em!==r){let o=t.getPropertyOptions(r),i=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:Ue;this._$Em=r;let d=i.fromAttribute(e,o.type);this[r]=d??this._$Ej?.get(r)??d,this._$Em=null}}requestUpdate(a,e,t,r=!1,o){if(a!==void 0){let i=this.constructor;if(r===!1&&(o=this[a]),t??=i.getPropertyOptions(a),!((t.hasChanged??ct)(o,e)||t.useDefault&&t.reflect&&o===this._$Ej?.get(a)&&!this.hasAttribute(i._$Eu(a,t))))return;this.C(a,e,t)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(a,e,{useDefault:t,reflect:r,wrapped:o},i){t&&!(this._$Ej??=new Map).has(a)&&(this._$Ej.set(a,i??e??this[a]),o!==!0||i!==void 0)||(this._$AL.has(a)||(this.hasUpdated||t||(e=void 0),this._$AL.set(a,e)),r===!0&&this._$Em!==a&&(this._$Eq??=new Set).add(a))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let a=this.scheduleUpdate();return a!=null&&await a,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[r,o]of this._$Ep)this[r]=o;this._$Ep=void 0}let t=this.constructor.elementProperties;if(t.size>0)for(let[r,o]of t){let{wrapped:i}=o,d=this[r];i!==!0||this._$AL.has(r)||d===void 0||this.C(r,void 0,o,d)}}let a=!1,e=this._$AL;try{a=this.shouldUpdate(e),a?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(t){throw a=!1,this._$EM(),t}a&&this._$AE(e)}willUpdate(a){}_$AE(a){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(a)),this.updated(a)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(a){return!0}update(a){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(a){}firstUpdated(a){}};U.elementStyles=[],U.shadowRootOptions={mode:"open"},U[Fe("elementProperties")]=new Map,U[Fe("finalized")]=new Map,Yr?.({ReactiveElement:U}),(dt.reactiveElementVersions??=[]).push("2.1.2");var Mt=globalThis,sr=n=>n,pt=Mt.trustedTypes,or=pt?pt.createPolicy("lit-html",{createHTML:n=>n}):void 0,pr="$lit$",ge=`lit$${Math.random().toFixed(9).slice(2)}$`,mr="?"+ge,Fr=`<${mr}>`,Le=document,Je=()=>Le.createComment(""),Xe=n=>n===null||typeof n!="object"&&typeof n!="function",zt=Array.isArray,Ur=n=>zt(n)||typeof n?.[Symbol.iterator]=="function",Pt=`[
2
- \f\r]`,We=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,nr=/-->/g,ir=/>/g,Te=RegExp(`>|${Pt}(?:([^\\s"'>=/]+)(${Pt}*=${Pt}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),lr=/'/g,dr=/"/g,hr=/^(?:script|style|textarea|title)$/i,_t=n=>(a,...e)=>({_$litType$:n,strings:a,values:e}),s=_t(1),w=_t(2),ls=_t(3),Ne=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),cr=new WeakMap,Re=Le.createTreeWalker(Le,129);function gr(n,a){if(!zt(n)||!n.hasOwnProperty("raw"))throw Error("invalid template strings array");return or!==void 0?or.createHTML(a):a}var Wr=(n,a)=>{let e=n.length-1,t=[],r,o=a===2?"<svg>":a===3?"<math>":"",i=We;for(let d=0;d<e;d++){let c=n[d],m,g,h=-1,y=0;for(;y<c.length&&(i.lastIndex=y,g=i.exec(c),g!==null);)y=i.lastIndex,i===We?g[1]==="!--"?i=nr:g[1]!==void 0?i=ir:g[2]!==void 0?(hr.test(g[2])&&(r=RegExp("</"+g[2],"g")),i=Te):g[3]!==void 0&&(i=Te):i===Te?g[0]===">"?(i=r??We,h=-1):g[1]===void 0?h=-2:(h=i.lastIndex-g[2].length,m=g[1],i=g[3]===void 0?Te:g[3]==='"'?dr:lr):i===dr||i===lr?i=Te:i===nr||i===ir?i=We:(i=Te,r=void 0);let S=i===Te&&n[d+1].startsWith("/>")?" ":"";o+=i===We?c+Fr:h>=0?(t.push(m),c.slice(0,h)+pr+c.slice(h)+ge+S):c+ge+(h===-2?d:S)}return[gr(n,o+(n[e]||"<?>")+(a===2?"</svg>":a===3?"</math>":"")),t]},Ze=class n{constructor({strings:a,_$litType$:e},t){let r;this.parts=[];let o=0,i=0,d=a.length-1,c=this.parts,[m,g]=Wr(a,e);if(this.el=n.createElement(m,t),Re.currentNode=this.el.content,e===2||e===3){let h=this.el.content.firstChild;h.replaceWith(...h.childNodes)}for(;(r=Re.nextNode())!==null&&c.length<d;){if(r.nodeType===1){if(r.hasAttributes())for(let h of r.getAttributeNames())if(h.endsWith(pr)){let y=g[i++],S=r.getAttribute(h).split(ge),k=/([.?@])?(.*)/.exec(y);c.push({type:1,index:o,name:k[2],strings:S,ctor:k[1]==="."?Tt:k[1]==="?"?Rt:k[1]==="@"?Lt:He}),r.removeAttribute(h)}else h.startsWith(ge)&&(c.push({type:6,index:o}),r.removeAttribute(h));if(hr.test(r.tagName)){let h=r.textContent.split(ge),y=h.length-1;if(y>0){r.textContent=pt?pt.emptyScript:"";for(let S=0;S<y;S++)r.append(h[S],Je()),Re.nextNode(),c.push({type:2,index:++o});r.append(h[y],Je())}}}else if(r.nodeType===8)if(r.data===mr)c.push({type:2,index:o});else{let h=-1;for(;(h=r.data.indexOf(ge,h+1))!==-1;)c.push({type:7,index:o}),h+=ge.length-1}o++}}static createElement(a,e){let t=Le.createElement("template");return t.innerHTML=a,t}};function Oe(n,a,e=n,t){if(a===Ne)return a;let r=t!==void 0?e._$Co?.[t]:e._$Cl,o=Xe(a)?void 0:a._$litDirective$;return r?.constructor!==o&&(r?._$AO?.(!1),o===void 0?r=void 0:(r=new o(n),r._$AT(n,e,t)),t!==void 0?(e._$Co??=[])[t]=r:e._$Cl=r),r!==void 0&&(a=Oe(n,r._$AS(n,a.values),r,t)),a}var Et=class{constructor(a,e){this._$AV=[],this._$AN=void 0,this._$AD=a,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(a){let{el:{content:e},parts:t}=this._$AD,r=(a?.creationScope??Le).importNode(e,!0);Re.currentNode=r;let o=Re.nextNode(),i=0,d=0,c=t[0];for(;c!==void 0;){if(i===c.index){let m;c.type===2?m=new Qe(o,o.nextSibling,this,a):c.type===1?m=new c.ctor(o,c.name,c.strings,this,a):c.type===6&&(m=new Nt(o,this,a)),this._$AV.push(m),c=t[++d]}i!==c?.index&&(o=Re.nextNode(),i++)}return Re.currentNode=Le,r}p(a){let e=0;for(let t of this._$AV)t!==void 0&&(t.strings!==void 0?(t._$AI(a,t,e),e+=t.strings.length-2):t._$AI(a[e])),e++}},Qe=class n{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(a,e,t,r){this.type=2,this._$AH=l,this._$AN=void 0,this._$AA=a,this._$AB=e,this._$AM=t,this.options=r,this._$Cv=r?.isConnected??!0}get parentNode(){let a=this._$AA.parentNode,e=this._$AM;return e!==void 0&&a?.nodeType===11&&(a=e.parentNode),a}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(a,e=this){a=Oe(this,a,e),Xe(a)?a===l||a==null||a===""?(this._$AH!==l&&this._$AR(),this._$AH=l):a!==this._$AH&&a!==Ne&&this._(a):a._$litType$!==void 0?this.$(a):a.nodeType!==void 0?this.T(a):Ur(a)?this.k(a):this._(a)}O(a){return this._$AA.parentNode.insertBefore(a,this._$AB)}T(a){this._$AH!==a&&(this._$AR(),this._$AH=this.O(a))}_(a){this._$AH!==l&&Xe(this._$AH)?this._$AA.nextSibling.data=a:this.T(Le.createTextNode(a)),this._$AH=a}$(a){let{values:e,_$litType$:t}=a,r=typeof t=="number"?this._$AC(a):(t.el===void 0&&(t.el=Ze.createElement(gr(t.h,t.h[0]),this.options)),t);if(this._$AH?._$AD===r)this._$AH.p(e);else{let o=new Et(r,this),i=o.u(this.options);o.p(e),this.T(i),this._$AH=o}}_$AC(a){let e=cr.get(a.strings);return e===void 0&&cr.set(a.strings,e=new Ze(a)),e}k(a){zt(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,t,r=0;for(let o of a)r===e.length?e.push(t=new n(this.O(Je()),this.O(Je()),this,this.options)):t=e[r],t._$AI(o),r++;r<e.length&&(this._$AR(t&&t._$AB.nextSibling,r),e.length=r)}_$AR(a=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);a!==this._$AB;){let t=sr(a).nextSibling;sr(a).remove(),a=t}}setConnected(a){this._$AM===void 0&&(this._$Cv=a,this._$AP?.(a))}},He=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(a,e,t,r,o){this.type=1,this._$AH=l,this._$AN=void 0,this.element=a,this.name=e,this._$AM=r,this.options=o,t.length>2||t[0]!==""||t[1]!==""?(this._$AH=Array(t.length-1).fill(new String),this.strings=t):this._$AH=l}_$AI(a,e=this,t,r){let o=this.strings,i=!1;if(o===void 0)a=Oe(this,a,e,0),i=!Xe(a)||a!==this._$AH&&a!==Ne,i&&(this._$AH=a);else{let d=a,c,m;for(a=o[0],c=0;c<o.length-1;c++)m=Oe(this,d[t+c],e,c),m===Ne&&(m=this._$AH[c]),i||=!Xe(m)||m!==this._$AH[c],m===l?a=l:a!==l&&(a+=(m??"")+o[c+1]),this._$AH[c]=m}i&&!r&&this.j(a)}j(a){a===l?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,a??"")}},Tt=class extends He{constructor(){super(...arguments),this.type=3}j(a){this.element[this.name]=a===l?void 0:a}},Rt=class extends He{constructor(){super(...arguments),this.type=4}j(a){this.element.toggleAttribute(this.name,!!a&&a!==l)}},Lt=class extends He{constructor(a,e,t,r,o){super(a,e,t,r,o),this.type=5}_$AI(a,e=this){if((a=Oe(this,a,e,0)??l)===Ne)return;let t=this._$AH,r=a===l&&t!==l||a.capture!==t.capture||a.once!==t.once||a.passive!==t.passive,o=a!==l&&(t===l||r);r&&this.element.removeEventListener(this.name,this,t),o&&this.element.addEventListener(this.name,this,a),this._$AH=a}handleEvent(a){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,a):this._$AH.handleEvent(a)}},Nt=class{constructor(a,e,t){this.element=a,this.type=6,this._$AN=void 0,this._$AM=e,this.options=t}get _$AU(){return this._$AM._$AU}_$AI(a){Oe(this,a)}};var Jr=Mt.litHtmlPolyfillSupport;Jr?.(Ze,Qe),(Mt.litHtmlVersions??=[]).push("3.3.2");var ur=(n,a,e)=>{let t=e?.renderBefore??a,r=t._$litPart$;if(r===void 0){let o=e?.renderBefore??null;t._$litPart$=r=new Qe(a.insertBefore(Je(),o),o,void 0,e??{})}return r._$AI(n),r};var Dt=globalThis,f=class extends U{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let a=super.createRenderRoot();return this.renderOptions.renderBefore??=a.firstChild,a}update(a){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(a),this._$Do=ur(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Ne}};f._$litElement$=!0,f.finalized=!0,Dt.litElementHydrateSupport?.({LitElement:f});var Xr=Dt.litElementPolyfillSupport;Xr?.({LitElement:f});(Dt.litElementVersions??=[]).push("4.2.2");var b=n=>(a,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(n,a)}):customElements.define(n,a)};var Zr={attribute:!0,type:String,converter:Ue,reflect:!1,hasChanged:ct},Qr=(n=Zr,a,e)=>{let{kind:t,metadata:r}=e,o=globalThis.litPropertyMetadata.get(r);if(o===void 0&&globalThis.litPropertyMetadata.set(r,o=new Map),t==="setter"&&((n=Object.create(n)).wrapped=!0),o.set(e.name,n),t==="accessor"){let{name:i}=e;return{set(d){let c=a.get.call(this);a.set.call(this,d),this.requestUpdate(i,c,n,!0,d)},init(d){return d!==void 0&&this.C(i,void 0,n,d),d}}}if(t==="setter"){let{name:i}=e;return function(d){let c=this[i];a.call(this,d),this.requestUpdate(i,c,n,!0,d)}}throw Error("Unsupported decorator location: "+t)};function u(n){return(a,e)=>typeof e=="object"?Qr(n,a,e):((t,r,o)=>{let i=r.hasOwnProperty(o);return r.constructor.createProperty(o,t),i?Object.getOwnPropertyDescriptor(r,o):void 0})(n,a,e)}function N(n){return u({...n,state:!0,attribute:!1})}var L={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},yr={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},G={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},ht={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},_=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],Us=_.map(n=>n.toLowerCase()),et={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},Ot={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},xr={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var v=x`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var ea="roxy-data";function ta(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var $=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(ta(a)&&a.classList.contains(ea))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var ra={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Me=["sarva","bhinna","pinda"],W=class extends f{constructor(){super();this.data=null;this.activeTab="sarva";new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return s`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?s`<p class="subtitle">${e.length} signs</p>`:l}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Me.map(t=>s`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${ra[t]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let t=Me.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Me[(t+1)%Me.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Me[(t-1+Me.length)%Me.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let t=this.data.sarvashtakavarga;return t?s`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((r,o)=>{let i=t.bindus[o]??0,d=this.sarvaHeat(i);return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${G[r]??""}</span> ${r}</div></td><td class="${`heat-cell ${d}`}">${i}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${t.total}</td></tr></tfoot></table></div>`:s`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let t=this.data.bhinnashtakavarga;return t?.length?s`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(r=>s`<th scope="col" title="${r}">${G[r]??r.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${t.map(r=>s`<tr><td>${r.planet}</td>${r.bindus.map(o=>{let i=this.bhinnaHeat(o);return s`<td class="${`heat-cell ${i}`}">${o}</td>`})}<td>${r.total}</td></tr>`)}</tbody></table></div>`:s`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?s`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(t=>s`<tr><td>${t.planet}</td><td>${t.rashiPinda}</td><td>${t.grahaPinda}</td><td>${t.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:s`<p class="roxy-empty">No shodhya pinda data</p>`}};W.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],p([u({attribute:!1})],W.prototype,"data",2),p([N()],W.prototype,"activeTab",2),W=p([b("roxy-ashtakavarga-grid")],W);var fr={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},J=class extends f{constructor(){super();this.data=null;this.mode="daily";new $(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):s`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let t=e.quickRead??{},r=Object.entries(t).map(([o,i])=>{let d=typeof i=="number"?i:0,c=Math.abs(d)>1?d/100:d;return[o,c]});return s`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?s`<span class="energy">Energy ${e.energyRating}/10</span>`:l}</header><div class="bars" role="list">${r.map(([o,i])=>{let d=(i+1)/2*100,c=fr[o]??"var(--roxy-accent, #f59e0b)";return s`<div class="bar" role="listitem"><span style="text-transform:capitalize">${o}</span> <span class="track"><span class="fill" style="width:${d}%;background:${c}"></span> </span><span class="value">${Math.round(i*100)}%</span></div>`})}</div>${e.dailyMessage?s`<p class="advice">${e.dailyMessage}</p>`:l} ${e.advice?s`<p class="advice">${e.advice}</p>`:l}</section>`}renderForecast(e){let t=e.days??[];if(t.length===0)return s`<div class="roxy-empty" role="status">No forecast</div>`;let r=600,o=160,i=r/Math.max(t.length-1,1),d=["physical","emotional","intellectual","intuitive"];return s`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${r} ${o}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${o/2}" x2="${r}" y2="${o/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${d.map(c=>{let m=t.map((h,y)=>{let S=h[c]??0,k=y*i,Ee=o/2-S/100*(o/2-8);return`${k.toFixed(2)},${Ee.toFixed(2)}`}).join(" "),g=fr[c]??"#475569";return w`<polyline points=${m} fill="none" stroke=${g} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?s`<p class="advice">${e.summary.periodAdvice}</p>`:l}</section>`}renderCritical(e){return s`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(t=>s`<span class="crit">${t.date} · ${t.cycle} ${t.severity}</span>`)}</div></section>`}};J.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],p([u({attribute:!1})],J.prototype,"data",2),p([u({type:String,reflect:!0})],J.prototype,"mode",2),J=p([b("roxy-biorhythm-chart")],J);var yt=4,xt=9,vr=(100+2*xt)*yt,aa=(100+2*xt)*yt;function I(n,a){return{x:(n+xt)*yt,y:(a+xt)*yt}}var tt=50,jt=n=>2*tt-n,Ht={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},sa={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function oa(){let n={},a={};for(let[e,[t,r]]of Object.entries(Ht.spleen))Ht["solar-plexus"][sa[Number(e)]]=[jt(t),r];for(let[e,t]of Object.entries(Ht))for(let[r,[o,i]]of Object.entries(t))n[Number(r)]=I(o,i),a[Number(r)]=e;return{points:n,centerOf:a}}var{points:It,centerOf:go}=oa(),uo=vr/2;function ze(n){return n.map(([a,e])=>I(a,e))}function Gt(n,a,e){return ze([[tt-n,a],[tt+n,a],[tt+n,e],[tt-n,e]])}var br=[[18.4,68],[18.4,81.8],[34.7,74.9]],na=[{id:"head",label:"Head",color:"gold",points:ze([[40,14.3],[60,14.3],[50,6]]),labelAnchor:I(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:ze([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:I(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Gt(9.5,30.4,43.6),labelAnchor:I(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:ze([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:I(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:ze([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:I(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:ze(br),labelAnchor:I(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Gt(9.5,70.6,83.6),labelAnchor:I(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:ze(br.map(([n,a])=>[jt(n),a])),labelAnchor:I(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Gt(9.5,87.9,99.9),labelAnchor:I(50,103),labelAlign:"middle"}],ia=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],la=da();function da(){let n=jt,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${gt(a[0])}`];for(let t=1;t+2<a.length;t+=3)e.push(`C ${gt(a[t])} ${gt(a[t+1])} ${gt(a[t+2])}`);e.push(`L ${ut(a[a.length-1],n)}`);for(let t=a.length-3;t>=1;t-=3)e.push(`C ${ut(a[t+1],n)} ${ut(a[t],n)} ${ut(a[t-1],n)}`);return e.push("Z"),e.join(" ")}function gt([n,a]){let e=I(n,a);return`${e.x} ${e.y}`}function ut([n,a],e){let t=I(e(n),a);return`${t.x} ${t.y}`}function ca(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function $r(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function pa(){return w`<path class="bg-body" d=${la} />`}function ma(n,a){let e=[];for(let[t,r]of ia){let o=It[t],i=It[r];if(!o||!i)continue;if(e.push(w`<line class="bg-channel" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`),n.has($r(t,r))){e.push(w`<line class="bg-channel on" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`);continue}let d={x:(o.x+i.x)/2,y:(o.y+i.y)/2};a.has(t)&&e.push(w`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${d.x} y2=${d.y} />`),a.has(r)&&e.push(w`<line class="bg-half" x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} />`)}return e}function ha(n,a,e){let t=e.x-a.x,r=e.y-a.y,o=t*t+r*r;if(o===0)return a;let i=Math.max(0,Math.min(1,((n.x-a.x)*t+(n.y-a.y)*r)/o));return{x:a.x+i*t,y:a.y+i*r}}function ga(n,a){let e=a[0],t=Number.POSITIVE_INFINITY;for(let r=0;r<a.length;r++){let o=ha(n,a[r],a[(r+1)%a.length]),i=(o.x-n.x)**2+(o.y-n.y)**2;i<t&&(t=i,e=o)}return e}function ua(n){return na.map(a=>{let e=n.has(a.id),t=`bg-center bg-${a.color}${e?" defined":""}`,r=ga(a.labelAnchor,a.points);return w`<g>
4
- <line class="bg-leader" x1=${a.labelAnchor.x} y1=${a.labelAnchor.y} x2=${r.x} y2=${r.y} />
5
- <polygon class=${t} points=${ca(a.points)}><title>${a.label}: ${e?"defined":"open"}</title></polygon>
1
+ "use strict";var RoxyUI=(()=>{var cr=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var Yt=Object.getOwnPropertyNames;var Ut=Object.prototype.hasOwnProperty;var Vt=(n,a)=>{for(var e in a)cr(n,e,{get:a[e],enumerable:!0})},Ft=(n,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of Yt(a))!Ut.call(n,t)&&t!==e&&cr(n,t,{get:()=>a[t],enumerable:!(r=ot(a,t))||r.enumerable});return n};var Wt=n=>Ft(cr({},"__esModule",{value:!0}),n),p=(n,a,e,r)=>{for(var t=r>1?void 0:r?ot(a,e):a,o=n.length-1,i;o>=0;o--)(i=n[o])&&(t=(r?i(a,e,t):i(t))||t);return r&&t&&cr(a,e,t),t};var ys={};Vt(ys,{ROXY_COMPONENTS:()=>Tr,ROXY_UI_COMPONENTS:()=>hs,ROXY_UI_TOKENS_STYLE_ID:()=>Rr,ROXY_UI_VERSION:()=>Kt,RoxyAngelNumberCard:()=>ue,RoxyAngelNumberLookup:()=>xe,RoxyAshtakavargaGrid:()=>J,RoxyBiorhythmChart:()=>X,RoxyBodygraph:()=>fe,RoxyChoghadiyaGrid:()=>be,RoxyCompatibilityCard:()=>Z,RoxyCrystalGrid:()=>Q,RoxyDashaTimeline:()=>ee,RoxyData:()=>re,RoxyDivisionalChart:()=>ae,RoxyDoshaCard:()=>se,RoxyDreamCard:()=>we,RoxyEndpointForm:()=>G,RoxyForecastTimeline:()=>ke,RoxyGunaMilan:()=>Se,RoxyHexagram:()=>oe,RoxyHoroscopeCard:()=>ne,RoxyKpChart:()=>ie,RoxyKpPlanetsTable:()=>Ae,RoxyKpRulingPlanets:()=>Ce,RoxyLocationSearch:()=>_,RoxyMoonPhase:()=>le,RoxyNakshatraCard:()=>Ee,RoxyNatalChart:()=>F,RoxyNumerologyCard:()=>de,RoxyPanchangTable:()=>ce,RoxyShadbalaTable:()=>Te,RoxySynastryChart:()=>Re,RoxyTarotCard:()=>pe,RoxyTarotSpread:()=>me,RoxyTransitsTable:()=>ge,RoxyVedicKundli:()=>K,RoxyVedicPlanetsTable:()=>Pe,RoxyWesternPlanetsTable:()=>Le,RoxyYogaList:()=>he,injectRoxyTokens:()=>Pr,roxyDataScript:()=>St,serializeRoxyData:()=>Kr});var pr=globalThis,mr=pr.ShadowRoot&&(pr.ShadyCSS===void 0||pr.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Lr=Symbol(),nt=new WeakMap,Je=class{constructor(a,e,r){if(this._$cssResult$=!0,r!==Lr)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=a,this.t=e}get styleSheet(){let a=this.o,e=this.t;if(mr&&a===void 0){let r=e!==void 0&&e.length===1;r&&(a=nt.get(e)),a===void 0&&((this.o=a=new CSSStyleSheet).replaceSync(this.cssText),r&&nt.set(e,a))}return a}toString(){return this.cssText}},it=n=>new Je(typeof n=="string"?n:n+"",void 0,Lr),u=(n,...a)=>{let e=n.length===1?n[0]:a.reduce((r,t,o)=>r+(i=>{if(i._$cssResult$===!0)return i.cssText;if(typeof i=="number")return i;throw Error("Value passed to 'css' function must be a 'css' function result: "+i+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(t)+n[o+1],n[0]);return new Je(e,n,Lr)},lt=(n,a)=>{if(mr)n.adoptedStyleSheets=a.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of a){let r=document.createElement("style"),t=pr.litNonce;t!==void 0&&r.setAttribute("nonce",t),r.textContent=e.cssText,n.appendChild(r)}},Nr=mr?n=>n:n=>n instanceof CSSStyleSheet?(a=>{let e="";for(let r of a.cssRules)e+=r.cssText;return it(e)})(n):n;var{is:Jt,defineProperty:Xt,getOwnPropertyDescriptor:Zt,getOwnPropertyNames:Qt,getOwnPropertySymbols:ea,getPrototypeOf:ra}=Object,gr=globalThis,dt=gr.trustedTypes,ta=dt?dt.emptyScript:"",aa=gr.reactiveElementPolyfillSupport,Xe=(n,a)=>n,Ze={toAttribute(n,a){switch(a){case Boolean:n=n?ta:null;break;case Object:case Array:n=n==null?n:JSON.stringify(n)}return n},fromAttribute(n,a){let e=n;switch(a){case Boolean:e=n!==null;break;case Number:e=n===null?null:Number(n);break;case Object:case Array:try{e=JSON.parse(n)}catch{e=null}}return e}},hr=(n,a)=>!Jt(n,a),ct={attribute:!0,type:String,converter:Ze,reflect:!1,useDefault:!1,hasChanged:hr};Symbol.metadata??=Symbol("metadata"),gr.litPropertyMetadata??=new WeakMap;var W=class extends HTMLElement{static addInitializer(a){this._$Ei(),(this.l??=[]).push(a)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(a,e=ct){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(a)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(a,e),!e.noAccessor){let r=Symbol(),t=this.getPropertyDescriptor(a,r,e);t!==void 0&&Xt(this.prototype,a,t)}}static getPropertyDescriptor(a,e,r){let{get:t,set:o}=Zt(this.prototype,a)??{get(){return this[e]},set(i){this[e]=i}};return{get:t,set(i){let d=t?.call(this);o?.call(this,i),this.requestUpdate(a,d,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(a){return this.elementProperties.get(a)??ct}static _$Ei(){if(this.hasOwnProperty(Xe("elementProperties")))return;let a=ra(this);a.finalize(),a.l!==void 0&&(this.l=[...a.l]),this.elementProperties=new Map(a.elementProperties)}static finalize(){if(this.hasOwnProperty(Xe("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(Xe("properties"))){let e=this.properties,r=[...Qt(e),...ea(e)];for(let t of r)this.createProperty(t,e[t])}let a=this[Symbol.metadata];if(a!==null){let e=litPropertyMetadata.get(a);if(e!==void 0)for(let[r,t]of e)this.elementProperties.set(r,t)}this._$Eh=new Map;for(let[e,r]of this.elementProperties){let t=this._$Eu(e,r);t!==void 0&&this._$Eh.set(t,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(a){let e=[];if(Array.isArray(a)){let r=new Set(a.flat(1/0).reverse());for(let t of r)e.unshift(Nr(t))}else a!==void 0&&e.push(Nr(a));return e}static _$Eu(a,e){let r=e.attribute;return r===!1?void 0:typeof r=="string"?r:typeof a=="string"?a.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(a=>this.enableUpdating=a),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(a=>a(this))}addController(a){(this._$EO??=new Set).add(a),this.renderRoot!==void 0&&this.isConnected&&a.hostConnected?.()}removeController(a){this._$EO?.delete(a)}_$E_(){let a=new Map,e=this.constructor.elementProperties;for(let r of e.keys())this.hasOwnProperty(r)&&(a.set(r,this[r]),delete this[r]);a.size>0&&(this._$Ep=a)}createRenderRoot(){let a=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return lt(a,this.constructor.elementStyles),a}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(a=>a.hostConnected?.())}enableUpdating(a){}disconnectedCallback(){this._$EO?.forEach(a=>a.hostDisconnected?.())}attributeChangedCallback(a,e,r){this._$AK(a,r)}_$ET(a,e){let r=this.constructor.elementProperties.get(a),t=this.constructor._$Eu(a,r);if(t!==void 0&&r.reflect===!0){let o=(r.converter?.toAttribute!==void 0?r.converter:Ze).toAttribute(e,r.type);this._$Em=a,o==null?this.removeAttribute(t):this.setAttribute(t,o),this._$Em=null}}_$AK(a,e){let r=this.constructor,t=r._$Eh.get(a);if(t!==void 0&&this._$Em!==t){let o=r.getPropertyOptions(t),i=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:Ze;this._$Em=t;let d=i.fromAttribute(e,o.type);this[t]=d??this._$Ej?.get(t)??d,this._$Em=null}}requestUpdate(a,e,r,t=!1,o){if(a!==void 0){let i=this.constructor;if(t===!1&&(o=this[a]),r??=i.getPropertyOptions(a),!((r.hasChanged??hr)(o,e)||r.useDefault&&r.reflect&&o===this._$Ej?.get(a)&&!this.hasAttribute(i._$Eu(a,r))))return;this.C(a,e,r)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(a,e,{useDefault:r,reflect:t,wrapped:o},i){r&&!(this._$Ej??=new Map).has(a)&&(this._$Ej.set(a,i??e??this[a]),o!==!0||i!==void 0)||(this._$AL.has(a)||(this.hasUpdated||r||(e=void 0),this._$AL.set(a,e)),t===!0&&this._$Em!==a&&(this._$Eq??=new Set).add(a))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let a=this.scheduleUpdate();return a!=null&&await a,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[t,o]of this._$Ep)this[t]=o;this._$Ep=void 0}let r=this.constructor.elementProperties;if(r.size>0)for(let[t,o]of r){let{wrapped:i}=o,d=this[t];i!==!0||this._$AL.has(t)||d===void 0||this.C(t,void 0,o,d)}}let a=!1,e=this._$AL;try{a=this.shouldUpdate(e),a?(this.willUpdate(e),this._$EO?.forEach(r=>r.hostUpdate?.()),this.update(e)):this._$EM()}catch(r){throw a=!1,this._$EM(),r}a&&this._$AE(e)}willUpdate(a){}_$AE(a){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(a)),this.updated(a)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(a){return!0}update(a){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(a){}firstUpdated(a){}};W.elementStyles=[],W.shadowRootOptions={mode:"open"},W[Xe("elementProperties")]=new Map,W[Xe("finalized")]=new Map,aa?.({ReactiveElement:W}),(gr.reactiveElementVersions??=[]).push("2.1.2");var Hr=globalThis,pt=n=>n,yr=Hr.trustedTypes,mt=yr?yr.createPolicy("lit-html",{createHTML:n=>n}):void 0,ft="$lit$",ye=`lit$${Math.random().toFixed(9).slice(2)}$`,bt="?"+ye,sa=`<${bt}>`,De=document,er=()=>De.createComment(""),rr=n=>n===null||typeof n!="object"&&typeof n!="function",Ir=Array.isArray,oa=n=>Ir(n)||typeof n?.[Symbol.iterator]=="function",Mr=`[
2
+ \f\r]`,Qe=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,gt=/-->/g,ht=/>/g,Me=RegExp(`>|${Mr}(?:([^\\s"'>=/]+)(${Mr}*=${Mr}*(?:[^
3
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),yt=/'/g,ut=/"/g,vt=/^(?:script|style|textarea|title)$/i,jr=n=>(a,...e)=>({_$litType$:n,strings:a,values:e}),s=jr(1),w=jr(2),$s=jr(3),_e=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),xt=new WeakMap,ze=De.createTreeWalker(De,129);function $t(n,a){if(!Ir(n)||!n.hasOwnProperty("raw"))throw Error("invalid template strings array");return mt!==void 0?mt.createHTML(a):a}var na=(n,a)=>{let e=n.length-1,r=[],t,o=a===2?"<svg>":a===3?"<math>":"",i=Qe;for(let d=0;d<e;d++){let c=n[d],m,y,g=-1,f=0;for(;f<c.length&&(i.lastIndex=f,y=i.exec(c),y!==null);)f=i.lastIndex,i===Qe?y[1]==="!--"?i=gt:y[1]!==void 0?i=ht:y[2]!==void 0?(vt.test(y[2])&&(t=RegExp("</"+y[2],"g")),i=Me):y[3]!==void 0&&(i=Me):i===Me?y[0]===">"?(i=t??Qe,g=-1):y[1]===void 0?g=-2:(g=i.lastIndex-y[2].length,m=y[1],i=y[3]===void 0?Me:y[3]==='"'?ut:yt):i===ut||i===yt?i=Me:i===gt||i===ht?i=Qe:(i=Me,t=void 0);let S=i===Me&&n[d+1].startsWith("/>")?" ":"";o+=i===Qe?c+sa:g>=0?(r.push(m),c.slice(0,g)+ft+c.slice(g)+ye+S):c+ye+(g===-2?d:S)}return[$t(n,o+(n[e]||"<?>")+(a===2?"</svg>":a===3?"</math>":"")),r]},tr=class n{constructor({strings:a,_$litType$:e},r){let t;this.parts=[];let o=0,i=0,d=a.length-1,c=this.parts,[m,y]=na(a,e);if(this.el=n.createElement(m,r),ze.currentNode=this.el.content,e===2||e===3){let g=this.el.content.firstChild;g.replaceWith(...g.childNodes)}for(;(t=ze.nextNode())!==null&&c.length<d;){if(t.nodeType===1){if(t.hasAttributes())for(let g of t.getAttributeNames())if(g.endsWith(ft)){let f=y[i++],S=t.getAttribute(g).split(ye),k=/([.?@])?(.*)/.exec(f);c.push({type:1,index:o,name:k[2],strings:S,ctor:k[1]==="."?Dr:k[1]==="?"?_r:k[1]==="@"?Or:Be}),t.removeAttribute(g)}else g.startsWith(ye)&&(c.push({type:6,index:o}),t.removeAttribute(g));if(vt.test(t.tagName)){let g=t.textContent.split(ye),f=g.length-1;if(f>0){t.textContent=yr?yr.emptyScript:"";for(let S=0;S<f;S++)t.append(g[S],er()),ze.nextNode(),c.push({type:2,index:++o});t.append(g[f],er())}}}else if(t.nodeType===8)if(t.data===bt)c.push({type:2,index:o});else{let g=-1;for(;(g=t.data.indexOf(ye,g+1))!==-1;)c.push({type:7,index:o}),g+=ye.length-1}o++}}static createElement(a,e){let r=De.createElement("template");return r.innerHTML=a,r}};function je(n,a,e=n,r){if(a===_e)return a;let t=r!==void 0?e._$Co?.[r]:e._$Cl,o=rr(a)?void 0:a._$litDirective$;return t?.constructor!==o&&(t?._$AO?.(!1),o===void 0?t=void 0:(t=new o(n),t._$AT(n,e,r)),r!==void 0?(e._$Co??=[])[r]=t:e._$Cl=t),t!==void 0&&(a=je(n,t._$AS(n,a.values),t,r)),a}var zr=class{constructor(a,e){this._$AV=[],this._$AN=void 0,this._$AD=a,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(a){let{el:{content:e},parts:r}=this._$AD,t=(a?.creationScope??De).importNode(e,!0);ze.currentNode=t;let o=ze.nextNode(),i=0,d=0,c=r[0];for(;c!==void 0;){if(i===c.index){let m;c.type===2?m=new ar(o,o.nextSibling,this,a):c.type===1?m=new c.ctor(o,c.name,c.strings,this,a):c.type===6&&(m=new Gr(o,this,a)),this._$AV.push(m),c=r[++d]}i!==c?.index&&(o=ze.nextNode(),i++)}return ze.currentNode=De,t}p(a){let e=0;for(let r of this._$AV)r!==void 0&&(r.strings!==void 0?(r._$AI(a,r,e),e+=r.strings.length-2):r._$AI(a[e])),e++}},ar=class n{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(a,e,r,t){this.type=2,this._$AH=l,this._$AN=void 0,this._$AA=a,this._$AB=e,this._$AM=r,this.options=t,this._$Cv=t?.isConnected??!0}get parentNode(){let a=this._$AA.parentNode,e=this._$AM;return e!==void 0&&a?.nodeType===11&&(a=e.parentNode),a}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(a,e=this){a=je(this,a,e),rr(a)?a===l||a==null||a===""?(this._$AH!==l&&this._$AR(),this._$AH=l):a!==this._$AH&&a!==_e&&this._(a):a._$litType$!==void 0?this.$(a):a.nodeType!==void 0?this.T(a):oa(a)?this.k(a):this._(a)}O(a){return this._$AA.parentNode.insertBefore(a,this._$AB)}T(a){this._$AH!==a&&(this._$AR(),this._$AH=this.O(a))}_(a){this._$AH!==l&&rr(this._$AH)?this._$AA.nextSibling.data=a:this.T(De.createTextNode(a)),this._$AH=a}$(a){let{values:e,_$litType$:r}=a,t=typeof r=="number"?this._$AC(a):(r.el===void 0&&(r.el=tr.createElement($t(r.h,r.h[0]),this.options)),r);if(this._$AH?._$AD===t)this._$AH.p(e);else{let o=new zr(t,this),i=o.u(this.options);o.p(e),this.T(i),this._$AH=o}}_$AC(a){let e=xt.get(a.strings);return e===void 0&&xt.set(a.strings,e=new tr(a)),e}k(a){Ir(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,r,t=0;for(let o of a)t===e.length?e.push(r=new n(this.O(er()),this.O(er()),this,this.options)):r=e[t],r._$AI(o),t++;t<e.length&&(this._$AR(r&&r._$AB.nextSibling,t),e.length=t)}_$AR(a=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);a!==this._$AB;){let r=pt(a).nextSibling;pt(a).remove(),a=r}}setConnected(a){this._$AM===void 0&&(this._$Cv=a,this._$AP?.(a))}},Be=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(a,e,r,t,o){this.type=1,this._$AH=l,this._$AN=void 0,this.element=a,this.name=e,this._$AM=t,this.options=o,r.length>2||r[0]!==""||r[1]!==""?(this._$AH=Array(r.length-1).fill(new String),this.strings=r):this._$AH=l}_$AI(a,e=this,r,t){let o=this.strings,i=!1;if(o===void 0)a=je(this,a,e,0),i=!rr(a)||a!==this._$AH&&a!==_e,i&&(this._$AH=a);else{let d=a,c,m;for(a=o[0],c=0;c<o.length-1;c++)m=je(this,d[r+c],e,c),m===_e&&(m=this._$AH[c]),i||=!rr(m)||m!==this._$AH[c],m===l?a=l:a!==l&&(a+=(m??"")+o[c+1]),this._$AH[c]=m}i&&!t&&this.j(a)}j(a){a===l?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,a??"")}},Dr=class extends Be{constructor(){super(...arguments),this.type=3}j(a){this.element[this.name]=a===l?void 0:a}},_r=class extends Be{constructor(){super(...arguments),this.type=4}j(a){this.element.toggleAttribute(this.name,!!a&&a!==l)}},Or=class extends Be{constructor(a,e,r,t,o){super(a,e,r,t,o),this.type=5}_$AI(a,e=this){if((a=je(this,a,e,0)??l)===_e)return;let r=this._$AH,t=a===l&&r!==l||a.capture!==r.capture||a.once!==r.once||a.passive!==r.passive,o=a!==l&&(r===l||t);t&&this.element.removeEventListener(this.name,this,r),o&&this.element.addEventListener(this.name,this,a),this._$AH=a}handleEvent(a){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,a):this._$AH.handleEvent(a)}},Gr=class{constructor(a,e,r){this.element=a,this.type=6,this._$AN=void 0,this._$AM=e,this.options=r}get _$AU(){return this._$AM._$AU}_$AI(a){je(this,a)}};var ia=Hr.litHtmlPolyfillSupport;ia?.(tr,ar),(Hr.litHtmlVersions??=[]).push("3.3.2");var wt=(n,a,e)=>{let r=e?.renderBefore??a,t=r._$litPart$;if(t===void 0){let o=e?.renderBefore??null;r._$litPart$=t=new ar(a.insertBefore(er(),o),o,void 0,e??{})}return t._$AI(n),t};var Br=globalThis,x=class extends W{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let a=super.createRenderRoot();return this.renderOptions.renderBefore??=a.firstChild,a}update(a){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(a),this._$Do=wt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return _e}};x._$litElement$=!0,x.finalized=!0,Br.litElementHydrateSupport?.({LitElement:x});var la=Br.litElementPolyfillSupport;la?.({LitElement:x});(Br.litElementVersions??=[]).push("4.2.2");var b=n=>(a,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(n,a)}):customElements.define(n,a)};var da={attribute:!0,type:String,converter:Ze,reflect:!1,hasChanged:hr},ca=(n=da,a,e)=>{let{kind:r,metadata:t}=e,o=globalThis.litPropertyMetadata.get(t);if(o===void 0&&globalThis.litPropertyMetadata.set(t,o=new Map),r==="setter"&&((n=Object.create(n)).wrapped=!0),o.set(e.name,n),r==="accessor"){let{name:i}=e;return{set(d){let c=a.get.call(this);a.set.call(this,d),this.requestUpdate(i,c,n,!0,d)},init(d){return d!==void 0&&this.C(i,void 0,n,d),d}}}if(r==="setter"){let{name:i}=e;return function(d){let c=this[i];a.call(this,d),this.requestUpdate(i,c,n,!0,d)}}throw Error("Unsupported decorator location: "+r)};function h(n){return(a,e)=>typeof e=="object"?ca(n,a,e):((r,t,o)=>{let i=t.hasOwnProperty(o);return t.constructor.createProperty(o,r),i?Object.getOwnPropertyDescriptor(t,o):void 0})(n,a,e)}function N(n){return h({...n,state:!0,attribute:!1})}var v=u`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var kt="roxy-data";function Kr(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function St(n){return`<script type="application/json" class="${kt}">${Kr(n)}<\/script>`}function pa(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var $=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(pa(a)&&a.classList.contains(kt))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var ma=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"twinFlame",label:"Twin flame"}],ue=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No angel number</div>`;let r=(e.energy??"").toLowerCase(),t=r==="positive"||r==="cautionary"||r==="neutral"?r:"",o=e.keywords??[],i=e.actionSteps??[];return s`<article class="card" aria-label="${`Angel number ${e.number??""}`}"><div class="hero">${e.number?s`<div class="numeral">${e.number}</div>`:l}<div><p class="label">Angel number</p>${e.title?s`<h2 class="title">${e.title}</h2>`:l}</div></div>${e.coreMessage?s`<p class="core">${e.coreMessage}</p>`:l}<div class="badges">${e.type?s`<span class="badge">${e.type}</span>`:l} ${typeof e.digitRoot=="number"?s`<span class="badge">Digit root ${e.digitRoot}</span>`:l} ${e.energy?s`<span class="${`badge ${t}`}">${e.energy}</span>`:l}</div>${o.length>0?s`<div class="chips">${o.map(d=>s`<span>${d}</span>`)}</div>`:l} ${this.renderSections(e)} ${e.affirmation?s`<p class="affirmation">${e.affirmation}</p>`:l} ${i.length>0?s`<div class="steps"><h3>Action steps</h3><ul>${i.map(d=>s`<li>${d}</li>`)}</ul></div>`:l}</article>`}renderSections(e){let r=e.meaning;if(!r)return l;let t=ma.filter(o=>r[o.key]);return t.length===0?l:s`<div class="sections">${t.map((o,i)=>s`<details name="angel-meaning" ?open="${i===0}"><summary>${o.label}</summary><p>${r[o.key]}</p></details>`)}</div>`}};ue.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.core{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;padding:3px 10px;display:inline-flex}.badge.positive{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.cautionary{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.badge.neutral{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.sections{gap:var(--roxy-space-xs,.25rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);display:grid}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.affirmation{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);border-left:3px solid var(--roxy-accent,#f59e0b);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-sm,4px);color:var(--roxy-fg,#0a0a0a);margin:0;font-style:italic}.steps h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.steps ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);gap:2px;margin:0;display:grid}`],p([h({attribute:!1})],ue.prototype,"data",2),ue=p([b("roxy-angel-number-card")],ue);var ga=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"twinFlame",label:"Twin flame"}],xe=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No number analysis</div>`;let r=e.knownMeaning,t=e.digitRootMeaning,o=r?.title??"Number analysis";return s`<article class="card" aria-label="${`Number ${e.number??""}`}"><div class="hero">${e.number?s`<div class="numeral">${e.number}</div>`:l}<div><p class="label">Number analysis</p><h2 class="title">${o}</h2></div></div><div class="badges">${e.type?s`<span class="badge">${e.type}</span>`:l} ${typeof e.digits=="number"?s`<span class="badge">${e.digits} digits</span>`:l} ${typeof e.uniqueDigits=="number"?s`<span class="badge">${e.uniqueDigits} unique</span>`:l} ${typeof e.digitRoot=="number"?s`<span class="badge">Digit root ${e.digitRoot}</span>`:l} ${e.isPalindrome?s`<span class="badge flag">Palindrome</span>`:l} ${e.isRepeating?s`<span class="badge flag">Repeating</span>`:l}</div>${r?s`<div class="section"><p class="label">Known angel number</p>${r.coreMessage?s`<p>${r.coreMessage}</p>`:l} ${r.keywords&&r.keywords.length>0?s`<div class="chips">${r.keywords.map(i=>s`<span>${i}</span>`)}</div>`:l} ${this.renderMeaning(r.meaning)} ${r.affirmation?s`<p><em>${r.affirmation}</em></p>`:l}</div>`:l} ${t?s`<div class="section"><p class="label">Foundational digit root${t.number?` (${t.number})`:""}</p>${t.title?s`<h3>${t.title}</h3>`:l} ${t.coreMessage?s`<p>${t.coreMessage}</p>`:l}</div>`:l}</article>`}renderMeaning(e){if(!e)return l;let r=ga.filter(t=>e[t.key]);return r.length===0?l:s`${r.map((t,o)=>s`<details name="lookup-meaning" ?open="${o===0}"><summary>${t.label}</summary><p>${e[t.key]}</p></details>`)}`}};xe.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;align-items:center;padding:3px 10px;display:inline-flex}.badge.flag{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.section>.label{margin:0}.section h3{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.section p{color:var(--roxy-fg,#0a0a0a);line-height:1.6;font-size:var(--roxy-text-sm,.875rem);margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem)}`],p([h({attribute:!1})],xe.prototype,"data",2),xe=p([b("roxy-angel-number-lookup")],xe);var L={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},At={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},H={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},xr={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},D=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],ko=D.map(n=>n.toLowerCase()),sr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},qr={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},Ct={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var ha={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Oe=["sarva","bhinna","pinda"],J=class extends x{constructor(){super();this.data=null;this.activeTab="sarva";new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return s`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?s`<p class="subtitle">${e.length} signs</p>`:l}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Oe.map(r=>s`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${ha[r]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=Oe.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Oe[(r+1)%Oe.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Oe[(r-1+Oe.length)%Oe.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?s`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,o)=>{let i=r.bindus[o]??0,d=this.sarvaHeat(i);return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${H[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${d}`}">${i}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:s`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?s`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>s`<th scope="col" title="${t}">${H[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>s`<tr><td>${t.planet}</td>${t.bindus.map(o=>{let i=this.bhinnaHeat(o);return s`<td class="${`heat-cell ${i}`}">${o}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:s`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?s`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>s`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:s`<p class="roxy-empty">No shodhya pinda data</p>`}};J.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],p([h({attribute:!1})],J.prototype,"data",2),p([N()],J.prototype,"activeTab",2),J=p([b("roxy-ashtakavarga-grid")],J);var Et={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},X=class extends x{constructor(){super();this.data=null;this.mode="daily";new $(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):s`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([o,i])=>{let d=typeof i=="number"?i:0,c=Math.abs(d)>1?d/100:d;return[o,c]});return s`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?s`<span class="energy">Energy ${e.energyRating}/10</span>`:l}</header><div class="bars" role="list">${t.map(([o,i])=>{let d=(i+1)/2*100,c=Et[o]??"var(--roxy-accent, #f59e0b)";return s`<div class="bar" role="listitem"><span style="text-transform:capitalize">${o}</span> <span class="track"><span class="fill" style="width:${d}%;background:${c}"></span> </span><span class="value">${Math.round(i*100)}%</span></div>`})}</div>${e.dailyMessage?s`<p class="advice">${e.dailyMessage}</p>`:l} ${e.advice?s`<p class="advice">${e.advice}</p>`:l}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return s`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,o=160,i=t/Math.max(r.length-1,1),d=["physical","emotional","intellectual","intuitive"];return s`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${o}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${o/2}" x2="${t}" y2="${o/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${d.map(c=>{let m=r.map((g,f)=>{let S=g[c]??0,k=f*i,Ne=o/2-S/100*(o/2-8);return`${k.toFixed(2)},${Ne.toFixed(2)}`}).join(" "),y=Et[c]??"#475569";return w`<polyline points=${m} fill="none" stroke=${y} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?s`<p class="advice">${e.summary.periodAdvice}</p>`:l}</section>`}renderCritical(e){return s`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>s`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};X.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],p([h({attribute:!1})],X.prototype,"data",2),p([h({type:String,reflect:!0})],X.prototype,"mode",2),X=p([b("roxy-biorhythm-chart")],X);var vr=4,$r=9,Rt=(100+2*$r)*vr,ya=(100+2*$r)*vr;function I(n,a){return{x:(n+$r)*vr,y:(a+$r)*vr}}var or=50,Fr=n=>2*or-n,Yr={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},ua={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function xa(){let n={},a={};for(let[e,[r,t]]of Object.entries(Yr.spleen))Yr["solar-plexus"][ua[Number(e)]]=[Fr(r),t];for(let[e,r]of Object.entries(Yr))for(let[t,[o,i]]of Object.entries(r))n[Number(t)]=I(o,i),a[Number(t)]=e;return{points:n,centerOf:a}}var{points:Vr,centerOf:Ho}=xa(),Io=Rt/2;function Ge(n){return n.map(([a,e])=>I(a,e))}function Ur(n,a,e){return Ge([[or-n,a],[or+n,a],[or+n,e],[or-n,e]])}var Tt=[[18.4,68],[18.4,81.8],[34.7,74.9]],fa=[{id:"head",label:"Head",color:"gold",points:Ge([[40,14.3],[60,14.3],[50,6]]),labelAnchor:I(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:Ge([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:I(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Ur(9.5,30.4,43.6),labelAnchor:I(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:Ge([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:I(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:Ge([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:I(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:Ge(Tt),labelAnchor:I(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Ur(9.5,70.6,83.6),labelAnchor:I(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:Ge(Tt.map(([n,a])=>[Fr(n),a])),labelAnchor:I(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Ur(9.5,87.9,99.9),labelAnchor:I(50,103),labelAlign:"middle"}],ba=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],va=$a();function $a(){let n=Fr,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${fr(a[0])}`];for(let r=1;r+2<a.length;r+=3)e.push(`C ${fr(a[r])} ${fr(a[r+1])} ${fr(a[r+2])}`);e.push(`L ${br(a[a.length-1],n)}`);for(let r=a.length-3;r>=1;r-=3)e.push(`C ${br(a[r+1],n)} ${br(a[r],n)} ${br(a[r-1],n)}`);return e.push("Z"),e.join(" ")}function fr([n,a]){let e=I(n,a);return`${e.x} ${e.y}`}function br([n,a],e){let r=I(e(n),a);return`${r.x} ${r.y}`}function wa(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function Pt(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function ka(){return w`<path class="bg-body" d=${va} />`}function Sa(n,a){let e=[];for(let[r,t]of ba){let o=Vr[r],i=Vr[t];if(!o||!i)continue;if(e.push(w`<line class="bg-channel" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`),n.has(Pt(r,t))){e.push(w`<line class="bg-channel on" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`);continue}let d={x:(o.x+i.x)/2,y:(o.y+i.y)/2};a.has(r)&&e.push(w`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${d.x} y2=${d.y} />`),a.has(t)&&e.push(w`<line class="bg-half" x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} />`)}return e}function Aa(n,a,e){let r=e.x-a.x,t=e.y-a.y,o=r*r+t*t;if(o===0)return a;let i=Math.max(0,Math.min(1,((n.x-a.x)*r+(n.y-a.y)*t)/o));return{x:a.x+i*r,y:a.y+i*t}}function Ca(n,a){let e=a[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<a.length;t++){let o=Aa(n,a[t],a[(t+1)%a.length]),i=(o.x-n.x)**2+(o.y-n.y)**2;i<r&&(r=i,e=o)}return e}function Ea(n){return fa.map(a=>{let e=n.has(a.id),r=`bg-center bg-${a.color}${e?" defined":""}`,t=Ca(a.labelAnchor,a.points);return w`<g>
4
+ <line class="bg-leader" x1=${a.labelAnchor.x} y1=${a.labelAnchor.y} x2=${t.x} y2=${t.y} />
5
+ <polygon class=${r} points=${wa(a.points)}><title>${a.label}: ${e?"defined":"open"}</title></polygon>
6
6
  <text class="bg-center-label" x=${a.labelAnchor.x} y=${a.labelAnchor.y} text-anchor=${a.labelAlign} dominant-baseline="central">${a.label}</text>
7
- </g>`})}function ya(n,a){let e=[];for(let[t,r]of Object.entries(It)){let o=Number(t);if(!n.has(o))continue;let i=a.get(o);e.push(w`<text class="bg-gate" x=${r.x} y=${r.y} text-anchor="middle" dominant-baseline="central">${o}${i?w`<title>${i}</title>`:l}</text>`)}return e}function wr(n,a){return $r(n,a)}var kr=`0 0 ${vr} ${aa}`;function Sr(n){return w`
8
- ${pa()}
9
- ${ma(n.activeChannels,n.activeGates)}
10
- ${ua(n.definedCenters)}
11
- ${ya(n.activeGates,n.gateTitles)}
12
- `}function A(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function j(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var ue=class extends f{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No bodygraph data</div>`;let t=new Set((e.centers??[]).filter(d=>d.defined).map(d=>d.id)),r=new Set((e.gates??[]).map(d=>d.gate).filter(d=>d!=null)),o=new Set((e.channels??[]).map(d=>wr(d.gateA,d.gateB))),i=this.buildGateTitles(e.gates??[]);return s`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?s`<div class="type-line">${e.type}${e.profile?s`· Profile ${e.profile}`:l}</div>`:l}</header><div class="layout"><svg viewBox="${kr}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Sr({definedCenters:t,activeChannels:o,activeGates:r,gateTitles:i})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let t=new Map;for(let r of e){if(r.gate==null)continue;let o=[`Gate ${r.gate}`];r.line!=null&&(o[0]+=`.${r.line}`),r.gateName&&o.push(r.gateName);let i=r.planet?A(r.planet):"",d=i?L[i]??i:"";d&&o.push(`${d} ${r.side??""}`.trim()),t.set(r.gate,o.join(" \xB7 "))}return t}renderSummary(e){let t=[{label:"Type",value:e.type},{label:"Strategy",value:e.strategy},{label:"Authority",value:e.authority},{label:"Profile",value:e.profile},{label:"Definition",value:e.definition}],r=e.incarnationCross;return s`<div class="summary"><div class="facts">${t.map(o=>o.value?s`<div class="fact"><span>${o.label}</span> <strong>${o.value}</strong></div>`:l)}</div>${r?.name?s`<p class="cross">${r.name} ${r.gates?.length?s`<span class="gates">(${r.gates.join(", ")})</span>`:l}</p>`:l} ${e.signature||e.notSelf?s`<div class="themes">${e.signature?s`<span class="pill pill--good">Signature: ${e.signature}</span>`:l} ${e.notSelf?s`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:l}</div>`:l}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};ue.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:340px;height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],p([u({attribute:!1})],ue.prototype,"data",2),ue=p([b("roxy-bodygraph")],ue);function Ar(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var ye=class extends f{constructor(){super();this.data=null;new $(this)}isCurrent(e){let t=Date.now(),r=Date.parse(e.start),o=Date.parse(e.end);return Number.isNaN(r)||Number.isNaN(o)?!1:t>=r&&t<o}renderTile(e){let t=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",r=this.isCurrent(e),o=L[A(e.lord)]??"",i=`${Ar(e.start)} - ${Ar(e.end)}`;return s`<div class="cho-tile ${t}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${e.name}${r?s`<span class="now-badge">Now</span>`:l} </span><span class="tile-time" aria-label="Time range">${i}</span> <span class="tile-lord">${o?s`<span aria-hidden="true">${o}</span>`:l} ${e.lord}</span></div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:t,nightChoghadiya:r}=this.data;return s`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?s`<p class="subtitle">${e}</p>`:l}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${t&&t.length>0?t.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${r&&r.length>0?r.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};ye.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],p([u({attribute:!1})],ye.prototype,"data",2),ye=p([b("roxy-choghadiya-grid")],ye);function K(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,t=new Date(e);return Number.isNaN(t.getTime())?n:t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function xe(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Bt(n){if(!n)return"";let a=K(n.start),e=K(n.end);return a&&e?`${a} - ${e}`:a||e||""}function C(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function Cr(n,a=1){let e=C(n,a);return e?`${e}%`:""}var _e={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function Ge(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}var X=class extends f{constructor(){super();this.data=null;this.mode="astrology";new $(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let t={};for(let[r,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(t[r]=o);return t}return{}}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No compatibility data</div>`;let t=e.overallScore,r=this.getBreakdown(),o="rating"in e?e.rating:void 0,i="archetype"in e?e.archetype:void 0,d="advice"in e?e.advice:void 0,c="summary"in e?e.summary:void 0,m="interpretation"in e?e.interpretation:void 0,g="strengths"in e?e.strengths:void 0,h="challenges"in e?e.challenges:void 0,y="keyAspects"in e?e.keyAspects:void 0;return s`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof t=="number"?s`<div class="score">${C(t,0)}</div>`:l} ${o?s`<div class="rating">${o}</div>`:l}</div></div>${Object.keys(r).length>0?s`<div role="list">${Object.entries(r).map(([S,k])=>s`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${S}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,k))}%"></span></span> <span>${C(k,0)}</span></div>`)}</div>`:l} ${i?s`<p><span class="archetype">${i.label}</span> ${i.description?s`· ${i.description}`:l}</p>`:l} ${c?s`<p>${c}</p>`:l} ${m&&!c?s`<p>${m}</p>`:l} ${d?s`<p>${d}</p>`:l} ${(g?.length??0)>0||(h?.length??0)>0?s`<div class="lists">${g?.length?s`<div><h3>Strengths</h3><ul>${g.map(S=>s`<li>${S}</li>`)}</ul></div>`:l} ${h?.length?s`<div><h3>Challenges</h3><ul>${h.map(S=>s`<li>${S}</li>`)}</ul></div>`:l}</div>`:l} ${y?.length?s`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${y.slice(0,6).map(S=>s`<li>${xa(S)}</li>`)}</ul></div>`:l}</article>`}};X.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],p([u({attribute:!1})],X.prototype,"data",2),p([u({type:String,reflect:!0})],X.prototype,"mode",2),X=p([b("roxy-compatibility-card")],X);function xa(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${C(n.orb,1)}\xB0)`:"",t=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${t}${e} \xB7 ${n.description}`:`${t}${e}`}var Z=class extends f{constructor(){super();this.data=null;this.period="current";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dasha data</div>`;let t=this.collectPeriods(e),r=t.length?Math.max(...t.map(o=>o.durationYears)):0;return s`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?s`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?s`(lord ${e.nakshatraLord})`:l}</div>`:l}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):l} ${t.length>0?s`<div class="timeline" role="list">${t.map(o=>this.renderBar(o,r))}</div>`:l} ${this.renderActiveInterpretation(t)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return l;let t=e.birthDashaBalance,r="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",o=t.years??0,i=t.months??0,d=t.days??0,c=[];o&&c.push(`${o}y`),i&&c.push(`${i}m`),d&&c.push(`${d}d`);let m=c.length?c.join(" "):"0d";return s`<p class="balance">Birth dasha balance: ${m} of ${r?s`<strong>${r}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let t=e.find(r=>this.isCurrent(r));return t?.interpretation?s`<div class="interp"><h3>${t.planet} mahadasha</h3><p>${t.interpretation}</p></div>`:l}renderCurrent(e){return"mahadasha"in e?s`<div class="current">${"mahadasha"in e&&e.mahadasha?s`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?s`<small>${C(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:l}</div>`:l} ${"antardasha"in e&&e.antardasha?s`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?s`<small>${C(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:l}</div>`:l} ${"pratyantardasha"in e&&e.pratyantardasha?s`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?s`<small>${C(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:l}</div>`:l}</div>`:l}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let t=Date.now(),r=Date.parse(e.startDate),o=Date.parse(e.endDate);return Number.isNaN(r)||Number.isNaN(o)?!1:t>=r&&t<o}progressIn(e){if(!e.startDate||!e.endDate)return-1;let t=Date.parse(e.startDate),r=Date.parse(e.endDate),o=Date.now();return Number.isNaN(t)||Number.isNaN(r)||o<t||o>=r||r<=t?-1:(o-t)/(r-t)}renderBar(e,t){let r=e.durationYears,o=t>0?r/t*100:0,i=this.isCurrent(e),d=i?this.progressIn(e):-1,c=i?"bar-track bar-now":"bar-track";return s`<div class="${i?"bar now":"bar"}" role="listitem" aria-current="${i?"time":"false"}"><span><strong>${e.planet}</strong>${i?s`<span class="now-badge">Now</span>`:l} </span><span class="${c}"><span class="bar-fill" style="width:${o}%"></span> ${d>=0?s`<span class="bar-progress" style="left:${d*o}%" aria-hidden="true"></span>`:l} </span><span class="dates">${e.startDate?Pr(e.startDate):""} ${e.endDate?s`- ${Pr(e.endDate)}`:""}</span></div>`}};Z.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],p([u({attribute:!1})],Z.prototype,"data",2),p([u({type:String,reflect:!0})],Z.prototype,"period",2),Z=p([b("roxy-dasha-timeline")],Z);function Pr(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var fa=["title","name","label","heading","overview","summary"],ba=["imageUrl","image","icon","symbol"],va=["imageUrl","image"],$a=6,Q=class extends f{constructor(){super();this.data=null;this.depth=0;new $(this)}render(){return this.data==null?s`<div class="roxy-empty" role="status">No data</div>`:this.depth>=$a?s`<div class="roxy-empty" role="status">…</div>`:s`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?l:typeof e=="string"?s`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?s`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?s`<div class="roxy-empty" role="status">Empty list</div>`:e.every(o=>o===null||["string","number","boolean"].includes(typeof o))?s`<ul class="roxy-chips">${e.map(o=>s`<li>${String(o)}</li>`)}</ul>`:e.every(o=>o!==null&&typeof o=="object"&&!Array.isArray(o))?this.renderTable(e):s`<ol>${e.map(o=>s`<li>${this.renderValue(o)}</li>`)}</ol>`}renderTable(e){let t=this.collectKeys(e);return s`<table class="roxy-table" role="table"><thead><tr>${t.map(r=>s`<th>${j(r)}</th>`)}</tr></thead><tbody>${e.map(r=>s`<tr>${t.map(o=>s`<td>${this.formatPrimitive(r[o])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let t=fa.find(d=>typeof e[d]=="string"),r=ba.find(d=>typeof e[d]=="string"&&e[d].startsWith("http")),o=t!=="summary"&&typeof e.summary=="string"?"summary":null,i=Object.entries(e).filter(([d,c])=>d!==t&&d!==o&&!va.includes(d)&&c!==null&&c!==void 0);return s`${r?s`<img class="roxy-image" src="${String(e[r])}" alt="${t?String(e[t]):"illustration"}" loading="lazy">`:l} ${t?s`<h3 class="roxy-title">${e[t]}</h3>`:l} ${o?s`<p class="roxy-summary">${e[o]}</p>`:l} ${i.length>0?s`<dl class="roxy-rows">${i.map(([d,c])=>s`<dt>${j(d)}</dt><dd>${this.renderField(c)}</dd>`)}</dl>`:l}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(r=>["string","number","boolean"].includes(typeof r))?s`<ul class="roxy-chips">${e.map(r=>s`<li>${String(r)}</li>`)}</ul>`:s`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let t=new Set;for(let r of e)for(let o of Object.keys(r))t.add(o);return Array.from(t)}};Q.styles=[v,x`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],p([u({attribute:!1})],Q.prototype,"data",2),p([u({attribute:!1})],Q.prototype,"depth",2),Q=p([b("roxy-data")],Q);function q(n){let a=n%360;return a<0?a+360:a}function V(n){let a=q(n),e=Math.floor(a/30)%12,t=a%30,r=Math.floor(t),o=(t-r)*60,i=Math.floor(o),d=Math.round((o-i)*60);return{sign:_[e]??"Aries",signIndex:e,degree:r,minute:i,second:d}}function ft(n){let{sign:a,degree:e,minute:t}=V(n);return`${e}\xB0 ${a} ${String(t).padStart(2,"0")}'`}function Kt(n){return q(n+180)}function Er(n,a){let e=q(n),t=q(a)-e;return t<0&&(t+=360),q(e+t/2)}function T(n,a,e,t){let r=t*Math.PI/180;return{x:n+e*Math.cos(r),y:a+e*Math.sin(r)}}var fe=x`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function Ie(n){let{items:a,active:e,onSelect:t,label:r,idPrefix:o,controls:i=!1}=n;return s`<div class="roxy-tablist" role="tablist" aria-label="${r}" @keydown="${c=>{if(c.key!=="ArrowRight"&&c.key!=="ArrowLeft")return;c.preventDefault();let m=a.findIndex(S=>S.id===e);if(m===-1)return;let g=c.key==="ArrowRight"?1:-1,h=a[(m+g+a.length)%a.length];if(!h)return;t(h.id);let y=c.currentTarget.getRootNode();requestAnimationFrame(()=>{y.querySelector(`#${o}-tab-${h.id}`)?.focus()})}}">${a.map(c=>s`<button type="button" class="roxy-tab" role="tab" id="${o}-tab-${c.id}" aria-selected="${e===c.id?"true":"false"}" aria-controls="${i&&e===c.id?`${o}-panel-${c.id}`:l}" tabindex="${e===c.id?"0":"-1"}" @click="${()=>t(c.id)}">${c.label}</button>`)}</div>`}var B=400,R=20,O=B-2*R,z=B/2,wa=Object.fromEntries(_.map(n=>[n.toLowerCase(),n])),ka=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Sa="\u02B3";function Tr(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:V(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function Aa(n,a){let e=yr[A(n.graha)]??n.graha.slice(0,2),t=n.isRetrograde?Sa:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||Tr(n,a))return`${e}${t}`;let{degree:r}=V(n.longitude);return`${e} ${r}\xB0${t}`}function Ca(n,a){let e=[A(n.graha)],t=Tr(n,a);if(t&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let r=V(n.longitude),o=String(r.minute).padStart(2,"0");e.push(t?`D1: ${r.degree}\xB0${o}' ${r.sign}`:`${r.degree}\xB0${o}' ${r.sign}`)}if(n.nakshatra?.name){let r=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${r}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function qt(n,a,e,t,r){let o=t-(n.length-1)*r/2;return n.map((i,d)=>{let c=o+d*r;return w`<text class="planet-text" x=${e} y=${c} text-anchor="middle" dominant-baseline="central">${Aa(i,a)}<title>${Ca(i,a)}</title></text>`})}function vt(n,a){let e={};for(let r of _)e[r.toLowerCase()]=[];let t="";for(let[r,o]of Object.entries(n??{})){let i=(o?.rashi??"").toLowerCase();if(r==="Lagna"||o?.graha==="Lagna"){t=wa[i]??"";continue}!i||!(i in e)||e[i]?.push({graha:o.graha??r,longitude:o.longitude,nakshatra:o.nakshatra,isRetrograde:o.isRetrograde,awastha:o.awastha})}return{lagnaSign:t,placements:e,divisionLabel:a}}var De=O/4,Pa={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function Ea(n){let a=Pa[n]??{col:0,row:0};return{x:R+a.col*De,y:R+a.row*De,w:De,h:De}}function Ta(n){let a=R,e=R+De,t=R+2*De,r=R+3*De,o=B-R;return w`
7
+ </g>`})}function Ta(n,a){let e=[];for(let[r,t]of Object.entries(Vr)){let o=Number(r);if(!n.has(o))continue;let i=a.get(o);e.push(w`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${o}${i?w`<title>${i}</title>`:l}</text>`)}return e}function Lt(n,a){return Pt(n,a)}var Nt=`0 0 ${Rt} ${ya}`;function Mt(n){return w`
8
+ ${ka()}
9
+ ${Sa(n.activeChannels,n.activeGates)}
10
+ ${Ea(n.definedCenters)}
11
+ ${Ta(n.activeGates,n.gateTitles)}
12
+ `}function A(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function j(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var fe=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No bodygraph data</div>`;let r=new Set((e.centers??[]).filter(d=>d.defined).map(d=>d.id)),t=new Set((e.gates??[]).map(d=>d.gate).filter(d=>d!=null)),o=new Set((e.channels??[]).map(d=>Lt(d.gateA,d.gateB))),i=this.buildGateTitles(e.gates??[]);return s`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?s`<div class="type-line">${e.type}${e.profile?s`· Profile ${e.profile}`:l}</div>`:l}</header><div class="layout"><svg viewBox="${Nt}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Mt({definedCenters:r,activeChannels:o,activeGates:t,gateTitles:i})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let r=new Map;for(let t of e){if(t.gate==null)continue;let o=[`Gate ${t.gate}`];t.line!=null&&(o[0]+=`.${t.line}`),t.gateName&&o.push(t.gateName);let i=t.planet?A(t.planet):"",d=i?L[i]??i:"";d&&o.push(`${d} ${t.side??""}`.trim()),r.set(t.gate,o.join(" \xB7 "))}return r}renderSummary(e){let r=[{label:"Type",value:e.type},{label:"Strategy",value:e.strategy},{label:"Authority",value:e.authority},{label:"Profile",value:e.profile},{label:"Definition",value:e.definition}],t=e.incarnationCross;return s`<div class="summary"><div class="facts">${r.map(o=>o.value?s`<div class="fact"><span>${o.label}</span> <strong>${o.value}</strong></div>`:l)}</div>${t?.name?s`<p class="cross">${t.name} ${t.gates?.length?s`<span class="gates">(${t.gates.join(", ")})</span>`:l}</p>`:l} ${e.signature||e.notSelf?s`<div class="themes">${e.signature?s`<span class="pill pill--good">Signature: ${e.signature}</span>`:l} ${e.notSelf?s`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:l}</div>`:l}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};fe.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:340px;height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],p([h({attribute:!1})],fe.prototype,"data",2),fe=p([b("roxy-bodygraph")],fe);function zt(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var be=class extends x{constructor(){super();this.data=null;new $(this)}isCurrent(e){let r=Date.now(),t=Date.parse(e.start),o=Date.parse(e.end);return Number.isNaN(t)||Number.isNaN(o)?!1:r>=t&&r<o}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",t=this.isCurrent(e),o=L[A(e.lord)]??"",i=`${zt(e.start)} - ${zt(e.end)}`;return s`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?s`<span class="now-badge">Now</span>`:l} </span><span class="tile-time" aria-label="Time range">${i}</span> <span class="tile-lord">${o?s`<span aria-hidden="true">${o}</span>`:l} ${e.lord}</span></div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return s`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?s`<p class="subtitle">${e}</p>`:l}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(o=>this.renderTile(o)):s`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};be.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],p([h({attribute:!1})],be.prototype,"data",2),be=p([b("roxy-choghadiya-grid")],be);function q(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,r=new Date(e);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function ve(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Wr(n){if(!n)return"";let a=q(n.start),e=q(n.end);return a&&e?`${a} - ${e}`:a||e||""}function C(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function Dt(n,a=1){let e=C(n,a);return e?`${e}%`:""}var He={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function Ke(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}var Z=class extends x{constructor(){super();this.data=null;this.mode="astrology";new $(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,o]of Object.entries(e.categories))typeof o=="number"&&Number.isFinite(o)&&(r[t]=o);return r}return{}}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),o="rating"in e?e.rating:void 0,i="archetype"in e?e.archetype:void 0,d="advice"in e?e.advice:void 0,c="summary"in e?e.summary:void 0,m="interpretation"in e?e.interpretation:void 0,y="strengths"in e?e.strengths:void 0,g="challenges"in e?e.challenges:void 0,f="keyAspects"in e?e.keyAspects:void 0;return s`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?s`<div class="score">${C(r,0)}</div>`:l} ${o?s`<div class="rating">${o}</div>`:l}</div></div>${Object.keys(t).length>0?s`<div role="list">${Object.entries(t).map(([S,k])=>s`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${S}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,k))}%"></span></span> <span>${C(k,0)}</span></div>`)}</div>`:l} ${i?s`<p><span class="archetype">${i.label}</span> ${i.description?s`· ${i.description}`:l}</p>`:l} ${c?s`<p>${c}</p>`:l} ${m&&!c?s`<p>${m}</p>`:l} ${d?s`<p>${d}</p>`:l} ${(y?.length??0)>0||(g?.length??0)>0?s`<div class="lists">${y?.length?s`<div><h3>Strengths</h3><ul>${y.map(S=>s`<li>${S}</li>`)}</ul></div>`:l} ${g?.length?s`<div><h3>Challenges</h3><ul>${g.map(S=>s`<li>${S}</li>`)}</ul></div>`:l}</div>`:l} ${f?.length?s`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${f.slice(0,6).map(S=>s`<li>${Ra(S)}</li>`)}</ul></div>`:l}</article>`}};Z.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],p([h({attribute:!1})],Z.prototype,"data",2),p([h({type:String,reflect:!0})],Z.prototype,"mode",2),Z=p([b("roxy-compatibility-card")],Z);function Ra(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${C(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}var Pa=["January","February","March","April","May","June","July","August","September","October","November","December"],Q=class extends x{constructor(){super();this.data=null;this.heading="";new $(this)}render(){let e=this.data,r=e?.crystals??[];if(!e||r.length===0)return s`<div class="roxy-empty" role="status">No crystals</div>`;let t=this.heading||this.deriveHeading(e),o="total"in e&&typeof e.total=="number"?e.total:r.length;return s`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${o} ${o===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(i=>s`<li class="tile">${i.imageUrl?s`<img class="photo" src="${i.imageUrl}" alt="${i.name??"Crystal"}" loading="lazy">`:s`<div class="photo" aria-hidden="true"></div>`}<p class="name">${i.name}</p>${i.colors&&i.colors.length>0?s`<div class="colors" aria-label="${`Colours: ${i.colors.join(", ")}`}">${i.colors.map(d=>s`<span class="swatch" style="${`background:${La(d)}`}" title="${d}"></span>`)}</div>`:l}</li>`)}</ul></section>`}deriveHeading(e){return"chakra"in e&&e.chakra?`${e.chakra} chakra crystals`:"element"in e&&e.element?`${e.element} element crystals`:"sign"in e&&e.sign?`Crystals for ${e.sign}`:"month"in e&&typeof e.month=="number"?`${Pa[e.month-1]??""} birthstones`.trim():"Crystals"}};Q.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.photo{aspect-ratio:1;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.colors{flex-wrap:wrap;gap:4px;display:flex}.swatch{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:10px;height:10px}`],p([h({attribute:!1})],Q.prototype,"data",2),p([h({type:String,reflect:!0})],Q.prototype,"heading",2),Q=p([b("roxy-crystal-grid")],Q);function La(n){return n.trim().toLowerCase().replace(/\s+/g,"")}var ee=class extends x{constructor(){super();this.data=null;this.period="current";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(o=>o.durationYears)):0;return s`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?s`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?s`(lord ${e.nakshatraLord})`:l}</div>`:l}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):l} ${r.length>0?s`<div class="timeline" role="list">${r.map(o=>this.renderBar(o,t))}</div>`:l} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return l;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",o=r.years??0,i=r.months??0,d=r.days??0,c=[];o&&c.push(`${o}y`),i&&c.push(`${i}m`),d&&c.push(`${d}d`);let m=c.length?c.join(" "):"0d";return s`<p class="balance">Birth dasha balance: ${m} of ${t?s`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?s`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:l}renderCurrent(e){return"mahadasha"in e?s`<div class="current">${"mahadasha"in e&&e.mahadasha?s`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?s`<small>${C(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:l}</div>`:l} ${"antardasha"in e&&e.antardasha?s`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?s`<small>${C(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:l}</div>`:l} ${"pratyantardasha"in e&&e.pratyantardasha?s`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?s`<small>${C(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:l}</div>`:l}</div>`:l}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),o=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(o)?!1:r>=t&&r<o}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),o=Date.now();return Number.isNaN(r)||Number.isNaN(t)||o<r||o>=t||t<=r?-1:(o-r)/(t-r)}renderBar(e,r){let t=e.durationYears,o=r>0?t/r*100:0,i=this.isCurrent(e),d=i?this.progressIn(e):-1,c=i?"bar-track bar-now":"bar-track";return s`<div class="${i?"bar now":"bar"}" role="listitem" aria-current="${i?"time":"false"}"><span><strong>${e.planet}</strong>${i?s`<span class="now-badge">Now</span>`:l} </span><span class="${c}"><span class="bar-fill" style="width:${o}%"></span> ${d>=0?s`<span class="bar-progress" style="left:${d*o}%" aria-hidden="true"></span>`:l} </span><span class="dates">${e.startDate?_t(e.startDate):""} ${e.endDate?s`- ${_t(e.endDate)}`:""}</span></div>`}};ee.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],p([h({attribute:!1})],ee.prototype,"data",2),p([h({type:String,reflect:!0})],ee.prototype,"period",2),ee=p([b("roxy-dasha-timeline")],ee);function _t(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var Na=["title","name","label","heading","overview","summary"],Ma=["imageUrl","image","icon","symbol"],za=["imageUrl","image"],Da=6,re=class extends x{constructor(){super();this.data=null;this.depth=0;new $(this)}render(){return this.data==null?s`<div class="roxy-empty" role="status">No data</div>`:this.depth>=Da?s`<div class="roxy-empty" role="status">…</div>`:s`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?l:typeof e=="string"?s`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?s`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?s`<div class="roxy-empty" role="status">Empty list</div>`:e.every(o=>o===null||["string","number","boolean"].includes(typeof o))?s`<ul class="roxy-chips">${e.map(o=>s`<li>${String(o)}</li>`)}</ul>`:e.every(o=>o!==null&&typeof o=="object"&&!Array.isArray(o))?this.renderTable(e):s`<ol>${e.map(o=>s`<li>${this.renderValue(o)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return s`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>s`<th>${j(t)}</th>`)}</tr></thead><tbody>${e.map(t=>s`<tr>${r.map(o=>s`<td>${this.formatPrimitive(t[o])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=Na.find(d=>typeof e[d]=="string"),t=Ma.find(d=>typeof e[d]=="string"&&e[d].startsWith("http")),o=r!=="summary"&&typeof e.summary=="string"?"summary":null,i=Object.entries(e).filter(([d,c])=>d!==r&&d!==o&&!za.includes(d)&&c!==null&&c!==void 0);return s`${t?s`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:l} ${r?s`<h3 class="roxy-title">${e[r]}</h3>`:l} ${o?s`<p class="roxy-summary">${e[o]}</p>`:l} ${i.length>0?s`<dl class="roxy-rows">${i.map(([d,c])=>s`<dt>${j(d)}</dt><dd>${this.renderField(c)}</dd>`)}</dl>`:l}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?s`<ul class="roxy-chips">${e.map(t=>s`<li>${String(t)}</li>`)}</ul>`:s`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let o of Object.keys(t))r.add(o);return Array.from(r)}};re.styles=[v,u`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],p([h({attribute:!1})],re.prototype,"data",2),p([h({attribute:!1})],re.prototype,"depth",2),re=p([b("roxy-data")],re);function Y(n){let a=n%360;return a<0?a+360:a}function U(n){let a=Y(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),o=(r-t)*60,i=Math.floor(o),d=Math.round((o-i)*60);return{sign:D[e]??"Aries",signIndex:e,degree:t,minute:i,second:d}}function wr(n){let{sign:a,degree:e,minute:r}=U(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function Jr(n){return Y(n+180)}function Ot(n,a){let e=Y(n),r=Y(a)-e;return r<0&&(r+=360),Y(e+r/2)}function R(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}var $e=u`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function qe(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:o,controls:i=!1}=n;return s`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${c=>{if(c.key!=="ArrowRight"&&c.key!=="ArrowLeft")return;c.preventDefault();let m=a.findIndex(S=>S.id===e);if(m===-1)return;let y=c.key==="ArrowRight"?1:-1,g=a[(m+y+a.length)%a.length];if(!g)return;r(g.id);let f=c.currentTarget.getRootNode();requestAnimationFrame(()=>{f.querySelector(`#${o}-tab-${g.id}`)?.focus()})}}">${a.map(c=>s`<button type="button" class="roxy-tab" role="tab" id="${o}-tab-${c.id}" aria-selected="${e===c.id?"true":"false"}" aria-controls="${i&&e===c.id?`${o}-panel-${c.id}`:l}" tabindex="${e===c.id?"0":"-1"}" @click="${()=>r(c.id)}">${c.label}</button>`)}</div>`}var B=400,P=20,O=B-2*P,z=B/2,Gt=Object.fromEntries(D.map(n=>[n.toLowerCase(),n])),_a=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Oa="\u02B3";function Ht(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:U(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function Ga(n,a){let e=At[A(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?Oa:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||Ht(n,a))return`${e}${r}`;let{degree:t}=U(n.longitude);return`${e} ${t}\xB0${r}`}function Ha(n,a){let e=[A(n.graha)],r=Ht(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=U(n.longitude),o=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${o}' ${t.sign}`:`${t.degree}\xB0${o}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Xr(n,a,e,r,t){let o=r-(n.length-1)*t/2;return n.map((i,d)=>{let c=o+d*t;return w`<text class="planet-text" x=${e} y=${c} text-anchor="middle" dominant-baseline="central">${Ga(i,a)}<title>${Ha(i,a)}</title></text>`})}function Sr(n,a,e){let r={};for(let i of D)r[i.toLowerCase()]=[];let t=e?Gt[e.toLowerCase()]??"":"",o=t;for(let[i,d]of Object.entries(n??{})){let c=(d?.rashi??"").toLowerCase();if(i==="Lagna"||d?.graha==="Lagna"){t||(o=Gt[c]??"");continue}!c||!(c in r)||r[c]?.push({graha:d.graha??i,longitude:d.longitude,nakshatra:d.nakshatra,isRetrograde:d.isRetrograde,awastha:d.awastha})}return{lagnaSign:o,placements:r,divisionLabel:a}}var Ie=O/4,Ia={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function ja(n){let a=Ia[n]??{col:0,row:0};return{x:P+a.col*Ie,y:P+a.row*Ie,w:Ie,h:Ie}}function Ba(n){let a=P,e=P+Ie,r=P+2*Ie,t=P+3*Ie,o=B-P;return w`
13
13
  <rect class="line" x=${a} y=${a} width=${O} height=${O} stroke-width="1.5" fill="none" />
14
14
  <line class="line" x1=${a} y1=${e} x2=${o} y2=${e} stroke-width="1" />
15
- <line class="line" x1=${a} y1=${r} x2=${o} y2=${r} stroke-width="1" />
15
+ <line class="line" x1=${a} y1=${t} x2=${o} y2=${t} stroke-width="1" />
16
16
  <line class="line" x1=${e} y1=${a} x2=${e} y2=${o} stroke-width="1" />
17
- <line class="line" x1=${r} y1=${a} x2=${r} y2=${o} stroke-width="1" />
18
- <line class="line" x1=${a} y1=${t} x2=${e} y2=${t} stroke-width="1" />
19
- <line class="line" x1=${r} y1=${t} x2=${o} y2=${t} stroke-width="1" />
20
- <line class="line" x1=${t} y1=${a} x2=${t} y2=${e} stroke-width="1" />
21
- <line class="line" x1=${t} y1=${r} x2=${t} y2=${o} stroke-width="1" />
17
+ <line class="line" x1=${t} y1=${a} x2=${t} y2=${o} stroke-width="1" />
18
+ <line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
19
+ <line class="line" x1=${t} y1=${r} x2=${o} y2=${r} stroke-width="1" />
20
+ <line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
21
+ <line class="line" x1=${r} y1=${t} x2=${r} y2=${o} stroke-width="1" />
22
22
  ${n?w`<text class="centre-label" x=${z} y=${z} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
23
- `}function Rr(n,a){let e=_.findIndex(r=>r===a),t=_.findIndex(r=>r===n);return e===-1||t===-1?0:(t-e+12)%12+1}function Ra(n,a,e,t){let r=Ea(n),o=r.x+r.w/2,i=r.y+r.h/2,d=ht[n]??n.slice(0,2),c=14;return w`
23
+ `}function It(n,a){let e=D.findIndex(t=>t===a),r=D.findIndex(t=>t===n);return e===-1||r===-1?0:(r-e+12)%12+1}function Ka(n,a,e,r){let t=ja(n),o=t.x+t.w/2,i=t.y+t.h/2,d=xr[n]??n.slice(0,2),c=14;return w`
24
24
  <g class=${e?"cell lagna":"cell"}>
25
25
  ${e?w`
26
- <rect class="lagna-bg" x=${r.x} y=${r.y} width=${r.w} height=${r.h} />
27
- <line class="lagna-slash" x1=${r.x+r.w-c} y1=${r.y+c} x2=${r.x+c} y2=${r.y+r.h-c} stroke-width="1.2" />
26
+ <rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
27
+ <line class="lagna-slash" x1=${t.x+t.w-c} y1=${t.y+c} x2=${t.x+c} y2=${t.y+t.h-c} stroke-width="1.2" />
28
28
  `:l}
29
- <text class="sign-text" x=${r.x+6} y=${r.y+12} text-anchor="start" dominant-baseline="central">${d}</text>
30
- ${t>0?w`<text class="house-num" x=${r.x+r.w-6} y=${r.y+12} text-anchor="end" dominant-baseline="central">${t}</text>`:l}
31
- ${e?w`<text class="lagna-marker" x=${o} y=${r.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
32
- ${a.length?qt(a,n,o,i+4,14):l}
29
+ <text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${d}</text>
30
+ ${r>0?w`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:l}
31
+ ${e?w`<text class="lagna-marker" x=${o} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
32
+ ${a.length?Xr(a,n,o,i+4,14):l}
33
33
  </g>
34
- `}function La(n){let a=n.lagnaSign.toLowerCase();return w`
35
- ${Ta(n.divisionLabel)}
36
- ${_.map(e=>Ra(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,Rr(e,n.lagnaSign)))}
37
- `}var E={tl:{x:R,y:R},tr:{x:B-R,y:R},br:{x:B-R,y:B-R},bl:{x:R,y:B-R},top:{x:z,y:R},right:{x:B-R,y:z},bottom:{x:z,y:B-R},left:{x:R,y:z},tlMid:{x:z-O/4,y:z-O/4},trMid:{x:z+O/4,y:z-O/4},brMid:{x:z+O/4,y:z+O/4},blMid:{x:z-O/4,y:z+O/4}};function ee(n){let a=n.reduce((t,r)=>t+r.x,0)/n.length,e=n.reduce((t,r)=>t+r.y,0)/n.length;return{x:a,y:e}}var Na={1:{x:z,y:E.tlMid.y},2:ee([E.tl,E.top,E.tlMid]),3:ee([E.tl,E.left,E.tlMid]),4:{x:E.tlMid.x,y:z},5:ee([E.bl,E.left,E.blMid]),6:ee([E.bl,E.bottom,E.blMid]),7:{x:z,y:E.blMid.y},8:ee([E.br,E.bottom,E.brMid]),9:ee([E.br,E.right,E.brMid]),10:{x:E.brMid.x,y:z},11:ee([E.tr,E.right,E.trMid]),12:ee([E.tr,E.top,E.trMid])};function Ma(n,a){let e=_.findIndex(t=>t===a);return e===-1?n:(e+n-1)%12+1}function za(n){let{tl:a,tr:e,br:t,bl:r,top:o,right:i,bottom:d,left:c}=E;return w`
34
+ `}function qa(n){let a=n.lagnaSign.toLowerCase();return w`
35
+ ${Ba(n.divisionLabel)}
36
+ ${D.map(e=>Ka(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,It(e,n.lagnaSign)))}
37
+ `}var T={tl:{x:P,y:P},tr:{x:B-P,y:P},br:{x:B-P,y:B-P},bl:{x:P,y:B-P},top:{x:z,y:P},right:{x:B-P,y:z},bottom:{x:z,y:B-P},left:{x:P,y:z},tlMid:{x:z-O/4,y:z-O/4},trMid:{x:z+O/4,y:z-O/4},brMid:{x:z+O/4,y:z+O/4},blMid:{x:z-O/4,y:z+O/4}};function te(n){let a=n.reduce((r,t)=>r+t.x,0)/n.length,e=n.reduce((r,t)=>r+t.y,0)/n.length;return{x:a,y:e}}var Ya={1:{x:z,y:T.tlMid.y},2:te([T.tl,T.top,T.tlMid]),3:te([T.tl,T.left,T.tlMid]),4:{x:T.tlMid.x,y:z},5:te([T.bl,T.left,T.blMid]),6:te([T.bl,T.bottom,T.blMid]),7:{x:z,y:T.blMid.y},8:te([T.br,T.bottom,T.brMid]),9:te([T.br,T.right,T.brMid]),10:{x:T.brMid.x,y:z},11:te([T.tr,T.right,T.trMid]),12:te([T.tr,T.top,T.trMid])};function Ua(n,a){let e=D.findIndex(r=>r===a);return e===-1?n:(e+n-1)%12+1}function Va(n){let{tl:a,tr:e,br:r,bl:t,top:o,right:i,bottom:d,left:c}=T;return w`
38
38
  <rect class="line" x=${a.x} y=${a.y} width=${O} height=${O} stroke-width="1.5" fill="none" />
39
39
  <polygon class="line" points="${o.x},${o.y} ${i.x},${i.y} ${d.x},${d.y} ${c.x},${c.y}" stroke-width="1" fill="none" />
40
- <line class="line" x1=${a.x} y1=${a.y} x2=${t.x} y2=${t.y} stroke-width="1" />
41
- <line class="line" x1=${e.x} y1=${e.y} x2=${r.x} y2=${r.y} stroke-width="1" />
40
+ <line class="line" x1=${a.x} y1=${a.y} x2=${r.x} y2=${r.y} stroke-width="1" />
41
+ <line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
42
42
  ${n?w`<text class="centre-label" x=${z} y=${z} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
43
- `}function _a(n,a,e,t,r){let o=Na[n];if(!o)return w``;let i=Math.min(14,Math.abs(o.y-z)*.45+6),d=i+12,c=r?`${a} \xB7 ${ht[e]??e.slice(0,2)}`:`${a}`;return w`
44
- <g class=${r?"cell lagna":"cell"}>
43
+ `}function Fa(n,a,e,r,t){let o=Ya[n];if(!o)return w``;let i=Math.min(14,Math.abs(o.y-z)*.45+6),d=i+12,c=t?`${a} \xB7 ${xr[e]??e.slice(0,2)}`:`${a}`;return w`
44
+ <g class=${t?"cell lagna":"cell"}>
45
45
  <text class="rashi-num" x=${o.x} y=${o.y-i} text-anchor="middle" dominant-baseline="central">${c}</text>
46
- ${r?w`<text class="lagna-marker" x=${o.x} y=${o.y-d} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
47
- ${t.length?qt(t,e,o.x,o.y+8,12):l}
46
+ ${t?w`<text class="lagna-marker" x=${o.x} y=${o.y-d} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
47
+ ${r.length?Xr(r,e,o.x,o.y+8,12):l}
48
48
  </g>
49
- `}function Da(n){let a=n.lagnaSign||"Aries";return w`
50
- ${za(n.divisionLabel)}
51
- ${Array.from({length:12},(e,t)=>{let r=t+1,o=Ma(r,a),i=_[o-1]??"Aries";return _a(r,o,i,n.placements[i.toLowerCase()]??[],r===1)})}
52
- `}var bt=O/3;function Oa(){let n=R,a=R+bt,e=R+2*bt,t=B-R,at={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:t}],Virgo:[{x:a,y:e},{x:a,y:t},{x:n,y:t}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:t},{x:a,y:t}],Scorpio:[{x:e,y:e},{x:e,y:t},{x:t,y:t}],Sagittarius:[{x:e,y:e},{x:t,y:t},{x:t,y:e}],Capricorn:[{x:e,y:a},{x:t,y:a},{x:t,y:e},{x:e,y:e}],Aquarius:[{x:t,y:n},{x:t,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:t,y:n},{x:e,y:a}]},Ve={};for(let[st,ot]of Object.entries(at))Ve[st]={points:[...ot],centroid:ee(ot)};return Ve}var Ha=Oa();function Ga(n){let a=R,e=R+bt,t=R+2*bt,r=B-R;return w`
49
+ `}function Wa(n){let a=n.lagnaSign||"Aries";return w`
50
+ ${Va(n.divisionLabel)}
51
+ ${Array.from({length:12},(e,r)=>{let t=r+1,o=Ua(t,a),i=D[o-1]??"Aries";return Fa(t,o,i,n.placements[i.toLowerCase()]??[],t===1)})}
52
+ `}var kr=O/3;function Ja(){let n=P,a=P+kr,e=P+2*kr,r=B-P,ir={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:r}],Virgo:[{x:a,y:e},{x:a,y:r},{x:n,y:r}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:r},{x:a,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:a},{x:r,y:a},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:n},{x:r,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:r,y:n},{x:e,y:a}]},We={};for(let[lr,dr]of Object.entries(ir))We[lr]={points:[...dr],centroid:te(dr)};return We}var Xa=Ja();function Za(n){let a=P,e=P+kr,r=P+2*kr,t=B-P;return w`
53
53
  <rect class="line" x=${a} y=${a} width=${O} height=${O} stroke-width="1.5" fill="none" />
54
54
  <line class="line" x1=${a} y1=${e} x2=${e} y2=${e} stroke-width="1" />
55
- <line class="line" x1=${t} y1=${e} x2=${r} y2=${e} stroke-width="1" />
56
- <line class="line" x1=${a} y1=${t} x2=${e} y2=${t} stroke-width="1" />
57
- <line class="line" x1=${t} y1=${t} x2=${r} y2=${t} stroke-width="1" />
55
+ <line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
56
+ <line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
57
+ <line class="line" x1=${r} y1=${r} x2=${t} y2=${r} stroke-width="1" />
58
58
  <line class="line" x1=${e} y1=${a} x2=${e} y2=${e} stroke-width="1" />
59
- <line class="line" x1=${e} y1=${t} x2=${e} y2=${r} stroke-width="1" />
60
- <line class="line" x1=${t} y1=${a} x2=${t} y2=${e} stroke-width="1" />
61
- <line class="line" x1=${t} y1=${t} x2=${t} y2=${r} stroke-width="1" />
59
+ <line class="line" x1=${e} y1=${r} x2=${e} y2=${t} stroke-width="1" />
60
+ <line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
61
+ <line class="line" x1=${r} y1=${r} x2=${r} y2=${t} stroke-width="1" />
62
62
  <line class="line" x1=${a} y1=${a} x2=${e} y2=${e} stroke-width="1" />
63
- <line class="line" x1=${r} y1=${a} x2=${t} y2=${e} stroke-width="1" />
64
- <line class="line" x1=${r} y1=${r} x2=${t} y2=${t} stroke-width="1" />
65
- <line class="line" x1=${a} y1=${r} x2=${e} y2=${t} stroke-width="1" />
63
+ <line class="line" x1=${t} y1=${a} x2=${r} y2=${e} stroke-width="1" />
64
+ <line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
65
+ <line class="line" x1=${a} y1=${t} x2=${e} y2=${r} stroke-width="1" />
66
66
  ${n?w`<text class="centre-label" x=${z} y=${z} text-anchor="middle" dominant-baseline="central">${n}</text>`:l}
67
- `}function Ia(n,a,e,t){let r=Ha[n];if(!r)return w``;let{centroid:o,points:i}=r,d=ht[n]??n.slice(0,2),c=i.map(m=>`${m.x},${m.y}`).join(" ");return w`
67
+ `}function Qa(n,a,e,r){let t=Xa[n];if(!t)return w``;let{centroid:o,points:i}=t,d=xr[n]??n.slice(0,2),c=i.map(m=>`${m.x},${m.y}`).join(" ");return w`
68
68
  <g class=${e?"cell lagna":"cell"}>
69
69
  ${e?w`<polygon class="lagna-bg" points=${c} />`:l}
70
70
  <text class="sign-text" x=${o.x} y=${o.y-16} text-anchor="middle" dominant-baseline="central">${d}</text>
71
- ${t>0?w`<text class="house-num" x=${o.x+18} y=${o.y-16} text-anchor="start" dominant-baseline="central">${t}</text>`:l}
71
+ ${r>0?w`<text class="house-num" x=${o.x+18} y=${o.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:l}
72
72
  ${e?w`<text class="lagna-marker" x=${o.x} y=${o.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:l}
73
- ${a.length?qt(a,n,o.x,o.y+4,12):l}
73
+ ${a.length?Xr(a,n,o.x,o.y+4,12):l}
74
74
  </g>
75
- `}function ja(n){let a=n.lagnaSign.toLowerCase();return w`
76
- ${Ga(n.divisionLabel)}
77
- ${_.map(e=>Ia(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,Rr(e,n.lagnaSign)))}
78
- `}function $t(n,a){switch(a){case"north":return Da(n);case"east":return ja(n);default:return La(n)}}function wt(n,a){return Ie({items:ka,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var kt=x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var te=class extends f{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new $(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,t=`D${e.number} ${e.name}`;return vt(this.data.chart.meta,t)}render(){let e=this.viewModel();if(!this.data||!e)return s`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:t,vargottama:r}=this.data;return s`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?s`<span class="division-meta">· ${t.sanskritName}</span>`:l}</h2>${t.significance?s`<p class="significance">${t.significance}</p>`:l}</div>${wt(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${$t(e,this.chartStyle)}</svg> ${r&&r.length>0?s`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${r.map(o=>s`<span class="vargottama-pill" role="listitem">${L[o]??""} ${o}</span>`)}</div>`:l}</div>`}};te.styles=[v,kt,fe,x`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],p([u({attribute:!1})],te.prototype,"data",2),p([u({type:String,reflect:!0,attribute:"chart-style"})],te.prototype,"chartStyle",2),te=p([b("roxy-divisional-chart")],te);var Ba={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},re=class extends f{constructor(){super();this.data=null;this.type="manglik";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dosha data</div>`;let t=!!e.present,r=Ba[this.type]??this.type,o=(e.severity??"").toLowerCase(),i=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=i*33,c=i===3?"var(--roxy-danger)":i===2?"var(--roxy-warning)":i===1?"var(--roxy-success)":"transparent";return s`<article class="card" aria-label="${r}"><header class="head"><h2 class="title">${r}</h2><span class="${`badge ${t?"present":"absent"}`}">${t?"Present":"Absent"}</span></header>${e.severity?s`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${i}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${d}%;background:${c}"></span></div>`:l} ${e.description?s`<p class="description">${e.description}</p>`:l} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?s`<div><h3>Remedies</h3><ul>${e.remedies.map(m=>s`<li>${m}</li>`)}</ul></div>`:l} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?s`<div><h3>Exceptions</h3><ul>${e.exceptions.map(m=>s`<li>${m}</li>`)}</ul></div>`:l}</article>`}renderEffects(e){if(!e.effects)return l;let t=Object.entries(e.effects).filter(([,r])=>typeof r=="string"&&r.length>0);return t.length===0?l:s`<div class="effects">${t.map(([r,o])=>s`<div><h3>${r}</h3><p>${o}</p></div>`)}</div>`}};re.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],p([u({attribute:!1})],re.prototype,"data",2),p([u({type:String,reflect:!0})],re.prototype,"type",2),re=p([b("roxy-dosha-card")],re);var Vt=new Map;async function Ka(n){let a=Vt.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Vt.delete(n),e}),Vt.set(n,a)),a}var H=class extends f{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let t=e.detail;t&&(this.values={...this.values,latitude:t.latitude,longitude:t.longitude,timezone:t.timezone??t.utcOffset})};this.onSubmit=e=>{e.preventDefault();let t=this.fields.filter(r=>r.required).filter(r=>this.values[r.name]===void 0||this.values[r.name]==="");if(t.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:t.map(r=>r.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Ka(this.specUrl),t=`/${this.endpoint.replace(/^\//,"")}`,r=e.paths?.[t]?.[this.method.toLowerCase()];if(!r)throw new Error(`Endpoint ${this.method} ${t} not found in OpenAPI spec`);let o=e.components?.schemas??{},i=[],d;if(r.requestBody){let m=r.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[g,h]of Object.entries(d.properties)){let y=this.resolve(h,o)??{};i.push({name:g,type:this.fieldType(y),required:m.has(g),description:y.description,enum:y.enum,min:y.minimum,max:y.maximum,default:y.default})}}for(let m of r.parameters??[])if(m.in==="path"||m.in==="query"){let g=this.resolve(m.schema,o)??{};i.push({name:m.name,type:this.fieldType(g),required:!!m.required,description:g.description,enum:g.enum,default:g.default})}this.fields=i,this.hasLocation=i.some(m=>m.name==="latitude")&&i.some(m=>m.name==="longitude")&&i.some(m=>m.name==="timezone");let c={};for(let m of i)m.default!==void 0&&(c[m.name]=m.default);this.values=c,this.loaded=!0}catch(e){let t=e instanceof Error?e.message:String(e);this.specError=t,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:t},bubbles:!0,composed:!0}))}}resolve(e,t){if(e){if("$ref"in e&&e.$ref){let r=e.$ref.split("/").pop();return r?t[r]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,t){this.values={...this.values,[e]:t}}render(){if(!this.loaded)return s`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return s`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=t=>{if(this.hasLocation&&(t.name==="latitude"||t.name==="longitude"||t.name==="timezone"))return l;let r=`roxy-form-${t.name}`;return s`<div class="field"><label for="${r}">${j(t.name)}${t.required?s`<span class="req" aria-hidden="true">*</span>`:l}</label> ${t.enum?s`<select id="${r}" ?required="${t.required}" @change="${o=>this.setValue(t.name,o.target.value)}"><option value="">Choose</option>${t.enum.map(o=>s`<option value="${o}" ?selected="${this.values[t.name]===o}">${o}</option>`)}</select>`:s`<input id="${r}" type="${this.htmlType(t.type)}" ?required="${t.required}" min="${t.min??""}" max="${t.max??""}" step="${t.type==="number"?"any":""}" .value="${this.values[t.name]??""}" @input="${o=>this.setValue(t.name,this.coerce(t.type,o.target.value))}">`} ${t.description?s`<small class="help">${t.description}</small>`:l}</div>`};return s`<form @submit="${this.onSubmit}"><h2 class="title">${j(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?s`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:l}<div class="fields">${this.fields.map(t=>e(t))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,t){if(t!==""){if(e==="number"){let r=Number(t);return Number.isFinite(r)?r:void 0}return t}}};H.styles=[v,x`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],p([u({type:String,attribute:"data-endpoint"})],H.prototype,"endpoint",2),p([u({type:String})],H.prototype,"method",2),p([u({type:String,attribute:"spec-url"})],H.prototype,"specUrl",2),p([u({type:String,attribute:"submit-label"})],H.prototype,"submitLabel",2),p([N()],H.prototype,"fields",2),p([N()],H.prototype,"values",2),p([N()],H.prototype,"hasLocation",2),p([N()],H.prototype,"loaded",2),p([N()],H.prototype,"specError",2),H=p([b("roxy-endpoint-form")],H);var qa={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Va=["western","vedic","biorhythm"],be=class extends f{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No forecast data</div>`;let t=e.events??[],r=this.groupByDate(t),o=Va.filter(i=>t.some(d=>d.domain===i));return s`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?s`<div class="range">${xe(e.startDate)} - ${xe(e.endDate)} · ${e.count??t.length} events</div>`:l}</header>${o.length?s`<div class="legend">${o.map(i=>s`<span><span class="swatch swatch-${i}"></span>${qa[i]}</span>`)}</div>`:l} ${r.length?s`<div class="days" role="list">${r.map(([i,d])=>this.renderDay(i,d))}</div>`:s`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(e){let t=new Map;for(let r of e){let o=r.date??"",i=t.get(o)??[];i.push(r),t.set(o,i)}return[...t.entries()]}renderDay(e,t){return s`<div class="day" role="listitem"><div class="day-date">${xe(e)}</div><div class="events">${t.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(e){let t=typeof e.significance=="number"?e.significance:0,r=Math.max(0,Math.min(100,t));return s`<div class="event"><span class="dot dot-${e.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(e)}</div>${e.description?s`<p class="event-desc">${e.description}</p>`:l}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${e.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(e){let t=e.body?A(e.body):"",r=e.target?A(e.target):"",o=e.aspect?e.aspect.toLowerCase():"",i=_e[o]??"",d=o?et[o]??o:"",c=typeof e.orb=="number"?C(e.orb,1):"",m=this.typeQualifier(e);return o&&r?s`<strong>${t}</strong> <span class="${i}">${d}</span> <strong>${r}</strong>${c?s`<span class="kind">orb ${c}°</span>`:l}`:s`<strong>${t||j(e.type??"")}</strong>${m?s`<span class="kind">${m}</span>`:l}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${A(e.target)}`:e.type==="retrograde-station"&&e.station?e.station:e.type==="eclipse"?[e.kind,"eclipse"].filter(Boolean).join(" "):e.type==="critical-day"?"critical day":e.type==="dasha-change"&&e.target?`dasha ${A(e.target)}`:j(e.type??"")}};be.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],p([u({attribute:!1})],be.prototype,"data",2),be=p([b("roxy-forecast-timeline")],be);var ve=class extends f{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let t=(e.breakdown??[]).filter(h=>h?.category!==void 0),r=e.total??0,o=e.maxScore??36,i=r/o*100,d="color-mix(in srgb, var(--roxy-border) 50%, transparent)",c=i>=70?"var(--roxy-success)":i>=50?"var(--roxy-warning)":"var(--roxy-danger)",m=i*2.827,g=(100-i)*2.827;return s`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${C(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?s`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Cr(e.percentage,1)}</small>`:l}</div>${e.recommendation?s`<span class="recommendation">${e.recommendation}</span>`:l}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${c}" stroke-width="8" stroke-dasharray="${m},${g}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${o}</text></svg></div></div>${t.length>0?s`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${t.map(h=>{let y=h.score??0,S=h.maxScore??Ya(h.category),k=S?y/S*100:0;return s`<tr><td>${h.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${k}%"></span></div></td><td class="score">${C(y,1)} / ${S}</td></tr>`})}</tbody></table>`:l} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?s`<div class="tags">${e.doshas?.map(h=>s`<span class="dosha">${h}</span>`)} ${e.doshaCancellations?.map(h=>s`<span class="cancel" title="${h.reason}">${h.dosha} cancelled</span>`)}</div>`:l}</article>`}};ve.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],p([u({attribute:!1})],ve.prototype,"data",2),ve=p([b("roxy-guna-milan")],ve);function Ya(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var ae=class extends f{constructor(){super();this.data=null;this.mode="lookup";new $(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let r=e;return{hex:r.hexagram,lines:r.lines,changingLinePositions:r.changingLinePositions,resultingHexagram:r.resultingHexagram}}let t=e;return{hex:t.hexagram,dailyMessage:t.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return s`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:t,lines:r,changingLinePositions:o,dailyMessage:i,resultingHexagram:d}=e,c=r??this.derivedLines(t),m=new Set(o??[]);return s`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${t.symbol?s`<div class="symbol">${t.symbol}</div>`:l}<div class="lines" aria-hidden="true">${c.slice().reverse().map((g,h)=>{let y=c.length-1-h+1,S=m.has(y),k=g===6||g===8;return s`<div class="line ${`${k?"broken":"solid"}${S?" changing":""}`}">${k?w`<span class="seg"></span><span class="seg"></span>`:w`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${t.number?s`${t.number}.`:l}${t.english??t.chinese??"Hexagram"}</h2><p class="subtitle">${t.chinese?s`${t.chinese}`:l} ${t.pinyin?s`· ${t.pinyin}`:l}</p><div class="trigrams">${t.upperTrigram?s`<div>Upper <span class="tri-glyph">${Ot[t.upperTrigram]??""}</span>${t.upperTrigram}</div>`:l} ${t.lowerTrigram?s`<div>Lower <span class="tri-glyph">${Ot[t.lowerTrigram]??""}</span>${t.lowerTrigram}</div>`:l}</div>${t.judgment?s`<p class="judgment">${t.judgment}</p>`:l} ${t.image?s`<p class="image">${t.image}</p>`:l} ${i?s`<p class="message">${i}</p>`:l} ${t.interpretation?.general?s`<p>${t.interpretation.general}</p>`:l} ${m.size>0?s`<div class="changing">Changing lines: ${Array.from(m).sort((g,h)=>g-h).join(", ")}. ${d?.english?s`Becomes hexagram ${d.number} ${d.english}.`:l}</div>`:l}</div></article>`}derivedLines(e){let t=e.symbol.codePointAt(0)??0;if(t>=19904&&t<=19967){let r=t-19904,o=[];for(let i=0;i<6;i++){let d=r>>i&1;o.push(d?8:7)}return o}return Array.from({length:6},()=>7)}};ae.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],p([u({attribute:!1})],ae.prototype,"data",2),p([u({type:String,reflect:!0})],ae.prototype,"mode",2),ae=p([b("roxy-hexagram")],ae);var se=class extends f{constructor(){super();this.data=null;this.period="daily";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No horoscope data</div>`;let t=e.sign??"",r=t?G[A(t)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,i="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return s`<article class="card" aria-label="${`${this.period} horoscope for ${t}`}"><header class="head"><span class="glyph" aria-hidden="true">${r}</span><div><h2 class="title">${t} ${this.period}</h2>${i?s`<div class="date">${i}</div>`:l}</div>${o!==null?s`<span class="energy" aria-label="${`Energy ${o} of 10`}">Energy ${o}/10 <span class="energy-bar"><span style="width:${o/10*100}%"></span></span></span>`:l}</header>${e.overview?s`<p class="overview">${e.overview}</p>`:l}<div class="sections">${e.love?s`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:l} ${e.career?s`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:l} ${e.health?s`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:l} ${e.finance?s`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:l} ${"advice"in e&&e.advice?s`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:l}</div>${(()=>{let d="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,c="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],g="luckyDays"in e&&e.luckyDays?e.luckyDays:[],h=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&g.length===0&&h.length===0?l:s`<div class="lucky">${d!==void 0?s`<span>Lucky number <strong>${d}</strong></span>`:l} ${c?s`<span>Lucky color <strong>${c}</strong></span>`:l} ${m.length?s`<span>Lucky numbers <strong>${m.join(", ")}</strong></span>`:l} ${g.length?s`<span>Lucky days <strong>${g.join(", ")}</strong></span>`:l} ${h.length?s`<span class="compat-wrap">Best with <span class="compat">${h.map(y=>s`<span>${y}</span>`)}</span></span>`:l}</div>`})()}</article>`}};se.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],p([u({attribute:!1})],se.prototype,"data",2),p([u({type:String,reflect:!0})],se.prototype,"period",2),se=p([b("roxy-horoscope-card")],se);var oe=class extends f{constructor(){super();this.data=null;this.activeTab="planets";new $(this)}bodies(){let e=this.data;if(!e)return[];let t=(e.planets??[]).map(o=>({name:o.planet,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,kpNumber:o.kpNumber,retrograde:o.retrograde})),r=e.nodes;for(let[o,i]of[["Rahu",r?.rahu],["Ketu",r?.ketu]])i&&t.push({name:o,sign:i.sign,house:i.house,nakshatra:i.nakshatra,starLord:i.starLord,subLord:i.subLord,subSubLord:i.subSubLord,retrograde:!0});return t}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let t=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${t}`)?.focus()})}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,t=e.ascendant;return s`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${t?s`<div class="asc">Ascendant: <strong>${t.sign??""}</strong> ${t.nakshatra?s`· ${t.nakshatra}`:l} ${t.subLord?s`· sub lord ${t.subLord}`:l} ${typeof t.kpNumber=="number"?s`· KP ${t.kpNumber}`:l}</div>`:l} ${typeof e.meta?.ayanamsa=="number"?s`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${C(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?s`· ${e.meta.houseSystem} houses`:l}</div>`:l}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(r=>s`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${r==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?s`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(t=>s`<tr><td class="body">${t.name}${t.retrograde?s`<span class="retro">R</span>`:l}</td><td>${t.sign??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.nakshatra??""}</td><td>${t.starLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?s`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(t=>s`<tr><td class="body num">${t.house}</td><td>${t.sign??""}</td><td>${t.signLord??""}</td><td>${t.nakshatra??""}</td><td>${t.starLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No cusps</p>`}};oe.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],p([u({attribute:!1})],oe.prototype,"data",2),p([N()],oe.prototype,"activeTab",2),oe=p([b("roxy-kp-chart")],oe);var $e=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return s`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?s`<span class="ayanamsa">Ayanamsa: ${C(this.data.ayanamsa,2)}°</span>`:l}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(t=>s`<tr><td class="planet">${t.planet} ${t.retrograde?s`<span class="retro">R</span>`:l}</td><td>${t.sign??""}</td><td>${t.signLord??""}</td><td>${t.nakshatra??""}</td><td>${t.nakshatraLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td>${t.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};$e.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],p([u({attribute:!1})],$e.prototype,"data",2),$e=p([b("roxy-kp-planets-table")],$e);var we=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,t=e.significators??[];return s`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?s`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:l}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?s`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((r,o)=>s`<span class="rp" role="listitem"><span class="rank">${o+1}</span> ${r}</span>`)}</div>`:l} ${t.length?s`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${t.map(r=>s`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:l}</div>`}};we.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],p([u({attribute:!1})],we.prototype,"data",2),we=p([b("roxy-kp-ruling-planets")],we);function Lr(n,a){let e,t=((...r)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...r)},a)});return t.cancel=()=>{e&&(clearTimeout(e),e=void 0)},t}var D=class extends f{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=Lr(e=>{this.fetchResults(e)},300);this.onInput=e=>{let t=e.target.value;if(this.query=t,t.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(t)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let t=this.results[this.highlight]??this.results[0];t&&this.select(t)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let t=new AbortController;this.abortController=t,this.isLoading=!0;try{let r=new URL(this.endpoint);r.searchParams.set("q",e),r.searchParams.set("limit","8");let o={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let i=this.publishableKey??this.apiKey;i&&(o["X-API-Key"]=i);let d=await fetch(r,{headers:o,signal:t.signal});if(!d.ok)throw new Error(`HTTP ${d.status}`);let c=await d.json();if(t.signal.aborted)return;this.results=c.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(r){if(r?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===t&&(this.abortController=void 0),t.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return s`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?s`<span class="spinner" role="status" aria-label="Loading"></span>`:l} ${this.isOpen?s`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?s`<li class="empty" role="status">No cities found</li>`:this.results.map((e,t)=>s`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${t}`}" aria-selected="${this.highlight===t?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=t}}"><span class="city">${e.city}</span> <span class="where">${e.province?s`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:l}</div>`}};D.styles=[v,x`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],p([u({type:String,attribute:"api-key"})],D.prototype,"apiKey",2),p([u({type:String,attribute:"publishable-key"})],D.prototype,"publishableKey",2),p([u({type:String})],D.prototype,"endpoint",2),p([u({type:String})],D.prototype,"placeholder",2),p([u({type:String,attribute:"default-value"})],D.prototype,"defaultValue",2),p([N()],D.prototype,"query",2),p([N()],D.prototype,"results",2),p([N()],D.prototype,"isOpen",2),p([N()],D.prototype,"isLoading",2),p([N()],D.prototype,"highlight",2),D=p([b("roxy-location-search")],D);var ne=class extends f{constructor(){super();this.data=null;this.mode="current";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No moon phase data</div>`;let t="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&t.length>0){let r="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return s`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${r??"Moon phases"} ${o??""}</h2><div class="list" role="list">${t.map(i=>this.renderListItem(i))}</div></article>`}return"phase"in e?this.renderSingle(e):l}renderSingle(e){let t=Nr(e.phase);return s`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${t}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?s`<div class="date">${e.date}</div>`:l}</div></div><div class="stats">${typeof e.illumination=="number"?s`<div><span>Illumination</span> <strong>${Fa(e.illumination)}</strong></div>`:l} ${typeof e.age=="number"?s`<div><span>Age</span> <strong>${C(e.age,1)} days</strong></div>`:l} ${e.sign?s`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:l} ${typeof e.distance=="number"?s`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:l}</div>${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l} ${e.meaning?.keywords?.length?s`<div class="keywords">${e.meaning.keywords.map(r=>s`<span>${r}</span>`)}</div>`:l}</article>`}renderListItem(e){let t=Nr(e.phase);return s`<div class="list-item" role="listitem"><span aria-hidden="true">${t}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};ne.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],p([u({attribute:!1})],ne.prototype,"data",2),p([u({type:String,reflect:!0})],ne.prototype,"mode",2),ne=p([b("roxy-moon-phase")],ne);function Nr(n){return n?xr[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Fa(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var ke=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,t=e.remedies;return s`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?s`<span class="number">Nakshatra ${e.number} of 27</span>`:l} ${e.range?s`<span class="range">${e.range}</span>`:l}</header><dl class="facts">${e.lord?s`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:l} ${e.deity?s`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:l} ${e.symbol?s`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:l}</dl>${e.characteristics?s`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:l} ${t?s`<div class="section"><h3>Remedies</h3><div class="remedies">${t.mantras?s`<div class="remedy"><strong>Mantras:</strong> ${t.mantras}</div>`:l} ${t.gemstones?s`<div class="remedy"><strong>Gemstones:</strong> ${t.gemstones}</div>`:l} ${t.rituals?s`<div class="remedy"><strong>Rituals:</strong> ${t.rituals}</div>`:l}</div></div>`:l}</article>`}};ke.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],p([u({attribute:!1})],ke.prototype,"data",2),ke=p([b("roxy-nakshatra-card")],ke);function Y(){return s`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var je=x`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var Ft=420,P=Ft/2,Be=164,Yt=146,rt=120,Ke=96,Ua=178,Wa=196,F=class extends f{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new $(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),t=this.data.aspects??[],r=this.view;return s`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?s`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:l}</header>${Ie({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:r,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${r}" role="tabpanel" aria-labelledby="natal-tab-${r}">${r==="wheel"?this.renderWheel(e,t):this.renderAspectGrid(e,t)}</div><div class="legend"><span>${e.length} planets</span> <span>${t.length} aspects</span> ${this.data.houseSystem?s`<span>${this.data.houseSystem} houses</span>`:l} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,t){return s`<svg viewBox="0 0 ${Ft} ${Ft}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${P}" cy="${P}" r="${Be}" stroke-width="1.5"/><circle class="wheel-line" cx="${P}" cy="${P}" r="${Yt-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${P}" cy="${P}" r="${rt}" stroke-width="1"/><circle class="wheel-line" cx="${P}" cy="${P}" r="${Ke-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,t)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,t){let r=e.map(i=>A(i.name)),o=new Map;for(let i of t){let d=[A(i.planet1),A(i.planet2)].sort().join("|");o.set(d,i)}return r.length===0?s`<p class="roxy-empty" role="status">No planets to grid</p>`:s`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${r.slice(0,-1).map(i=>{let d=L[i]??i.slice(0,2);return s`<th scope="col" title="${i}">${d}</th>`})}</tr></thead><tbody>${r.slice(1).map((i,d)=>{let c=L[i]??i.slice(0,2);return s`<tr><th scope="row" title="${i}">${c}</th>${r.slice(0,d+1).map(m=>{let g=o.get([i,m].sort().join("|"));if(!g)return s`<td class="empty"></td>`;let h=Ge(g),y=et[h]??et[h.replace(/-/g,"")]??h.slice(0,3),S=_e[h]??"aspect-other",k=C(g.orb,1);return s`<td class="${`cell ${S}`}" title="${`${i} ${h} ${m}${k?` (orb ${k}\xB0)`:""}`}"><span class="asp">${y}</span></td>`})} ${r.slice(d+1,-1).map(()=>s`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),t=this.getMidheaven(),r=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Kt(e),"DSC")];t!==null&&(r.push(this.renderAngleMark(t,"MC")),r.push(this.renderAngleMark(Kt(t),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&r.push(this.renderAngleMark(q(o),"PoF"));let i=this.data?.vertex?.longitude;return typeof i=="number"&&r.push(this.renderAngleMark(q(i),"Vtx")),r}renderAngleMark(e,t){let r=this.toAngle(e),o=T(P,P,Be,r),i=T(P,P,Ua,r),d=T(P,P,Wa,r);return w`
75
+ `}function es(n){let a=n.lagnaSign.toLowerCase();return w`
76
+ ${Za(n.divisionLabel)}
77
+ ${D.map(e=>Qa(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,It(e,n.lagnaSign)))}
78
+ `}function Ar(n,a){switch(a){case"north":return Wa(n);case"east":return es(n);default:return qa(n)}}function Cr(n,a){return qe({items:_a,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var Er=u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var ae=class extends x{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new $(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Sr(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return s`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return s`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?s`<span class="division-meta">· ${r.sanskritName}</span>`:l}</h2>${r.significance?s`<p class="significance">${r.significance}</p>`:l}</div>${Cr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${r.number} ${r.name} divisional chart with twelve sign houses"><title>D${r.number} ${r.name}</title>${Ar(e,this.chartStyle)}</svg> ${t&&t.length>0?s`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(o=>s`<span class="vargottama-pill" role="listitem">${L[o]??""} ${o}</span>`)}</div>`:l}</div>`}};ae.styles=[v,Er,$e,u`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],p([h({attribute:!1})],ae.prototype,"data",2),p([h({type:String,reflect:!0,attribute:"chart-style"})],ae.prototype,"chartStyle",2),ae=p([b("roxy-divisional-chart")],ae);var rs={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},se=class extends x{constructor(){super();this.data=null;this.type="manglik";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=rs[this.type]??this.type,o=(e.severity??"").toLowerCase(),i=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=i*33,c=i===3?"var(--roxy-danger)":i===2?"var(--roxy-warning)":i===1?"var(--roxy-success)":"transparent";return s`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?s`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${i}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${d}%;background:${c}"></span></div>`:l} ${e.description?s`<p class="description">${e.description}</p>`:l} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?s`<div><h3>Remedies</h3><ul>${e.remedies.map(m=>s`<li>${m}</li>`)}</ul></div>`:l} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?s`<div><h3>Exceptions</h3><ul>${e.exceptions.map(m=>s`<li>${m}</li>`)}</ul></div>`:l}</article>`}renderEffects(e){if(!e.effects)return l;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?l:s`<div class="effects">${r.map(([t,o])=>s`<div><h3>${t}</h3><p>${o}</p></div>`)}</div>`}};se.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],p([h({attribute:!1})],se.prototype,"data",2),p([h({type:String,reflect:!0})],se.prototype,"type",2),se=p([b("roxy-dosha-card")],se);var we=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;return e?s`<article class="card" aria-label="${e.name??"Dream symbol"}"><header class="head">${e.letter?s`<span class="letter" aria-hidden="true">${e.letter}</span>`:l}<div><p class="label">Dream symbol</p>${e.name?s`<h2 class="name">${e.name}</h2>`:l}</div></header>${e.meaning?s`<p class="meaning">${e.meaning}</p>`:l}</article>`:s`<div class="roxy-empty" role="status">No dream symbol</div>`}};we.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:2.5rem;height:2.5rem;color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-variant-numeric:tabular-nums;flex:none;justify-content:center;align-items:center;display:inline-flex}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}`],p([h({attribute:!1})],we.prototype,"data",2),we=p([b("roxy-dream-card")],we);var Zr=new Map;async function ts(n){let a=Zr.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Zr.delete(n),e}),Zr.set(n,a)),a}var G=class extends x{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(t=>t.required).filter(t=>this.values[t.name]===void 0||this.values[t.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(t=>t.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await ts(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let o=e.components?.schemas??{},i=[],d;if(t.requestBody){let m=t.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[y,g]of Object.entries(d.properties)){let f=this.resolve(g,o)??{};i.push({name:y,type:this.fieldType(f),required:m.has(y),description:f.description,enum:f.enum,min:f.minimum,max:f.maximum,default:f.default})}}for(let m of t.parameters??[])if(m.in==="path"||m.in==="query"){let y=this.resolve(m.schema,o)??{};i.push({name:m.name,type:this.fieldType(y),required:!!m.required,description:y.description,enum:y.enum,default:y.default})}this.fields=i,this.hasLocation=i.some(m=>m.name==="latitude")&&i.some(m=>m.name==="longitude")&&i.some(m=>m.name==="timezone");let c={};for(let m of i)m.default!==void 0&&(c[m.name]=m.default);this.values=c,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return s`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return s`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return l;let t=`roxy-form-${r.name}`;return s`<div class="field"><label for="${t}">${j(r.name)}${r.required?s`<span class="req" aria-hidden="true">*</span>`:l}</label> ${r.enum?s`<select id="${t}" ?required="${r.required}" @change="${o=>this.setValue(r.name,o.target.value)}"><option value="">Choose</option>${r.enum.map(o=>s`<option value="${o}" ?selected="${this.values[r.name]===o}">${o}</option>`)}</select>`:s`<input id="${t}" type="${this.htmlType(r.type)}" ?required="${r.required}" min="${r.min??""}" max="${r.max??""}" step="${r.type==="number"?"any":""}" .value="${this.values[r.name]??""}" @input="${o=>this.setValue(r.name,this.coerce(r.type,o.target.value))}">`} ${r.description?s`<small class="help">${r.description}</small>`:l}</div>`};return s`<form @submit="${this.onSubmit}"><h2 class="title">${j(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?s`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:l}<div class="fields">${this.fields.map(r=>e(r))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};G.styles=[v,u`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],p([h({type:String,attribute:"data-endpoint"})],G.prototype,"endpoint",2),p([h({type:String})],G.prototype,"method",2),p([h({type:String,attribute:"spec-url"})],G.prototype,"specUrl",2),p([h({type:String,attribute:"submit-label"})],G.prototype,"submitLabel",2),p([N()],G.prototype,"fields",2),p([N()],G.prototype,"values",2),p([N()],G.prototype,"hasLocation",2),p([N()],G.prototype,"loaded",2),p([N()],G.prototype,"specError",2),G=p([b("roxy-endpoint-form")],G);var as={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},ss=["western","vedic","biorhythm"],ke=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No forecast data</div>`;let r=e.events??[],t=this.groupByDate(r),o=ss.filter(i=>r.some(d=>d.domain===i));return s`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?s`<div class="range">${ve(e.startDate)} - ${ve(e.endDate)} · ${e.count??r.length} events</div>`:l}</header>${o.length?s`<div class="legend">${o.map(i=>s`<span><span class="swatch swatch-${i}"></span>${as[i]}</span>`)}</div>`:l} ${t.length?s`<div class="days" role="list">${t.map(([i,d])=>this.renderDay(i,d))}</div>`:s`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(e){let r=new Map;for(let t of e){let o=t.date??"",i=r.get(o)??[];i.push(t),r.set(o,i)}return[...r.entries()]}renderDay(e,r){return s`<div class="day" role="listitem"><div class="day-date">${ve(e)}</div><div class="events">${r.map(t=>this.renderEvent(t))}</div></div>`}renderEvent(e){let r=typeof e.significance=="number"?e.significance:0,t=Math.max(0,Math.min(100,r));return s`<div class="event"><span class="dot dot-${e.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(e)}</div>${e.description?s`<p class="event-desc">${e.description}</p>`:l}<div class="sig" title="Significance ${t} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${e.domain}" style="width:${t}%"></span> </span><span class="sig-val">${t}</span></div></div></div>`}renderHeadline(e){let r=e.body?A(e.body):"",t=e.target?A(e.target):"",o=e.aspect?e.aspect.toLowerCase():"",i=He[o]??"",d=o?sr[o]??o:"",c=typeof e.orb=="number"?C(e.orb,1):"",m=this.typeQualifier(e);return o&&t?s`<strong>${r}</strong> <span class="${i}">${d}</span> <strong>${t}</strong>${c?s`<span class="kind">orb ${c}°</span>`:l}`:s`<strong>${r||j(e.type??"")}</strong>${m?s`<span class="kind">${m}</span>`:l}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${A(e.target)}`:e.type==="retrograde-station"&&e.station?e.station:e.type==="eclipse"?[e.kind,"eclipse"].filter(Boolean).join(" "):e.type==="critical-day"?"critical day":e.type==="dasha-change"&&e.target?`dasha ${A(e.target)}`:j(e.type??"")}};ke.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],p([h({attribute:!1})],ke.prototype,"data",2),ke=p([b("roxy-forecast-timeline")],ke);var Se=class extends x{constructor(){super();this.data=null;new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(g=>g?.category!==void 0),t=e.total??0,o=e.maxScore??36,i=t/o*100,d="color-mix(in srgb, var(--roxy-border) 50%, transparent)",c=i>=70?"var(--roxy-success)":i>=50?"var(--roxy-warning)":"var(--roxy-danger)",m=i*2.827,y=(100-i)*2.827;return s`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${C(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?s`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Dt(e.percentage,1)}</small>`:l}</div>${e.recommendation?s`<span class="recommendation">${e.recommendation}</span>`:l}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${c}" stroke-width="8" stroke-dasharray="${m},${y}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${o}</text></svg></div></div>${r.length>0?s`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(g=>{let f=g.score??0,S=g.maxScore??os(g.category),k=S?f/S*100:0;return s`<tr><td>${g.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${k}%"></span></div></td><td class="score">${C(f,1)} / ${S}</td></tr>`})}</tbody></table>`:l} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?s`<div class="tags">${e.doshas?.map(g=>s`<span class="dosha">${g}</span>`)} ${e.doshaCancellations?.map(g=>s`<span class="cancel" title="${g.reason}">${g.dosha} cancelled</span>`)}</div>`:l}</article>`}};Se.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],p([h({attribute:!1})],Se.prototype,"data",2),Se=p([b("roxy-guna-milan")],Se);function os(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var oe=class extends x{constructor(){super();this.data=null;this.mode="lookup";new $(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return s`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:o,dailyMessage:i,resultingHexagram:d}=e,c=t??this.derivedLines(r),m=new Set(o??[]);return s`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?s`<div class="symbol">${r.symbol}</div>`:l}<div class="lines" aria-hidden="true">${c.slice().reverse().map((y,g)=>{let f=c.length-1-g+1,S=m.has(f),k=y===6||y===8;return s`<div class="line ${`${k?"broken":"solid"}${S?" changing":""}`}">${k?w`<span class="seg"></span><span class="seg"></span>`:w`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?s`${r.number}.`:l}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?s`${r.chinese}`:l} ${r.pinyin?s`· ${r.pinyin}`:l}</p><div class="trigrams">${r.upperTrigram?s`<div>Upper <span class="tri-glyph">${qr[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:l} ${r.lowerTrigram?s`<div>Lower <span class="tri-glyph">${qr[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:l}</div>${r.judgment?s`<p class="judgment">${r.judgment}</p>`:l} ${r.image?s`<p class="image">${r.image}</p>`:l} ${i?s`<p class="message">${i}</p>`:l} ${r.interpretation?.general?s`<p>${r.interpretation.general}</p>`:l} ${m.size>0?s`<div class="changing">Changing lines: ${Array.from(m).sort((y,g)=>y-g).join(", ")}. ${d?.english?s`Becomes hexagram ${d.number} ${d.english}.`:l}</div>`:l}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,o=[];for(let i=0;i<6;i++){let d=t>>i&1;o.push(d?8:7)}return o}return Array.from({length:6},()=>7)}};oe.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],p([h({attribute:!1})],oe.prototype,"data",2),p([h({type:String,reflect:!0})],oe.prototype,"mode",2),oe=p([b("roxy-hexagram")],oe);var ne=class extends x{constructor(){super();this.data=null;this.period="daily";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?H[A(r)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,i="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return s`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${i?s`<div class="date">${i}</div>`:l}</div>${o!==null?s`<span class="energy" aria-label="${`Energy ${o} of 10`}">Energy ${o}/10 <span class="energy-bar"><span style="width:${o/10*100}%"></span></span></span>`:l}</header>${e.overview?s`<p class="overview">${e.overview}</p>`:l}<div class="sections">${e.love?s`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:l} ${e.career?s`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:l} ${e.health?s`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:l} ${e.finance?s`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:l} ${"advice"in e&&e.advice?s`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:l}</div>${(()=>{let d="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,c="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],y="luckyDays"in e&&e.luckyDays?e.luckyDays:[],g=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&y.length===0&&g.length===0?l:s`<div class="lucky">${d!==void 0?s`<span>Lucky number <strong>${d}</strong></span>`:l} ${c?s`<span>Lucky color <strong>${c}</strong></span>`:l} ${m.length?s`<span>Lucky numbers <strong>${m.join(", ")}</strong></span>`:l} ${y.length?s`<span>Lucky days <strong>${y.join(", ")}</strong></span>`:l} ${g.length?s`<span class="compat-wrap">Best with <span class="compat">${g.map(f=>s`<span>${f}</span>`)}</span></span>`:l}</div>`})()}</article>`}};ne.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],p([h({attribute:!1})],ne.prototype,"data",2),p([h({type:String,reflect:!0})],ne.prototype,"period",2),ne=p([b("roxy-horoscope-card")],ne);var ie=class extends x{constructor(){super();this.data=null;this.activeTab="planets";new $(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(o=>({name:o.planet,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,kpNumber:o.kpNumber,retrograde:o.retrograde})),t=e.nodes;for(let[o,i]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])i&&r.push({name:o,sign:i.sign,house:i.house,nakshatra:i.nakshatra,starLord:i.starLord,subLord:i.subLord,subSubLord:i.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return s`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?s`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?s`· ${r.nakshatra}`:l} ${r.subLord?s`· sub lord ${r.subLord}`:l} ${typeof r.kpNumber=="number"?s`· KP ${r.kpNumber}`:l}</div>`:l} ${typeof e.meta?.ayanamsa=="number"?s`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${C(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?s`· ${e.meta.houseSystem} houses`:l}</div>`:l}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>s`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?s`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>s`<tr><td class="body">${r.name}${r.retrograde?s`<span class="retro">R</span>`:l}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?s`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>s`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No cusps</p>`}};ie.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],p([h({attribute:!1})],ie.prototype,"data",2),p([N()],ie.prototype,"activeTab",2),ie=p([b("roxy-kp-chart")],ie);var Ae=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return s`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?s`<span class="ayanamsa">Ayanamsa: ${C(this.data.ayanamsa,2)}°</span>`:l}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>s`<tr><td class="planet">${r.planet} ${r.retrograde?s`<span class="retro">R</span>`:l}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Ae.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],p([h({attribute:!1})],Ae.prototype,"data",2),Ae=p([b("roxy-kp-planets-table")],Ae);var Ce=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return s`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?s`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:l}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?s`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,o)=>s`<span class="rp" role="listitem"><span class="rank">${o+1}</span> ${t}</span>`)}</div>`:l} ${r.length?s`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>s`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:l}</div>`}};Ce.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],p([h({attribute:!1})],Ce.prototype,"data",2),Ce=p([b("roxy-kp-ruling-planets")],Ce);function jt(n,a){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...t)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var _=class extends x{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=jt(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let o={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let i=this.publishableKey??this.apiKey;i&&(o["X-API-Key"]=i);let d=await fetch(t,{headers:o,signal:r.signal});if(!d.ok)throw new Error(`HTTP ${d.status}`);let c=await d.json();if(r.signal.aborted)return;this.results=c.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return s`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?s`<span class="spinner" role="status" aria-label="Loading"></span>`:l} ${this.isOpen?s`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?s`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>s`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?s`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:l}</div>`}};_.styles=[v,u`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],p([h({type:String,attribute:"api-key"})],_.prototype,"apiKey",2),p([h({type:String,attribute:"publishable-key"})],_.prototype,"publishableKey",2),p([h({type:String})],_.prototype,"endpoint",2),p([h({type:String})],_.prototype,"placeholder",2),p([h({type:String,attribute:"default-value"})],_.prototype,"defaultValue",2),p([N()],_.prototype,"query",2),p([N()],_.prototype,"results",2),p([N()],_.prototype,"isOpen",2),p([N()],_.prototype,"isLoading",2),p([N()],_.prototype,"highlight",2),_=p([b("roxy-location-search")],_);var le=class extends x{constructor(){super();this.data=null;this.mode="current";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,o="year"in e?e.year:void 0;return s`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${o??""}</h2><div class="list" role="list">${r.map(i=>this.renderListItem(i))}</div></article>`}return"phase"in e?this.renderSingle(e):l}renderSingle(e){let r=Bt(e.phase);return s`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?s`<div class="date">${e.date}</div>`:l}</div></div><div class="stats">${typeof e.illumination=="number"?s`<div><span>Illumination</span> <strong>${ns(e.illumination)}</strong></div>`:l} ${typeof e.age=="number"?s`<div><span>Age</span> <strong>${C(e.age,1)} days</strong></div>`:l} ${e.sign?s`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:l} ${typeof e.distance=="number"?s`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:l}</div>${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l} ${e.meaning?.keywords?.length?s`<div class="keywords">${e.meaning.keywords.map(t=>s`<span>${t}</span>`)}</div>`:l}</article>`}renderListItem(e){let r=Bt(e.phase);return s`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};le.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],p([h({attribute:!1})],le.prototype,"data",2),p([h({type:String,reflect:!0})],le.prototype,"mode",2),le=p([b("roxy-moon-phase")],le);function Bt(n){return n?Ct[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function ns(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var Ee=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return s`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?s`<span class="number">Nakshatra ${e.number} of 27</span>`:l} ${e.range?s`<span class="range">${e.range}</span>`:l}</header><dl class="facts">${e.lord?s`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:l} ${e.deity?s`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:l} ${e.symbol?s`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:l}</dl>${e.characteristics?s`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:l} ${r?s`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?s`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:l} ${r.gemstones?s`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:l} ${r.rituals?s`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:l}</div></div>`:l}</article>`}};Ee.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],p([h({attribute:!1})],Ee.prototype,"data",2),Ee=p([b("roxy-nakshatra-card")],Ee);function V(){return s`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var Ye=u`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var et=420,E=et/2,Ue=164,Qr=146,nr=120,Ve=96,is=178,ls=196,F=class extends x{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new $(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return s`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?s`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:l}</header>${qe({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?s`<span>${this.data.houseSystem} houses</span>`:l} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return s`<svg viewBox="0 0 ${et} ${et}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${E}" cy="${E}" r="${Ue}" stroke-width="1.5"/><circle class="wheel-line" cx="${E}" cy="${E}" r="${Qr-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${E}" cy="${E}" r="${nr}" stroke-width="1"/><circle class="wheel-line" cx="${E}" cy="${E}" r="${Ve-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(i=>A(i.name)),o=new Map;for(let i of r){let d=[A(i.planet1),A(i.planet2)].sort().join("|");o.set(d,i)}return t.length===0?s`<p class="roxy-empty" role="status">No planets to grid</p>`:s`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(i=>{let d=L[i]??i.slice(0,2);return s`<th scope="col" title="${i}">${d}</th>`})}</tr></thead><tbody>${t.slice(1).map((i,d)=>{let c=L[i]??i.slice(0,2);return s`<tr><th scope="row" title="${i}">${c}</th>${t.slice(0,d+1).map(m=>{let y=o.get([i,m].sort().join("|"));if(!y)return s`<td class="empty"></td>`;let g=Ke(y),f=sr[g]??sr[g.replace(/-/g,"")]??g.slice(0,3),S=He[g]??"aspect-other",k=C(y.orb,1);return s`<td class="${`cell ${S}`}" title="${`${i} ${g} ${m}${k?` (orb ${k}\xB0)`:""}`}"><span class="asp">${f}</span></td>`})} ${t.slice(d+1,-1).map(()=>s`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Jr(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Jr(r),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&t.push(this.renderAngleMark(Y(o),"PoF"));let i=this.data?.vertex?.longitude;return typeof i=="number"&&t.push(this.renderAngleMark(Y(i),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),o=R(E,E,Ue,t),i=R(E,E,is,t),d=R(E,E,ls,t);return w`
79
79
  <g>
80
80
  <line class="angle-tick" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />
81
- <text class="angle-marker" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${t}</text>
81
+ <text class="angle-marker" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${r}</text>
82
82
  </g>
83
- `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(r=>r.longitude):Array.from({length:12},(r,o)=>this.getAscendant()+o*30)).map(r=>{let o=this.toAngle(r),i=T(P,P,rt,o),d=T(P,P,Be,o);return w`<line class="wheel-line" x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} stroke-width="0.8" />`})}renderSigns(){return _.map((e,t)=>{let r=this.toAngle(t*30+15),o=T(P,P,Yt,r);return w`<text class="sign-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${G[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((r,o)=>{let i=e[(o+1)%12],d=Er(r.longitude,i?i.longitude:r.longitude+30),c=T(P,P,rt-12,this.toAngle(d));return w`<text class="house-num" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${r.number}</text>`});let t=Math.floor(this.getAscendant()/30);return Array.from({length:12},(r,o)=>{let i=this.toAngle(o*30+15),d=T(P,P,rt-12,i),c=(o-t+12)%12+1;return w`<text class="house-num" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${c}</text>`})}renderTicks(){let e=[];for(let t=0;t<360;t+=5){let r=this.toAngle(t),o=t%30===0,i=o?Yt-14:Be-5,d=T(P,P,i,r),c=T(P,P,Be,r);e.push(w`<line class=${o?"tick tick-major":"tick"} x1=${d.x} y1=${d.y} x2=${c.x} y2=${c.y} stroke-width=${o?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?l:e.map(t=>{let r=this.toAngle(t.longitude),o=T(P,P,rt+9,r),i=V(t.longitude);return w`<text class="cusp-deg" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${i.degree}°${String(i.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let r=e.filter(i=>Number.isFinite(i.longitude)).map(i=>({p:i,trueLon:q(i.longitude),displayLon:q(i.longitude)})).sort((i,d)=>i.trueLon-d.trueLon);for(let i=1;i<r.length;i++){let d=r[i-1],c=r[i];if(!d||!c)continue;let m=d.displayLon+7;c.displayLon<m&&(c.displayLon=m)}let o=r[r.length-1];if(o&&o.displayLon>360){let i=o.displayLon-360;for(let d of r)d.displayLon-=i}return r.map(({p:i,trueLon:d,displayLon:c})=>{let m=this.toAngle(d),g=this.toAngle(c),h=T(P,P,Ke,g),y=T(P,P,Ke-13,g),S=T(P,P,Be-4,m),k=T(P,P,Ke+8,g),Ee=L[A(i.name)]??i.name.slice(0,2),at=V(i.longitude),Ve=i.isRetrograde===!0,st=`${at.degree}\xB0${String(at.minute).padStart(2,"0")}'`,ot=Math.abs(c-d)>.5;return w`<g>
84
- ${ot?w`<line class="planet-leader" x1=${S.x} y1=${S.y} x2=${k.x} y2=${k.y} />`:l}
85
- <text class="planet-glyph" x=${h.x} y=${h.y} text-anchor="middle" dominant-baseline="central"><title>${i.name}${Ve?" retrograde":""} - ${st} ${i.sign??""}</title>${Ee}</text>
86
- <text class="planet-deg" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">${st}${Ve?w`<tspan class="retro"> ℞</tspan>`:l}</text>
87
- </g>`})}renderDetails(){let e=this.data?.summary,t=this.data?.aspectsInterpretation;if(!e&&!t)return l;let r=e?.retrogradePlanets??[];return s`<div class="details">${e?.dominantElement||e?.dominantModality?s`<div class="pill-row">${e.dominantElement?s`<span class="pill">Dominant element: ${e.dominantElement}</span>`:l} ${e.dominantModality?s`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:l}</div>`:l} ${t?s`<div class="pill-row"><span class="pill pill--success">Harmonious ${t.harmonious}</span> <span class="pill pill--danger">Challenging ${t.challenging}</span> <span class="pill pill--muted">Neutral ${t.neutral}</span></div>`:l} ${r.length>0?s`<div class="pill-row">${r.map(o=>{let i=L[o]??o.slice(0,2);return s`<span class="pill pill--muted">${i} ${o} R</span>`})}</div>`:l} ${t?.summary?s`<p class="summary">${t.summary}</p>`:l} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return l;let t=["Fire","Earth","Air","Water"],r=["Cardinal","Fixed","Mutable"],o=_,i={};for(let d of t)i[d]={Cardinal:[],Fixed:[],Mutable:[]};for(let d of e){let c=o.indexOf(A(d.sign??""));if(c<0)continue;let m=t[c%4],g=r[c%3],h=L[A(d.name)]??A(d.name).slice(0,2);i[m]?.[g]?.push(h)}return s`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${r.map(d=>s`<th scope="col">${d.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${t.map(d=>{let c=r.reduce((m,g)=>m+(i[d]?.[g]?.length??0),0);return s`<tr><th scope="row">${d}</th>${r.map(m=>s`<td>${(i[d]?.[m]??[]).join(" ")}</td>`)}<td class="em-total">${c}</td></tr>`})}<tr><th scope="row">Total</th>${r.map(d=>s`<td class="em-total">${t.reduce((c,m)=>c+(i[m]?.[d]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(t=>t.interpretation);return e.length===0?l:s`<section class="interpretations"><h3>Planet readings</h3>${e.map((t,r)=>{let o=t.interpretation,i=L[A(t.name)]??"",d=C(t.degree??0,1);return s`<details class="interp-card" name="natal-planet-readings" ?open="${r===0}"><summary><span>${i} ${t.name}</span> <span class="interp-aside"><small>${t.sign??""} ${d}</small> ${Y()}</span></summary><div class="interp-body">${o.summary?s`<p class="interp-summary">${o.summary}</p>`:l} ${o.detailed?s`<p class="interp-detail">${o.detailed}</p>`:l} ${o.keywords?.length?s`<div class="interp-keywords">${o.keywords.map(c=>s`<span class="kw">${c}</span>`)}</div>`:l}</div></details>`})}</section>`}renderAspects(e,t){let r=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let i=A(o.name);i&&r.set(i,o.longitude)}return t.map(o=>{let i=r.get(A(o.planet1)),d=r.get(A(o.planet2));if(i===void 0||d===void 0)return l;let c=T(P,P,Ke-18,this.toAngle(i)),m=T(P,P,Ke-18,this.toAngle(d)),g=Ge(o),h=_e[g]??"aspect-other",y=C(o.orb,1);return w`<line class=${`aspect ${h}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${g||""} ${o.planet2}${y?` (orb ${y}\xB0)`:""}</title></line>`})}};F.styles=[v,fe,je,x`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],p([u({attribute:!1})],F.prototype,"data",2),p([u({type:String,attribute:"house-system",reflect:!0})],F.prototype,"houseSystem",2),p([N()],F.prototype,"view",2),F=p([b("roxy-natal-chart")],F);var ie=class extends f{constructor(){super();this.data=null;this.type="life-path";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No numerology data</div>`;let t=Ja[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,t):"personalYear"in e?this.renderPersonalYear(e,t):this.renderNumberCard(e,t)}renderNumberCard(e,t){let r=e.meaning?.keywords??[];return s`<article class="card" aria-label="${t}"><div class="hero">${typeof e.number=="number"?s`<div class="numeral">${e.number}</div>`:l}<div><p class="label">${t}</p>${e.meaning?.title?s`<h2 class="title">${e.meaning.title}</h2>`:l}</div></div>${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l} ${e.calculation?s`<pre class="calc">${e.calculation}</pre>`:l} ${r.length>0?s`<div class="chips">${r.map(o=>s`<span>${o}</span>`)}</div>`:l} ${e.hasKarmicDebt&&e.karmicDebtNumber?s`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Xa(e.karmicDebtMeaning)}</div>`:l}</article>`}renderPersonalYear(e,t){return s`<article class="card" aria-label="${t}"><div class="hero">${typeof e.personalYear=="number"?s`<div class="numeral">${e.personalYear}</div>`:l}<div><p class="label">${t}</p>${e.theme?s`<h2 class="title">${e.theme}</h2>`:l}</div></div>${e.forecast?s`<p class="meaning">${e.forecast}</p>`:l} ${e.advice?s`<p>${e.advice}</p>`:l}</article>`}renderChart(e,t){let r=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return s`<article class="card" aria-label="${t}"><div><p class="label">${t}</p>${e.profile?.name?s`<h2 class="title">${e.profile.name}</h2>`:l}</div>${r.length>0?s`<div class="cores">${r.map(([o,i])=>s`<div class="item"><span>${j(o)}</span> <strong>${i.number??""}</strong></div>`)}</div>`:l}</article>`}};ie.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],p([u({attribute:!1})],ie.prototype,"data",2),p([u({type:String,reflect:!0})],ie.prototype,"type",2),ie=p([b("roxy-numerology-card")],ie);var Ja={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Xa(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var le=class extends f{constructor(){super();this.data=null;this.detail="detailed";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No panchang data</div>`;let t="sunrise"in e?e:null,r=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];t&&r.push(["Vara",this.formatPart(t.vara)]);let o=t?[["Moon sign",this.formatRashi(t.moonSign)],["Sun sign",this.formatRashi(t.sunSign)],["Sun nakshatra",this.formatSunNakshatra(t.sunNakshatra)],["Hora",this.formatHora(t.hora)]].filter(h=>!!h[1]):[],i=t?[["Brahma Muhurta",t.brahmaMuhurta],["Abhijit Muhurta",t.abhijitMuhurta],["Vijaya Muhurta",t.vijayaMuhurta],["Godhuli Muhurta",t.godhuliMuhurta],["Nishita Muhurta",t.nishitaMuhurta],["Pratah Sandhya",t.pratahSandhya],["Sayahna Sandhya",t.sayahnaSandhya]]:[],d=t?this.expandWindows("Amrit Kalam",t.amritKalam):[],c=t?[["Rahu Kaal",t.rahuKaal],["Yamaganda",t.yamaganda],["Gulika",t.gulika]]:[],m=t?[...this.expandWindows("Dur Muhurta",t.durMuhurta),...this.expandWindows("Varjyam",t.varjyam)]:[],g=t&&"transitions"in t?t.transitions:void 0;return s`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${t?xe(t.date):""}</span></header><table><tbody>${r.map(([h,y])=>s`<tr><th>${h}</th><td>${y}</td></tr>`)} ${t?.sunrise?s`<tr><th>Sunrise</th><td>${K(t.sunrise)}</td></tr>`:l} ${t?.sunset?s`<tr><th>Sunset</th><td>${K(t.sunset)}</td></tr>`:l} ${t?.moonrise?s`<tr><th>Moonrise</th><td>${K(t.moonrise)}</td></tr>`:l} ${t?.moonset?s`<tr><th>Moonset</th><td>${K(t.moonset)}</td></tr>`:l} ${o.map(([h,y])=>s`<tr><th>${h}</th><td>${y}</td></tr>`)}</tbody></table>${g?s`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",g.tithi)} ${this.renderTransitionRow("Nakshatra",g.nakshatra)} ${this.renderTransitionRow("Yoga",g.yoga)} ${this.renderTransitionRow("Karana",g.karana)}</tbody></table>`:l} ${this.detail==="detailed"&&(i.some(h=>!!h[1])||d.length>0||c.some(h=>!!h[1])||m.length>0)?s`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...i.filter(h=>!!h[1]),...d])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...c.filter(h=>!!h[1]),...m])}</tbody></table>`:l}</div>`}renderPeriodRows(e){return e.map(([t,r])=>{let o=Bt(r);return o?s`<tr><th>${t}</th><td>${o}</td></tr>`:l})}expandWindows(e,t){return!t||t.length===0?[]:t.map((r,o)=>[t.length>1?`${e} ${o+1}`:e,r])}renderTransitionRow(e,t){if(!t?.endsAt)return l;let r=K(t.endsAt),o=t.next?` \u2192 ${t.next}`:"";return s`<tr><th>${e}</th><td>ends ${r}${o}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let t=e;return[t.name,t.paksha?`(${t.paksha} paksha)`:"",t.lord?`\xB7 ${t.lord}`:"",t.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let t=Bt(e);return t?`${e.current} (${t})`:e.current}};le.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],p([u({attribute:!1})],le.prototype,"data",2),p([u({type:String,reflect:!0})],le.prototype,"detail",2),le=p([b("roxy-panchang-table")],le);var Ut=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],Se=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data?.planets?.length)return s`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((t,r)=>t.relativeRank-r.relativeRank);return s`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(t=>this.renderPlanetRow(t))}</div><div class="legend" aria-label="Strength component legend">${Ut.map(t=>s`<div class="legend-row"><span class="legend-swatch" style="background:${t.color}" aria-hidden="true"></span> ${t.label}</div>`)}</div></div>`}renderPlanetRow(e){let t=L[A(e.planet)]??"",r=Ut.map(g=>Math.max(0,e[g.key])),o=r.reduce((g,h)=>g+h,0),i=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,d=i?"adequacy-badge--adequate":"adequacy-badge--weak",c=i?"adequate":"weak",m=C(e.totalRupas,2)&&C(e.minRequired,2)?`${C(e.totalRupas,2)} / ${C(e.minRequired,2)} R`:"";return s`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${t}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${o>0?Ut.map((g,h)=>{let y=r[h];if(y<=0)return l;let S=y/o*100;return s`<div class="bar-segment" style="flex-grow:${S};background:${g.color}" title="${g.label}: ${C(y,1)}"></div>`}):l}</div></div><div class="pills">${m?s`<span class="rupas-label">${m}</span>`:l} <span class="${`adequacy-badge ${d}`}">${c}</span></div></div>`}};Se.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],p([u({attribute:!1})],Se.prototype,"data",2),Se=p([b("roxy-shadbala-table")],Se);var Xt=360,M=Xt/2,Wt=170,Za=154,Jt=124,qe=96,Ae=class extends f{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:t,compatibilityScore:r,analysis:o}=this.data,i=this.data.interAspects??[],d=e?.planets??[],c=t?.planets??[],m=typeof r=="number"?Math.round(r):void 0,g=o?.overall,h=o?.strengths??[],y=o?.challenges??[];return d.length>0&&c.length>0?s`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof m=="number"?s`<span class="score" aria-label="${`Score ${m} of 100`}">${m} / 100</span>`:l}</div><svg viewBox="0 0 ${Xt} ${Xt}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${M}" cy="${M}" r="${Wt}" stroke-width="1.5"/><circle class="wheel-line" cx="${M}" cy="${M}" r="${qe+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${M}" cy="${M}" r="${qe-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(d,c,i)} ${this.renderRing(d,Jt,"p1",1)} ${this.renderRing(c,qe,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${g?s`<p class="summary">${g}</p>`:l} ${i.length>0?this.renderAspects(i):l} ${h.length>0||y.length>0?s`<div class="lists">${h.length?s`<div><h3>Strengths</h3><ul>${h.map(k=>s`<li>${k}</li>`)}</ul></div>`:l} ${y.length?s`<div><h3>Challenges</h3><ul>${y.map(k=>s`<li>${k}</li>`)}</ul></div>`:l}</div>`:l}</div>`:s`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof m=="number"?s`<span class="score" aria-label="${`Score ${m} of 100`}">${m} / 100</span>`:l}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code>&lt;roxy-data></code> fallback.</div>${g?s`<p class="summary">${g}</p>`:l} ${i.length>0?this.renderAspects(i):l} ${h.length>0||y.length>0?s`<div class="lists">${h.length?s`<div><h3>Strengths</h3><ul>${h.map(k=>s`<li>${k}</li>`)}</ul></div>`:l} ${y.length?s`<div><h3>Challenges</h3><ul>${y.map(k=>s`<li>${k}</li>`)}</ul></div>`:l}</div>`:l}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,t)=>{let r=this.toAngle(t*30),o=T(M,M,qe-14,r),i=T(M,M,Wt,r);return w`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.6" />`})}renderSigns(){return _.map((e,t)=>{let r=this.toAngle(t*30+15),o=T(M,M,Za,r);return w`<text class="sign" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${G[e]}</text>`})}renderRing(e,t,r,o){return e.map(i=>{if(!Number.isFinite(i.longitude))return l;let d=this.toAngle(i.longitude),c=T(M,M,t,d),g=T(M,M,t+(o===1?-12:-10),d),h=L[A(i.name)]??i.name.slice(0,2),y=V(i.longitude),S=i.isRetrograde===!0,k=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,Ee=`${i.name}${S?" retrograde":""} - ${k} ${y.sign}`;return w`<g>
88
- <text class=${r} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central"><title>${Ee}</title>${h}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${o}</tspan></text>
89
- <text class="planet-deg" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central">${y.degree}°${S?w`<tspan class="retro"> ℞</tspan>`:l}</text>
90
- </g>`})}renderAscendants(e){let t=[],r=(o,i)=>{if(!o)return;let d=_.findIndex(S=>S.toLowerCase()===o.sign.toLowerCase());if(d===-1)return;let c=d*30+o.degree,m=this.toAngle(c),g=i===1?Jt+14:qe+14,h=T(M,M,g,m),y=T(M,M,Wt+14,m);t.push(w`<g>
91
- <line class="asc-tick" x1=${h.x} y1=${h.y} x2=${y.x} y2=${y.y} />
92
- <text class="asc-label" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">Asc${i}</text>
93
- </g>`)};return r(e.person1?.ascendant,1),r(e.person2?.ascendant,2),t}renderInterAspectLines(e,t,r){let o=(i,d)=>{let c=A(d);for(let m of i)if(A(m.name)===c&&typeof m.longitude=="number")return m.longitude};return r.map(i=>{let d=o(e,i.planet1),c=o(t,i.planet2);if(d===void 0||c===void 0)return l;let m=T(M,M,Jt-12,this.toAngle(d)),g=T(M,M,qe+8,this.toAngle(c)),h=Ge(i),y=_e[h]??"aspect-other",S=C(i.orb,1);return w`<line class=${`aspect ${y}`} x1=${m.x} y1=${m.y} x2=${g.x} y2=${g.y}><title>${i.planet1} ${h} ${i.planet2}${S?` (orb ${S}\xB0)`:""}</title></line>`})}renderAspects(e){return s`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(t=>s`<tr><td>${t.planet1}</td><td>${t.planet2}</td><td>${Ge(t)||""}</td><td class="orb">${C(t.orb,1)}</td><td>${Qa(t.strength)}</td></tr>`)}</tbody></table>`}};Ae.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],p([u({attribute:!1})],Ae.prototype,"data",2),Ae=p([b("roxy-synastry-chart")],Ae);function Qa(n){return typeof n=="number"?Math.round(n).toString():""}var de=class extends f{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new $(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):s`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let t=e.card,r=this.flipped!==!!t.reversed,o=t.keywords??[];return s`<article class="card" aria-label="${t.name??"Tarot card"}"><div class="image-wrap">${t.imageUrl?s`<img class="${`image ${r?"reversed":""}`}" src="${t.imageUrl}" alt="${t.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}">`:s`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${t.name??"?"}</div>`}</div><div><div class="meta">${t.arcana?s`${t.arcana} arcana`:l} ${r?s`· reversed`:l}</div><h2 class="title">${t.name??"Tarot card"}</h2>${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:l} ${t.meaning?s`<p>${t.meaning}</p>`:l} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:l} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let t=this.flipped,r=t?e.reversed:e.upright,o=t?e.keywords?.reversed??[]:e.keywords?.upright??[];return s`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?s`<img class="${`image ${t?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}">`:s`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?s`${e.arcana} arcana`:l} ${e.number!==void 0&&e.number!==null?s`· ${e.number}`:l} ${t?s`· reversed`:l}</div><h2 class="title">${e.name??"Tarot card"}</h2>${r?.description?s`<p>${r.description}</p>`:l} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:l} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};de.styles=[v,x`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],p([u({attribute:!1})],de.prototype,"data",2),p([N()],de.prototype,"flipped",2),de=p([b("roxy-tarot-card")],de);var ce=class extends f{constructor(){super();this.data=null;this.spread="three-card";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No tarot spread</div>`;let t="answer"in e,r="cards"in e&&!("spread"in e),o=r?[]:"positions"in e?e.positions??[]:[],i=r&&"cards"in e?e.cards:[],d=t?e.answer:void 0,c=t?e.strength:void 0,m="spread"in e?e.spread:this.spread.replace(/-/g," "),g="question"in e?e.question:void 0,h="summary"in e?e.summary:void 0,y=t?e.interpretation:void 0,S=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${m}</h2>${g?s`<span class="question">"${g}"</span>`:l}</header>${t?s`<div><span class="${`answer ${S}`}">${d}</span> ${c?s`<small>· ${c}</small>`:l}</div>`:l} ${o.length>0?s`<div class="grid">${o.map(k=>s`<div class="card"><p class="label">${k.name??""}</p><div class="image">${k.card?.imageUrl?s`<img src="${k.card.imageUrl}" alt="${k.card.name??"tarot card"}" class="${k.card.reversed?"reversed":""}">`:s`${k.card?.name??"?"}`}</div><p class="name">${k.card?.name??""} ${k.card?.reversed?s`<small>(reversed)</small>`:l}</p>${k.interpretation?s`<p class="interp">${k.interpretation}</p>`:l}</div>`)}</div>`:l} ${i.length>0?s`<div class="grid">${i.map(k=>s`<div class="card"><div class="image">${k.imageUrl?s`<img src="${k.imageUrl}" alt="${k.name??"tarot card"}" class="${k.reversed?"reversed":""}">`:s`${k.name??"?"}`}</div><p class="name">${k.name??""} ${k.reversed?s`<small>(reversed)</small>`:l}</p>${k.meaning?s`<p class="interp">${k.meaning}</p>`:l}</div>`)}</div>`:l} ${h?s`<p class="reading">${h}</p>`:l} ${y?s`<p class="reading">${y}</p>`:l}</article>`}};ce.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],p([u({attribute:!1})],ce.prototype,"data",2),p([u({type:String,reflect:!0})],ce.prototype,"spread",2),ce=p([b("roxy-tarot-spread")],ce);var pe=class extends f{constructor(){super();this.data=null;this.tab="positions";new $(this)}render(){if(!this.data?.transitPlanets?.length)return s`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:t,transitPlanets:r,transitAspects:o,summary:i}=this.data,d=[xe(e),K(t)].filter(Boolean).join(" "),c=o?.length??0,m=this.tab;return s`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${d?s`<p class="subtitle">${d}</p>`:l}</div>${c>0?s`${Ie({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:m,onSelect:g=>{this.tab=g},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${m}" role="tabpanel" aria-labelledby="transits-tab-${m}">${m==="positions"?s`<div class="overflow-scroll">${this.renderPlanetsTable(r)}</div>`:s`${i?this.renderSummaryPills(i):l}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:s`<div class="overflow-scroll">${this.renderPlanetsTable(r)}</div>`}</div>`}renderSummaryPills(e){return s`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return s`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(t=>{let r=L[A(t.name)]??"",o=G[A(t.sign)]??"",i=t.speed>=0?"\u2191":"\u2193";return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${r}</span> ${t.name} ${t.isRetrograde?s`<span class="retro-badge" aria-label="retrograde">R</span>`:l}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${o}</span> ${t.sign}</div></td><td class="num">${C(t.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${i}</span> ${C(Math.abs(t.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return s`<div role="list" aria-label="Transit aspects">${e.map((t,r)=>{let o=L[A(t.transitPlanet)]??"",i=L[A(t.natalPlanet)]??"",d=(t.nature??"neutral").toLowerCase(),c=t.interpretation,m=(t.type??"").toLowerCase(),g=t.isApplying?"Applying":"Separating";return s`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${r===0}"><summary><span aria-hidden="true">${o}</span> ${t.transitPlanet} <span class="nature-badge ${d}">${m}</span> <span aria-hidden="true">${i}</span> ${t.natalPlanet} <span class="meta">${g} · orb ${C(t.orb,2)}° · strength ${C(t.strength,1)} </span>${Y()}</summary><div class="interp-body">${c?.summary?s`<p>${c.summary}</p>`:l} ${c?.impact?s`<p><strong>Impact:</strong> ${c.impact}</p>`:l} ${c?.timing?s`<p><strong>Timing:</strong> ${c.timing}</p>`:l} ${c?.guidance?s`<p><strong>Guidance:</strong> ${c.guidance}</p>`:l} ${c?.keywords?.length?s`<div class="interp-keywords">${c.keywords.map(h=>s`<span class="kw">${h}</span>`)}</div>`:l}</div></details>`})}</div>`}};pe.styles=[v,fe,je,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],p([u({attribute:!1})],pe.prototype,"data",2),p([N()],pe.prototype,"tab",2),pe=p([b("roxy-transits-table")],pe);var me=class extends f{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new $(this)}viewModel(){return this.data?.meta?vt(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?s`<div class="wrap"><div class="header"><h2 class="title">Vedic kundli</h2>${wt(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${$t(e,this.chartStyle)}</svg></div>`:s`<div class="roxy-empty" role="status">No kundli data</div>`}};me.styles=[v,kt,fe],p([u({attribute:!1})],me.prototype,"data",2),p([u({type:String,reflect:!0,attribute:"chart-style"})],me.prototype,"chartStyle",2),me=p([b("roxy-vedic-kundli")],me);var es=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Ce=class extends f{constructor(){super();this.data=null;new $(this)}orderedRows(){let e=this.data?.meta??{},t=new Set,r=[];for(let o of es){let i=e[o];i&&(r.push([o,i]),t.add(o))}for(let[o,i]of Object.entries(e))t.has(o)||r.push([o,i]);return r}render(){if(!this.data?.meta)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return s`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([t,r])=>{let o=(r.graha??t)==="Lagna",i=L[A(r.graha??t)]??"",d=G[A(r.rashi??"")]??"";return s`<tr class="${o?"lagna":""}"><td class="graha">${i?s`<span class="glyph">${i}</span>`:l}${r.graha??t}</td><td>${d?s`<span class="glyph">${d}</span>`:l}${r.rashi??""}</td><td class="num">${typeof r.longitude=="number"?ft(r.longitude):""}</td><td>${r.nakshatra?.name??""}</td><td class="num">${r.nakshatra?.pada??""}</td><td>${r.nakshatra?.lord??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.awastha??""}</td><td>${r.isRetrograde?s`<span class="retro">R</span>`:l}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?l:s`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${Y()}</summary><div class="panel-body">${e.map(t=>{let r=L[A(t.planet)]??"",o=C(t.distanceFromSun,2),i=C(t.orb,1);return s`<div class="condition"><span class="planet">${r?`${r} `:""}${t.planet}</span> <span class="detail">${o} deg from Sun, within ${i} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?l:s`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${Y()}</summary><div class="panel-body">${e.map(t=>{let r=C(t.distance,2);return s`<div class="condition"><span class="planet">${t.planet1} vs ${t.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${t.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},t=this.orderedRows().map(([r,o])=>[o.graha??r,e[o.graha??r]]).filter(([,r])=>r!=null);return t.length===0?l:s`<details class="panel"><summary>Interpretations<span class="summary-count">${t.length}</span>${Y()}</summary><div class="panel-body">${t.map(([r,o])=>{let i=L[A(r)]??"";return s`<div class="interp"><span class="planet">${i?`${i} `:""}${r}</span> ${o.rashi?s`<p><span class="label">Rashi.</span> ${o.rashi}</p>`:l} ${o.nakshatra?s`<p><span class="label">Nakshatra.</span> ${o.nakshatra}</p>`:l}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(t=>t.name||t.description);return e.length===0?l:s`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${Y()}</summary><div class="panel-body">${e.map(t=>s`<div class="bhava"><span class="name">${t.number}. ${t.name??""}</span> ${t.description?s`<p class="desc">${t.description}</p>`:l}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(t=>t.present);return e.length===0?l:s`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${Y()}</summary><div class="panel-body">${e.map(t=>s`<div class="bhava"><span class="name">${t.name} ${t.quality?s`<span class="quality ${t.quality.toLowerCase()}">${t.quality}</span>`:l}</span> ${t.result?s`<p class="desc">${t.result}</p>`:l}</div>`)}</div></details>`}};Ce.styles=[v,je,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],p([u({attribute:!1})],Ce.prototype,"data",2),Ce=p([b("roxy-vedic-planets-table")],Ce);var Pe=class extends f{constructor(){super();this.data=null;new $(this)}rows(){let e=this.data;if(!e)return[];let t=(e.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,o]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])o&&t.push({name:r,sign:o.sign,longitude:o.longitude,isPoint:!0});return t}render(){if(!this.data?.planets)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return s`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(t=>{let r=L[A(t.name)]??"",o=G[A(t.sign??"")]??"",i=typeof t.speed=="number"?C(t.speed,3):"";return s`<tr class="${t.isPoint?"point":""}"><td class="body">${r?s`<span class="glyph">${r}</span>`:l}${t.name}</td><td>${o?s`<span class="glyph">${o}</span>`:l}${t.sign??""}</td><td class="num">${typeof t.longitude=="number"?ft(t.longitude):""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td class="num">${i?s`${i}°/day`:l} ${t.isRetrograde?s`<span class="retro">℞</span>`:l}</td></tr>`})}</tbody></table></div>`}};Pe.styles=[v,x`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],p([u({attribute:!1})],Pe.prototype,"data",2),Pe=p([b("roxy-western-planets-table")],Pe);var he=class extends f{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new $(this)}renderQualityChip(e){let t=`quality-chip quality-${e}`;return s`<span class="${t}">${e}</span>`}renderDetailCard(e){return s`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):l}</p>${e.description?s`<p class="description">${e.description}</p>`:l} ${e.result?s`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:l}</div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,t=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let r=e;return s`<div class="wrap">${this.renderDetailCard(r)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let r=e.yogas;if(r.length>0&&"description"in r[0]){let m=r,g=t?m.filter(y=>y.name.toLowerCase().includes(t)):m,h=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${h!==void 0?s`<span class="count">${h} total</span>`:l}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${g.length>0?g.map(y=>this.renderDetailCard(y)):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let i=r,d=t?i.filter(m=>m.name.toLowerCase().includes(t)):i,c=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${c!==void 0?s`<span class="count">${c} total</span>`:l}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${d.length>0?d.map(m=>s`<div class="yoga-chip">${m.name} <span class="yoga-id">${m.id}</span></div>`):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return s`<div class="roxy-empty" role="status">No yoga data</div>`}};he.styles=[v,x`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],p([u({attribute:!1})],he.prototype,"data",2),p([N()],he.prototype,"filter",2),he=p([b("roxy-yoga-list")],he);var St=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,personal-year,chart}",docsSummary:"Life path, expression, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Mr="0.8.1";var ts=St.map(n=>n.slug);return Hr(rs);})();
83
+ `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,o)=>this.getAscendant()+o*30)).map(t=>{let o=this.toAngle(t),i=R(E,E,nr,o),d=R(E,E,Ue,o);return w`<line class="wheel-line" x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} stroke-width="0.8" />`})}renderSigns(){return D.map((e,r)=>{let t=this.toAngle(r*30+15),o=R(E,E,Qr,t);return w`<text class="sign-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${H[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,o)=>{let i=e[(o+1)%12],d=Ot(t.longitude,i?i.longitude:t.longitude+30),c=R(E,E,nr-12,this.toAngle(d));return w`<text class="house-num" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,o)=>{let i=this.toAngle(o*30+15),d=R(E,E,nr-12,i),c=(o-r+12)%12+1;return w`<text class="house-num" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${c}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),o=r%30===0,i=o?Qr-14:Ue-5,d=R(E,E,i,t),c=R(E,E,Ue,t);e.push(w`<line class=${o?"tick tick-major":"tick"} x1=${d.x} y1=${d.y} x2=${c.x} y2=${c.y} stroke-width=${o?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?l:e.map(r=>{let t=this.toAngle(r.longitude),o=R(E,E,nr+9,t),i=U(r.longitude);return w`<text class="cusp-deg" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${i.degree}°${String(i.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(i=>Number.isFinite(i.longitude)).map(i=>({p:i,trueLon:Y(i.longitude),displayLon:Y(i.longitude)})).sort((i,d)=>i.trueLon-d.trueLon);for(let i=1;i<t.length;i++){let d=t[i-1],c=t[i];if(!d||!c)continue;let m=d.displayLon+7;c.displayLon<m&&(c.displayLon=m)}let o=t[t.length-1];if(o&&o.displayLon>360){let i=o.displayLon-360;for(let d of t)d.displayLon-=i}return t.map(({p:i,trueLon:d,displayLon:c})=>{let m=this.toAngle(d),y=this.toAngle(c),g=R(E,E,Ve,y),f=R(E,E,Ve-13,y),S=R(E,E,Ue-4,m),k=R(E,E,Ve+8,y),Ne=L[A(i.name)]??i.name.slice(0,2),ir=U(i.longitude),We=i.isRetrograde===!0,lr=`${ir.degree}\xB0${String(ir.minute).padStart(2,"0")}'`,dr=Math.abs(c-d)>.5;return w`<g>
84
+ ${dr?w`<line class="planet-leader" x1=${S.x} y1=${S.y} x2=${k.x} y2=${k.y} />`:l}
85
+ <text class="planet-glyph" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central"><title>${i.name}${We?" retrograde":""} - ${lr} ${i.sign??""}</title>${Ne}</text>
86
+ <text class="planet-deg" x=${f.x} y=${f.y} text-anchor="middle" dominant-baseline="central">${lr}${We?w`<tspan class="retro"> ℞</tspan>`:l}</text>
87
+ </g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return l;let t=e?.retrogradePlanets??[];return s`<div class="details">${e?.dominantElement||e?.dominantModality?s`<div class="pill-row">${e.dominantElement?s`<span class="pill">Dominant element: ${e.dominantElement}</span>`:l} ${e.dominantModality?s`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:l}</div>`:l} ${r?s`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:l} ${t.length>0?s`<div class="pill-row">${t.map(o=>{let i=L[o]??o.slice(0,2);return s`<span class="pill pill--muted">${i} ${o} R</span>`})}</div>`:l} ${r?.summary?s`<p class="summary">${r.summary}</p>`:l} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return l;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],o=D,i={};for(let d of r)i[d]={Cardinal:[],Fixed:[],Mutable:[]};for(let d of e){let c=o.indexOf(A(d.sign??""));if(c<0)continue;let m=r[c%4],y=t[c%3],g=L[A(d.name)]??A(d.name).slice(0,2);i[m]?.[y]?.push(g)}return s`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(d=>s`<th scope="col">${d.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(d=>{let c=t.reduce((m,y)=>m+(i[d]?.[y]?.length??0),0);return s`<tr><th scope="row">${d}</th>${t.map(m=>s`<td>${(i[d]?.[m]??[]).join(" ")}</td>`)}<td class="em-total">${c}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(d=>s`<td class="em-total">${r.reduce((c,m)=>c+(i[m]?.[d]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?l:s`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let o=r.interpretation,i=L[A(r.name)]??"",d=C(r.degree??0,1);return s`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${i} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${d}</small> ${V()}</span></summary><div class="interp-body">${o.summary?s`<p class="interp-summary">${o.summary}</p>`:l} ${o.detailed?s`<p class="interp-detail">${o.detailed}</p>`:l} ${o.keywords?.length?s`<div class="interp-keywords">${o.keywords.map(c=>s`<span class="kw">${c}</span>`)}</div>`:l}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let i=A(o.name);i&&t.set(i,o.longitude)}return r.map(o=>{let i=t.get(A(o.planet1)),d=t.get(A(o.planet2));if(i===void 0||d===void 0)return l;let c=R(E,E,Ve-18,this.toAngle(i)),m=R(E,E,Ve-18,this.toAngle(d)),y=Ke(o),g=He[y]??"aspect-other",f=C(o.orb,1);return w`<line class=${`aspect ${g}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${y||""} ${o.planet2}${f?` (orb ${f}\xB0)`:""}</title></line>`})}};F.styles=[v,$e,Ye,u`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],p([h({attribute:!1})],F.prototype,"data",2),p([h({type:String,attribute:"house-system",reflect:!0})],F.prototype,"houseSystem",2),p([N()],F.prototype,"view",2),F=p([b("roxy-natal-chart")],F);var de=class extends x{constructor(){super();this.data=null;this.type="life-path";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No numerology data</div>`;let r=ds[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return s`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?s`<div class="numeral">${e.number}</div>`:l}<div><p class="label">${r}</p>${e.meaning?.title?s`<h2 class="title">${e.meaning.title}</h2>`:l}</div></div>${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l} ${e.calculation?s`<pre class="calc">${e.calculation}</pre>`:l} ${t.length>0?s`<div class="chips">${t.map(o=>s`<span>${o}</span>`)}</div>`:l} ${e.hasKarmicDebt&&e.karmicDebtNumber?s`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${cs(e.karmicDebtMeaning)}</div>`:l}</article>`}renderPersonalYear(e,r){return s`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?s`<div class="numeral">${e.personalYear}</div>`:l}<div><p class="label">${r}</p>${e.theme?s`<h2 class="title">${e.theme}</h2>`:l}</div></div>${e.forecast?s`<p class="meaning">${e.forecast}</p>`:l} ${e.advice?s`<p>${e.advice}</p>`:l}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,o])=>o!=null);return s`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?s`<h2 class="title">${e.profile.name}</h2>`:l}</div>${t.length>0?s`<div class="cores">${t.map(([o,i])=>s`<div class="item"><span>${j(o)}</span> <strong>${i.number??""}</strong></div>`)}</div>`:l}</article>`}};de.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],p([h({attribute:!1})],de.prototype,"data",2),p([h({type:String,reflect:!0})],de.prototype,"type",2),de=p([b("roxy-numerology-card")],de);var ds={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","personal-year":"Personal Year",chart:"Numerology chart"};function cs(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var ce=class extends x{constructor(){super();this.data=null;this.detail="detailed";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let o=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(g=>!!g[1]):[],i=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],d=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],c=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],m=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],y=r&&"transitions"in r?r.transitions:void 0;return s`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?ve(r.date):""}</span></header><table><tbody>${t.map(([g,f])=>s`<tr><th>${g}</th><td>${f}</td></tr>`)} ${r?.sunrise?s`<tr><th>Sunrise</th><td>${q(r.sunrise)}</td></tr>`:l} ${r?.sunset?s`<tr><th>Sunset</th><td>${q(r.sunset)}</td></tr>`:l} ${r?.moonrise?s`<tr><th>Moonrise</th><td>${q(r.moonrise)}</td></tr>`:l} ${r?.moonset?s`<tr><th>Moonset</th><td>${q(r.moonset)}</td></tr>`:l} ${o.map(([g,f])=>s`<tr><th>${g}</th><td>${f}</td></tr>`)}</tbody></table>${y?s`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",y.tithi)} ${this.renderTransitionRow("Nakshatra",y.nakshatra)} ${this.renderTransitionRow("Yoga",y.yoga)} ${this.renderTransitionRow("Karana",y.karana)}</tbody></table>`:l} ${this.detail==="detailed"&&(i.some(g=>!!g[1])||d.length>0||c.some(g=>!!g[1])||m.length>0)?s`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...i.filter(g=>!!g[1]),...d])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...c.filter(g=>!!g[1]),...m])}</tbody></table>`:l}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let o=Wr(t);return o?s`<tr><th>${r}</th><td>${o}</td></tr>`:l})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,o)=>[r.length>1?`${e} ${o+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return l;let t=q(r.endsAt),o=r.next?` \u2192 ${r.next}`:"";return s`<tr><th>${e}</th><td>ends ${t}${o}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=Wr(e);return r?`${e.current} (${r})`:e.current}};ce.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],p([h({attribute:!1})],ce.prototype,"data",2),p([h({type:String,reflect:!0})],ce.prototype,"detail",2),ce=p([b("roxy-panchang-table")],ce);var rt=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],Te=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data?.planets?.length)return s`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return s`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${rt.map(r=>s`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=L[A(e.planet)]??"",t=rt.map(y=>Math.max(0,e[y.key])),o=t.reduce((y,g)=>y+g,0),i=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,d=i?"adequacy-badge--adequate":"adequacy-badge--weak",c=i?"adequate":"weak",m=C(e.totalRupas,2)&&C(e.minRequired,2)?`${C(e.totalRupas,2)} / ${C(e.minRequired,2)} R`:"";return s`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${r}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${o>0?rt.map((y,g)=>{let f=t[g];if(f<=0)return l;let S=f/o*100;return s`<div class="bar-segment" style="flex-grow:${S};background:${y.color}" title="${y.label}: ${C(f,1)}"></div>`}):l}</div></div><div class="pills">${m?s`<span class="rupas-label">${m}</span>`:l} <span class="${`adequacy-badge ${d}`}">${c}</span></div></div>`}};Te.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],p([h({attribute:!1})],Te.prototype,"data",2),Te=p([b("roxy-shadbala-table")],Te);var st=360,M=st/2,tt=170,ps=154,at=124,Fe=96,Re=class extends x{constructor(){super();this.data=null;new $(this)}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:o}=this.data,i=this.data.interAspects??[],d=e?.planets??[],c=r?.planets??[],m=typeof t=="number"?Math.round(t):void 0,y=o?.overall,g=o?.strengths??[],f=o?.challenges??[];return d.length>0&&c.length>0?s`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof m=="number"?s`<span class="score" aria-label="${`Score ${m} of 100`}">${m} / 100</span>`:l}</div><svg viewBox="0 0 ${st} ${st}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${M}" cy="${M}" r="${tt}" stroke-width="1.5"/><circle class="wheel-line" cx="${M}" cy="${M}" r="${Fe+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${M}" cy="${M}" r="${Fe-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(d,c,i)} ${this.renderRing(d,at,"p1",1)} ${this.renderRing(c,Fe,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${y?s`<p class="summary">${y}</p>`:l} ${i.length>0?this.renderAspects(i):l} ${g.length>0||f.length>0?s`<div class="lists">${g.length?s`<div><h3>Strengths</h3><ul>${g.map(k=>s`<li>${k}</li>`)}</ul></div>`:l} ${f.length?s`<div><h3>Challenges</h3><ul>${f.map(k=>s`<li>${k}</li>`)}</ul></div>`:l}</div>`:l}</div>`:s`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof m=="number"?s`<span class="score" aria-label="${`Score ${m} of 100`}">${m} / 100</span>`:l}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code>&lt;roxy-data></code> fallback.</div>${y?s`<p class="summary">${y}</p>`:l} ${i.length>0?this.renderAspects(i):l} ${g.length>0||f.length>0?s`<div class="lists">${g.length?s`<div><h3>Strengths</h3><ul>${g.map(k=>s`<li>${k}</li>`)}</ul></div>`:l} ${f.length?s`<div><h3>Challenges</h3><ul>${f.map(k=>s`<li>${k}</li>`)}</ul></div>`:l}</div>`:l}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),o=R(M,M,Fe-14,t),i=R(M,M,tt,t);return w`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.6" />`})}renderSigns(){return D.map((e,r)=>{let t=this.toAngle(r*30+15),o=R(M,M,ps,t);return w`<text class="sign" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${H[e]}</text>`})}renderRing(e,r,t,o){return e.map(i=>{if(!Number.isFinite(i.longitude))return l;let d=this.toAngle(i.longitude),c=R(M,M,r,d),y=R(M,M,r+(o===1?-12:-10),d),g=L[A(i.name)]??i.name.slice(0,2),f=U(i.longitude),S=i.isRetrograde===!0,k=`${f.degree}\xB0${String(f.minute).padStart(2,"0")}'`,Ne=`${i.name}${S?" retrograde":""} - ${k} ${f.sign}`;return w`<g>
88
+ <text class=${t} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central"><title>${Ne}</title>${g}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${o}</tspan></text>
89
+ <text class="planet-deg" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">${f.degree}°${S?w`<tspan class="retro"> ℞</tspan>`:l}</text>
90
+ </g>`})}renderAscendants(e){let r=[],t=(o,i)=>{if(!o)return;let d=D.findIndex(S=>S.toLowerCase()===o.sign.toLowerCase());if(d===-1)return;let c=d*30+o.degree,m=this.toAngle(c),y=i===1?at+14:Fe+14,g=R(M,M,y,m),f=R(M,M,tt+14,m);r.push(w`<g>
91
+ <line class="asc-tick" x1=${g.x} y1=${g.y} x2=${f.x} y2=${f.y} />
92
+ <text class="asc-label" x=${f.x} y=${f.y} text-anchor="middle" dominant-baseline="central">Asc${i}</text>
93
+ </g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let o=(i,d)=>{let c=A(d);for(let m of i)if(A(m.name)===c&&typeof m.longitude=="number")return m.longitude};return t.map(i=>{let d=o(e,i.planet1),c=o(r,i.planet2);if(d===void 0||c===void 0)return l;let m=R(M,M,at-12,this.toAngle(d)),y=R(M,M,Fe+8,this.toAngle(c)),g=Ke(i),f=He[g]??"aspect-other",S=C(i.orb,1);return w`<line class=${`aspect ${f}`} x1=${m.x} y1=${m.y} x2=${y.x} y2=${y.y}><title>${i.planet1} ${g} ${i.planet2}${S?` (orb ${S}\xB0)`:""}</title></line>`})}renderAspects(e){return s`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(r=>s`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${Ke(r)||""}</td><td class="orb">${C(r.orb,1)}</td><td>${ms(r.strength)}</td></tr>`)}</tbody></table>`}};Re.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],p([h({attribute:!1})],Re.prototype,"data",2),Re=p([b("roxy-synastry-chart")],Re);function ms(n){return typeof n=="number"?Math.round(n).toString():""}var pe=class extends x{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new $(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):s`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,o=r.keywords??[];return s`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?s`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}">`:s`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?s`${r.arcana} arcana`:l} ${t?s`· reversed`:l}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:l} ${r.meaning?s`<p>${r.meaning}</p>`:l} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:l} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,o=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return s`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?s`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),this.toggleFlip())}}">`:s`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?s`${e.arcana} arcana`:l} ${e.number!==void 0&&e.number!==null?s`· ${e.number}`:l} ${r?s`· reversed`:l}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?s`<p>${t.description}</p>`:l} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:l} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};pe.styles=[v,u`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],p([h({attribute:!1})],pe.prototype,"data",2),p([N()],pe.prototype,"flipped",2),pe=p([b("roxy-tarot-card")],pe);var me=class extends x{constructor(){super();this.data=null;this.spread="three-card";new $(this)}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),o=t?[]:"positions"in e?e.positions??[]:[],i=t&&"cards"in e?e.cards:[],d=r?e.answer:void 0,c=r?e.strength:void 0,m="spread"in e?e.spread:this.spread.replace(/-/g," "),y="question"in e?e.question:void 0,g="summary"in e?e.summary:void 0,f=r?e.interpretation:void 0,S=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${m}</h2>${y?s`<span class="question">"${y}"</span>`:l}</header>${r?s`<div><span class="${`answer ${S}`}">${d}</span> ${c?s`<small>· ${c}</small>`:l}</div>`:l} ${o.length>0?s`<div class="grid">${o.map(k=>s`<div class="card"><p class="label">${k.name??""}</p><div class="image">${k.card?.imageUrl?s`<img src="${k.card.imageUrl}" alt="${k.card.name??"tarot card"}" class="${k.card.reversed?"reversed":""}">`:s`${k.card?.name??"?"}`}</div><p class="name">${k.card?.name??""} ${k.card?.reversed?s`<small>(reversed)</small>`:l}</p>${k.interpretation?s`<p class="interp">${k.interpretation}</p>`:l}</div>`)}</div>`:l} ${i.length>0?s`<div class="grid">${i.map(k=>s`<div class="card"><div class="image">${k.imageUrl?s`<img src="${k.imageUrl}" alt="${k.name??"tarot card"}" class="${k.reversed?"reversed":""}">`:s`${k.name??"?"}`}</div><p class="name">${k.name??""} ${k.reversed?s`<small>(reversed)</small>`:l}</p>${k.meaning?s`<p class="interp">${k.meaning}</p>`:l}</div>`)}</div>`:l} ${g?s`<p class="reading">${g}</p>`:l} ${f?s`<p class="reading">${f}</p>`:l}</article>`}};me.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],p([h({attribute:!1})],me.prototype,"data",2),p([h({type:String,reflect:!0})],me.prototype,"spread",2),me=p([b("roxy-tarot-spread")],me);var ge=class extends x{constructor(){super();this.data=null;this.tab="positions";new $(this)}render(){if(!this.data?.transitPlanets?.length)return s`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:o,summary:i}=this.data,d=[ve(e),q(r)].filter(Boolean).join(" "),c=o?.length??0,m=this.tab;return s`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${d?s`<p class="subtitle">${d}</p>`:l}</div>${c>0?s`${qe({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:m,onSelect:y=>{this.tab=y},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${m}" role="tabpanel" aria-labelledby="transits-tab-${m}">${m==="positions"?s`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:s`${i?this.renderSummaryPills(i):l}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:s`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return s`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return s`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=L[A(r.name)]??"",o=H[A(r.sign)]??"",i=r.speed>=0?"\u2191":"\u2193";return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?s`<span class="retro-badge" aria-label="retrograde">R</span>`:l}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${o}</span> ${r.sign}</div></td><td class="num">${C(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${i}</span> ${C(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return s`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let o=L[A(r.transitPlanet)]??"",i=L[A(r.natalPlanet)]??"",d=(r.nature??"neutral").toLowerCase(),c=r.interpretation,m=(r.type??"").toLowerCase(),y=r.isApplying?"Applying":"Separating";return s`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${o}</span> ${r.transitPlanet} <span class="nature-badge ${d}">${m}</span> <span aria-hidden="true">${i}</span> ${r.natalPlanet} <span class="meta">${y} · orb ${C(r.orb,2)}° · strength ${C(r.strength,1)} </span>${V()}</summary><div class="interp-body">${c?.summary?s`<p>${c.summary}</p>`:l} ${c?.impact?s`<p><strong>Impact:</strong> ${c.impact}</p>`:l} ${c?.timing?s`<p><strong>Timing:</strong> ${c.timing}</p>`:l} ${c?.guidance?s`<p><strong>Guidance:</strong> ${c.guidance}</p>`:l} ${c?.keywords?.length?s`<div class="interp-keywords">${c.keywords.map(g=>s`<span class="kw">${g}</span>`)}</div>`:l}</div></details>`})}</div>`}};ge.styles=[v,$e,Ye,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],p([h({attribute:!1})],ge.prototype,"data",2),p([N()],ge.prototype,"tab",2),ge=p([b("roxy-transits-table")],ge);var K=class extends x{constructor(){super();this.data=null;this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e};new $(this)}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?Sr(this.data.meta,"D1 Rashi",this.resolveReference()):null}render(){let e=this.viewModel();if(!e)return s`<div class="roxy-empty" role="status">No kundli data</div>`;let r=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return s`<div class="wrap"><div class="header"><h2 class="title">${r}</h2>${Cr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${Ar(e,this.chartStyle)}</svg></div>`}};K.styles=[v,Er,$e],p([h({attribute:!1})],K.prototype,"data",2),p([h({type:String,reflect:!0,attribute:"chart-style"})],K.prototype,"chartStyle",2),p([h({type:String,reflect:!0,attribute:"chart-reference"})],K.prototype,"chartReference",2),p([h({type:String,reflect:!0,attribute:"lagna-override"})],K.prototype,"lagnaOverride",2),K=p([b("roxy-vedic-kundli")],K);var gs=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Pe=class extends x{constructor(){super();this.data=null;new $(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let o of gs){let i=e[o];i&&(t.push([o,i]),r.add(o))}for(let[o,i]of Object.entries(e))r.has(o)||t.push([o,i]);return t}render(){if(!this.data?.meta)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return s`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let o=(t.graha??r)==="Lagna",i=L[A(t.graha??r)]??"",d=H[A(t.rashi??"")]??"";return s`<tr class="${o?"lagna":""}"><td class="graha">${i?s`<span class="glyph">${i}</span>`:l}${t.graha??r}</td><td>${d?s`<span class="glyph">${d}</span>`:l}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?wr(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?s`<span class="retro">R</span>`:l}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?l:s`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${V()}</summary><div class="panel-body">${e.map(r=>{let t=L[A(r.planet)]??"",o=C(r.distanceFromSun,2),i=C(r.orb,1);return s`<div class="condition"><span class="planet">${t?`${t} `:""}${r.planet}</span> <span class="detail">${o} deg from Sun, within ${i} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?l:s`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${V()}</summary><div class="panel-body">${e.map(r=>{let t=C(r.distance,2);return s`<div class="condition"><span class="planet">${r.planet1} vs ${r.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${r.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},r=this.orderedRows().map(([t,o])=>[o.graha??t,e[o.graha??t]]).filter(([,t])=>t!=null);return r.length===0?l:s`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${V()}</summary><div class="panel-body">${r.map(([t,o])=>{let i=L[A(t)]??"";return s`<div class="interp"><span class="planet">${i?`${i} `:""}${t}</span> ${o.rashi?s`<p><span class="label">Rashi.</span> ${o.rashi}</p>`:l} ${o.nakshatra?s`<p><span class="label">Nakshatra.</span> ${o.nakshatra}</p>`:l}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?l:s`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${V()}</summary><div class="panel-body">${e.map(r=>s`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?s`<p class="desc">${r.description}</p>`:l}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?l:s`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${V()}</summary><div class="panel-body">${e.map(r=>s`<div class="bhava"><span class="name">${r.name} ${r.quality?s`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:l}</span> ${r.result?s`<p class="desc">${r.result}</p>`:l}</div>`)}</div></details>`}};Pe.styles=[v,Ye,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],p([h({attribute:!1})],Pe.prototype,"data",2),Pe=p([b("roxy-vedic-planets-table")],Pe);var Le=class extends x{constructor(){super();this.data=null;new $(this)}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,o]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])o&&r.push({name:t,sign:o.sign,longitude:o.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return s`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=L[A(r.name)]??"",o=H[A(r.sign??"")]??"",i=typeof r.speed=="number"?C(r.speed,3):"";return s`<tr class="${r.isPoint?"point":""}"><td class="body">${t?s`<span class="glyph">${t}</span>`:l}${r.name}</td><td>${o?s`<span class="glyph">${o}</span>`:l}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?wr(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${i?s`${i}°/day`:l} ${r.isRetrograde?s`<span class="retro">℞</span>`:l}</td></tr>`})}</tbody></table></div>`}};Le.styles=[v,u`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],p([h({attribute:!1})],Le.prototype,"data",2),Le=p([b("roxy-western-planets-table")],Le);var he=class extends x{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new $(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return s`<span class="${r}">${e}</span>`}renderDetailCard(e){return s`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):l}</p>${e.description?s`<p class="description">${e.description}</p>`:l} ${e.result?s`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:l}</div>`}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return s`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let m=t,y=r?m.filter(f=>f.name.toLowerCase().includes(r)):m,g=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${g!==void 0?s`<span class="count">${g} total</span>`:l}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${y.length>0?y.map(f=>this.renderDetailCard(f)):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let i=t,d=r?i.filter(m=>m.name.toLowerCase().includes(r)):i,c=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${c!==void 0?s`<span class="count">${c} total</span>`:l}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${d.length>0?d.map(m=>s`<div class="yoga-chip">${m.name} <span class="yoga-id">${m.id}</span></div>`):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return s`<div class="roxy-empty" role="status">No yoga data</div>`}};he.styles=[v,u`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],p([h({attribute:!1})],he.prototype,"data",2),p([N()],he.prototype,"filter",2),he=p([b("roxy-yoga-list")],he);var Tr=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, soul urge, personality, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,soul-urge,personality,personal-year,chart}",docsSummary:"Life path, expression, soul urge, personality, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyCrystalGrid",tag:"roxy-crystal-grid",slug:"crystal-grid",heading:"Crystal grid",description:"Responsive crystal gallery with photo, name, and colour swatches from any crystals list response",docsLabel:"Crystals",endpointLabel:"GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",docsSummary:"Crystal gallery tiles with photo, name, and colour swatches",topic:"Crystals"},{pascal:"RoxyDreamCard",tag:"roxy-dream-card",slug:"dream-card",heading:"Dream symbol",description:"Dream symbol card with the symbol name, full interpretation, and dictionary letter",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols/{id}",docsSummary:"Symbol name, interpretation body, and letter chip",topic:"Dreams"},{pascal:"RoxyAngelNumberCard",tag:"roxy-angel-number-card",slug:"angel-number-card",heading:"Angel number",description:"Angel number card with title, core message, badges, keywords, life-area interpretations, affirmation, and action steps",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/numbers/{number}",docsSummary:"Number meaning with spiritual, love, career, and twin flame sections",topic:"Angel Numbers"},{pascal:"RoxyAngelNumberLookup",tag:"roxy-angel-number-lookup",slug:"angel-number-lookup",heading:"Angel number lookup",description:"Angel number sequence analysis with pattern classification, the known meaning when present, and a digit-root fallback for any number",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/lookup",docsSummary:"Pattern analysis plus known meaning and digit-root fallback",topic:"Angel Numbers"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Kt="0.10.0";var hs=Tr.map(n=>n.slug);var qt=`/**
94
+ * Roxy UI design tokens. ~30 CSS custom properties that every component reads. Light + dark defaults. Host page overrides at :root or per element. No Tailwind, no class-name overrides, no JS theme switcher.
95
+ *
96
+ * Delivery model: this file ships as a global light-DOM stylesheet (linked, or auto-injected by the CDN bundle). Custom properties inherit through the shadow boundary, so tokens set on a light-DOM ancestor reach every component shadow. The explicit theme blocks therefore target light-DOM selectors (:root, .dark, [data-theme="dark"], a wrapper element), NOT :host (a :host rule in a global sheet matches nothing). The :host([data-theme]) selectors are kept only for the case where this CSS is ever adopted directly into a shadow root; they are inert in global delivery.
97
+ *
98
+ * Light is the default. Dark applies under any of:
99
+ * - prefers-color-scheme: dark
100
+ * - [data-theme="dark"] on the element itself or any ancestor (typically :root)
101
+ * - .dark class on the element itself or any ancestor (typically :root)
102
+ *
103
+ * Explicit choice wins over the OS: the [data-theme] / .dark blocks come after the @media (prefers-color-scheme: dark) block in source order, and a closer ancestor overrides a farther one through normal custom-property inheritance.
104
+ *
105
+ * Motion gating:
106
+ * - --roxy-motion-duration defaults to 200ms. Set to 0ms to disable.
107
+ * - prefers-reduced-motion: reduce forces 0ms regardless of host overrides.
108
+ */
109
+
110
+ :root,
111
+ :host {
112
+ /* Color: brand */
113
+ --roxy-primary: #0f172a;
114
+ --roxy-secondary: #475569;
115
+ --roxy-accent: #f59e0b;
116
+ /* Text-safe accent variant. amber-500 hits 2.14:1 on white which fails
117
+ * WCAG AA for body text. amber-700 hits 4.5:1, used wherever the accent
118
+ * tone is applied to text. Fills (planet glyphs, chart accents, badges
119
+ * with non-text use) keep --roxy-accent. */
120
+ --roxy-accent-ink: #b45309;
121
+
122
+ /* Color: status. The base value (success, warning, danger, info) is for
123
+ * fills and tints. The -fg variant is darker so text on a light tint passes
124
+ * WCAG AA (>= 4.5:1 on white). Use -fg whenever status color hits text. */
125
+ --roxy-success: #16a34a;
126
+ --roxy-success-fg: #166534;
127
+ --roxy-warning: #ea580c;
128
+ --roxy-warning-fg: #9a3412;
129
+ --roxy-danger: #dc2626;
130
+ --roxy-danger-fg: #991b1b;
131
+ --roxy-info: #0284c7;
132
+ --roxy-info-fg: #075985;
133
+
134
+ /* Color: surface */
135
+ --roxy-bg: #ffffff;
136
+ --roxy-fg: #0a0a0a;
137
+ --roxy-muted: #71717a;
138
+ --roxy-border: #e4e4e7;
139
+ --roxy-ring: rgba(245, 158, 11, 0.4);
140
+
141
+ /* Typography */
142
+ --roxy-font-sans:
143
+ "Geist", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
144
+ sans-serif;
145
+ --roxy-font-mono:
146
+ "Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono",
147
+ monospace;
148
+
149
+ --roxy-text-xs: 0.75rem;
150
+ --roxy-text-sm: 0.875rem;
151
+ --roxy-text-base: 1rem;
152
+ --roxy-text-lg: 1.125rem;
153
+ --roxy-text-xl: 1.5rem;
154
+
155
+ --roxy-weight-normal: 400;
156
+ --roxy-weight-bold: 600;
157
+
158
+ --roxy-leading-tight: 1.2;
159
+ --roxy-leading-normal: 1.5;
160
+
161
+ --roxy-tracking-tight: -0.02em;
162
+ --roxy-tracking-normal: 0em;
163
+
164
+ /* Spacing */
165
+ --roxy-space-xs: 0.25rem;
166
+ --roxy-space-sm: 0.5rem;
167
+ --roxy-space-md: 1rem;
168
+ --roxy-space-lg: 1.5rem;
169
+ --roxy-space-xl: 2.5rem;
170
+
171
+ /* Radius */
172
+ --roxy-radius-sm: 4px;
173
+ --roxy-radius-md: 8px;
174
+ --roxy-radius-lg: 12px;
175
+ --roxy-radius-full: 9999px;
176
+
177
+ /* Shadow */
178
+ --roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);
179
+ --roxy-shadow-md:
180
+ 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06);
181
+ --roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.14);
182
+
183
+ /* Motion */
184
+ --roxy-motion-duration: 200ms;
185
+ --roxy-motion-easing: cubic-bezier(0.4, 0, 0.2, 1);
186
+
187
+ /* Heat scale: a single base hue. Consumers mix it with \`transparent\` at
188
+ * increasing percentages to paint cooler-to-hotter tiers. The mix-with-
189
+ * transparent approach lets the page bg show through and keeps text
190
+ * colour stable (always --roxy-fg), so the cells read in both themes
191
+ * without per-tier text colours. */
192
+ --roxy-heat: var(--roxy-danger, #ef4444);
193
+ }
194
+
195
+ /* Dark theme via system preference */
196
+ @media (prefers-color-scheme: dark) {
197
+ :root,
198
+ :host {
199
+ --roxy-primary: #f8fafc;
200
+ --roxy-secondary: #94a3b8;
201
+ --roxy-accent: #fbbf24;
202
+ --roxy-accent-ink: #fbbf24;
203
+
204
+ /* Status -fg overrides must mirror the explicit [data-theme="dark"] block
205
+ * below. Without these, a user on system dark with no data-theme attribute
206
+ * inherits the light-mode -fg values (e.g. #166534 success) which renders
207
+ * as near-invisible dark green on a near-black surface and fails WCAG AA. */
208
+ --roxy-success: #22c55e;
209
+ --roxy-success-fg: #86efac;
210
+ --roxy-warning: #fb923c;
211
+ --roxy-warning-fg: #fdba74;
212
+ --roxy-danger: #ef4444;
213
+ --roxy-danger-fg: #fca5a5;
214
+ --roxy-info: #38bdf8;
215
+ --roxy-info-fg: #7dd3fc;
216
+
217
+ --roxy-bg: #0a0a0a;
218
+ --roxy-fg: #fafafa;
219
+ --roxy-muted: #a1a1aa;
220
+ --roxy-border: #27272a;
221
+ --roxy-ring: rgba(251, 191, 36, 0.45);
222
+
223
+ --roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);
224
+ --roxy-shadow-md:
225
+ 0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);
226
+ --roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
227
+
228
+ --roxy-heat: var(--roxy-danger, #ef4444);
229
+ }
230
+ }
231
+
232
+ /* Light theme override. Beats the @media (prefers-color-scheme: dark) block
233
+ * when the host explicitly opts back into light. Without this, a dark-mode OS
234
+ * pins the tokens to dark even after data-theme="light" is set. The light-DOM
235
+ * selectors (:root.light, .light, [data-theme="light"]) set the vars on the
236
+ * ancestor or the element itself so they inherit into every component shadow;
237
+ * :host([data-theme="light"]) is inert in global delivery and kept only for
238
+ * shadow-adopted use. */
239
+ :root[data-theme="light"],
240
+ [data-theme="light"],
241
+ :root.light,
242
+ .light,
243
+ :host([data-theme="light"]) {
244
+ --roxy-primary: #0f172a;
245
+ --roxy-secondary: #475569;
246
+ --roxy-accent: #f59e0b;
247
+ --roxy-accent-ink: #b45309;
248
+
249
+ --roxy-success: #16a34a;
250
+ --roxy-success-fg: #166534;
251
+ --roxy-warning: #ea580c;
252
+ --roxy-warning-fg: #9a3412;
253
+ --roxy-danger: #dc2626;
254
+ --roxy-danger-fg: #991b1b;
255
+ --roxy-info: #0284c7;
256
+ --roxy-info-fg: #075985;
257
+
258
+ --roxy-bg: #ffffff;
259
+ --roxy-fg: #0a0a0a;
260
+ --roxy-muted: #71717a;
261
+ --roxy-border: #e4e4e7;
262
+ --roxy-ring: rgba(245, 158, 11, 0.4);
263
+
264
+ --roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);
265
+ --roxy-shadow-md:
266
+ 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06);
267
+ --roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.14);
268
+ }
269
+
270
+ /* Dark theme via explicit opt-in. The light-DOM selectors (:root.dark, .dark,
271
+ * [data-theme="dark"]) set the vars on the ancestor or the element itself so
272
+ * they inherit into every component shadow; this is what makes a .dark class on
273
+ * any ancestor (Tailwind, shadcn) actually theme the components in global
274
+ * delivery. :host([data-theme="dark"]) is inert in global delivery and kept
275
+ * only for shadow-adopted use. */
276
+ :root[data-theme="dark"],
277
+ [data-theme="dark"],
278
+ :root.dark,
279
+ .dark,
280
+ :host([data-theme="dark"]) {
281
+ --roxy-primary: #f8fafc;
282
+ --roxy-secondary: #94a3b8;
283
+ --roxy-accent: #fbbf24;
284
+ --roxy-accent-ink: #fbbf24;
285
+
286
+ --roxy-success: #22c55e;
287
+ --roxy-success-fg: #86efac;
288
+ --roxy-warning: #fb923c;
289
+ --roxy-warning-fg: #fdba74;
290
+ --roxy-danger: #ef4444;
291
+ --roxy-danger-fg: #fca5a5;
292
+ --roxy-info: #38bdf8;
293
+ --roxy-info-fg: #7dd3fc;
294
+
295
+ --roxy-bg: #0a0a0a;
296
+ --roxy-fg: #fafafa;
297
+ --roxy-muted: #a1a1aa;
298
+ --roxy-border: #27272a;
299
+ --roxy-ring: rgba(251, 191, 36, 0.45);
300
+
301
+ --roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);
302
+ --roxy-shadow-md:
303
+ 0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);
304
+ --roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
305
+
306
+ --roxy-heat: var(--roxy-danger, #ef4444);
307
+ }
308
+
309
+ /* Reduced motion override */
310
+ @media (prefers-reduced-motion: reduce) {
311
+ :root,
312
+ :host {
313
+ --roxy-motion-duration: 0ms;
314
+ }
315
+ }
316
+ `;var Rr="roxy-ui-tokens";function Pr(){if(typeof document>"u")return null;let n=document.getElementById(Rr);if(n)return n;let a=document.createElement("style");return a.id=Rr,a.textContent=qt,document.head.prepend(a),a}Pr();return Wt(ys);})();
94
317
  /*! Bundled license information:
95
318
 
96
319
  @lit/reactive-element/css-tag.js: