@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
package/dist/index.cjs CHANGED
@@ -1,92 +1,92 @@
1
- "use strict";var Hr=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var qt=Object.getOwnPropertyNames;var Vt=Object.prototype.hasOwnProperty;var Ft=(o,n)=>{for(var e in n)Hr(o,e,{get:n[e],enumerable:!0})},Ut=(o,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of qt(n))!Vt.call(o,t)&&t!==e&&Hr(o,t,{get:()=>n[t],enumerable:!(r=St(n,t))||r.enumerable});return o};var Wt=o=>Ut(Hr({},"__esModule",{value:!0}),o),d=(o,n,e,r)=>{for(var t=r>1?void 0:r?St(n,e):n,a=o.length-1,s;a>=0;a--)(s=o[a])&&(t=(r?s(n,e,t):s(t))||t);return r&&t&&Hr(n,e,t),t};var Qa={};Ft(Qa,{ROXY_COMPONENTS:()=>lt,ROXY_UI_COMPONENTS:()=>Xa,ROXY_UI_VERSION:()=>Yt,RoxyAshtakavargaGrid:()=>$e,RoxyBiorhythmChart:()=>we,RoxyBodygraph:()=>je,RoxyChoghadiyaGrid:()=>Be,RoxyCompatibilityCard:()=>ke,RoxyDashaTimeline:()=>Se,RoxyData:()=>Ce,RoxyDivisionalChart:()=>Le,RoxyDoshaCard:()=>Te,RoxyEndpointForm:()=>ae,RoxyForecastTimeline:()=>Ye,RoxyGunaMilan:()=>qe,RoxyHexagram:()=>Re,RoxyHoroscopeCard:()=>Ae,RoxyKpChart:()=>Ee,RoxyKpPlanetsTable:()=>Ve,RoxyKpRulingPlanets:()=>Fe,RoxyLocationSearch:()=>ee,RoxyMoonPhase:()=>Ne,RoxyNakshatraCard:()=>Ue,RoxyNatalChart:()=>ve,RoxyNumerologyCard:()=>ze,RoxyPanchangTable:()=>Me,RoxyShadbalaTable:()=>We,RoxySynastryChart:()=>Je,RoxyTarotCard:()=>De,RoxyTarotSpread:()=>Ge,RoxyTransitsTable:()=>Oe,RoxyVedicKundli:()=>He,RoxyVedicPlanetsTable:()=>Xe,RoxyWesternPlanetsTable:()=>Qe,RoxyYogaList:()=>Ie});module.exports=Wt(Qa);var U=require("lit"),nr=require("lit/decorators.js");var I={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"},Ct={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"},oe={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Ir={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},Q=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],es=Q.map(o=>o.toLowerCase()),fr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},dt={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"},Pt={"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 Lt=require("lit"),y=Lt.css`: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 Jt="roxy-data";function Xt(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var h=class{constructor(n){this.host=n,n.addController(this)}hostConnected(){if(this.host.data!=null)return;let n=this.read();n!==void 0&&(this.host.data=n,this.host.requestUpdate())}read(){let n=this.findInlineScript();return n?this.parse(n.textContent):void 0}findInlineScript(){for(let n of Array.from(this.host.children))if(Xt(n)&&n.classList.contains(Jt))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var Qt={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},er=["sarva","bhinna","pinda"],$e=class extends U.LitElement{constructor(){super();this.data=null;this.activeTab="sarva";new h(this)}render(){if(!this.data)return U.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return U.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?U.html`<p class="subtitle">${e.length} signs</p>`:U.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${er.map(r=>U.html`<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}}">${Qt[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=er.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=er[(r+1)%er.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=er[(r-1+er.length)%er.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?U.html`<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,a)=>{let s=r.bindus[a]??0,i=this.sarvaHeat(s);return U.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${oe[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${s}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:U.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?U.html`<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=>U.html`<th scope="col" title="${t}">${oe[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>U.html`<tr><td>${t.planet}</td>${t.bindus.map(a=>{let s=this.bhinnaHeat(a);return U.html`<td class="${`heat-cell ${s}`}">${a}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:U.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?U.html`<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=>U.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:U.html`<p class="roxy-empty">No shodhya pinda data</p>`}};$e.styles=[y,U.css`.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%)}`],d([(0,nr.property)({attribute:!1})],$e.prototype,"data",2),d([(0,nr.state)()],$e.prototype,"activeTab",2),$e=d([(0,nr.customElement)("roxy-ashtakavarga-grid")],$e);var V=require("lit"),br=require("lit/decorators.js");var Tt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},we=class extends V.LitElement{constructor(){super();this.data=null;this.mode="daily";new h(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):V.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([a,s])=>{let i=typeof s=="number"?s:0,l=Math.abs(i)>1?i/100:i;return[a,l]});return V.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?V.html`<span class="energy">Energy ${e.energyRating}/10</span>`:V.nothing}</header><div class="bars" role="list">${t.map(([a,s])=>{let i=(s+1)/2*100,l=Tt[a]??"var(--roxy-accent, #f59e0b)";return V.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${a}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(s*100)}%</span></div>`})}</div>${e.dailyMessage?V.html`<p class="advice">${e.dailyMessage}</p>`:V.nothing} ${e.advice?V.html`<p class="advice">${e.advice}</p>`:V.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return V.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,a=160,s=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return V.html`<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} ${a}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${a/2}" x2="${t}" y2="${a/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((p,u)=>{let P=p[l]??0,x=u*s,Ze=a/2-P/100*(a/2-8);return`${x.toFixed(2)},${Ze.toFixed(2)}`}).join(" "),m=Tt[l]??"#475569";return V.svg`<polyline points=${c} fill="none" stroke=${m} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?V.html`<p class="advice">${e.summary.periodAdvice}</p>`:V.nothing}</section>`}renderCritical(e){return V.html`<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=>V.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};we.styles=[y,V.css`.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}`],d([(0,br.property)({attribute:!1})],we.prototype,"data",2),d([(0,br.property)({type:String,reflect:!0})],we.prototype,"mode",2),we=d([(0,br.customElement)("roxy-biorhythm-chart")],we);var _=require("lit"),Yr=require("lit/decorators.js");var ge=require("lit"),_r=4,Kr=9,At=(100+2*Kr)*_r,Zt=(100+2*Kr)*_r;function ce(o,n){return{x:(o+Kr)*_r,y:(n+Kr)*_r}}var vr=50,gt=o=>2*vr-o,ct={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]}},ea={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function ra(){let o={},n={};for(let[e,[r,t]]of Object.entries(ct.spleen))ct["solar-plexus"][ea[Number(e)]]=[gt(r),t];for(let[e,r]of Object.entries(ct))for(let[t,[a,s]]of Object.entries(r))o[Number(t)]=ce(a,s),n[Number(t)]=e;return{points:o,centerOf:n}}var{points:mt,centerOf:gs}=ra(),ys=At/2;function rr(o){return o.map(([n,e])=>ce(n,e))}function pt(o,n,e){return rr([[vr-o,n],[vr+o,n],[vr+o,e],[vr-o,e]])}var Rt=[[18.4,68],[18.4,81.8],[34.7,74.9]],ta=[{id:"head",label:"Head",color:"gold",points:rr([[40,14.3],[60,14.3],[50,6]]),labelAnchor:ce(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:rr([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:ce(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:pt(9.5,30.4,43.6),labelAnchor:ce(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:rr([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:ce(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:rr([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:ce(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:rr(Rt),labelAnchor:ce(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:pt(9.5,70.6,83.6),labelAnchor:ce(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:rr(Rt.map(([o,n])=>[gt(o),n])),labelAnchor:ce(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:pt(9.5,87.9,99.9),labelAnchor:ce(50,103),labelAlign:"middle"}],aa=[[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]],sa=oa();function oa(){let o=gt,n=[[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 ${jr(n[0])}`];for(let r=1;r+2<n.length;r+=3)e.push(`C ${jr(n[r])} ${jr(n[r+1])} ${jr(n[r+2])}`);e.push(`L ${Br(n[n.length-1],o)}`);for(let r=n.length-3;r>=1;r-=3)e.push(`C ${Br(n[r+1],o)} ${Br(n[r],o)} ${Br(n[r-1],o)}`);return e.push("Z"),e.join(" ")}function jr([o,n]){let e=ce(o,n);return`${e.x} ${e.y}`}function Br([o,n],e){let r=ce(e(o),n);return`${r.x} ${r.y}`}function na(o){return o.map(n=>`${n.x},${n.y}`).join(" ")}function Et(o,n){return o<n?`${o}-${n}`:`${n}-${o}`}function ia(){return ge.svg`<path class="bg-body" d=${sa} />`}function la(o,n){let e=[];for(let[r,t]of aa){let a=mt[r],s=mt[t];if(!a||!s)continue;if(e.push(ge.svg`<line class="bg-channel" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />`),o.has(Et(r,t))){e.push(ge.svg`<line class="bg-channel on" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />`);continue}let i={x:(a.x+s.x)/2,y:(a.y+s.y)/2};n.has(r)&&e.push(ge.svg`<line class="bg-half" x1=${a.x} y1=${a.y} x2=${i.x} y2=${i.y} />`),n.has(t)&&e.push(ge.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`)}return e}function da(o,n,e){let r=e.x-n.x,t=e.y-n.y,a=r*r+t*t;if(a===0)return n;let s=Math.max(0,Math.min(1,((o.x-n.x)*r+(o.y-n.y)*t)/a));return{x:n.x+s*r,y:n.y+s*t}}function ca(o,n){let e=n[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<n.length;t++){let a=da(o,n[t],n[(t+1)%n.length]),s=(a.x-o.x)**2+(a.y-o.y)**2;s<r&&(r=s,e=a)}return e}function pa(o){return ta.map(n=>{let e=o.has(n.id),r=`bg-center bg-${n.color}${e?" defined":""}`,t=ca(n.labelAnchor,n.points);return ge.svg`<g>
2
- <line class="bg-leader" x1=${n.labelAnchor.x} y1=${n.labelAnchor.y} x2=${t.x} y2=${t.y} />
3
- <polygon class=${r} points=${na(n.points)}><title>${n.label}: ${e?"defined":"open"}</title></polygon>
1
+ "use strict";var Vr=Object.defineProperty;var Oa=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var lt=Object.prototype.hasOwnProperty;var dt=(o,n)=>{for(var e in n)Vr(o,e,{get:n[e],enumerable:!0})},ct=(o,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of it(n))!lt.call(o,a)&&a!==e&&Vr(o,a,{get:()=>n[a],enumerable:!(r=Oa(n,a))||r.enumerable});return o};var pt=o=>ct(Vr({},"__esModule",{value:!0}),o),l=(o,n,e,r)=>{for(var a=r>1?void 0:r?Oa(n,e):n,t=o.length-1,s;t>=0;t--)(s=o[t])&&(a=(r?s(n,e,a):s(a))||a);return r&&a&&Vr(n,e,a),a};var hs={};dt(hs,{ROXY_COMPONENTS:()=>va,ROXY_UI_COMPONENTS:()=>us,ROXY_UI_VERSION:()=>nt,RoxyAngelNumberCard:()=>Ye,RoxyAngelNumberLookup:()=>Fe,RoxyAshtakavargaGrid:()=>Le,RoxyBiorhythmChart:()=>Re,RoxyBodygraph:()=>Ve,RoxyChoghadiyaGrid:()=>Ue,RoxyCompatibilityCard:()=>Te,RoxyCrystalGrid:()=>Pe,RoxyDashaTimeline:()=>Ae,RoxyData:()=>Ne,RoxyDivisionalChart:()=>Ee,RoxyDoshaCard:()=>Me,RoxyDreamCard:()=>Xe,RoxyEndpointForm:()=>oe,RoxyForecastTimeline:()=>Ze,RoxyGunaMilan:()=>Qe,RoxyHexagram:()=>De,RoxyHoroscopeCard:()=>Ge,RoxyKpChart:()=>Oe,RoxyKpPlanetsTable:()=>er,RoxyKpRulingPlanets:()=>rr,RoxyLocationSearch:()=>ae,RoxyMoonPhase:()=>He,RoxyNakshatraCard:()=>ar,RoxyNatalChart:()=>Ce,RoxyNumerologyCard:()=>Ie,RoxyPanchangTable:()=>je,RoxyShadbalaTable:()=>tr,RoxySynastryChart:()=>sr,RoxyTarotCard:()=>Be,RoxyTarotSpread:()=>_e,RoxyTransitsTable:()=>Ke,RoxyVedicKundli:()=>ve,RoxyVedicPlanetsTable:()=>or,RoxyWesternPlanetsTable:()=>nr,RoxyYogaList:()=>qe,roxyDataScript:()=>ja,serializeRoxyData:()=>$a});module.exports=pt(hs);var D=require("lit"),Ur=require("lit/decorators.js");var Ha=require("lit"),g=Ha.css`: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 Ia="roxy-data";function $a(o){return JSON.stringify(o).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function ja(o){return`<script type="application/json" class="${Ia}">${$a(o)}</script>`}function mt(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var y=class{constructor(n){this.host=n,n.addController(this)}hostConnected(){if(this.host.data!=null)return;let n=this.read();n!==void 0&&(this.host.data=n,this.host.requestUpdate())}read(){let n=this.findInlineScript();return n?this.parse(n.textContent):void 0}findInlineScript(){for(let n of Array.from(this.host.children))if(mt(n)&&n.classList.contains(Ia))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var gt=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"twinFlame",label:"Twin flame"}],Ye=class extends D.LitElement{constructor(){super();this.data=null;new y(this)}render(){let e=this.data;if(!e)return D.html`<div class="roxy-empty" role="status">No angel number</div>`;let r=(e.energy??"").toLowerCase(),a=r==="positive"||r==="cautionary"||r==="neutral"?r:"",t=e.keywords??[],s=e.actionSteps??[];return D.html`<article class="card" aria-label="${`Angel number ${e.number??""}`}"><div class="hero">${e.number?D.html`<div class="numeral">${e.number}</div>`:D.nothing}<div><p class="label">Angel number</p>${e.title?D.html`<h2 class="title">${e.title}</h2>`:D.nothing}</div></div>${e.coreMessage?D.html`<p class="core">${e.coreMessage}</p>`:D.nothing}<div class="badges">${e.type?D.html`<span class="badge">${e.type}</span>`:D.nothing} ${typeof e.digitRoot=="number"?D.html`<span class="badge">Digit root ${e.digitRoot}</span>`:D.nothing} ${e.energy?D.html`<span class="${`badge ${a}`}">${e.energy}</span>`:D.nothing}</div>${t.length>0?D.html`<div class="chips">${t.map(i=>D.html`<span>${i}</span>`)}</div>`:D.nothing} ${this.renderSections(e)} ${e.affirmation?D.html`<p class="affirmation">${e.affirmation}</p>`:D.nothing} ${s.length>0?D.html`<div class="steps"><h3>Action steps</h3><ul>${s.map(i=>D.html`<li>${i}</li>`)}</ul></div>`:D.nothing}</article>`}renderSections(e){let r=e.meaning;if(!r)return D.nothing;let a=gt.filter(t=>r[t.key]);return a.length===0?D.nothing:D.html`<div class="sections">${a.map((t,s)=>D.html`<details name="angel-meaning" ?open="${s===0}"><summary>${t.label}</summary><p>${r[t.key]}</p></details>`)}</div>`}};Ye.styles=[g,D.css`.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}`],l([(0,Ur.property)({attribute:!1})],Ye.prototype,"data",2),Ye=l([(0,Ur.customElement)("roxy-angel-number-card")],Ye);var w=require("lit"),Wr=require("lit/decorators.js");var yt=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"twinFlame",label:"Twin flame"}],Fe=class extends w.LitElement{constructor(){super();this.data=null;new y(this)}render(){let e=this.data;if(!e)return w.html`<div class="roxy-empty" role="status">No number analysis</div>`;let r=e.knownMeaning,a=e.digitRootMeaning,t=r?.title??"Number analysis";return w.html`<article class="card" aria-label="${`Number ${e.number??""}`}"><div class="hero">${e.number?w.html`<div class="numeral">${e.number}</div>`:w.nothing}<div><p class="label">Number analysis</p><h2 class="title">${t}</h2></div></div><div class="badges">${e.type?w.html`<span class="badge">${e.type}</span>`:w.nothing} ${typeof e.digits=="number"?w.html`<span class="badge">${e.digits} digits</span>`:w.nothing} ${typeof e.uniqueDigits=="number"?w.html`<span class="badge">${e.uniqueDigits} unique</span>`:w.nothing} ${typeof e.digitRoot=="number"?w.html`<span class="badge">Digit root ${e.digitRoot}</span>`:w.nothing} ${e.isPalindrome?w.html`<span class="badge flag">Palindrome</span>`:w.nothing} ${e.isRepeating?w.html`<span class="badge flag">Repeating</span>`:w.nothing}</div>${r?w.html`<div class="section"><p class="label">Known angel number</p>${r.coreMessage?w.html`<p>${r.coreMessage}</p>`:w.nothing} ${r.keywords&&r.keywords.length>0?w.html`<div class="chips">${r.keywords.map(s=>w.html`<span>${s}</span>`)}</div>`:w.nothing} ${this.renderMeaning(r.meaning)} ${r.affirmation?w.html`<p><em>${r.affirmation}</em></p>`:w.nothing}</div>`:w.nothing} ${a?w.html`<div class="section"><p class="label">Foundational digit root${a.number?` (${a.number})`:""}</p>${a.title?w.html`<h3>${a.title}</h3>`:w.nothing} ${a.coreMessage?w.html`<p>${a.coreMessage}</p>`:w.nothing}</div>`:w.nothing}</article>`}renderMeaning(e){if(!e)return w.nothing;let r=yt.filter(a=>e[a.key]);return r.length===0?w.nothing:w.html`${r.map((a,t)=>w.html`<details name="lookup-meaning" ?open="${t===0}"><summary>${a.label}</summary><p>${e[a.key]}</p></details>`)}`}};Fe.styles=[g,w.css`.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)}`],l([(0,Wr.property)({attribute:!1})],Fe.prototype,"data",2),Fe=l([(0,Wr.customElement)("roxy-angel-number-lookup")],Fe);var J=require("lit"),ur=require("lit/decorators.js");var B={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"},Ba={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"},ie={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Jr={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},ee=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],Ts=ee.map(o=>o.toLowerCase()),Rr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},wa={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"},_a={"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 ut={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},lr=["sarva","bhinna","pinda"],Le=class extends J.LitElement{constructor(){super();this.data=null;this.activeTab="sarva";new y(this)}render(){if(!this.data)return J.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return J.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?J.html`<p class="subtitle">${e.length} signs</p>`:J.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${lr.map(r=>J.html`<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}}">${ut[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=lr.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=lr[(r+1)%lr.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=lr[(r-1+lr.length)%lr.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?J.html`<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((a,t)=>{let s=r.bindus[t]??0,i=this.sarvaHeat(s);return J.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${ie[a]??""}</span> ${a}</div></td><td class="${`heat-cell ${i}`}">${s}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:J.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?J.html`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(a=>J.html`<th scope="col" title="${a}">${ie[a]??a.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(a=>J.html`<tr><td>${a.planet}</td>${a.bindus.map(t=>{let s=this.bhinnaHeat(t);return J.html`<td class="${`heat-cell ${s}`}">${t}</td>`})}<td>${a.total}</td></tr>`)}</tbody></table></div>`:J.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?J.html`<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=>J.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:J.html`<p class="roxy-empty">No shodhya pinda data</p>`}};Le.styles=[g,J.css`.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%)}`],l([(0,ur.property)({attribute:!1})],Le.prototype,"data",2),l([(0,ur.state)()],Le.prototype,"activeTab",2),Le=l([(0,ur.customElement)("roxy-ashtakavarga-grid")],Le);var U=require("lit"),Tr=require("lit/decorators.js");var Ka={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},Re=class extends U.LitElement{constructor(){super();this.data=null;this.mode="daily";new y(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):U.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},a=Object.entries(r).map(([t,s])=>{let i=typeof s=="number"?s:0,d=Math.abs(i)>1?i/100:i;return[t,d]});return U.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?U.html`<span class="energy">Energy ${e.energyRating}/10</span>`:U.nothing}</header><div class="bars" role="list">${a.map(([t,s])=>{let i=(s+1)/2*100,d=Ka[t]??"var(--roxy-accent, #f59e0b)";return U.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${t}</span> <span class="track"><span class="fill" style="width:${i}%;background:${d}"></span> </span><span class="value">${Math.round(s*100)}%</span></div>`})}</div>${e.dailyMessage?U.html`<p class="advice">${e.dailyMessage}</p>`:U.nothing} ${e.advice?U.html`<p class="advice">${e.advice}</p>`:U.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return U.html`<div class="roxy-empty" role="status">No forecast</div>`;let a=600,t=160,s=a/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return U.html`<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 ${a} ${t}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${t/2}" x2="${a}" y2="${t/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(d=>{let c=r.map((p,h)=>{let R=p[d]??0,x=h*s,ir=t/2-R/100*(t/2-8);return`${x.toFixed(2)},${ir.toFixed(2)}`}).join(" "),m=Ka[d]??"#475569";return U.svg`<polyline points=${c} fill="none" stroke=${m} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?U.html`<p class="advice">${e.summary.periodAdvice}</p>`:U.nothing}</section>`}renderCritical(e){return U.html`<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=>U.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};Re.styles=[g,U.css`.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}`],l([(0,Tr.property)({attribute:!1})],Re.prototype,"data",2),l([(0,Tr.property)({type:String,reflect:!0})],Re.prototype,"mode",2),Re=l([(0,Tr.customElement)("roxy-biorhythm-chart")],Re);var q=require("lit"),ra=require("lit/decorators.js");var xe=require("lit"),Qr=4,ea=9,Ya=(100+2*ea)*Qr,ht=(100+2*ea)*Qr;function ye(o,n){return{x:(o+ea)*Qr,y:(n+ea)*Qr}}var Pr=50,La=o=>2*Pr-o,ka={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]}},xt={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function bt(){let o={},n={};for(let[e,[r,a]]of Object.entries(ka.spleen))ka["solar-plexus"][xt[Number(e)]]=[La(r),a];for(let[e,r]of Object.entries(ka))for(let[a,[t,s]]of Object.entries(r))o[Number(a)]=ye(t,s),n[Number(a)]=e;return{points:o,centerOf:n}}var{points:Ca,centerOf:Is}=bt(),js=Ya/2;function dr(o){return o.map(([n,e])=>ye(n,e))}function Sa(o,n,e){return dr([[Pr-o,n],[Pr+o,n],[Pr+o,e],[Pr-o,e]])}var qa=[[18.4,68],[18.4,81.8],[34.7,74.9]],ft=[{id:"head",label:"Head",color:"gold",points:dr([[40,14.3],[60,14.3],[50,6]]),labelAnchor:ye(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:dr([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:ye(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Sa(9.5,30.4,43.6),labelAnchor:ye(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:dr([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:ye(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:dr([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:ye(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:dr(qa),labelAnchor:ye(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Sa(9.5,70.6,83.6),labelAnchor:ye(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:dr(qa.map(([o,n])=>[La(o),n])),labelAnchor:ye(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Sa(9.5,87.9,99.9),labelAnchor:ye(50,103),labelAlign:"middle"}],vt=[[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]],$t=wt();function wt(){let o=La,n=[[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 ${Xr(n[0])}`];for(let r=1;r+2<n.length;r+=3)e.push(`C ${Xr(n[r])} ${Xr(n[r+1])} ${Xr(n[r+2])}`);e.push(`L ${Zr(n[n.length-1],o)}`);for(let r=n.length-3;r>=1;r-=3)e.push(`C ${Zr(n[r+1],o)} ${Zr(n[r],o)} ${Zr(n[r-1],o)}`);return e.push("Z"),e.join(" ")}function Xr([o,n]){let e=ye(o,n);return`${e.x} ${e.y}`}function Zr([o,n],e){let r=ye(e(o),n);return`${r.x} ${r.y}`}function kt(o){return o.map(n=>`${n.x},${n.y}`).join(" ")}function Fa(o,n){return o<n?`${o}-${n}`:`${n}-${o}`}function St(){return xe.svg`<path class="bg-body" d=${$t} />`}function Ct(o,n){let e=[];for(let[r,a]of vt){let t=Ca[r],s=Ca[a];if(!t||!s)continue;if(e.push(xe.svg`<line class="bg-channel" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} />`),o.has(Fa(r,a))){e.push(xe.svg`<line class="bg-channel on" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} />`);continue}let i={x:(t.x+s.x)/2,y:(t.y+s.y)/2};n.has(r)&&e.push(xe.svg`<line class="bg-half" x1=${t.x} y1=${t.y} x2=${i.x} y2=${i.y} />`),n.has(a)&&e.push(xe.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`)}return e}function Lt(o,n,e){let r=e.x-n.x,a=e.y-n.y,t=r*r+a*a;if(t===0)return n;let s=Math.max(0,Math.min(1,((o.x-n.x)*r+(o.y-n.y)*a)/t));return{x:n.x+s*r,y:n.y+s*a}}function Rt(o,n){let e=n[0],r=Number.POSITIVE_INFINITY;for(let a=0;a<n.length;a++){let t=Lt(o,n[a],n[(a+1)%n.length]),s=(t.x-o.x)**2+(t.y-o.y)**2;s<r&&(r=s,e=t)}return e}function Tt(o){return ft.map(n=>{let e=o.has(n.id),r=`bg-center bg-${n.color}${e?" defined":""}`,a=Rt(n.labelAnchor,n.points);return xe.svg`<g>
2
+ <line class="bg-leader" x1=${n.labelAnchor.x} y1=${n.labelAnchor.y} x2=${a.x} y2=${a.y} />
3
+ <polygon class=${r} points=${kt(n.points)}><title>${n.label}: ${e?"defined":"open"}</title></polygon>
4
4
  <text class="bg-center-label" x=${n.labelAnchor.x} y=${n.labelAnchor.y} text-anchor=${n.labelAlign} dominant-baseline="central">${n.label}</text>
5
- </g>`})}function ma(o,n){let e=[];for(let[r,t]of Object.entries(mt)){let a=Number(r);if(!o.has(a))continue;let s=n.get(a);e.push(ge.svg`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${a}${s?ge.svg`<title>${s}</title>`:ge.nothing}</text>`)}return e}function Nt(o,n){return Et(o,n)}var zt=`0 0 ${At} ${Zt}`;function Mt(o){return ge.svg`
6
- ${ia()}
7
- ${la(o.activeChannels,o.activeGates)}
8
- ${pa(o.definedCenters)}
9
- ${ma(o.activeGates,o.gateTitles)}
10
- `}function b(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function ye(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,n=>n.toUpperCase())}var je=class extends _.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return _.html`<div class="roxy-empty" role="status">No bodygraph data</div>`;let r=new Set((e.centers??[]).filter(i=>i.defined).map(i=>i.id)),t=new Set((e.gates??[]).map(i=>i.gate).filter(i=>i!=null)),a=new Set((e.channels??[]).map(i=>Nt(i.gateA,i.gateB))),s=this.buildGateTitles(e.gates??[]);return _.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?_.html`<div class="type-line">${e.type}${e.profile?_.html`· Profile ${e.profile}`:_.nothing}</div>`:_.nothing}</header><div class="layout"><svg viewBox="${zt}" 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:a,activeGates:t,gateTitles:s})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let r=new Map;for(let t of e){if(t.gate==null)continue;let a=[`Gate ${t.gate}`];t.line!=null&&(a[0]+=`.${t.line}`),t.gateName&&a.push(t.gateName);let s=t.planet?b(t.planet):"",i=s?I[s]??s:"";i&&a.push(`${i} ${t.side??""}`.trim()),r.set(t.gate,a.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 _.html`<div class="summary"><div class="facts">${r.map(a=>a.value?_.html`<div class="fact"><span>${a.label}</span> <strong>${a.value}</strong></div>`:_.nothing)}</div>${t?.name?_.html`<p class="cross">${t.name} ${t.gates?.length?_.html`<span class="gates">(${t.gates.join(", ")})</span>`:_.nothing}</p>`:_.nothing} ${e.signature||e.notSelf?_.html`<div class="themes">${e.signature?_.html`<span class="pill pill--good">Signature: ${e.signature}</span>`:_.nothing} ${e.notSelf?_.html`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:_.nothing}</div>`:_.nothing}<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>`}};je.styles=[y,_.css`.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}`],d([(0,Yr.property)({attribute:!1})],je.prototype,"data",2),je=d([(0,Yr.customElement)("roxy-bodygraph")],je);var Z=require("lit"),qr=require("lit/decorators.js");function Dt(o){try{let n=new Date(o);return Number.isNaN(n.getTime())?o:n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return o}}var Be=class extends Z.LitElement{constructor(){super();this.data=null;new h(this)}isCurrent(e){let r=Date.now(),t=Date.parse(e.start),a=Date.parse(e.end);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",t=this.isCurrent(e),a=I[b(e.lord)]??"",s=`${Dt(e.start)} - ${Dt(e.end)}`;return Z.html`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?Z.html`<span class="now-badge">Now</span>`:Z.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${a?Z.html`<span aria-hidden="true">${a}</span>`:Z.nothing} ${e.lord}</span></div>`}render(){if(!this.data)return Z.html`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return Z.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?Z.html`<p class="subtitle">${e}</p>`:Z.nothing}</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(a=>this.renderTile(a)):Z.html`<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(a=>this.renderTile(a)):Z.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Be.styles=[y,Z.css`.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}`],d([(0,qr.property)({attribute:!1})],Be.prototype,"data",2),Be=d([(0,qr.customElement)("roxy-choghadiya-grid")],Be);var L=require("lit"),$r=require("lit/decorators.js");function he(o){if(typeof o!="string"||o.length===0||/^\d{4}-\d{2}-\d{2}$/.test(o))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(o)?`1970-01-01T${o}`:o,r=new Date(e);return Number.isNaN(r.getTime())?o:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function _e(o){if(typeof o!="string"||o.length===0)return"";let n=new Date(/^\d{4}-\d{2}-\d{2}$/.test(o)?`${o}T00:00:00`:o);return Number.isNaN(n.getTime())?o:n.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function yt(o){if(!o)return"";let n=he(o.start),e=he(o.end);return n&&e?`${n} - ${e}`:n||e||""}function v(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function Gt(o,n=1){let e=v(o,n);return e?`${e}%`:""}var tr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function ir(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var ke=class extends L.LitElement{constructor(){super();this.data=null;this.mode="astrology";new h(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,a]of Object.entries(e.categories))typeof a=="number"&&Number.isFinite(a)&&(r[t]=a);return r}return{}}render(){let e=this.data;if(!e)return L.html`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),a="rating"in e?e.rating:void 0,s="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,m="strengths"in e?e.strengths:void 0,p="challenges"in e?e.challenges:void 0,u="keyAspects"in e?e.keyAspects:void 0;return L.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?L.html`<div class="score">${v(r,0)}</div>`:L.nothing} ${a?L.html`<div class="rating">${a}</div>`:L.nothing}</div></div>${Object.keys(t).length>0?L.html`<div role="list">${Object.entries(t).map(([P,x])=>L.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${P}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,x))}%"></span></span> <span>${v(x,0)}</span></div>`)}</div>`:L.nothing} ${s?L.html`<p><span class="archetype">${s.label}</span> ${s.description?L.html`· ${s.description}`:L.nothing}</p>`:L.nothing} ${l?L.html`<p>${l}</p>`:L.nothing} ${c&&!l?L.html`<p>${c}</p>`:L.nothing} ${i?L.html`<p>${i}</p>`:L.nothing} ${(m?.length??0)>0||(p?.length??0)>0?L.html`<div class="lists">${m?.length?L.html`<div><h3>Strengths</h3><ul>${m.map(P=>L.html`<li>${P}</li>`)}</ul></div>`:L.nothing} ${p?.length?L.html`<div><h3>Challenges</h3><ul>${p.map(P=>L.html`<li>${P}</li>`)}</ul></div>`:L.nothing}</div>`:L.nothing} ${u?.length?L.html`<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)">${u.slice(0,6).map(P=>L.html`<li>${ga(P)}</li>`)}</ul></div>`:L.nothing}</article>`}};ke.styles=[y,L.css`.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}`],d([(0,$r.property)({attribute:!1})],ke.prototype,"data",2),d([(0,$r.property)({type:String,reflect:!0})],ke.prototype,"mode",2),ke=d([(0,$r.customElement)("roxy-compatibility-card")],ke);function ga(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${v(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}var w=require("lit"),wr=require("lit/decorators.js");var Se=class extends w.LitElement{constructor(){super();this.data=null;this.period="current";new h(this)}render(){let e=this.data;if(!e)return w.html`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(a=>a.durationYears)):0;return w.html`<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?w.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?w.html`(lord ${e.nakshatraLord})`:w.nothing}</div>`:w.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):w.nothing} ${r.length>0?w.html`<div class="timeline" role="list">${r.map(a=>this.renderBar(a,t))}</div>`:w.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return w.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",a=r.years??0,s=r.months??0,i=r.days??0,l=[];a&&l.push(`${a}y`),s&&l.push(`${s}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return w.html`<p class="balance">Birth dasha balance: ${c} of ${t?w.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?w.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:w.nothing}renderCurrent(e){return"mahadasha"in e?w.html`<div class="current">${"mahadasha"in e&&e.mahadasha?w.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?w.html`<small>${v(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing} ${"antardasha"in e&&e.antardasha?w.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?w.html`<small>${v(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?w.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?w.html`<small>${v(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing}</div>`:w.nothing}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),a=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),a=Date.now();return Number.isNaN(r)||Number.isNaN(t)||a<r||a>=t||t<=r?-1:(a-r)/(t-r)}renderBar(e,r){let t=e.durationYears,a=r>0?t/r*100:0,s=this.isCurrent(e),i=s?this.progressIn(e):-1,l=s?"bar-track bar-now":"bar-track";return w.html`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?w.html`<span class="now-badge">Now</span>`:w.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${a}%"></span> ${i>=0?w.html`<span class="bar-progress" style="left:${i*a}%" aria-hidden="true"></span>`:w.nothing} </span><span class="dates">${e.startDate?Ot(e.startDate):""} ${e.endDate?w.html`- ${Ot(e.endDate)}`:""}</span></div>`}};Se.styles=[y,w.css`.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)}`],d([(0,wr.property)({attribute:!1})],Se.prototype,"data",2),d([(0,wr.property)({type:String,reflect:!0})],Se.prototype,"period",2),Se=d([(0,wr.customElement)("roxy-dasha-timeline")],Se);function Ot(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}var N=require("lit"),kr=require("lit/decorators.js");var ya=["title","name","label","heading","overview","summary"],ua=["imageUrl","image","icon","symbol"],ha=["imageUrl","image"],xa=6,Ce=class extends N.LitElement{constructor(){super();this.data=null;this.depth=0;new h(this)}render(){return this.data==null?N.html`<div class="roxy-empty" role="status">No data</div>`:this.depth>=xa?N.html`<div class="roxy-empty" role="status">…</div>`:N.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?N.nothing:typeof e=="string"?N.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?N.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?N.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(a=>a===null||["string","number","boolean"].includes(typeof a))?N.html`<ul class="roxy-chips">${e.map(a=>N.html`<li>${String(a)}</li>`)}</ul>`:e.every(a=>a!==null&&typeof a=="object"&&!Array.isArray(a))?this.renderTable(e):N.html`<ol>${e.map(a=>N.html`<li>${this.renderValue(a)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return N.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>N.html`<th>${ye(t)}</th>`)}</tr></thead><tbody>${e.map(t=>N.html`<tr>${r.map(a=>N.html`<td>${this.formatPrimitive(t[a])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=ya.find(i=>typeof e[i]=="string"),t=ua.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),a=r!=="summary"&&typeof e.summary=="string"?"summary":null,s=Object.entries(e).filter(([i,l])=>i!==r&&i!==a&&!ha.includes(i)&&l!==null&&l!==void 0);return N.html`${t?N.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:N.nothing} ${r?N.html`<h3 class="roxy-title">${e[r]}</h3>`:N.nothing} ${a?N.html`<p class="roxy-summary">${e[a]}</p>`:N.nothing} ${s.length>0?N.html`<dl class="roxy-rows">${s.map(([i,l])=>N.html`<dt>${ye(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:N.nothing}`}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))?N.html`<ul class="roxy-chips">${e.map(t=>N.html`<li>${String(t)}</li>`)}</ul>`:N.html`<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 a of Object.keys(t))r.add(a);return Array.from(r)}};Ce.styles=[y,N.css`.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}`],d([(0,kr.property)({attribute:!1})],Ce.prototype,"data",2),d([(0,kr.property)({attribute:!1})],Ce.prototype,"depth",2),Ce=d([(0,kr.customElement)("roxy-data")],Ce);var ne=require("lit"),Sr=require("lit/decorators.js");var S=require("lit");function xe(o){let n=o%360;return n<0?n+360:n}function fe(o){let n=xe(o),e=Math.floor(n/30)%12,r=n%30,t=Math.floor(r),a=(r-t)*60,s=Math.floor(a),i=Math.round((a-s)*60);return{sign:Q[e]??"Aries",signIndex:e,degree:t,minute:s,second:i}}function Vr(o){let{sign:n,degree:e,minute:r}=fe(o);return`${e}\xB0 ${n} ${String(r).padStart(2,"0")}'`}function ut(o){return xe(o+180)}function Ht(o,n){let e=xe(o),r=xe(n)-e;return r<0&&(r+=360),xe(e+r/2)}function G(o,n,e,r){let t=r*Math.PI/180;return{x:o+e*Math.cos(t),y:n+e*Math.sin(t)}}var ar=require("lit"),Ke=ar.css`.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 lr(o){let{items:n,active:e,onSelect:r,label:t,idPrefix:a,controls:s=!1}=o;return ar.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=n.findIndex(P=>P.id===e);if(c===-1)return;let m=l.key==="ArrowRight"?1:-1,p=n[(c+m+n.length)%n.length];if(!p)return;r(p.id);let u=l.currentTarget.getRootNode();requestAnimationFrame(()=>{u.querySelector(`#${a}-tab-${p.id}`)?.focus()})}}">${n.map(l=>ar.html`<button type="button" class="roxy-tab" role="tab" id="${a}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${s&&e===l.id?`${a}-panel-${l.id}`:ar.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ue=400,O=20,te=ue-2*O,F=ue/2,fa=Object.fromEntries(Q.map(o=>[o.toLowerCase(),o])),ba=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],va="\u02B3";function It(o,n){return typeof o.longitude!="number"||!Number.isFinite(o.longitude)?!1:fe(o.longitude).sign.toLowerCase()!==n.toLowerCase()}function $a(o,n){let e=Ct[b(o.graha)]??o.graha.slice(0,2),r=o.isRetrograde?va:"";if(typeof o.longitude!="number"||!Number.isFinite(o.longitude)||It(o,n))return`${e}${r}`;let{degree:t}=fe(o.longitude);return`${e} ${t}\xB0${r}`}function wa(o,n){let e=[b(o.graha)],r=It(o,n);if(r&&e.push(`in ${n}`),typeof o.longitude=="number"&&Number.isFinite(o.longitude)){let t=fe(o.longitude),a=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${a}' ${t.sign}`:`${t.degree}\xB0${a}' ${t.sign}`)}if(o.nakshatra?.name){let t=o.nakshatra.pada?` pada ${o.nakshatra.pada}`:"";e.push(`${o.nakshatra.name}${t}`)}return o.awastha&&e.push(o.awastha),o.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function ht(o,n,e,r,t){let a=r-(o.length-1)*t/2;return o.map((s,i)=>{let l=a+i*t;return S.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${$a(s,n)}<title>${wa(s,n)}</title></text>`})}function Ur(o,n){let e={};for(let t of Q)e[t.toLowerCase()]=[];let r="";for(let[t,a]of Object.entries(o??{})){let s=(a?.rashi??"").toLowerCase();if(t==="Lagna"||a?.graha==="Lagna"){r=fa[s]??"";continue}!s||!(s in e)||e[s]?.push({graha:a.graha??t,longitude:a.longitude,nakshatra:a.nakshatra,isRetrograde:a.isRetrograde,awastha:a.awastha})}return{lagnaSign:r,placements:e,divisionLabel:n}}var sr=te/4,ka={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 Sa(o){let n=ka[o]??{col:0,row:0};return{x:O+n.col*sr,y:O+n.row*sr,w:sr,h:sr}}function Ca(o){let n=O,e=O+sr,r=O+2*sr,t=O+3*sr,a=ue-O;return S.svg`
11
- <rect class="line" x=${n} y=${n} width=${te} height=${te} stroke-width="1.5" fill="none" />
12
- <line class="line" x1=${n} y1=${e} x2=${a} y2=${e} stroke-width="1" />
13
- <line class="line" x1=${n} y1=${t} x2=${a} y2=${t} stroke-width="1" />
14
- <line class="line" x1=${e} y1=${n} x2=${e} y2=${a} stroke-width="1" />
15
- <line class="line" x1=${t} y1=${n} x2=${t} y2=${a} stroke-width="1" />
5
+ </g>`})}function Pt(o,n){let e=[];for(let[r,a]of Object.entries(Ca)){let t=Number(r);if(!o.has(t))continue;let s=n.get(t);e.push(xe.svg`<text class="bg-gate" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${t}${s?xe.svg`<title>${s}</title>`:xe.nothing}</text>`)}return e}function Va(o,n){return Fa(o,n)}var Ua=`0 0 ${Ya} ${ht}`;function Wa(o){return xe.svg`
6
+ ${St()}
7
+ ${Ct(o.activeChannels,o.activeGates)}
8
+ ${Tt(o.definedCenters)}
9
+ ${Pt(o.activeGates,o.gateTitles)}
10
+ `}function f(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function be(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,n=>n.toUpperCase())}var Ve=class extends q.LitElement{constructor(){super();this.data=null;new y(this)}render(){let e=this.data;if(!e)return q.html`<div class="roxy-empty" role="status">No bodygraph data</div>`;let r=new Set((e.centers??[]).filter(i=>i.defined).map(i=>i.id)),a=new Set((e.gates??[]).map(i=>i.gate).filter(i=>i!=null)),t=new Set((e.channels??[]).map(i=>Va(i.gateA,i.gateB))),s=this.buildGateTitles(e.gates??[]);return q.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?q.html`<div class="type-line">${e.type}${e.profile?q.html`· Profile ${e.profile}`:q.nothing}</div>`:q.nothing}</header><div class="layout"><svg viewBox="${Ua}" 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>${Wa({definedCenters:r,activeChannels:t,activeGates:a,gateTitles:s})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let r=new Map;for(let a of e){if(a.gate==null)continue;let t=[`Gate ${a.gate}`];a.line!=null&&(t[0]+=`.${a.line}`),a.gateName&&t.push(a.gateName);let s=a.planet?f(a.planet):"",i=s?B[s]??s:"";i&&t.push(`${i} ${a.side??""}`.trim()),r.set(a.gate,t.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}],a=e.incarnationCross;return q.html`<div class="summary"><div class="facts">${r.map(t=>t.value?q.html`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:q.nothing)}</div>${a?.name?q.html`<p class="cross">${a.name} ${a.gates?.length?q.html`<span class="gates">(${a.gates.join(", ")})</span>`:q.nothing}</p>`:q.nothing} ${e.signature||e.notSelf?q.html`<div class="themes">${e.signature?q.html`<span class="pill pill--good">Signature: ${e.signature}</span>`:q.nothing} ${e.notSelf?q.html`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:q.nothing}</div>`:q.nothing}<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>`}};Ve.styles=[g,q.css`.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}`],l([(0,ra.property)({attribute:!1})],Ve.prototype,"data",2),Ve=l([(0,ra.customElement)("roxy-bodygraph")],Ve);var re=require("lit"),aa=require("lit/decorators.js");function Ja(o){try{let n=new Date(o);return Number.isNaN(n.getTime())?o:n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return o}}var Ue=class extends re.LitElement{constructor(){super();this.data=null;new y(this)}isCurrent(e){let r=Date.now(),a=Date.parse(e.start),t=Date.parse(e.end);return Number.isNaN(a)||Number.isNaN(t)?!1:r>=a&&r<t}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",a=this.isCurrent(e),t=B[f(e.lord)]??"",s=`${Ja(e.start)} - ${Ja(e.end)}`;return re.html`<div class="cho-tile ${r}${a?" now":""}" role="listitem" aria-current="${a?"time":"false"}"><span class="tile-name">${e.name}${a?re.html`<span class="now-badge">Now</span>`:re.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?re.html`<span aria-hidden="true">${t}</span>`:re.nothing} ${e.lord}</span></div>`}render(){if(!this.data)return re.html`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:a}=this.data;return re.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?re.html`<p class="subtitle">${e}</p>`:re.nothing}</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(t=>this.renderTile(t)):re.html`<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">${a&&a.length>0?a.map(t=>this.renderTile(t)):re.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Ue.styles=[g,re.css`.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}`],l([(0,aa.property)({attribute:!1})],Ue.prototype,"data",2),Ue=l([(0,aa.customElement)("roxy-choghadiya-grid")],Ue);var T=require("lit"),Ar=require("lit/decorators.js");function $e(o){if(typeof o!="string"||o.length===0||/^\d{4}-\d{2}-\d{2}$/.test(o))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(o)?`1970-01-01T${o}`:o,r=new Date(e);return Number.isNaN(r.getTime())?o:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function We(o){if(typeof o!="string"||o.length===0)return"";let n=new Date(/^\d{4}-\d{2}-\d{2}$/.test(o)?`${o}T00:00:00`:o);return Number.isNaN(n.getTime())?o:n.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Ra(o){if(!o)return"";let n=$e(o.start),e=$e(o.end);return n&&e?`${n} - ${e}`:n||e||""}function v(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function Xa(o,n=1){let e=v(o,n);return e?`${e}%`:""}var cr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function hr(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var Te=class extends T.LitElement{constructor(){super();this.data=null;this.mode="astrology";new y(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[a,t]of Object.entries(e.categories))typeof t=="number"&&Number.isFinite(t)&&(r[a]=t);return r}return{}}render(){let e=this.data;if(!e)return T.html`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,a=this.getBreakdown(),t="rating"in e?e.rating:void 0,s="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,d="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,m="strengths"in e?e.strengths:void 0,p="challenges"in e?e.challenges:void 0,h="keyAspects"in e?e.keyAspects:void 0;return T.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?T.html`<div class="score">${v(r,0)}</div>`:T.nothing} ${t?T.html`<div class="rating">${t}</div>`:T.nothing}</div></div>${Object.keys(a).length>0?T.html`<div role="list">${Object.entries(a).map(([R,x])=>T.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${R}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,x))}%"></span></span> <span>${v(x,0)}</span></div>`)}</div>`:T.nothing} ${s?T.html`<p><span class="archetype">${s.label}</span> ${s.description?T.html`· ${s.description}`:T.nothing}</p>`:T.nothing} ${d?T.html`<p>${d}</p>`:T.nothing} ${c&&!d?T.html`<p>${c}</p>`:T.nothing} ${i?T.html`<p>${i}</p>`:T.nothing} ${(m?.length??0)>0||(p?.length??0)>0?T.html`<div class="lists">${m?.length?T.html`<div><h3>Strengths</h3><ul>${m.map(R=>T.html`<li>${R}</li>`)}</ul></div>`:T.nothing} ${p?.length?T.html`<div><h3>Challenges</h3><ul>${p.map(R=>T.html`<li>${R}</li>`)}</ul></div>`:T.nothing}</div>`:T.nothing} ${h?.length?T.html`<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)">${h.slice(0,6).map(R=>T.html`<li>${At(R)}</li>`)}</ul></div>`:T.nothing}</article>`}};Te.styles=[g,T.css`.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}`],l([(0,Ar.property)({attribute:!1})],Te.prototype,"data",2),l([(0,Ar.property)({type:String,reflect:!0})],Te.prototype,"mode",2),Te=l([(0,Ar.customElement)("roxy-compatibility-card")],Te);function At(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${v(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}var ce=require("lit"),Nr=require("lit/decorators.js");var Nt=["January","February","March","April","May","June","July","August","September","October","November","December"],Pe=class extends ce.LitElement{constructor(){super();this.data=null;this.heading="";new y(this)}render(){let e=this.data,r=e?.crystals??[];if(!e||r.length===0)return ce.html`<div class="roxy-empty" role="status">No crystals</div>`;let a=this.heading||this.deriveHeading(e),t="total"in e&&typeof e.total=="number"?e.total:r.length;return ce.html`<section class="wrap" aria-label="${a}"><header class="head"><h2 class="title">${a}</h2><span class="count">${t} ${t===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(s=>ce.html`<li class="tile">${s.imageUrl?ce.html`<img class="photo" src="${s.imageUrl}" alt="${s.name??"Crystal"}" loading="lazy">`:ce.html`<div class="photo" aria-hidden="true"></div>`}<p class="name">${s.name}</p>${s.colors&&s.colors.length>0?ce.html`<div class="colors" aria-label="${`Colours: ${s.colors.join(", ")}`}">${s.colors.map(i=>ce.html`<span class="swatch" style="${`background:${zt(i)}`}" title="${i}"></span>`)}</div>`:ce.nothing}</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"?`${Nt[e.month-1]??""} birthstones`.trim():"Crystals"}};Pe.styles=[g,ce.css`.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}`],l([(0,Nr.property)({attribute:!1})],Pe.prototype,"data",2),l([(0,Nr.property)({type:String,reflect:!0})],Pe.prototype,"heading",2),Pe=l([(0,Nr.customElement)("roxy-crystal-grid")],Pe);function zt(o){return o.trim().toLowerCase().replace(/\s+/g,"")}var k=require("lit"),zr=require("lit/decorators.js");var Ae=class extends k.LitElement{constructor(){super();this.data=null;this.period="current";new y(this)}render(){let e=this.data;if(!e)return k.html`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),a=r.length?Math.max(...r.map(t=>t.durationYears)):0;return k.html`<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?k.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?k.html`(lord ${e.nakshatraLord})`:k.nothing}</div>`:k.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):k.nothing} ${r.length>0?k.html`<div class="timeline" role="list">${r.map(t=>this.renderBar(t,a))}</div>`:k.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return k.nothing;let r=e.birthDashaBalance,a="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",t=r.years??0,s=r.months??0,i=r.days??0,d=[];t&&d.push(`${t}y`),s&&d.push(`${s}m`),i&&d.push(`${i}d`);let c=d.length?d.join(" "):"0d";return k.html`<p class="balance">Birth dasha balance: ${c} of ${a?k.html`<strong>${a}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(a=>this.isCurrent(a));return r?.interpretation?k.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:k.nothing}renderCurrent(e){return"mahadasha"in e?k.html`<div class="current">${"mahadasha"in e&&e.mahadasha?k.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?k.html`<small>${v(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:k.nothing}</div>`:k.nothing} ${"antardasha"in e&&e.antardasha?k.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?k.html`<small>${v(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:k.nothing}</div>`:k.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?k.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?k.html`<small>${v(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:k.nothing}</div>`:k.nothing}</div>`:k.nothing}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(),a=Date.parse(e.startDate),t=Date.parse(e.endDate);return Number.isNaN(a)||Number.isNaN(t)?!1:r>=a&&r<t}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),a=Date.parse(e.endDate),t=Date.now();return Number.isNaN(r)||Number.isNaN(a)||t<r||t>=a||a<=r?-1:(t-r)/(a-r)}renderBar(e,r){let a=e.durationYears,t=r>0?a/r*100:0,s=this.isCurrent(e),i=s?this.progressIn(e):-1,d=s?"bar-track bar-now":"bar-track";return k.html`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?k.html`<span class="now-badge">Now</span>`:k.nothing} </span><span class="${d}"><span class="bar-fill" style="width:${t}%"></span> ${i>=0?k.html`<span class="bar-progress" style="left:${i*t}%" aria-hidden="true"></span>`:k.nothing} </span><span class="dates">${e.startDate?Za(e.startDate):""} ${e.endDate?k.html`- ${Za(e.endDate)}`:""}</span></div>`}};Ae.styles=[g,k.css`.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)}`],l([(0,zr.property)({attribute:!1})],Ae.prototype,"data",2),l([(0,zr.property)({type:String,reflect:!0})],Ae.prototype,"period",2),Ae=l([(0,zr.customElement)("roxy-dasha-timeline")],Ae);function Za(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}var E=require("lit"),Er=require("lit/decorators.js");var Et=["title","name","label","heading","overview","summary"],Mt=["imageUrl","image","icon","symbol"],Dt=["imageUrl","image"],Gt=6,Ne=class extends E.LitElement{constructor(){super();this.data=null;this.depth=0;new y(this)}render(){return this.data==null?E.html`<div class="roxy-empty" role="status">No data</div>`:this.depth>=Gt?E.html`<div class="roxy-empty" role="status">…</div>`:E.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?E.nothing:typeof e=="string"?E.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?E.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?E.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(t=>t===null||["string","number","boolean"].includes(typeof t))?E.html`<ul class="roxy-chips">${e.map(t=>E.html`<li>${String(t)}</li>`)}</ul>`:e.every(t=>t!==null&&typeof t=="object"&&!Array.isArray(t))?this.renderTable(e):E.html`<ol>${e.map(t=>E.html`<li>${this.renderValue(t)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return E.html`<table class="roxy-table" role="table"><thead><tr>${r.map(a=>E.html`<th>${be(a)}</th>`)}</tr></thead><tbody>${e.map(a=>E.html`<tr>${r.map(t=>E.html`<td>${this.formatPrimitive(a[t])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=Et.find(i=>typeof e[i]=="string"),a=Mt.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),t=r!=="summary"&&typeof e.summary=="string"?"summary":null,s=Object.entries(e).filter(([i,d])=>i!==r&&i!==t&&!Dt.includes(i)&&d!==null&&d!==void 0);return E.html`${a?E.html`<img class="roxy-image" src="${String(e[a])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:E.nothing} ${r?E.html`<h3 class="roxy-title">${e[r]}</h3>`:E.nothing} ${t?E.html`<p class="roxy-summary">${e[t]}</p>`:E.nothing} ${s.length>0?E.html`<dl class="roxy-rows">${s.map(([i,d])=>E.html`<dt>${be(i)}</dt><dd>${this.renderField(d)}</dd>`)}</dl>`:E.nothing}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(a=>["string","number","boolean"].includes(typeof a))?E.html`<ul class="roxy-chips">${e.map(a=>E.html`<li>${String(a)}</li>`)}</ul>`:E.html`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let a of e)for(let t of Object.keys(a))r.add(t);return Array.from(r)}};Ne.styles=[g,E.css`.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}`],l([(0,Er.property)({attribute:!1})],Ne.prototype,"data",2),l([(0,Er.property)({attribute:!1})],Ne.prototype,"depth",2),Ne=l([(0,Er.customElement)("roxy-data")],Ne);var le=require("lit"),Mr=require("lit/decorators.js");var C=require("lit");function we(o){let n=o%360;return n<0?n+360:n}function ke(o){let n=we(o),e=Math.floor(n/30)%12,r=n%30,a=Math.floor(r),t=(r-a)*60,s=Math.floor(t),i=Math.round((t-s)*60);return{sign:ee[e]??"Aries",signIndex:e,degree:a,minute:s,second:i}}function ta(o){let{sign:n,degree:e,minute:r}=ke(o);return`${e}\xB0 ${n} ${String(r).padStart(2,"0")}'`}function Ta(o){return we(o+180)}function Qa(o,n){let e=we(o),r=we(n)-e;return r<0&&(r+=360),we(e+r/2)}function H(o,n,e,r){let a=r*Math.PI/180;return{x:o+e*Math.cos(a),y:n+e*Math.sin(a)}}var pr=require("lit"),Je=pr.css`.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 xr(o){let{items:n,active:e,onSelect:r,label:a,idPrefix:t,controls:s=!1}=o;return pr.html`<div class="roxy-tablist" role="tablist" aria-label="${a}" @keydown="${d=>{if(d.key!=="ArrowRight"&&d.key!=="ArrowLeft")return;d.preventDefault();let c=n.findIndex(R=>R.id===e);if(c===-1)return;let m=d.key==="ArrowRight"?1:-1,p=n[(c+m+n.length)%n.length];if(!p)return;r(p.id);let h=d.currentTarget.getRootNode();requestAnimationFrame(()=>{h.querySelector(`#${t}-tab-${p.id}`)?.focus()})}}">${n.map(d=>pr.html`<button type="button" class="roxy-tab" role="tab" id="${t}-tab-${d.id}" aria-selected="${e===d.id?"true":"false"}" aria-controls="${s&&e===d.id?`${t}-panel-${d.id}`:pr.nothing}" tabindex="${e===d.id?"0":"-1"}" @click="${()=>r(d.id)}">${d.label}</button>`)}</div>`}var fe=400,I=20,se=fe-2*I,W=fe/2,et=Object.fromEntries(ee.map(o=>[o.toLowerCase(),o])),Ot=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Ht="\u02B3";function rt(o,n){return typeof o.longitude!="number"||!Number.isFinite(o.longitude)?!1:ke(o.longitude).sign.toLowerCase()!==n.toLowerCase()}function It(o,n){let e=Ba[f(o.graha)]??o.graha.slice(0,2),r=o.isRetrograde?Ht:"";if(typeof o.longitude!="number"||!Number.isFinite(o.longitude)||rt(o,n))return`${e}${r}`;let{degree:a}=ke(o.longitude);return`${e} ${a}\xB0${r}`}function jt(o,n){let e=[f(o.graha)],r=rt(o,n);if(r&&e.push(`in ${n}`),typeof o.longitude=="number"&&Number.isFinite(o.longitude)){let a=ke(o.longitude),t=String(a.minute).padStart(2,"0");e.push(r?`D1: ${a.degree}\xB0${t}' ${a.sign}`:`${a.degree}\xB0${t}' ${a.sign}`)}if(o.nakshatra?.name){let a=o.nakshatra.pada?` pada ${o.nakshatra.pada}`:"";e.push(`${o.nakshatra.name}${a}`)}return o.awastha&&e.push(o.awastha),o.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Pa(o,n,e,r,a){let t=r-(o.length-1)*a/2;return o.map((s,i)=>{let d=t+i*a;return C.svg`<text class="planet-text" x=${e} y=${d} text-anchor="middle" dominant-baseline="central">${It(s,n)}<title>${jt(s,n)}</title></text>`})}function oa(o,n,e){let r={};for(let s of ee)r[s.toLowerCase()]=[];let a=e?et[e.toLowerCase()]??"":"",t=a;for(let[s,i]of Object.entries(o??{})){let d=(i?.rashi??"").toLowerCase();if(s==="Lagna"||i?.graha==="Lagna"){a||(t=et[d]??"");continue}!d||!(d in r)||r[d]?.push({graha:i.graha??s,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:t,placements:r,divisionLabel:n}}var mr=se/4,Bt={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 _t(o){let n=Bt[o]??{col:0,row:0};return{x:I+n.col*mr,y:I+n.row*mr,w:mr,h:mr}}function Kt(o){let n=I,e=I+mr,r=I+2*mr,a=I+3*mr,t=fe-I;return C.svg`
11
+ <rect class="line" x=${n} y=${n} width=${se} height=${se} stroke-width="1.5" fill="none" />
12
+ <line class="line" x1=${n} y1=${e} x2=${t} y2=${e} stroke-width="1" />
13
+ <line class="line" x1=${n} y1=${a} x2=${t} y2=${a} stroke-width="1" />
14
+ <line class="line" x1=${e} y1=${n} x2=${e} y2=${t} stroke-width="1" />
15
+ <line class="line" x1=${a} y1=${n} x2=${a} y2=${t} stroke-width="1" />
16
16
  <line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
17
- <line class="line" x1=${t} y1=${r} x2=${a} y2=${r} stroke-width="1" />
17
+ <line class="line" x1=${a} y1=${r} x2=${t} y2=${r} stroke-width="1" />
18
18
  <line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
19
- <line class="line" x1=${r} y1=${t} x2=${r} y2=${a} stroke-width="1" />
20
- ${o?S.svg`<text class="centre-label" x=${F} y=${F} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
21
- `}function jt(o,n){let e=Q.findIndex(t=>t===n),r=Q.findIndex(t=>t===o);return e===-1||r===-1?0:(r-e+12)%12+1}function Pa(o,n,e,r){let t=Sa(o),a=t.x+t.w/2,s=t.y+t.h/2,i=Ir[o]??o.slice(0,2),l=14;return S.svg`
19
+ <line class="line" x1=${r} y1=${a} x2=${r} y2=${t} stroke-width="1" />
20
+ ${o?C.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${o}</text>`:C.nothing}
21
+ `}function at(o,n){let e=ee.findIndex(a=>a===n),r=ee.findIndex(a=>a===o);return e===-1||r===-1?0:(r-e+12)%12+1}function qt(o,n,e,r){let a=_t(o),t=a.x+a.w/2,s=a.y+a.h/2,i=Jr[o]??o.slice(0,2),d=14;return C.svg`
22
22
  <g class=${e?"cell lagna":"cell"}>
23
- ${e?S.svg`
24
- <rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
25
- <line class="lagna-slash" x1=${t.x+t.w-l} y1=${t.y+l} x2=${t.x+l} y2=${t.y+t.h-l} stroke-width="1.2" />
26
- `:S.nothing}
27
- <text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
28
- ${r>0?S.svg`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:S.nothing}
29
- ${e?S.svg`<text class="lagna-marker" x=${a} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:S.nothing}
30
- ${n.length?ht(n,o,a,s+4,14):S.nothing}
23
+ ${e?C.svg`
24
+ <rect class="lagna-bg" x=${a.x} y=${a.y} width=${a.w} height=${a.h} />
25
+ <line class="lagna-slash" x1=${a.x+a.w-d} y1=${a.y+d} x2=${a.x+d} y2=${a.y+a.h-d} stroke-width="1.2" />
26
+ `:C.nothing}
27
+ <text class="sign-text" x=${a.x+6} y=${a.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
28
+ ${r>0?C.svg`<text class="house-num" x=${a.x+a.w-6} y=${a.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:C.nothing}
29
+ ${e?C.svg`<text class="lagna-marker" x=${t} y=${a.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:C.nothing}
30
+ ${n.length?Pa(n,o,t,s+4,14):C.nothing}
31
31
  </g>
32
- `}function La(o){let n=o.lagnaSign.toLowerCase();return S.svg`
33
- ${Ca(o.divisionLabel)}
34
- ${Q.map(e=>Pa(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,jt(e,o.lagnaSign)))}
35
- `}var M={tl:{x:O,y:O},tr:{x:ue-O,y:O},br:{x:ue-O,y:ue-O},bl:{x:O,y:ue-O},top:{x:F,y:O},right:{x:ue-O,y:F},bottom:{x:F,y:ue-O},left:{x:O,y:F},tlMid:{x:F-te/4,y:F-te/4},trMid:{x:F+te/4,y:F-te/4},brMid:{x:F+te/4,y:F+te/4},blMid:{x:F-te/4,y:F+te/4}};function Pe(o){let n=o.reduce((r,t)=>r+t.x,0)/o.length,e=o.reduce((r,t)=>r+t.y,0)/o.length;return{x:n,y:e}}var Ta={1:{x:F,y:M.tlMid.y},2:Pe([M.tl,M.top,M.tlMid]),3:Pe([M.tl,M.left,M.tlMid]),4:{x:M.tlMid.x,y:F},5:Pe([M.bl,M.left,M.blMid]),6:Pe([M.bl,M.bottom,M.blMid]),7:{x:F,y:M.blMid.y},8:Pe([M.br,M.bottom,M.brMid]),9:Pe([M.br,M.right,M.brMid]),10:{x:M.brMid.x,y:F},11:Pe([M.tr,M.right,M.trMid]),12:Pe([M.tr,M.top,M.trMid])};function Ra(o,n){let e=Q.findIndex(r=>r===n);return e===-1?o:(e+o-1)%12+1}function Aa(o){let{tl:n,tr:e,br:r,bl:t,top:a,right:s,bottom:i,left:l}=M;return S.svg`
36
- <rect class="line" x=${n.x} y=${n.y} width=${te} height=${te} stroke-width="1.5" fill="none" />
37
- <polygon class="line" points="${a.x},${a.y} ${s.x},${s.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
32
+ `}function Yt(o){let n=o.lagnaSign.toLowerCase();return C.svg`
33
+ ${Kt(o.divisionLabel)}
34
+ ${ee.map(e=>qt(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,at(e,o.lagnaSign)))}
35
+ `}var G={tl:{x:I,y:I},tr:{x:fe-I,y:I},br:{x:fe-I,y:fe-I},bl:{x:I,y:fe-I},top:{x:W,y:I},right:{x:fe-I,y:W},bottom:{x:W,y:fe-I},left:{x:I,y:W},tlMid:{x:W-se/4,y:W-se/4},trMid:{x:W+se/4,y:W-se/4},brMid:{x:W+se/4,y:W+se/4},blMid:{x:W-se/4,y:W+se/4}};function ze(o){let n=o.reduce((r,a)=>r+a.x,0)/o.length,e=o.reduce((r,a)=>r+a.y,0)/o.length;return{x:n,y:e}}var Ft={1:{x:W,y:G.tlMid.y},2:ze([G.tl,G.top,G.tlMid]),3:ze([G.tl,G.left,G.tlMid]),4:{x:G.tlMid.x,y:W},5:ze([G.bl,G.left,G.blMid]),6:ze([G.bl,G.bottom,G.blMid]),7:{x:W,y:G.blMid.y},8:ze([G.br,G.bottom,G.brMid]),9:ze([G.br,G.right,G.brMid]),10:{x:G.brMid.x,y:W},11:ze([G.tr,G.right,G.trMid]),12:ze([G.tr,G.top,G.trMid])};function Vt(o,n){let e=ee.findIndex(r=>r===n);return e===-1?o:(e+o-1)%12+1}function Ut(o){let{tl:n,tr:e,br:r,bl:a,top:t,right:s,bottom:i,left:d}=G;return C.svg`
36
+ <rect class="line" x=${n.x} y=${n.y} width=${se} height=${se} stroke-width="1.5" fill="none" />
37
+ <polygon class="line" points="${t.x},${t.y} ${s.x},${s.y} ${i.x},${i.y} ${d.x},${d.y}" stroke-width="1" fill="none" />
38
38
  <line class="line" x1=${n.x} y1=${n.y} x2=${r.x} y2=${r.y} stroke-width="1" />
39
- <line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
40
- ${o?S.svg`<text class="centre-label" x=${F} y=${F} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
41
- `}function Ea(o,n,e,r,t){let a=Ta[o];if(!a)return S.svg``;let s=Math.min(14,Math.abs(a.y-F)*.45+6),i=s+12,l=t?`${n} \xB7 ${Ir[e]??e.slice(0,2)}`:`${n}`;return S.svg`
42
- <g class=${t?"cell lagna":"cell"}>
43
- <text class="rashi-num" x=${a.x} y=${a.y-s} text-anchor="middle" dominant-baseline="central">${l}</text>
44
- ${t?S.svg`<text class="lagna-marker" x=${a.x} y=${a.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:S.nothing}
45
- ${r.length?ht(r,e,a.x,a.y+8,12):S.nothing}
39
+ <line class="line" x1=${e.x} y1=${e.y} x2=${a.x} y2=${a.y} stroke-width="1" />
40
+ ${o?C.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${o}</text>`:C.nothing}
41
+ `}function Wt(o,n,e,r,a){let t=Ft[o];if(!t)return C.svg``;let s=Math.min(14,Math.abs(t.y-W)*.45+6),i=s+12,d=a?`${n} \xB7 ${Jr[e]??e.slice(0,2)}`:`${n}`;return C.svg`
42
+ <g class=${a?"cell lagna":"cell"}>
43
+ <text class="rashi-num" x=${t.x} y=${t.y-s} text-anchor="middle" dominant-baseline="central">${d}</text>
44
+ ${a?C.svg`<text class="lagna-marker" x=${t.x} y=${t.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:C.nothing}
45
+ ${r.length?Pa(r,e,t.x,t.y+8,12):C.nothing}
46
46
  </g>
47
- `}function Na(o){let n=o.lagnaSign||"Aries";return S.svg`
48
- ${Aa(o.divisionLabel)}
49
- ${Array.from({length:12},(e,r)=>{let t=r+1,a=Ra(t,n),s=Q[a-1]??"Aries";return Ea(t,a,s,o.placements[s.toLowerCase()]??[],t===1)})}
50
- `}var Fr=te/3;function za(){let o=O,n=O+Fr,e=O+2*Fr,r=ue-O,Dr={Aries:[{x:n,y:o},{x:e,y:o},{x:e,y:n},{x:n,y:n}],Taurus:[{x:o,y:o},{x:n,y:o},{x:n,y:n}],Gemini:[{x:o,y:o},{x:n,y:n},{x:o,y:n}],Cancer:[{x:o,y:n},{x:n,y:n},{x:n,y:e},{x:o,y:e}],Leo:[{x:o,y:e},{x:n,y:e},{x:o,y:r}],Virgo:[{x:n,y:e},{x:n,y:r},{x:o,y:r}],Libra:[{x:n,y:e},{x:e,y:e},{x:e,y:r},{x:n,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:n},{x:r,y:n},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:o},{x:r,y:n},{x:e,y:n}],Pisces:[{x:e,y:o},{x:r,y:o},{x:e,y:n}]},xr={};for(let[Gr,Or]of Object.entries(Dr))xr[Gr]={points:[...Or],centroid:Pe(Or)};return xr}var Ma=za();function Da(o){let n=O,e=O+Fr,r=O+2*Fr,t=ue-O;return S.svg`
51
- <rect class="line" x=${n} y=${n} width=${te} height=${te} stroke-width="1.5" fill="none" />
47
+ `}function Jt(o){let n=o.lagnaSign||"Aries";return C.svg`
48
+ ${Ut(o.divisionLabel)}
49
+ ${Array.from({length:12},(e,r)=>{let a=r+1,t=Vt(a,n),s=ee[t-1]??"Aries";return Wt(a,t,s,o.placements[s.toLowerCase()]??[],a===1)})}
50
+ `}var sa=se/3;function Xt(){let o=I,n=I+sa,e=I+2*sa,r=fe-I,qr={Aries:[{x:n,y:o},{x:e,y:o},{x:e,y:n},{x:n,y:n}],Taurus:[{x:o,y:o},{x:n,y:o},{x:n,y:n}],Gemini:[{x:o,y:o},{x:n,y:n},{x:o,y:n}],Cancer:[{x:o,y:n},{x:n,y:n},{x:n,y:e},{x:o,y:e}],Leo:[{x:o,y:e},{x:n,y:e},{x:o,y:r}],Virgo:[{x:n,y:e},{x:n,y:r},{x:o,y:r}],Libra:[{x:n,y:e},{x:e,y:e},{x:e,y:r},{x:n,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:n},{x:r,y:n},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:o},{x:r,y:n},{x:e,y:n}],Pisces:[{x:e,y:o},{x:r,y:o},{x:e,y:n}]},Lr={};for(let[Yr,Fr]of Object.entries(qr))Lr[Yr]={points:[...Fr],centroid:ze(Fr)};return Lr}var Zt=Xt();function Qt(o){let n=I,e=I+sa,r=I+2*sa,a=fe-I;return C.svg`
51
+ <rect class="line" x=${n} y=${n} width=${se} height=${se} stroke-width="1.5" fill="none" />
52
52
  <line class="line" x1=${n} y1=${e} x2=${e} y2=${e} stroke-width="1" />
53
- <line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
53
+ <line class="line" x1=${r} y1=${e} x2=${a} y2=${e} stroke-width="1" />
54
54
  <line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
55
- <line class="line" x1=${r} y1=${r} x2=${t} y2=${r} stroke-width="1" />
55
+ <line class="line" x1=${r} y1=${r} x2=${a} y2=${r} stroke-width="1" />
56
56
  <line class="line" x1=${e} y1=${n} x2=${e} y2=${e} stroke-width="1" />
57
- <line class="line" x1=${e} y1=${r} x2=${e} y2=${t} stroke-width="1" />
57
+ <line class="line" x1=${e} y1=${r} x2=${e} y2=${a} stroke-width="1" />
58
58
  <line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
59
- <line class="line" x1=${r} y1=${r} x2=${r} y2=${t} stroke-width="1" />
59
+ <line class="line" x1=${r} y1=${r} x2=${r} y2=${a} stroke-width="1" />
60
60
  <line class="line" x1=${n} y1=${n} x2=${e} y2=${e} stroke-width="1" />
61
- <line class="line" x1=${t} y1=${n} x2=${r} y2=${e} stroke-width="1" />
62
- <line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
63
- <line class="line" x1=${n} y1=${t} x2=${e} y2=${r} stroke-width="1" />
64
- ${o?S.svg`<text class="centre-label" x=${F} y=${F} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
65
- `}function Ga(o,n,e,r){let t=Ma[o];if(!t)return S.svg``;let{centroid:a,points:s}=t,i=Ir[o]??o.slice(0,2),l=s.map(c=>`${c.x},${c.y}`).join(" ");return S.svg`
61
+ <line class="line" x1=${a} y1=${n} x2=${r} y2=${e} stroke-width="1" />
62
+ <line class="line" x1=${a} y1=${a} x2=${r} y2=${r} stroke-width="1" />
63
+ <line class="line" x1=${n} y1=${a} x2=${e} y2=${r} stroke-width="1" />
64
+ ${o?C.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${o}</text>`:C.nothing}
65
+ `}function es(o,n,e,r){let a=Zt[o];if(!a)return C.svg``;let{centroid:t,points:s}=a,i=Jr[o]??o.slice(0,2),d=s.map(c=>`${c.x},${c.y}`).join(" ");return C.svg`
66
66
  <g class=${e?"cell lagna":"cell"}>
67
- ${e?S.svg`<polygon class="lagna-bg" points=${l} />`:S.nothing}
68
- <text class="sign-text" x=${a.x} y=${a.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
69
- ${r>0?S.svg`<text class="house-num" x=${a.x+18} y=${a.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:S.nothing}
70
- ${e?S.svg`<text class="lagna-marker" x=${a.x} y=${a.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:S.nothing}
71
- ${n.length?ht(n,o,a.x,a.y+4,12):S.nothing}
67
+ ${e?C.svg`<polygon class="lagna-bg" points=${d} />`:C.nothing}
68
+ <text class="sign-text" x=${t.x} y=${t.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
69
+ ${r>0?C.svg`<text class="house-num" x=${t.x+18} y=${t.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:C.nothing}
70
+ ${e?C.svg`<text class="lagna-marker" x=${t.x} y=${t.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:C.nothing}
71
+ ${n.length?Pa(n,o,t.x,t.y+4,12):C.nothing}
72
72
  </g>
73
- `}function Oa(o){let n=o.lagnaSign.toLowerCase();return S.svg`
74
- ${Da(o.divisionLabel)}
75
- ${Q.map(e=>Ga(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,jt(e,o.lagnaSign)))}
76
- `}function Wr(o,n){switch(n){case"north":return Na(o);case"east":return Oa(o);default:return La(o)}}function Jr(o,n){return lr({items:ba,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}var Bt=require("lit"),Xr=Bt.css`.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 Le=class extends ne.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Ur(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return ne.html`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return ne.html`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?ne.html`<span class="division-meta">· ${r.sanskritName}</span>`:ne.nothing}</h2>${r.significance?ne.html`<p class="significance">${r.significance}</p>`:ne.nothing}</div>${Jr(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>${Wr(e,this.chartStyle)}</svg> ${t&&t.length>0?ne.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(a=>ne.html`<span class="vargottama-pill" role="listitem">${I[a]??""} ${a}</span>`)}</div>`:ne.nothing}</div>`}};Le.styles=[y,Xr,Ke,ne.css`.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}`],d([(0,Sr.property)({attribute:!1})],Le.prototype,"data",2),d([(0,Sr.property)({type:String,reflect:!0,attribute:"chart-style"})],Le.prototype,"chartStyle",2),Le=d([(0,Sr.customElement)("roxy-divisional-chart")],Le);var W=require("lit"),Cr=require("lit/decorators.js");var Ha={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Te=class extends W.LitElement{constructor(){super();this.data=null;this.type="manglik";new h(this)}render(){let e=this.data;if(!e)return W.html`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=Ha[this.type]??this.type,a=(e.severity??"").toLowerCase(),s=a==="severe"?3:a==="moderate"?2:a==="mild"?1:0,i=s*33,l=s===3?"var(--roxy-danger)":s===2?"var(--roxy-warning)":s===1?"var(--roxy-success)":"transparent";return W.html`<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?W.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${s}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:W.nothing} ${e.description?W.html`<p class="description">${e.description}</p>`:W.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?W.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>W.html`<li>${c}</li>`)}</ul></div>`:W.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?W.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>W.html`<li>${c}</li>`)}</ul></div>`:W.nothing}</article>`}renderEffects(e){if(!e.effects)return W.nothing;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?W.nothing:W.html`<div class="effects">${r.map(([t,a])=>W.html`<div><h3>${t}</h3><p>${a}</p></div>`)}</div>`}};Te.styles=[y,W.css`.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}`],d([(0,Cr.property)({attribute:!1})],Te.prototype,"data",2),d([(0,Cr.property)({type:String,reflect:!0})],Te.prototype,"type",2),Te=d([(0,Cr.customElement)("roxy-dosha-card")],Te);var J=require("lit"),pe=require("lit/decorators.js");var xt=new Map;async function Ia(o){let n=xt.get(o);return n||(n=fetch(o).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw xt.delete(o),e}),xt.set(o,n)),n}var ae=class extends J.LitElement{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 Ia(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 a=e.components?.schemas??{},s=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,a)}if(i?.properties){let c=new Set(i.required??[]);for(let[m,p]of Object.entries(i.properties)){let u=this.resolve(p,a)??{};s.push({name:m,type:this.fieldType(u),required:c.has(m),description:u.description,enum:u.enum,min:u.minimum,max:u.maximum,default:u.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let m=this.resolve(c.schema,a)??{};s.push({name:c.name,type:this.fieldType(m),required:!!c.required,description:m.description,enum:m.enum,default:m.default})}this.fields=s,this.hasLocation=s.some(c=>c.name==="latitude")&&s.some(c=>c.name==="longitude")&&s.some(c=>c.name==="timezone");let l={};for(let c of s)c.default!==void 0&&(l[c.name]=c.default);this.values=l,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 J.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return J.html`<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 J.nothing;let t=`roxy-form-${r.name}`;return J.html`<div class="field"><label for="${t}">${ye(r.name)}${r.required?J.html`<span class="req" aria-hidden="true">*</span>`:J.nothing}</label> ${r.enum?J.html`<select id="${t}" ?required="${r.required}" @change="${a=>this.setValue(r.name,a.target.value)}"><option value="">Choose</option>${r.enum.map(a=>J.html`<option value="${a}" ?selected="${this.values[r.name]===a}">${a}</option>`)}</select>`:J.html`<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="${a=>this.setValue(r.name,this.coerce(r.type,a.target.value))}">`} ${r.description?J.html`<small class="help">${r.description}</small>`:J.nothing}</div>`};return J.html`<form @submit="${this.onSubmit}"><h2 class="title">${ye(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?J.html`<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>`:J.nothing}<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}}};ae.styles=[y,J.css`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}`],d([(0,pe.property)({type:String,attribute:"data-endpoint"})],ae.prototype,"endpoint",2),d([(0,pe.property)({type:String})],ae.prototype,"method",2),d([(0,pe.property)({type:String,attribute:"spec-url"})],ae.prototype,"specUrl",2),d([(0,pe.property)({type:String,attribute:"submit-label"})],ae.prototype,"submitLabel",2),d([(0,pe.state)()],ae.prototype,"fields",2),d([(0,pe.state)()],ae.prototype,"values",2),d([(0,pe.state)()],ae.prototype,"hasLocation",2),d([(0,pe.state)()],ae.prototype,"loaded",2),d([(0,pe.state)()],ae.prototype,"specError",2),ae=d([(0,pe.customElement)("roxy-endpoint-form")],ae);var K=require("lit"),Qr=require("lit/decorators.js");var ja={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Ba=["western","vedic","biorhythm"],Ye=class extends K.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return K.html`<div class="roxy-empty" role="status">No forecast data</div>`;let r=e.events??[],t=this.groupByDate(r),a=Ba.filter(s=>r.some(i=>i.domain===s));return K.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?K.html`<div class="range">${_e(e.startDate)} - ${_e(e.endDate)} · ${e.count??r.length} events</div>`:K.nothing}</header>${a.length?K.html`<div class="legend">${a.map(s=>K.html`<span><span class="swatch swatch-${s}"></span>${ja[s]}</span>`)}</div>`:K.nothing} ${t.length?K.html`<div class="days" role="list">${t.map(([s,i])=>this.renderDay(s,i))}</div>`:K.html`<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 a=t.date??"",s=r.get(a)??[];s.push(t),r.set(a,s)}return[...r.entries()]}renderDay(e,r){return K.html`<div class="day" role="listitem"><div class="day-date">${_e(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 K.html`<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?K.html`<p class="event-desc">${e.description}</p>`:K.nothing}<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?b(e.body):"",t=e.target?b(e.target):"",a=e.aspect?e.aspect.toLowerCase():"",s=tr[a]??"",i=a?fr[a]??a:"",l=typeof e.orb=="number"?v(e.orb,1):"",c=this.typeQualifier(e);return a&&t?K.html`<strong>${r}</strong> <span class="${s}">${i}</span> <strong>${t}</strong>${l?K.html`<span class="kind">orb ${l}°</span>`:K.nothing}`:K.html`<strong>${r||ye(e.type??"")}</strong>${c?K.html`<span class="kind">${c}</span>`:K.nothing}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${b(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 ${b(e.target)}`:ye(e.type??"")}};Ye.styles=[y,K.css`.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}`],d([(0,Qr.property)({attribute:!1})],Ye.prototype,"data",2),Ye=d([(0,Qr.customElement)("roxy-forecast-timeline")],Ye);var X=require("lit"),Zr=require("lit/decorators.js");var qe=class extends X.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return X.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(p=>p?.category!==void 0),t=e.total??0,a=e.maxScore??36,s=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",l=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,m=(100-s)*2.827;return X.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${v(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?X.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Gt(e.percentage,1)}</small>`:X.nothing}</div>${e.recommendation?X.html`<span class="recommendation">${e.recommendation}</span>`:X.nothing}</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="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${l}" stroke-width="8" stroke-dasharray="${c},${m}" 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">/${a}</text></svg></div></div>${r.length>0?X.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(p=>{let u=p.score??0,P=p.maxScore??_a(p.category),x=P?u/P*100:0;return X.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${x}%"></span></div></td><td class="score">${v(u,1)} / ${P}</td></tr>`})}</tbody></table>`:X.nothing} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?X.html`<div class="tags">${e.doshas?.map(p=>X.html`<span class="dosha">${p}</span>`)} ${e.doshaCancellations?.map(p=>X.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:X.nothing}</article>`}};qe.styles=[y,X.css`.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)}`],d([(0,Zr.property)({attribute:!1})],qe.prototype,"data",2),qe=d([(0,Zr.customElement)("roxy-guna-milan")],qe);function _a(o){if(!o)return 1;switch(o.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 T=require("lit"),Pr=require("lit/decorators.js");var Re=class extends T.LitElement{constructor(){super();this.data=null;this.mode="lookup";new h(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 T.html`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:a,dailyMessage:s,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(a??[]);return T.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?T.html`<div class="symbol">${r.symbol}</div>`:T.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((m,p)=>{let u=l.length-1-p+1,P=c.has(u),x=m===6||m===8;return T.html`<div class="line ${`${x?"broken":"solid"}${P?" changing":""}`}">${x?T.svg`<span class="seg"></span><span class="seg"></span>`:T.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?T.html`${r.number}.`:T.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?T.html`${r.chinese}`:T.nothing} ${r.pinyin?T.html`· ${r.pinyin}`:T.nothing}</p><div class="trigrams">${r.upperTrigram?T.html`<div>Upper <span class="tri-glyph">${dt[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:T.nothing} ${r.lowerTrigram?T.html`<div>Lower <span class="tri-glyph">${dt[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:T.nothing}</div>${r.judgment?T.html`<p class="judgment">${r.judgment}</p>`:T.nothing} ${r.image?T.html`<p class="image">${r.image}</p>`:T.nothing} ${s?T.html`<p class="message">${s}</p>`:T.nothing} ${r.interpretation?.general?T.html`<p>${r.interpretation.general}</p>`:T.nothing} ${c.size>0?T.html`<div class="changing">Changing lines: ${Array.from(c).sort((m,p)=>m-p).join(", ")}. ${i?.english?T.html`Becomes hexagram ${i.number} ${i.english}.`:T.nothing}</div>`:T.nothing}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,a=[];for(let s=0;s<6;s++){let i=t>>s&1;a.push(i?8:7)}return a}return Array.from({length:6},()=>7)}};Re.styles=[y,T.css`.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)}`],d([(0,Pr.property)({attribute:!1})],Re.prototype,"data",2),d([(0,Pr.property)({type:String,reflect:!0})],Re.prototype,"mode",2),Re=d([(0,Pr.customElement)("roxy-hexagram")],Re);var C=require("lit"),Lr=require("lit/decorators.js");var Ae=class extends C.LitElement{constructor(){super();this.data=null;this.period="daily";new h(this)}render(){let e=this.data;if(!e)return C.html`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?oe[b(r)]??"":"",a="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,s="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return C.html`<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>${s?C.html`<div class="date">${s}</div>`:C.nothing}</div>${a!==null?C.html`<span class="energy" aria-label="${`Energy ${a} of 10`}">Energy ${a}/10 <span class="energy-bar"><span style="width:${a/10*100}%"></span></span></span>`:C.nothing}</header>${e.overview?C.html`<p class="overview">${e.overview}</p>`:C.nothing}<div class="sections">${e.love?C.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:C.nothing} ${e.career?C.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:C.nothing} ${e.health?C.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:C.nothing} ${e.finance?C.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:C.nothing} ${"advice"in e&&e.advice?C.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:C.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],m="luckyDays"in e&&e.luckyDays?e.luckyDays:[],p=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&m.length===0&&p.length===0?C.nothing:C.html`<div class="lucky">${i!==void 0?C.html`<span>Lucky number <strong>${i}</strong></span>`:C.nothing} ${l?C.html`<span>Lucky color <strong>${l}</strong></span>`:C.nothing} ${c.length?C.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:C.nothing} ${m.length?C.html`<span>Lucky days <strong>${m.join(", ")}</strong></span>`:C.nothing} ${p.length?C.html`<span class="compat-wrap">Best with <span class="compat">${p.map(u=>C.html`<span>${u}</span>`)}</span></span>`:C.nothing}</div>`})()}</article>`}};Ae.styles=[y,C.css`.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}`],d([(0,Lr.property)({attribute:!1})],Ae.prototype,"data",2),d([(0,Lr.property)({type:String,reflect:!0})],Ae.prototype,"period",2),Ae=d([(0,Lr.customElement)("roxy-horoscope-card")],Ae);var D=require("lit"),dr=require("lit/decorators.js");var Ee=class extends D.LitElement{constructor(){super();this.data=null;this.activeTab="planets";new h(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.planet,sign:a.sign,house:a.house,nakshatra:a.nakshatra,starLord:a.starLord,subLord:a.subLord,subSubLord:a.subSubLord,kpNumber:a.kpNumber,retrograde:a.retrograde})),t=e.nodes;for(let[a,s]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])s&&r.push({name:a,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.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 D.html`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return D.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?D.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?D.html`· ${r.nakshatra}`:D.nothing} ${r.subLord?D.html`· sub lord ${r.subLord}`:D.nothing} ${typeof r.kpNumber=="number"?D.html`· KP ${r.kpNumber}`:D.nothing}</div>`:D.nothing} ${typeof e.meta?.ayanamsa=="number"?D.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${v(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?D.html`· ${e.meta.houseSystem} houses`:D.nothing}</div>`:D.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>D.html`<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?D.html`<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=>D.html`<tr><td class="body">${r.name}${r.retrograde?D.html`<span class="retro">R</span>`:D.nothing}</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>`:D.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?D.html`<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=>D.html`<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>`:D.html`<p class="roxy-empty" role="status">No cusps</p>`}};Ee.styles=[y,D.css`.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}`],d([(0,dr.property)({attribute:!1})],Ee.prototype,"data",2),d([(0,dr.state)()],Ee.prototype,"activeTab",2),Ee=d([(0,dr.customElement)("roxy-kp-chart")],Ee);var me=require("lit"),et=require("lit/decorators.js");var Ve=class extends me.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return me.html`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return me.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?me.html`<span class="ayanamsa">Ayanamsa: ${v(this.data.ayanamsa,2)}°</span>`:me.nothing}</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=>me.html`<tr><td class="planet">${r.planet} ${r.retrograde?me.html`<span class="retro">R</span>`:me.nothing}</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>`}};Ve.styles=[y,me.css`.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}`],d([(0,et.property)({attribute:!1})],Ve.prototype,"data",2),Ve=d([(0,et.customElement)("roxy-kp-planets-table")],Ve);var se=require("lit"),rt=require("lit/decorators.js");var Fe=class extends se.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return se.html`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return se.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?se.html`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:se.nothing}</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?se.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,a)=>se.html`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:se.nothing} ${r.length?se.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>se.html`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:se.nothing}</div>`}};Fe.styles=[y,se.css`.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}`],d([(0,rt.property)({attribute:!1})],Fe.prototype,"data",2),Fe=d([(0,rt.customElement)("roxy-kp-ruling-planets")],Fe);var le=require("lit"),de=require("lit/decorators.js");function _t(o,n){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,o(...t)},n)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ee=class extends le.LitElement{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=_t(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 a={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 s=this.publishableKey??this.apiKey;s&&(a["X-API-Key"]=s);let i=await fetch(t,{headers:a,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.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 le.html`<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?le.html`<span class="spinner" role="status" aria-label="Loading"></span>`:le.nothing} ${this.isOpen?le.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?le.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>le.html`<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?le.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:le.nothing}</div>`}};ee.styles=[y,le.css`: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)}`],d([(0,de.property)({type:String,attribute:"api-key"})],ee.prototype,"apiKey",2),d([(0,de.property)({type:String,attribute:"publishable-key"})],ee.prototype,"publishableKey",2),d([(0,de.property)({type:String})],ee.prototype,"endpoint",2),d([(0,de.property)({type:String})],ee.prototype,"placeholder",2),d([(0,de.property)({type:String,attribute:"default-value"})],ee.prototype,"defaultValue",2),d([(0,de.state)()],ee.prototype,"query",2),d([(0,de.state)()],ee.prototype,"results",2),d([(0,de.state)()],ee.prototype,"isOpen",2),d([(0,de.state)()],ee.prototype,"isLoading",2),d([(0,de.state)()],ee.prototype,"highlight",2),ee=d([(0,de.customElement)("roxy-location-search")],ee);var j=require("lit"),Tr=require("lit/decorators.js");var Ne=class extends j.LitElement{constructor(){super();this.data=null;this.mode="current";new h(this)}render(){let e=this.data;if(!e)return j.html`<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,a="year"in e?e.year:void 0;return j.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${a??""}</h2><div class="list" role="list">${r.map(s=>this.renderListItem(s))}</div></article>`}return"phase"in e?this.renderSingle(e):j.nothing}renderSingle(e){let r=Kt(e.phase);return j.html`<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?j.html`<div class="date">${e.date}</div>`:j.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?j.html`<div><span>Illumination</span> <strong>${Ka(e.illumination)}</strong></div>`:j.nothing} ${typeof e.age=="number"?j.html`<div><span>Age</span> <strong>${v(e.age,1)} days</strong></div>`:j.nothing} ${e.sign?j.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:j.nothing} ${typeof e.distance=="number"?j.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:j.nothing}</div>${e.meaning?.description?j.html`<p class="meaning">${e.meaning.description}</p>`:j.nothing} ${e.meaning?.keywords?.length?j.html`<div class="keywords">${e.meaning.keywords.map(t=>j.html`<span>${t}</span>`)}</div>`:j.nothing}</article>`}renderListItem(e){let r=Kt(e.phase);return j.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};Ne.styles=[y,j.css`.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}`],d([(0,Tr.property)({attribute:!1})],Ne.prototype,"data",2),d([(0,Tr.property)({type:String,reflect:!0})],Ne.prototype,"mode",2),Ne=d([(0,Tr.customElement)("roxy-moon-phase")],Ne);function Kt(o){return o?Pt[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Ka(o){let n=o<=1?o*100:o;return`${Math.round(n)}%`}var H=require("lit"),tt=require("lit/decorators.js");var Ue=class extends H.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return H.html`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return H.html`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?H.html`<span class="number">Nakshatra ${e.number} of 27</span>`:H.nothing} ${e.range?H.html`<span class="range">${e.range}</span>`:H.nothing}</header><dl class="facts">${e.lord?H.html`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:H.nothing} ${e.deity?H.html`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:H.nothing} ${e.symbol?H.html`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:H.nothing}</dl>${e.characteristics?H.html`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:H.nothing} ${r?H.html`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?H.html`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:H.nothing} ${r.gemstones?H.html`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:H.nothing} ${r.rituals?H.html`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:H.nothing}</div></div>`:H.nothing}</article>`}};Ue.styles=[y,H.css`.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)}`],d([(0,tt.property)({attribute:!1})],Ue.prototype,"data",2),Ue=d([(0,tt.customElement)("roxy-nakshatra-card")],Ue);var g=require("lit"),or=require("lit/decorators.js");var at=require("lit");function be(){return at.html`<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 cr=at.css`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 bt=420,$=bt/2,pr=164,ft=146,Rr=120,mr=96,Ya=178,qa=196,ve=class extends g.LitElement{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new h(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 g.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return g.html`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?g.html`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:g.nothing}</header>${lr({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:a=>{this.view=a},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?g.html`<span>${this.data.houseSystem} houses</span>`:g.nothing} <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 g.html`<svg viewBox="0 0 ${bt} ${bt}" 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="${$}" cy="${$}" r="${pr}" stroke-width="1.5"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${ft-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${Rr}" stroke-width="1"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${mr-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(s=>b(s.name)),a=new Map;for(let s of r){let i=[b(s.planet1),b(s.planet2)].sort().join("|");a.set(i,s)}return t.length===0?g.html`<p class="roxy-empty" role="status">No planets to grid</p>`:g.html`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(s=>{let i=I[s]??s.slice(0,2);return g.html`<th scope="col" title="${s}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((s,i)=>{let l=I[s]??s.slice(0,2);return g.html`<tr><th scope="row" title="${s}">${l}</th>${t.slice(0,i+1).map(c=>{let m=a.get([s,c].sort().join("|"));if(!m)return g.html`<td class="empty"></td>`;let p=ir(m),u=fr[p]??fr[p.replace(/-/g,"")]??p.slice(0,3),P=tr[p]??"aspect-other",x=v(m.orb,1);return g.html`<td class="${`cell ${P}`}" title="${`${s} ${p} ${c}${x?` (orb ${x}\xB0)`:""}`}"><span class="asp">${u}</span></td>`})} ${t.slice(i+1,-1).map(()=>g.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(ut(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(ut(r),"IC")));let a=this.data?.partOfFortune?.longitude;typeof a=="number"&&t.push(this.renderAngleMark(xe(a),"PoF"));let s=this.data?.vertex?.longitude;return typeof s=="number"&&t.push(this.renderAngleMark(xe(s),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),a=G($,$,pr,t),s=G($,$,Ya,t),i=G($,$,qa,t);return g.svg`
73
+ `}function rs(o){let n=o.lagnaSign.toLowerCase();return C.svg`
74
+ ${Qt(o.divisionLabel)}
75
+ ${ee.map(e=>es(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,at(e,o.lagnaSign)))}
76
+ `}function na(o,n){switch(n){case"north":return Jt(o);case"east":return rs(o);default:return Yt(o)}}function ia(o,n){return xr({items:Ot,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}var tt=require("lit"),la=tt.css`.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 Ee=class extends le.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new y(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return oa(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return le.html`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:a}=this.data;return le.html`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?le.html`<span class="division-meta">· ${r.sanskritName}</span>`:le.nothing}</h2>${r.significance?le.html`<p class="significance">${r.significance}</p>`:le.nothing}</div>${ia(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>${na(e,this.chartStyle)}</svg> ${a&&a.length>0?le.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${a.map(t=>le.html`<span class="vargottama-pill" role="listitem">${B[t]??""} ${t}</span>`)}</div>`:le.nothing}</div>`}};Ee.styles=[g,la,Je,le.css`.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}`],l([(0,Mr.property)({attribute:!1})],Ee.prototype,"data",2),l([(0,Mr.property)({type:String,reflect:!0,attribute:"chart-style"})],Ee.prototype,"chartStyle",2),Ee=l([(0,Mr.customElement)("roxy-divisional-chart")],Ee);var X=require("lit"),Dr=require("lit/decorators.js");var as={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Me=class extends X.LitElement{constructor(){super();this.data=null;this.type="manglik";new y(this)}render(){let e=this.data;if(!e)return X.html`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,a=as[this.type]??this.type,t=(e.severity??"").toLowerCase(),s=t==="severe"?3:t==="moderate"?2:t==="mild"?1:0,i=s*33,d=s===3?"var(--roxy-danger)":s===2?"var(--roxy-warning)":s===1?"var(--roxy-success)":"transparent";return X.html`<article class="card" aria-label="${a}"><header class="head"><h2 class="title">${a}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?X.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${s}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${d}"></span></div>`:X.nothing} ${e.description?X.html`<p class="description">${e.description}</p>`:X.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?X.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>X.html`<li>${c}</li>`)}</ul></div>`:X.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?X.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>X.html`<li>${c}</li>`)}</ul></div>`:X.nothing}</article>`}renderEffects(e){if(!e.effects)return X.nothing;let r=Object.entries(e.effects).filter(([,a])=>typeof a=="string"&&a.length>0);return r.length===0?X.nothing:X.html`<div class="effects">${r.map(([a,t])=>X.html`<div><h3>${a}</h3><p>${t}</p></div>`)}</div>`}};Me.styles=[g,X.css`.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}`],l([(0,Dr.property)({attribute:!1})],Me.prototype,"data",2),l([(0,Dr.property)({type:String,reflect:!0})],Me.prototype,"type",2),Me=l([(0,Dr.customElement)("roxy-dosha-card")],Me);var pe=require("lit"),da=require("lit/decorators.js");var Xe=class extends pe.LitElement{constructor(){super();this.data=null;new y(this)}render(){let e=this.data;return e?pe.html`<article class="card" aria-label="${e.name??"Dream symbol"}"><header class="head">${e.letter?pe.html`<span class="letter" aria-hidden="true">${e.letter}</span>`:pe.nothing}<div><p class="label">Dream symbol</p>${e.name?pe.html`<h2 class="name">${e.name}</h2>`:pe.nothing}</div></header>${e.meaning?pe.html`<p class="meaning">${e.meaning}</p>`:pe.nothing}</article>`:pe.html`<div class="roxy-empty" role="status">No dream symbol</div>`}};Xe.styles=[g,pe.css`.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}`],l([(0,da.property)({attribute:!1})],Xe.prototype,"data",2),Xe=l([(0,da.customElement)("roxy-dream-card")],Xe);var Z=require("lit"),ue=require("lit/decorators.js");var Aa=new Map;async function ts(o){let n=Aa.get(o);return n||(n=fetch(o).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Aa.delete(o),e}),Aa.set(o,n)),n}var oe=class extends Z.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(a=>a.required).filter(a=>this.values[a.name]===void 0||this.values[a.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(a=>a.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await ts(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,a=e.paths?.[r]?.[this.method.toLowerCase()];if(!a)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let t=e.components?.schemas??{},s=[],i;if(a.requestBody){let c=a.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,t)}if(i?.properties){let c=new Set(i.required??[]);for(let[m,p]of Object.entries(i.properties)){let h=this.resolve(p,t)??{};s.push({name:m,type:this.fieldType(h),required:c.has(m),description:h.description,enum:h.enum,min:h.minimum,max:h.maximum,default:h.default})}}for(let c of a.parameters??[])if(c.in==="path"||c.in==="query"){let m=this.resolve(c.schema,t)??{};s.push({name:c.name,type:this.fieldType(m),required:!!c.required,description:m.description,enum:m.enum,default:m.default})}this.fields=s,this.hasLocation=s.some(c=>c.name==="latitude")&&s.some(c=>c.name==="longitude")&&s.some(c=>c.name==="timezone");let d={};for(let c of s)c.default!==void 0&&(d[c.name]=c.default);this.values=d,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let a=e.$ref.split("/").pop();return a?r[a]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return Z.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return Z.html`<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 Z.nothing;let a=`roxy-form-${r.name}`;return Z.html`<div class="field"><label for="${a}">${be(r.name)}${r.required?Z.html`<span class="req" aria-hidden="true">*</span>`:Z.nothing}</label> ${r.enum?Z.html`<select id="${a}" ?required="${r.required}" @change="${t=>this.setValue(r.name,t.target.value)}"><option value="">Choose</option>${r.enum.map(t=>Z.html`<option value="${t}" ?selected="${this.values[r.name]===t}">${t}</option>`)}</select>`:Z.html`<input id="${a}" 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="${t=>this.setValue(r.name,this.coerce(r.type,t.target.value))}">`} ${r.description?Z.html`<small class="help">${r.description}</small>`:Z.nothing}</div>`};return Z.html`<form @submit="${this.onSubmit}"><h2 class="title">${be(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?Z.html`<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>`:Z.nothing}<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 a=Number(r);return Number.isFinite(a)?a:void 0}return r}}};oe.styles=[g,Z.css`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}`],l([(0,ue.property)({type:String,attribute:"data-endpoint"})],oe.prototype,"endpoint",2),l([(0,ue.property)({type:String})],oe.prototype,"method",2),l([(0,ue.property)({type:String,attribute:"spec-url"})],oe.prototype,"specUrl",2),l([(0,ue.property)({type:String,attribute:"submit-label"})],oe.prototype,"submitLabel",2),l([(0,ue.state)()],oe.prototype,"fields",2),l([(0,ue.state)()],oe.prototype,"values",2),l([(0,ue.state)()],oe.prototype,"hasLocation",2),l([(0,ue.state)()],oe.prototype,"loaded",2),l([(0,ue.state)()],oe.prototype,"specError",2),oe=l([(0,ue.customElement)("roxy-endpoint-form")],oe);var Y=require("lit"),ca=require("lit/decorators.js");var ss={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},os=["western","vedic","biorhythm"],Ze=class extends Y.LitElement{constructor(){super();this.data=null;new y(this)}render(){let e=this.data;if(!e)return Y.html`<div class="roxy-empty" role="status">No forecast data</div>`;let r=e.events??[],a=this.groupByDate(r),t=os.filter(s=>r.some(i=>i.domain===s));return Y.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?Y.html`<div class="range">${We(e.startDate)} - ${We(e.endDate)} · ${e.count??r.length} events</div>`:Y.nothing}</header>${t.length?Y.html`<div class="legend">${t.map(s=>Y.html`<span><span class="swatch swatch-${s}"></span>${ss[s]}</span>`)}</div>`:Y.nothing} ${a.length?Y.html`<div class="days" role="list">${a.map(([s,i])=>this.renderDay(s,i))}</div>`:Y.html`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(e){let r=new Map;for(let a of e){let t=a.date??"",s=r.get(t)??[];s.push(a),r.set(t,s)}return[...r.entries()]}renderDay(e,r){return Y.html`<div class="day" role="listitem"><div class="day-date">${We(e)}</div><div class="events">${r.map(a=>this.renderEvent(a))}</div></div>`}renderEvent(e){let r=typeof e.significance=="number"?e.significance:0,a=Math.max(0,Math.min(100,r));return Y.html`<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?Y.html`<p class="event-desc">${e.description}</p>`:Y.nothing}<div class="sig" title="Significance ${a} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${e.domain}" style="width:${a}%"></span> </span><span class="sig-val">${a}</span></div></div></div>`}renderHeadline(e){let r=e.body?f(e.body):"",a=e.target?f(e.target):"",t=e.aspect?e.aspect.toLowerCase():"",s=cr[t]??"",i=t?Rr[t]??t:"",d=typeof e.orb=="number"?v(e.orb,1):"",c=this.typeQualifier(e);return t&&a?Y.html`<strong>${r}</strong> <span class="${s}">${i}</span> <strong>${a}</strong>${d?Y.html`<span class="kind">orb ${d}°</span>`:Y.nothing}`:Y.html`<strong>${r||be(e.type??"")}</strong>${c?Y.html`<span class="kind">${c}</span>`:Y.nothing}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${f(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 ${f(e.target)}`:be(e.type??"")}};Ze.styles=[g,Y.css`.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}`],l([(0,ca.property)({attribute:!1})],Ze.prototype,"data",2),Ze=l([(0,ca.customElement)("roxy-forecast-timeline")],Ze);var Q=require("lit"),pa=require("lit/decorators.js");var Qe=class extends Q.LitElement{constructor(){super();this.data=null;new y(this)}render(){let e=this.data;if(!e)return Q.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(p=>p?.category!==void 0),a=e.total??0,t=e.maxScore??36,s=a/t*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",d=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,m=(100-s)*2.827;return Q.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${v(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?Q.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Xa(e.percentage,1)}</small>`:Q.nothing}</div>${e.recommendation?Q.html`<span class="recommendation">${e.recommendation}</span>`:Q.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${a}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8" stroke-dasharray="${c},${m}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${a}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${r.length>0?Q.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(p=>{let h=p.score??0,R=p.maxScore??ns(p.category),x=R?h/R*100:0;return Q.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${x}%"></span></div></td><td class="score">${v(h,1)} / ${R}</td></tr>`})}</tbody></table>`:Q.nothing} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?Q.html`<div class="tags">${e.doshas?.map(p=>Q.html`<span class="dosha">${p}</span>`)} ${e.doshaCancellations?.map(p=>Q.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:Q.nothing}</article>`}};Qe.styles=[g,Q.css`.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)}`],l([(0,pa.property)({attribute:!1})],Qe.prototype,"data",2),Qe=l([(0,pa.customElement)("roxy-guna-milan")],Qe);function ns(o){if(!o)return 1;switch(o.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 P=require("lit"),Gr=require("lit/decorators.js");var De=class extends P.LitElement{constructor(){super();this.data=null;this.mode="lookup";new y(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let a=e;return{hex:a.hexagram,lines:a.lines,changingLinePositions:a.changingLinePositions,resultingHexagram:a.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return P.html`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:a,changingLinePositions:t,dailyMessage:s,resultingHexagram:i}=e,d=a??this.derivedLines(r),c=new Set(t??[]);return P.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?P.html`<div class="symbol">${r.symbol}</div>`:P.nothing}<div class="lines" aria-hidden="true">${d.slice().reverse().map((m,p)=>{let h=d.length-1-p+1,R=c.has(h),x=m===6||m===8;return P.html`<div class="line ${`${x?"broken":"solid"}${R?" changing":""}`}">${x?P.svg`<span class="seg"></span><span class="seg"></span>`:P.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?P.html`${r.number}.`:P.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?P.html`${r.chinese}`:P.nothing} ${r.pinyin?P.html`· ${r.pinyin}`:P.nothing}</p><div class="trigrams">${r.upperTrigram?P.html`<div>Upper <span class="tri-glyph">${wa[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:P.nothing} ${r.lowerTrigram?P.html`<div>Lower <span class="tri-glyph">${wa[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:P.nothing}</div>${r.judgment?P.html`<p class="judgment">${r.judgment}</p>`:P.nothing} ${r.image?P.html`<p class="image">${r.image}</p>`:P.nothing} ${s?P.html`<p class="message">${s}</p>`:P.nothing} ${r.interpretation?.general?P.html`<p>${r.interpretation.general}</p>`:P.nothing} ${c.size>0?P.html`<div class="changing">Changing lines: ${Array.from(c).sort((m,p)=>m-p).join(", ")}. ${i?.english?P.html`Becomes hexagram ${i.number} ${i.english}.`:P.nothing}</div>`:P.nothing}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let a=r-19904,t=[];for(let s=0;s<6;s++){let i=a>>s&1;t.push(i?8:7)}return t}return Array.from({length:6},()=>7)}};De.styles=[g,P.css`.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)}`],l([(0,Gr.property)({attribute:!1})],De.prototype,"data",2),l([(0,Gr.property)({type:String,reflect:!0})],De.prototype,"mode",2),De=l([(0,Gr.customElement)("roxy-hexagram")],De);var L=require("lit"),Or=require("lit/decorators.js");var Ge=class extends L.LitElement{constructor(){super();this.data=null;this.period="daily";new y(this)}render(){let e=this.data;if(!e)return L.html`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",a=r?ie[f(r)]??"":"",t="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,s="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return L.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${a}</span><div><h2 class="title">${r} ${this.period}</h2>${s?L.html`<div class="date">${s}</div>`:L.nothing}</div>${t!==null?L.html`<span class="energy" aria-label="${`Energy ${t} of 10`}">Energy ${t}/10 <span class="energy-bar"><span style="width:${t/10*100}%"></span></span></span>`:L.nothing}</header>${e.overview?L.html`<p class="overview">${e.overview}</p>`:L.nothing}<div class="sections">${e.love?L.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:L.nothing} ${e.career?L.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:L.nothing} ${e.health?L.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:L.nothing} ${e.finance?L.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:L.nothing} ${"advice"in e&&e.advice?L.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:L.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,d="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],m="luckyDays"in e&&e.luckyDays?e.luckyDays:[],p=e.compatibleSigns??[];return i===void 0&&!d&&c.length===0&&m.length===0&&p.length===0?L.nothing:L.html`<div class="lucky">${i!==void 0?L.html`<span>Lucky number <strong>${i}</strong></span>`:L.nothing} ${d?L.html`<span>Lucky color <strong>${d}</strong></span>`:L.nothing} ${c.length?L.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:L.nothing} ${m.length?L.html`<span>Lucky days <strong>${m.join(", ")}</strong></span>`:L.nothing} ${p.length?L.html`<span class="compat-wrap">Best with <span class="compat">${p.map(h=>L.html`<span>${h}</span>`)}</span></span>`:L.nothing}</div>`})()}</article>`}};Ge.styles=[g,L.css`.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}`],l([(0,Or.property)({attribute:!1})],Ge.prototype,"data",2),l([(0,Or.property)({type:String,reflect:!0})],Ge.prototype,"period",2),Ge=l([(0,Or.customElement)("roxy-horoscope-card")],Ge);var O=require("lit"),br=require("lit/decorators.js");var Oe=class extends O.LitElement{constructor(){super();this.data=null;this.activeTab="planets";new y(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(t=>({name:t.planet,sign:t.sign,house:t.house,nakshatra:t.nakshatra,starLord:t.starLord,subLord:t.subLord,subSubLord:t.subSubLord,kpNumber:t.kpNumber,retrograde:t.retrograde})),a=e.nodes;for(let[t,s]of[["Rahu",a?.rahu],["Ketu",a?.ketu]])s&&r.push({name:t,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.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 O.html`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return O.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?O.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?O.html`· ${r.nakshatra}`:O.nothing} ${r.subLord?O.html`· sub lord ${r.subLord}`:O.nothing} ${typeof r.kpNumber=="number"?O.html`· KP ${r.kpNumber}`:O.nothing}</div>`:O.nothing} ${typeof e.meta?.ayanamsa=="number"?O.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${v(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?O.html`· ${e.meta.houseSystem} houses`:O.nothing}</div>`:O.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(a=>O.html`<button class="tab" role="tab" id="tab-${a}" aria-selected="${this.activeTab===a?"true":"false"}" aria-controls="panel-${a}" tabindex="${this.activeTab===a?"0":"-1"}" @click="${()=>{this.activeTab=a}}">${a==="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?O.html`<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=>O.html`<tr><td class="body">${r.name}${r.retrograde?O.html`<span class="retro">R</span>`:O.nothing}</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>`:O.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?O.html`<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=>O.html`<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>`:O.html`<p class="roxy-empty" role="status">No cusps</p>`}};Oe.styles=[g,O.css`.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}`],l([(0,br.property)({attribute:!1})],Oe.prototype,"data",2),l([(0,br.state)()],Oe.prototype,"activeTab",2),Oe=l([(0,br.customElement)("roxy-kp-chart")],Oe);var he=require("lit"),ma=require("lit/decorators.js");var er=class extends he.LitElement{constructor(){super();this.data=null;new y(this)}render(){if(!this.data)return he.html`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return he.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?he.html`<span class="ayanamsa">Ayanamsa: ${v(this.data.ayanamsa,2)}°</span>`:he.nothing}</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=>he.html`<tr><td class="planet">${r.planet} ${r.retrograde?he.html`<span class="retro">R</span>`:he.nothing}</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>`}};er.styles=[g,he.css`.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}`],l([(0,ma.property)({attribute:!1})],er.prototype,"data",2),er=l([(0,ma.customElement)("roxy-kp-planets-table")],er);var ne=require("lit"),ga=require("lit/decorators.js");var rr=class extends ne.LitElement{constructor(){super();this.data=null;new y(this)}render(){if(!this.data)return ne.html`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return ne.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?ne.html`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:ne.nothing}</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?ne.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((a,t)=>ne.html`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${a}</span>`)}</div>`:ne.nothing} ${r.length?ne.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(a=>ne.html`<tr><td>${a.planet}</td><td>${(a.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:ne.nothing}</div>`}};rr.styles=[g,ne.css`.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}`],l([(0,ga.property)({attribute:!1})],rr.prototype,"data",2),rr=l([(0,ga.customElement)("roxy-kp-ruling-planets")],rr);var me=require("lit"),ge=require("lit/decorators.js");function st(o,n){let e,r=((...a)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,o(...a)},n)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ae=class extends me.LitElement{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=st(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let a=new URL(this.endpoint);a.searchParams.set("q",e),a.searchParams.set("limit","8");let t={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 s=this.publishableKey??this.apiKey;s&&(t["X-API-Key"]=s);let i=await fetch(a,{headers:t,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let d=await i.json();if(r.signal.aborted)return;this.results=d.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(a){if(a?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return me.html`<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?me.html`<span class="spinner" role="status" aria-label="Loading"></span>`:me.nothing} ${this.isOpen?me.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?me.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>me.html`<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?me.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:me.nothing}</div>`}};ae.styles=[g,me.css`: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)}`],l([(0,ge.property)({type:String,attribute:"api-key"})],ae.prototype,"apiKey",2),l([(0,ge.property)({type:String,attribute:"publishable-key"})],ae.prototype,"publishableKey",2),l([(0,ge.property)({type:String})],ae.prototype,"endpoint",2),l([(0,ge.property)({type:String})],ae.prototype,"placeholder",2),l([(0,ge.property)({type:String,attribute:"default-value"})],ae.prototype,"defaultValue",2),l([(0,ge.state)()],ae.prototype,"query",2),l([(0,ge.state)()],ae.prototype,"results",2),l([(0,ge.state)()],ae.prototype,"isOpen",2),l([(0,ge.state)()],ae.prototype,"isLoading",2),l([(0,ge.state)()],ae.prototype,"highlight",2),ae=l([(0,ge.customElement)("roxy-location-search")],ae);var _=require("lit"),Hr=require("lit/decorators.js");var He=class extends _.LitElement{constructor(){super();this.data=null;this.mode="current";new y(this)}render(){let e=this.data;if(!e)return _.html`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let a="month"in e?e.month:void 0,t="year"in e?e.year:void 0;return _.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${a??"Moon phases"} ${t??""}</h2><div class="list" role="list">${r.map(s=>this.renderListItem(s))}</div></article>`}return"phase"in e?this.renderSingle(e):_.nothing}renderSingle(e){let r=ot(e.phase);return _.html`<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?_.html`<div class="date">${e.date}</div>`:_.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?_.html`<div><span>Illumination</span> <strong>${is(e.illumination)}</strong></div>`:_.nothing} ${typeof e.age=="number"?_.html`<div><span>Age</span> <strong>${v(e.age,1)} days</strong></div>`:_.nothing} ${e.sign?_.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:_.nothing} ${typeof e.distance=="number"?_.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:_.nothing}</div>${e.meaning?.description?_.html`<p class="meaning">${e.meaning.description}</p>`:_.nothing} ${e.meaning?.keywords?.length?_.html`<div class="keywords">${e.meaning.keywords.map(a=>_.html`<span>${a}</span>`)}</div>`:_.nothing}</article>`}renderListItem(e){let r=ot(e.phase);return _.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};He.styles=[g,_.css`.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}`],l([(0,Hr.property)({attribute:!1})],He.prototype,"data",2),l([(0,Hr.property)({type:String,reflect:!0})],He.prototype,"mode",2),He=l([(0,Hr.customElement)("roxy-moon-phase")],He);function ot(o){return o?_a[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function is(o){let n=o<=1?o*100:o;return`${Math.round(n)}%`}var j=require("lit"),ya=require("lit/decorators.js");var ar=class extends j.LitElement{constructor(){super();this.data=null;new y(this)}render(){if(!this.data)return j.html`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return j.html`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?j.html`<span class="number">Nakshatra ${e.number} of 27</span>`:j.nothing} ${e.range?j.html`<span class="range">${e.range}</span>`:j.nothing}</header><dl class="facts">${e.lord?j.html`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:j.nothing} ${e.deity?j.html`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:j.nothing} ${e.symbol?j.html`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:j.nothing}</dl>${e.characteristics?j.html`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:j.nothing} ${r?j.html`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?j.html`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:j.nothing} ${r.gemstones?j.html`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:j.nothing} ${r.rituals?j.html`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:j.nothing}</div></div>`:j.nothing}</article>`}};ar.styles=[g,j.css`.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)}`],l([(0,ya.property)({attribute:!1})],ar.prototype,"data",2),ar=l([(0,ya.customElement)("roxy-nakshatra-card")],ar);var u=require("lit"),gr=require("lit/decorators.js");var ua=require("lit");function Se(){return ua.html`<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 fr=ua.css`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 za=420,$=za/2,vr=164,Na=146,Ir=120,$r=96,ls=178,ds=196,Ce=class extends u.LitElement{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new y(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 u.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],a=this.view;return u.html`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?u.html`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:u.nothing}</header>${xr({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:a,onSelect:t=>{this.view=t},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${a}" role="tabpanel" aria-labelledby="natal-tab-${a}">${a==="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?u.html`<span>${this.data.houseSystem} houses</span>`:u.nothing} <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 u.html`<svg viewBox="0 0 ${za} ${za}" 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="${$}" cy="${$}" r="${vr}" stroke-width="1.5"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${Na-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${Ir}" stroke-width="1"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${$r-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 a=e.map(s=>f(s.name)),t=new Map;for(let s of r){let i=[f(s.planet1),f(s.planet2)].sort().join("|");t.set(i,s)}return a.length===0?u.html`<p class="roxy-empty" role="status">No planets to grid</p>`:u.html`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${a.slice(0,-1).map(s=>{let i=B[s]??s.slice(0,2);return u.html`<th scope="col" title="${s}">${i}</th>`})}</tr></thead><tbody>${a.slice(1).map((s,i)=>{let d=B[s]??s.slice(0,2);return u.html`<tr><th scope="row" title="${s}">${d}</th>${a.slice(0,i+1).map(c=>{let m=t.get([s,c].sort().join("|"));if(!m)return u.html`<td class="empty"></td>`;let p=hr(m),h=Rr[p]??Rr[p.replace(/-/g,"")]??p.slice(0,3),R=cr[p]??"aspect-other",x=v(m.orb,1);return u.html`<td class="${`cell ${R}`}" title="${`${s} ${p} ${c}${x?` (orb ${x}\xB0)`:""}`}"><span class="asp">${h}</span></td>`})} ${a.slice(i+1,-1).map(()=>u.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),a=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Ta(e),"DSC")];r!==null&&(a.push(this.renderAngleMark(r,"MC")),a.push(this.renderAngleMark(Ta(r),"IC")));let t=this.data?.partOfFortune?.longitude;typeof t=="number"&&a.push(this.renderAngleMark(we(t),"PoF"));let s=this.data?.vertex?.longitude;return typeof s=="number"&&a.push(this.renderAngleMark(we(s),"Vtx")),a}renderAngleMark(e,r){let a=this.toAngle(e),t=H($,$,vr,a),s=H($,$,ls,a),i=H($,$,ds,a);return u.svg`
77
77
  <g>
78
- <line class="angle-tick" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />
78
+ <line class="angle-tick" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} />
79
79
  <text class="angle-marker" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r}</text>
80
80
  </g>
81
- `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,a)=>this.getAscendant()+a*30)).map(t=>{let a=this.toAngle(t),s=G($,$,Rr,a),i=G($,$,pr,a);return g.svg`<line class="wheel-line" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return Q.map((e,r)=>{let t=this.toAngle(r*30+15),a=G($,$,ft,t);return g.svg`<text class="sign-glyph" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${oe[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,a)=>{let s=e[(a+1)%12],i=Ht(t.longitude,s?s.longitude:t.longitude+30),l=G($,$,Rr-12,this.toAngle(i));return g.svg`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,a)=>{let s=this.toAngle(a*30+15),i=G($,$,Rr-12,s),l=(a-r+12)%12+1;return g.svg`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),a=r%30===0,s=a?ft-14:pr-5,i=G($,$,s,t),l=G($,$,pr,t);e.push(g.svg`<line class=${a?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${a?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?g.nothing:e.map(r=>{let t=this.toAngle(r.longitude),a=G($,$,Rr+9,t),s=fe(r.longitude);return g.svg`<text class="cusp-deg" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${s.degree}°${String(s.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(s=>Number.isFinite(s.longitude)).map(s=>({p:s,trueLon:xe(s.longitude),displayLon:xe(s.longitude)})).sort((s,i)=>s.trueLon-i.trueLon);for(let s=1;s<t.length;s++){let i=t[s-1],l=t[s];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let a=t[t.length-1];if(a&&a.displayLon>360){let s=a.displayLon-360;for(let i of t)i.displayLon-=s}return t.map(({p:s,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),m=this.toAngle(l),p=G($,$,mr,m),u=G($,$,mr-13,m),P=G($,$,pr-4,c),x=G($,$,mr+8,m),Ze=I[b(s.name)]??s.name.slice(0,2),Dr=fe(s.longitude),xr=s.isRetrograde===!0,Gr=`${Dr.degree}\xB0${String(Dr.minute).padStart(2,"0")}'`,Or=Math.abs(l-i)>.5;return g.svg`<g>
82
- ${Or?g.svg`<line class="planet-leader" x1=${P.x} y1=${P.y} x2=${x.x} y2=${x.y} />`:g.nothing}
83
- <text class="planet-glyph" x=${p.x} y=${p.y} text-anchor="middle" dominant-baseline="central"><title>${s.name}${xr?" retrograde":""} - ${Gr} ${s.sign??""}</title>${Ze}</text>
84
- <text class="planet-deg" x=${u.x} y=${u.y} text-anchor="middle" dominant-baseline="central">${Gr}${xr?g.svg`<tspan class="retro"> ℞</tspan>`:g.nothing}</text>
85
- </g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return g.nothing;let t=e?.retrogradePlanets??[];return g.html`<div class="details">${e?.dominantElement||e?.dominantModality?g.html`<div class="pill-row">${e.dominantElement?g.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:g.nothing} ${e.dominantModality?g.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:g.nothing}</div>`:g.nothing} ${r?g.html`<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>`:g.nothing} ${t.length>0?g.html`<div class="pill-row">${t.map(a=>{let s=I[a]??a.slice(0,2);return g.html`<span class="pill pill--muted">${s} ${a} R</span>`})}</div>`:g.nothing} ${r?.summary?g.html`<p class="summary">${r.summary}</p>`:g.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return g.nothing;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],a=Q,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=a.indexOf(b(i.sign??""));if(l<0)continue;let c=r[l%4],m=t[l%3],p=I[b(i.name)]??b(i.name).slice(0,2);s[c]?.[m]?.push(p)}return g.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>g.html`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,m)=>c+(s[i]?.[m]?.length??0),0);return g.html`<tr><th scope="row">${i}</th>${t.map(c=>g.html`<td>${(s[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>g.html`<td class="em-total">${r.reduce((l,c)=>l+(s[c]?.[i]?.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?g.nothing:g.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let a=r.interpretation,s=I[b(r.name)]??"",i=v(r.degree??0,1);return g.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${s} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${be()}</span></summary><div class="interp-body">${a.summary?g.html`<p class="interp-summary">${a.summary}</p>`:g.nothing} ${a.detailed?g.html`<p class="interp-detail">${a.detailed}</p>`:g.nothing} ${a.keywords?.length?g.html`<div class="interp-keywords">${a.keywords.map(l=>g.html`<span class="kw">${l}</span>`)}</div>`:g.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let a of e){if(typeof a.longitude!="number")continue;let s=b(a.name);s&&t.set(s,a.longitude)}return r.map(a=>{let s=t.get(b(a.planet1)),i=t.get(b(a.planet2));if(s===void 0||i===void 0)return g.nothing;let l=G($,$,mr-18,this.toAngle(s)),c=G($,$,mr-18,this.toAngle(i)),m=ir(a),p=tr[m]??"aspect-other",u=v(a.orb,1);return g.svg`<line class=${`aspect ${p}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${a.planet1} ${m||""} ${a.planet2}${u?` (orb ${u}\xB0)`:""}</title></line>`})}};ve.styles=[y,Ke,cr,g.css`.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}`],d([(0,or.property)({attribute:!1})],ve.prototype,"data",2),d([(0,or.property)({type:String,attribute:"house-system",reflect:!0})],ve.prototype,"houseSystem",2),d([(0,or.state)()],ve.prototype,"view",2),ve=d([(0,or.customElement)("roxy-natal-chart")],ve);var R=require("lit"),Ar=require("lit/decorators.js");var ze=class extends R.LitElement{constructor(){super();this.data=null;this.type="life-path";new h(this)}render(){let e=this.data;if(!e)return R.html`<div class="roxy-empty" role="status">No numerology data</div>`;let r=Va[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 R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?R.html`<div class="numeral">${e.number}</div>`:R.nothing}<div><p class="label">${r}</p>${e.meaning?.title?R.html`<h2 class="title">${e.meaning.title}</h2>`:R.nothing}</div></div>${e.meaning?.description?R.html`<p class="meaning">${e.meaning.description}</p>`:R.nothing} ${e.calculation?R.html`<pre class="calc">${e.calculation}</pre>`:R.nothing} ${t.length>0?R.html`<div class="chips">${t.map(a=>R.html`<span>${a}</span>`)}</div>`:R.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?R.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Fa(e.karmicDebtMeaning)}</div>`:R.nothing}</article>`}renderPersonalYear(e,r){return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?R.html`<div class="numeral">${e.personalYear}</div>`:R.nothing}<div><p class="label">${r}</p>${e.theme?R.html`<h2 class="title">${e.theme}</h2>`:R.nothing}</div></div>${e.forecast?R.html`<p class="meaning">${e.forecast}</p>`:R.nothing} ${e.advice?R.html`<p>${e.advice}</p>`:R.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,a])=>a!=null);return R.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?R.html`<h2 class="title">${e.profile.name}</h2>`:R.nothing}</div>${t.length>0?R.html`<div class="cores">${t.map(([a,s])=>R.html`<div class="item"><span>${ye(a)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:R.nothing}</article>`}};ze.styles=[y,R.css`.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)}`],d([(0,Ar.property)({attribute:!1})],ze.prototype,"data",2),d([(0,Ar.property)({type:String,reflect:!0})],ze.prototype,"type",2),ze=d([(0,Ar.customElement)("roxy-numerology-card")],ze);var Va={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Fa(o){return o?[o.description,o.challenge,o.resolution].filter(Boolean).join(" "):""}var B=require("lit"),Er=require("lit/decorators.js");var Me=class extends B.LitElement{constructor(){super();this.data=null;this.detail="detailed";new h(this)}render(){let e=this.data;if(!e)return B.html`<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 a=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(p=>!!p[1]):[],s=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]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],m=r&&"transitions"in r?r.transitions:void 0;return B.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?_e(r.date):""}</span></header><table><tbody>${t.map(([p,u])=>B.html`<tr><th>${p}</th><td>${u}</td></tr>`)} ${r?.sunrise?B.html`<tr><th>Sunrise</th><td>${he(r.sunrise)}</td></tr>`:B.nothing} ${r?.sunset?B.html`<tr><th>Sunset</th><td>${he(r.sunset)}</td></tr>`:B.nothing} ${r?.moonrise?B.html`<tr><th>Moonrise</th><td>${he(r.moonrise)}</td></tr>`:B.nothing} ${r?.moonset?B.html`<tr><th>Moonset</th><td>${he(r.moonset)}</td></tr>`:B.nothing} ${a.map(([p,u])=>B.html`<tr><th>${p}</th><td>${u}</td></tr>`)}</tbody></table>${m?B.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",m.tithi)} ${this.renderTransitionRow("Nakshatra",m.nakshatra)} ${this.renderTransitionRow("Yoga",m.yoga)} ${this.renderTransitionRow("Karana",m.karana)}</tbody></table>`:B.nothing} ${this.detail==="detailed"&&(s.some(p=>!!p[1])||i.length>0||l.some(p=>!!p[1])||c.length>0)?B.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...s.filter(p=>!!p[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(p=>!!p[1]),...c])}</tbody></table>`:B.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let a=yt(t);return a?B.html`<tr><th>${r}</th><td>${a}</td></tr>`:B.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,a)=>[r.length>1?`${e} ${a+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return B.nothing;let t=he(r.endsAt),a=r.next?` \u2192 ${r.next}`:"";return B.html`<tr><th>${e}</th><td>ends ${t}${a}</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=yt(e);return r?`${e.current} (${r})`:e.current}};Me.styles=[y,B.css`.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}`],d([(0,Er.property)({attribute:!1})],Me.prototype,"data",2),d([(0,Er.property)({type:String,reflect:!0})],Me.prototype,"detail",2),Me=d([(0,Er.customElement)("roxy-panchang-table")],Me);var ie=require("lit"),st=require("lit/decorators.js");var vt=[{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)"}],We=class extends ie.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data?.planets?.length)return ie.html`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return ie.html`<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">${vt.map(r=>ie.html`<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=I[b(e.planet)]??"",t=vt.map(m=>Math.max(0,e[m.key])),a=t.reduce((m,p)=>m+p,0),s=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,i=s?"adequacy-badge--adequate":"adequacy-badge--weak",l=s?"adequate":"weak",c=v(e.totalRupas,2)&&v(e.minRequired,2)?`${v(e.totalRupas,2)} / ${v(e.minRequired,2)} R`:"";return ie.html`<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}">${a>0?vt.map((m,p)=>{let u=t[p];if(u<=0)return ie.nothing;let P=u/a*100;return ie.html`<div class="bar-segment" style="flex-grow:${P};background:${m.color}" title="${m.label}: ${v(u,1)}"></div>`}):ie.nothing}</div></div><div class="pills">${c?ie.html`<span class="rupas-label">${c}</span>`:ie.nothing} <span class="${`adequacy-badge ${i}`}">${l}</span></div></div>`}};We.styles=[y,ie.css`.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}}`],d([(0,st.property)({attribute:!1})],We.prototype,"data",2),We=d([(0,st.customElement)("roxy-shadbala-table")],We);var f=require("lit"),ot=require("lit/decorators.js");var kt=360,q=kt/2,$t=170,Ua=154,wt=124,gr=96,Je=class extends f.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return f.html`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:a}=this.data,s=this.data.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,m=a?.overall,p=a?.strengths??[],u=a?.challenges??[];return i.length>0&&l.length>0?f.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?f.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:f.nothing}</div><svg viewBox="0 0 ${kt} ${kt}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${q}" cy="${q}" r="${$t}" stroke-width="1.5"/><circle class="wheel-line" cx="${q}" cy="${q}" r="${gr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${q}" cy="${q}" r="${gr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,s)} ${this.renderRing(i,wt,"p1",1)} ${this.renderRing(l,gr,"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>${m?f.html`<p class="summary">${m}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${p.length>0||u.length>0?f.html`<div class="lists">${p.length?f.html`<div><h3>Strengths</h3><ul>${p.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${u.length?f.html`<div><h3>Challenges</h3><ul>${u.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing}</div>`:f.nothing}</div>`:f.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?f.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:f.nothing}</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>${m?f.html`<p class="summary">${m}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${p.length>0||u.length>0?f.html`<div class="lists">${p.length?f.html`<div><h3>Strengths</h3><ul>${p.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${u.length?f.html`<div><h3>Challenges</h3><ul>${u.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing}</div>`:f.nothing}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),a=G(q,q,gr-14,t),s=G(q,q,$t,t);return f.svg`<line class="wheel-line" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return Q.map((e,r)=>{let t=this.toAngle(r*30+15),a=G(q,q,Ua,t);return f.svg`<text class="sign" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${oe[e]}</text>`})}renderRing(e,r,t,a){return e.map(s=>{if(!Number.isFinite(s.longitude))return f.nothing;let i=this.toAngle(s.longitude),l=G(q,q,r,i),m=G(q,q,r+(a===1?-12:-10),i),p=I[b(s.name)]??s.name.slice(0,2),u=fe(s.longitude),P=s.isRetrograde===!0,x=`${u.degree}\xB0${String(u.minute).padStart(2,"0")}'`,Ze=`${s.name}${P?" retrograde":""} - ${x} ${u.sign}`;return f.svg`<g>
86
- <text class=${t} x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central"><title>${Ze}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${a}</tspan></text>
87
- <text class="planet-deg" x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${u.degree}°${P?f.svg`<tspan class="retro"> ℞</tspan>`:f.nothing}</text>
88
- </g>`})}renderAscendants(e){let r=[],t=(a,s)=>{if(!a)return;let i=Q.findIndex(P=>P.toLowerCase()===a.sign.toLowerCase());if(i===-1)return;let l=i*30+a.degree,c=this.toAngle(l),m=s===1?wt+14:gr+14,p=G(q,q,m,c),u=G(q,q,$t+14,c);r.push(f.svg`<g>
89
- <line class="asc-tick" x1=${p.x} y1=${p.y} x2=${u.x} y2=${u.y} />
90
- <text class="asc-label" x=${u.x} y=${u.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
91
- </g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=b(i);for(let c of s)if(b(c.name)===l&&typeof c.longitude=="number")return c.longitude};return t.map(s=>{let i=a(e,s.planet1),l=a(r,s.planet2);if(i===void 0||l===void 0)return f.nothing;let c=G(q,q,wt-12,this.toAngle(i)),m=G(q,q,gr+8,this.toAngle(l)),p=ir(s),u=tr[p]??"aspect-other",P=v(s.orb,1);return f.svg`<line class=${`aspect ${u}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${s.planet1} ${p} ${s.planet2}${P?` (orb ${P}\xB0)`:""}</title></line>`})}renderAspects(e){return f.html`<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=>f.html`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${ir(r)||""}</td><td class="orb">${v(r.orb,1)}</td><td>${Wa(r.strength)}</td></tr>`)}</tbody></table>`}};Je.styles=[y,f.css`.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}`],d([(0,ot.property)({attribute:!1})],Je.prototype,"data",2),Je=d([(0,ot.customElement)("roxy-synastry-chart")],Je);function Wa(o){return typeof o=="number"?Math.round(o).toString():""}var E=require("lit"),yr=require("lit/decorators.js");var De=class extends E.LitElement{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new h(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):E.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,a=r.keywords??[];return E.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?E.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:E.html`<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?E.html`${r.arcana} arcana`:E.nothing} ${t?E.html`· reversed`:E.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?E.html`<p class="message">${e.dailyMessage}</p>`:E.nothing} ${r.meaning?E.html`<p>${r.meaning}</p>`:E.nothing} ${a.length>0?E.html`<div class="chips">${a.map(s=>E.html`<span>${s}</span>`)}</div>`:E.nothing} <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,a=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return E.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?E.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:E.html`<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?E.html`${e.arcana} arcana`:E.nothing} ${e.number!==void 0&&e.number!==null?E.html`· ${e.number}`:E.nothing} ${r?E.html`· reversed`:E.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?E.html`<p>${t.description}</p>`:E.nothing} ${a.length>0?E.html`<div class="chips">${a.map(s=>E.html`<span>${s}</span>`)}</div>`:E.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};De.styles=[y,E.css`.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)}`],d([(0,yr.property)({attribute:!1})],De.prototype,"data",2),d([(0,yr.state)()],De.prototype,"flipped",2),De=d([(0,yr.customElement)("roxy-tarot-card")],De);var A=require("lit"),Nr=require("lit/decorators.js");var Ge=class extends A.LitElement{constructor(){super();this.data=null;this.spread="three-card";new h(this)}render(){let e=this.data;if(!e)return A.html`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),a=t?[]:"positions"in e?e.positions??[]:[],s=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,p="summary"in e?e.summary:void 0,u=r?e.interpretation:void 0,P=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return A.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${m?A.html`<span class="question">"${m}"</span>`:A.nothing}</header>${r?A.html`<div><span class="${`answer ${P}`}">${i}</span> ${l?A.html`<small>· ${l}</small>`:A.nothing}</div>`:A.nothing} ${a.length>0?A.html`<div class="grid">${a.map(x=>A.html`<div class="card"><p class="label">${x.name??""}</p><div class="image">${x.card?.imageUrl?A.html`<img src="${x.card.imageUrl}" alt="${x.card.name??"tarot card"}" class="${x.card.reversed?"reversed":""}">`:A.html`${x.card?.name??"?"}`}</div><p class="name">${x.card?.name??""} ${x.card?.reversed?A.html`<small>(reversed)</small>`:A.nothing}</p>${x.interpretation?A.html`<p class="interp">${x.interpretation}</p>`:A.nothing}</div>`)}</div>`:A.nothing} ${s.length>0?A.html`<div class="grid">${s.map(x=>A.html`<div class="card"><div class="image">${x.imageUrl?A.html`<img src="${x.imageUrl}" alt="${x.name??"tarot card"}" class="${x.reversed?"reversed":""}">`:A.html`${x.name??"?"}`}</div><p class="name">${x.name??""} ${x.reversed?A.html`<small>(reversed)</small>`:A.nothing}</p>${x.meaning?A.html`<p class="interp">${x.meaning}</p>`:A.nothing}</div>`)}</div>`:A.nothing} ${p?A.html`<p class="reading">${p}</p>`:A.nothing} ${u?A.html`<p class="reading">${u}</p>`:A.nothing}</article>`}};Ge.styles=[y,A.css`.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}`],d([(0,Nr.property)({attribute:!1})],Ge.prototype,"data",2),d([(0,Nr.property)({type:String,reflect:!0})],Ge.prototype,"spread",2),Ge=d([(0,Nr.customElement)("roxy-tarot-spread")],Ge);var z=require("lit"),ur=require("lit/decorators.js");var Oe=class extends z.LitElement{constructor(){super();this.data=null;this.tab="positions";new h(this)}render(){if(!this.data?.transitPlanets?.length)return z.html`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:a,summary:s}=this.data,i=[_e(e),he(r)].filter(Boolean).join(" "),l=a?.length??0,c=this.tab;return z.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${i?z.html`<p class="subtitle">${i}</p>`:z.nothing}</div>${l>0?z.html`${lr({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${l})`}],active:c,onSelect:m=>{this.tab=m},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?z.html`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:z.html`${s?this.renderSummaryPills(s):z.nothing}<div class="overflow-scroll">${this.renderAspectsList(a??[])}</div>`}</div>`:z.html`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return z.html`<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 z.html`<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=I[b(r.name)]??"",a=oe[b(r.sign)]??"",s=r.speed>=0?"\u2191":"\u2193";return z.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?z.html`<span class="retro-badge" aria-label="retrograde">R</span>`:z.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${r.sign}</div></td><td class="num">${v(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${v(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return z.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let a=I[b(r.transitPlanet)]??"",s=I[b(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),m=r.isApplying?"Applying":"Separating";return z.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${a}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${m} · orb ${v(r.orb,2)}° · strength ${v(r.strength,1)} </span>${be()}</summary><div class="interp-body">${l?.summary?z.html`<p>${l.summary}</p>`:z.nothing} ${l?.impact?z.html`<p><strong>Impact:</strong> ${l.impact}</p>`:z.nothing} ${l?.timing?z.html`<p><strong>Timing:</strong> ${l.timing}</p>`:z.nothing} ${l?.guidance?z.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:z.nothing} ${l?.keywords?.length?z.html`<div class="interp-keywords">${l.keywords.map(p=>z.html`<span class="kw">${p}</span>`)}</div>`:z.nothing}</div></details>`})}</div>`}};Oe.styles=[y,Ke,cr,z.css`.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)}`],d([(0,ur.property)({attribute:!1})],Oe.prototype,"data",2),d([(0,ur.state)()],Oe.prototype,"tab",2),Oe=d([(0,ur.customElement)("roxy-transits-table")],Oe);var zr=require("lit"),Mr=require("lit/decorators.js");var He=class extends zr.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){return this.data?.meta?Ur(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?zr.html`<div class="wrap"><div class="header"><h2 class="title">Vedic kundli</h2>${Jr(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>${Wr(e,this.chartStyle)}</svg></div>`:zr.html`<div class="roxy-empty" role="status">No kundli data</div>`}};He.styles=[y,Xr,Ke],d([(0,Mr.property)({attribute:!1})],He.prototype,"data",2),d([(0,Mr.property)({type:String,reflect:!0,attribute:"chart-style"})],He.prototype,"chartStyle",2),He=d([(0,Mr.customElement)("roxy-vedic-kundli")],He);var k=require("lit"),nt=require("lit/decorators.js");var Ja=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Xe=class extends k.LitElement{constructor(){super();this.data=null;new h(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let a of Ja){let s=e[a];s&&(t.push([a,s]),r.add(a))}for(let[a,s]of Object.entries(e))r.has(a)||t.push([a,s]);return t}render(){if(!this.data?.meta)return k.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return k.html`<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 a=(t.graha??r)==="Lagna",s=I[b(t.graha??r)]??"",i=oe[b(t.rashi??"")]??"";return k.html`<tr class="${a?"lagna":""}"><td class="graha">${s?k.html`<span class="glyph">${s}</span>`:k.nothing}${t.graha??r}</td><td>${i?k.html`<span class="glyph">${i}</span>`:k.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Vr(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?k.html`<span class="retro">R</span>`:k.nothing}</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?k.nothing:k.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>{let t=I[b(r.planet)]??"",a=v(r.distanceFromSun,2),s=v(r.orb,1);return k.html`<div class="condition"><span class="planet">${t?`${t} `:""}${r.planet}</span> <span class="detail">${a} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?k.nothing:k.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>{let t=v(r.distance,2);return k.html`<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,a])=>[a.graha??t,e[a.graha??t]]).filter(([,t])=>t!=null);return r.length===0?k.nothing:k.html`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${be()}</summary><div class="panel-body">${r.map(([t,a])=>{let s=I[b(t)]??"";return k.html`<div class="interp"><span class="planet">${s?`${s} `:""}${t}</span> ${a.rashi?k.html`<p><span class="label">Rashi.</span> ${a.rashi}</p>`:k.nothing} ${a.nakshatra?k.html`<p><span class="label">Nakshatra.</span> ${a.nakshatra}</p>`:k.nothing}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?k.nothing:k.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>k.html`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?k.html`<p class="desc">${r.description}</p>`:k.nothing}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?k.nothing:k.html`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>k.html`<div class="bhava"><span class="name">${r.name} ${r.quality?k.html`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:k.nothing}</span> ${r.result?k.html`<p class="desc">${r.result}</p>`:k.nothing}</div>`)}</div></details>`}};Xe.styles=[y,cr,k.css`.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)}`],d([(0,nt.property)({attribute:!1})],Xe.prototype,"data",2),Xe=d([(0,nt.customElement)("roxy-vedic-planets-table")],Xe);var re=require("lit"),it=require("lit/decorators.js");var Qe=class extends re.LitElement{constructor(){super();this.data=null;new h(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,a]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])a&&r.push({name:t,sign:a.sign,longitude:a.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return re.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return re.html`<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=I[b(r.name)]??"",a=oe[b(r.sign??"")]??"",s=typeof r.speed=="number"?v(r.speed,3):"";return re.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?re.html`<span class="glyph">${t}</span>`:re.nothing}${r.name}</td><td>${a?re.html`<span class="glyph">${a}</span>`:re.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Vr(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${s?re.html`${s}°/day`:re.nothing} ${r.isRetrograde?re.html`<span class="retro">℞</span>`:re.nothing}</td></tr>`})}</tbody></table></div>`}};Qe.styles=[y,re.css`.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}`],d([(0,it.property)({attribute:!1})],Qe.prototype,"data",2),Qe=d([(0,it.customElement)("roxy-western-planets-table")],Qe);var Y=require("lit"),hr=require("lit/decorators.js");var Ie=class extends Y.LitElement{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new h(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Y.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return Y.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Y.nothing}</p>${e.description?Y.html`<p class="description">${e.description}</p>`:Y.nothing} ${e.result?Y.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Y.nothing}</div>`}render(){if(!this.data)return Y.html`<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 Y.html`<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 c=t,m=r?c.filter(u=>u.name.toLowerCase().includes(r)):c,p=e.total;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${p!==void 0?Y.html`<span class="count">${p} total</span>`:Y.nothing}</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">${m.length>0?m.map(u=>this.renderDetailCard(u)):Y.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let s=t,i=r?s.filter(c=>c.name.toLowerCase().includes(r)):s,l=e.total;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Y.html`<span class="count">${l} total</span>`:Y.nothing}</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">${i.length>0?i.map(c=>Y.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Y.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Y.html`<div class="roxy-empty" role="status">No yoga data</div>`}};Ie.styles=[y,Y.css`.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}`],d([(0,hr.property)({attribute:!1})],Ie.prototype,"data",2),d([(0,hr.state)()],Ie.prototype,"filter",2),Ie=d([(0,hr.customElement)("roxy-yoga-list")],Ie);var lt=[{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 Yt="0.8.1";var Xa=lt.map(o=>o.slug);
81
+ `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(a=>a.longitude):Array.from({length:12},(a,t)=>this.getAscendant()+t*30)).map(a=>{let t=this.toAngle(a),s=H($,$,Ir,t),i=H($,$,vr,t);return u.svg`<line class="wheel-line" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return ee.map((e,r)=>{let a=this.toAngle(r*30+15),t=H($,$,Na,a);return u.svg`<text class="sign-glyph" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${ie[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((a,t)=>{let s=e[(t+1)%12],i=Qa(a.longitude,s?s.longitude:a.longitude+30),d=H($,$,Ir-12,this.toAngle(i));return u.svg`<text class="house-num" x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central">${a.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(a,t)=>{let s=this.toAngle(t*30+15),i=H($,$,Ir-12,s),d=(t-r+12)%12+1;return u.svg`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${d}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let a=this.toAngle(r),t=r%30===0,s=t?Na-14:vr-5,i=H($,$,s,a),d=H($,$,vr,a);e.push(u.svg`<line class=${t?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${d.x} y2=${d.y} stroke-width=${t?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?u.nothing:e.map(r=>{let a=this.toAngle(r.longitude),t=H($,$,Ir+9,a),s=ke(r.longitude);return u.svg`<text class="cusp-deg" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${s.degree}°${String(s.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let a=e.filter(s=>Number.isFinite(s.longitude)).map(s=>({p:s,trueLon:we(s.longitude),displayLon:we(s.longitude)})).sort((s,i)=>s.trueLon-i.trueLon);for(let s=1;s<a.length;s++){let i=a[s-1],d=a[s];if(!i||!d)continue;let c=i.displayLon+7;d.displayLon<c&&(d.displayLon=c)}let t=a[a.length-1];if(t&&t.displayLon>360){let s=t.displayLon-360;for(let i of a)i.displayLon-=s}return a.map(({p:s,trueLon:i,displayLon:d})=>{let c=this.toAngle(i),m=this.toAngle(d),p=H($,$,$r,m),h=H($,$,$r-13,m),R=H($,$,vr-4,c),x=H($,$,$r+8,m),ir=B[f(s.name)]??s.name.slice(0,2),qr=ke(s.longitude),Lr=s.isRetrograde===!0,Yr=`${qr.degree}\xB0${String(qr.minute).padStart(2,"0")}'`,Fr=Math.abs(d-i)>.5;return u.svg`<g>
82
+ ${Fr?u.svg`<line class="planet-leader" x1=${R.x} y1=${R.y} x2=${x.x} y2=${x.y} />`:u.nothing}
83
+ <text class="planet-glyph" x=${p.x} y=${p.y} text-anchor="middle" dominant-baseline="central"><title>${s.name}${Lr?" retrograde":""} - ${Yr} ${s.sign??""}</title>${ir}</text>
84
+ <text class="planet-deg" x=${h.x} y=${h.y} text-anchor="middle" dominant-baseline="central">${Yr}${Lr?u.svg`<tspan class="retro"> ℞</tspan>`:u.nothing}</text>
85
+ </g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return u.nothing;let a=e?.retrogradePlanets??[];return u.html`<div class="details">${e?.dominantElement||e?.dominantModality?u.html`<div class="pill-row">${e.dominantElement?u.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:u.nothing} ${e.dominantModality?u.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:u.nothing}</div>`:u.nothing} ${r?u.html`<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>`:u.nothing} ${a.length>0?u.html`<div class="pill-row">${a.map(t=>{let s=B[t]??t.slice(0,2);return u.html`<span class="pill pill--muted">${s} ${t} R</span>`})}</div>`:u.nothing} ${r?.summary?u.html`<p class="summary">${r.summary}</p>`:u.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return u.nothing;let r=["Fire","Earth","Air","Water"],a=["Cardinal","Fixed","Mutable"],t=ee,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let d=t.indexOf(f(i.sign??""));if(d<0)continue;let c=r[d%4],m=a[d%3],p=B[f(i.name)]??f(i.name).slice(0,2);s[c]?.[m]?.push(p)}return u.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${a.map(i=>u.html`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let d=a.reduce((c,m)=>c+(s[i]?.[m]?.length??0),0);return u.html`<tr><th scope="row">${i}</th>${a.map(c=>u.html`<td>${(s[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${d}</td></tr>`})}<tr><th scope="row">Total</th>${a.map(i=>u.html`<td class="em-total">${r.reduce((d,c)=>d+(s[c]?.[i]?.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?u.nothing:u.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,a)=>{let t=r.interpretation,s=B[f(r.name)]??"",i=v(r.degree??0,1);return u.html`<details class="interp-card" name="natal-planet-readings" ?open="${a===0}"><summary><span>${s} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${Se()}</span></summary><div class="interp-body">${t.summary?u.html`<p class="interp-summary">${t.summary}</p>`:u.nothing} ${t.detailed?u.html`<p class="interp-detail">${t.detailed}</p>`:u.nothing} ${t.keywords?.length?u.html`<div class="interp-keywords">${t.keywords.map(d=>u.html`<span class="kw">${d}</span>`)}</div>`:u.nothing}</div></details>`})}</section>`}renderAspects(e,r){let a=new Map;for(let t of e){if(typeof t.longitude!="number")continue;let s=f(t.name);s&&a.set(s,t.longitude)}return r.map(t=>{let s=a.get(f(t.planet1)),i=a.get(f(t.planet2));if(s===void 0||i===void 0)return u.nothing;let d=H($,$,$r-18,this.toAngle(s)),c=H($,$,$r-18,this.toAngle(i)),m=hr(t),p=cr[m]??"aspect-other",h=v(t.orb,1);return u.svg`<line class=${`aspect ${p}`} x1=${d.x} y1=${d.y} x2=${c.x} y2=${c.y}><title>${t.planet1} ${m||""} ${t.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}};Ce.styles=[g,Je,fr,u.css`.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}`],l([(0,gr.property)({attribute:!1})],Ce.prototype,"data",2),l([(0,gr.property)({type:String,attribute:"house-system",reflect:!0})],Ce.prototype,"houseSystem",2),l([(0,gr.state)()],Ce.prototype,"view",2),Ce=l([(0,gr.customElement)("roxy-natal-chart")],Ce);var A=require("lit"),jr=require("lit/decorators.js");var Ie=class extends A.LitElement{constructor(){super();this.data=null;this.type="life-path";new y(this)}render(){let e=this.data;if(!e)return A.html`<div class="roxy-empty" role="status">No numerology data</div>`;let r=cs[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let a=e.meaning?.keywords??[];return A.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?A.html`<div class="numeral">${e.number}</div>`:A.nothing}<div><p class="label">${r}</p>${e.meaning?.title?A.html`<h2 class="title">${e.meaning.title}</h2>`:A.nothing}</div></div>${e.meaning?.description?A.html`<p class="meaning">${e.meaning.description}</p>`:A.nothing} ${e.calculation?A.html`<pre class="calc">${e.calculation}</pre>`:A.nothing} ${a.length>0?A.html`<div class="chips">${a.map(t=>A.html`<span>${t}</span>`)}</div>`:A.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?A.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${ps(e.karmicDebtMeaning)}</div>`:A.nothing}</article>`}renderPersonalYear(e,r){return A.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?A.html`<div class="numeral">${e.personalYear}</div>`:A.nothing}<div><p class="label">${r}</p>${e.theme?A.html`<h2 class="title">${e.theme}</h2>`:A.nothing}</div></div>${e.forecast?A.html`<p class="meaning">${e.forecast}</p>`:A.nothing} ${e.advice?A.html`<p>${e.advice}</p>`:A.nothing}</article>`}renderChart(e,r){let a=Object.entries(e.coreNumbers).filter(([,t])=>t!=null);return A.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?A.html`<h2 class="title">${e.profile.name}</h2>`:A.nothing}</div>${a.length>0?A.html`<div class="cores">${a.map(([t,s])=>A.html`<div class="item"><span>${be(t)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:A.nothing}</article>`}};Ie.styles=[g,A.css`.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)}`],l([(0,jr.property)({attribute:!1})],Ie.prototype,"data",2),l([(0,jr.property)({type:String,reflect:!0})],Ie.prototype,"type",2),Ie=l([(0,jr.customElement)("roxy-numerology-card")],Ie);var cs={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","personal-year":"Personal Year",chart:"Numerology chart"};function ps(o){return o?[o.description,o.challenge,o.resolution].filter(Boolean).join(" "):""}var K=require("lit"),Br=require("lit/decorators.js");var je=class extends K.LitElement{constructor(){super();this.data=null;this.detail="detailed";new y(this)}render(){let e=this.data;if(!e)return K.html`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,a=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&a.push(["Vara",this.formatPart(r.vara)]);let t=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(p=>!!p[1]):[],s=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]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],d=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],m=r&&"transitions"in r?r.transitions:void 0;return K.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?We(r.date):""}</span></header><table><tbody>${a.map(([p,h])=>K.html`<tr><th>${p}</th><td>${h}</td></tr>`)} ${r?.sunrise?K.html`<tr><th>Sunrise</th><td>${$e(r.sunrise)}</td></tr>`:K.nothing} ${r?.sunset?K.html`<tr><th>Sunset</th><td>${$e(r.sunset)}</td></tr>`:K.nothing} ${r?.moonrise?K.html`<tr><th>Moonrise</th><td>${$e(r.moonrise)}</td></tr>`:K.nothing} ${r?.moonset?K.html`<tr><th>Moonset</th><td>${$e(r.moonset)}</td></tr>`:K.nothing} ${t.map(([p,h])=>K.html`<tr><th>${p}</th><td>${h}</td></tr>`)}</tbody></table>${m?K.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",m.tithi)} ${this.renderTransitionRow("Nakshatra",m.nakshatra)} ${this.renderTransitionRow("Yoga",m.yoga)} ${this.renderTransitionRow("Karana",m.karana)}</tbody></table>`:K.nothing} ${this.detail==="detailed"&&(s.some(p=>!!p[1])||i.length>0||d.some(p=>!!p[1])||c.length>0)?K.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...s.filter(p=>!!p[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...d.filter(p=>!!p[1]),...c])}</tbody></table>`:K.nothing}</div>`}renderPeriodRows(e){return e.map(([r,a])=>{let t=Ra(a);return t?K.html`<tr><th>${r}</th><td>${t}</td></tr>`:K.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((a,t)=>[r.length>1?`${e} ${t+1}`:e,a])}renderTransitionRow(e,r){if(!r?.endsAt)return K.nothing;let a=$e(r.endsAt),t=r.next?` \u2192 ${r.next}`:"";return K.html`<tr><th>${e}</th><td>ends ${a}${t}</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=Ra(e);return r?`${e.current} (${r})`:e.current}};je.styles=[g,K.css`.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}`],l([(0,Br.property)({attribute:!1})],je.prototype,"data",2),l([(0,Br.property)({type:String,reflect:!0})],je.prototype,"detail",2),je=l([(0,Br.customElement)("roxy-panchang-table")],je);var de=require("lit"),ha=require("lit/decorators.js");var Ea=[{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)"}],tr=class extends de.LitElement{constructor(){super();this.data=null;new y(this)}render(){if(!this.data?.planets?.length)return de.html`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,a)=>r.relativeRank-a.relativeRank);return de.html`<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">${Ea.map(r=>de.html`<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=B[f(e.planet)]??"",a=Ea.map(m=>Math.max(0,e[m.key])),t=a.reduce((m,p)=>m+p,0),s=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,i=s?"adequacy-badge--adequate":"adequacy-badge--weak",d=s?"adequate":"weak",c=v(e.totalRupas,2)&&v(e.minRequired,2)?`${v(e.totalRupas,2)} / ${v(e.minRequired,2)} R`:"";return de.html`<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}">${t>0?Ea.map((m,p)=>{let h=a[p];if(h<=0)return de.nothing;let R=h/t*100;return de.html`<div class="bar-segment" style="flex-grow:${R};background:${m.color}" title="${m.label}: ${v(h,1)}"></div>`}):de.nothing}</div></div><div class="pills">${c?de.html`<span class="rupas-label">${c}</span>`:de.nothing} <span class="${`adequacy-badge ${i}`}">${d}</span></div></div>`}};tr.styles=[g,de.css`.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}}`],l([(0,ha.property)({attribute:!1})],tr.prototype,"data",2),tr=l([(0,ha.customElement)("roxy-shadbala-table")],tr);var b=require("lit"),xa=require("lit/decorators.js");var Ga=360,V=Ga/2,Ma=170,ms=154,Da=124,wr=96,sr=class extends b.LitElement{constructor(){super();this.data=null;new y(this)}render(){if(!this.data)return b.html`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:a,analysis:t}=this.data,s=this.data.interAspects??[],i=e?.planets??[],d=r?.planets??[],c=typeof a=="number"?Math.round(a):void 0,m=t?.overall,p=t?.strengths??[],h=t?.challenges??[];return i.length>0&&d.length>0?b.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?b.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:b.nothing}</div><svg viewBox="0 0 ${Ga} ${Ga}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${V}" cy="${V}" r="${Ma}" stroke-width="1.5"/><circle class="wheel-line" cx="${V}" cy="${V}" r="${wr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${V}" cy="${V}" r="${wr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,d,s)} ${this.renderRing(i,Da,"p1",1)} ${this.renderRing(d,wr,"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>${m?b.html`<p class="summary">${m}</p>`:b.nothing} ${s.length>0?this.renderAspects(s):b.nothing} ${p.length>0||h.length>0?b.html`<div class="lists">${p.length?b.html`<div><h3>Strengths</h3><ul>${p.map(x=>b.html`<li>${x}</li>`)}</ul></div>`:b.nothing} ${h.length?b.html`<div><h3>Challenges</h3><ul>${h.map(x=>b.html`<li>${x}</li>`)}</ul></div>`:b.nothing}</div>`:b.nothing}</div>`:b.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?b.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:b.nothing}</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>${m?b.html`<p class="summary">${m}</p>`:b.nothing} ${s.length>0?this.renderAspects(s):b.nothing} ${p.length>0||h.length>0?b.html`<div class="lists">${p.length?b.html`<div><h3>Strengths</h3><ul>${p.map(x=>b.html`<li>${x}</li>`)}</ul></div>`:b.nothing} ${h.length?b.html`<div><h3>Challenges</h3><ul>${h.map(x=>b.html`<li>${x}</li>`)}</ul></div>`:b.nothing}</div>`:b.nothing}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let a=this.toAngle(r*30),t=H(V,V,wr-14,a),s=H(V,V,Ma,a);return b.svg`<line class="wheel-line" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return ee.map((e,r)=>{let a=this.toAngle(r*30+15),t=H(V,V,ms,a);return b.svg`<text class="sign" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${ie[e]}</text>`})}renderRing(e,r,a,t){return e.map(s=>{if(!Number.isFinite(s.longitude))return b.nothing;let i=this.toAngle(s.longitude),d=H(V,V,r,i),m=H(V,V,r+(t===1?-12:-10),i),p=B[f(s.name)]??s.name.slice(0,2),h=ke(s.longitude),R=s.isRetrograde===!0,x=`${h.degree}\xB0${String(h.minute).padStart(2,"0")}'`,ir=`${s.name}${R?" retrograde":""} - ${x} ${h.sign}`;return b.svg`<g>
86
+ <text class=${a} x=${d.x} y=${d.y} text-anchor="middle" dominant-baseline="central"><title>${ir}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${t}</tspan></text>
87
+ <text class="planet-deg" x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${h.degree}°${R?b.svg`<tspan class="retro"> ℞</tspan>`:b.nothing}</text>
88
+ </g>`})}renderAscendants(e){let r=[],a=(t,s)=>{if(!t)return;let i=ee.findIndex(R=>R.toLowerCase()===t.sign.toLowerCase());if(i===-1)return;let d=i*30+t.degree,c=this.toAngle(d),m=s===1?Da+14:wr+14,p=H(V,V,m,c),h=H(V,V,Ma+14,c);r.push(b.svg`<g>
89
+ <line class="asc-tick" x1=${p.x} y1=${p.y} x2=${h.x} y2=${h.y} />
90
+ <text class="asc-label" x=${h.x} y=${h.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
91
+ </g>`)};return a(e.person1?.ascendant,1),a(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,a){let t=(s,i)=>{let d=f(i);for(let c of s)if(f(c.name)===d&&typeof c.longitude=="number")return c.longitude};return a.map(s=>{let i=t(e,s.planet1),d=t(r,s.planet2);if(i===void 0||d===void 0)return b.nothing;let c=H(V,V,Da-12,this.toAngle(i)),m=H(V,V,wr+8,this.toAngle(d)),p=hr(s),h=cr[p]??"aspect-other",R=v(s.orb,1);return b.svg`<line class=${`aspect ${h}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${s.planet1} ${p} ${s.planet2}${R?` (orb ${R}\xB0)`:""}</title></line>`})}renderAspects(e){return b.html`<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=>b.html`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${hr(r)||""}</td><td class="orb">${v(r.orb,1)}</td><td>${gs(r.strength)}</td></tr>`)}</tbody></table>`}};sr.styles=[g,b.css`.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}`],l([(0,xa.property)({attribute:!1})],sr.prototype,"data",2),sr=l([(0,xa.customElement)("roxy-synastry-chart")],sr);function gs(o){return typeof o=="number"?Math.round(o).toString():""}var z=require("lit"),kr=require("lit/decorators.js");var Be=class extends z.LitElement{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new y(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):z.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,a=this.flipped!==!!r.reversed,t=r.keywords??[];return z.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?z.html`<img class="${`image ${a?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:z.html`<div class="${`image ${a?"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?z.html`${r.arcana} arcana`:z.nothing} ${a?z.html`· reversed`:z.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?z.html`<p class="message">${e.dailyMessage}</p>`:z.nothing} ${r.meaning?z.html`<p>${r.meaning}</p>`:z.nothing} ${t.length>0?z.html`<div class="chips">${t.map(s=>z.html`<span>${s}</span>`)}</div>`:z.nothing} <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,a=r?e.reversed:e.upright,t=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return z.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?z.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:z.html`<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?z.html`${e.arcana} arcana`:z.nothing} ${e.number!==void 0&&e.number!==null?z.html`· ${e.number}`:z.nothing} ${r?z.html`· reversed`:z.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${a?.description?z.html`<p>${a.description}</p>`:z.nothing} ${t.length>0?z.html`<div class="chips">${t.map(s=>z.html`<span>${s}</span>`)}</div>`:z.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};Be.styles=[g,z.css`.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)}`],l([(0,kr.property)({attribute:!1})],Be.prototype,"data",2),l([(0,kr.state)()],Be.prototype,"flipped",2),Be=l([(0,kr.customElement)("roxy-tarot-card")],Be);var N=require("lit"),_r=require("lit/decorators.js");var _e=class extends N.LitElement{constructor(){super();this.data=null;this.spread="three-card";new y(this)}render(){let e=this.data;if(!e)return N.html`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,a="cards"in e&&!("spread"in e),t=a?[]:"positions"in e?e.positions??[]:[],s=a&&"cards"in e?e.cards:[],i=r?e.answer:void 0,d=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,p="summary"in e?e.summary:void 0,h=r?e.interpretation:void 0,R=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return N.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${m?N.html`<span class="question">"${m}"</span>`:N.nothing}</header>${r?N.html`<div><span class="${`answer ${R}`}">${i}</span> ${d?N.html`<small>· ${d}</small>`:N.nothing}</div>`:N.nothing} ${t.length>0?N.html`<div class="grid">${t.map(x=>N.html`<div class="card"><p class="label">${x.name??""}</p><div class="image">${x.card?.imageUrl?N.html`<img src="${x.card.imageUrl}" alt="${x.card.name??"tarot card"}" class="${x.card.reversed?"reversed":""}">`:N.html`${x.card?.name??"?"}`}</div><p class="name">${x.card?.name??""} ${x.card?.reversed?N.html`<small>(reversed)</small>`:N.nothing}</p>${x.interpretation?N.html`<p class="interp">${x.interpretation}</p>`:N.nothing}</div>`)}</div>`:N.nothing} ${s.length>0?N.html`<div class="grid">${s.map(x=>N.html`<div class="card"><div class="image">${x.imageUrl?N.html`<img src="${x.imageUrl}" alt="${x.name??"tarot card"}" class="${x.reversed?"reversed":""}">`:N.html`${x.name??"?"}`}</div><p class="name">${x.name??""} ${x.reversed?N.html`<small>(reversed)</small>`:N.nothing}</p>${x.meaning?N.html`<p class="interp">${x.meaning}</p>`:N.nothing}</div>`)}</div>`:N.nothing} ${p?N.html`<p class="reading">${p}</p>`:N.nothing} ${h?N.html`<p class="reading">${h}</p>`:N.nothing}</article>`}};_e.styles=[g,N.css`.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}`],l([(0,_r.property)({attribute:!1})],_e.prototype,"data",2),l([(0,_r.property)({type:String,reflect:!0})],_e.prototype,"spread",2),_e=l([(0,_r.customElement)("roxy-tarot-spread")],_e);var M=require("lit"),Sr=require("lit/decorators.js");var Ke=class extends M.LitElement{constructor(){super();this.data=null;this.tab="positions";new y(this)}render(){if(!this.data?.transitPlanets?.length)return M.html`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:a,transitAspects:t,summary:s}=this.data,i=[We(e),$e(r)].filter(Boolean).join(" "),d=t?.length??0,c=this.tab;return M.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${i?M.html`<p class="subtitle">${i}</p>`:M.nothing}</div>${d>0?M.html`${xr({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${d})`}],active:c,onSelect:m=>{this.tab=m},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?M.html`<div class="overflow-scroll">${this.renderPlanetsTable(a)}</div>`:M.html`${s?this.renderSummaryPills(s):M.nothing}<div class="overflow-scroll">${this.renderAspectsList(t??[])}</div>`}</div>`:M.html`<div class="overflow-scroll">${this.renderPlanetsTable(a)}</div>`}</div>`}renderSummaryPills(e){return M.html`<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 M.html`<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 a=B[f(r.name)]??"",t=ie[f(r.sign)]??"",s=r.speed>=0?"\u2191":"\u2193";return M.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${r.name} ${r.isRetrograde?M.html`<span class="retro-badge" aria-label="retrograde">R</span>`:M.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.sign}</div></td><td class="num">${v(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${v(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return M.html`<div role="list" aria-label="Transit aspects">${e.map((r,a)=>{let t=B[f(r.transitPlanet)]??"",s=B[f(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),d=r.interpretation,c=(r.type??"").toLowerCase(),m=r.isApplying?"Applying":"Separating";return M.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${a===0}"><summary><span aria-hidden="true">${t}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${m} · orb ${v(r.orb,2)}° · strength ${v(r.strength,1)} </span>${Se()}</summary><div class="interp-body">${d?.summary?M.html`<p>${d.summary}</p>`:M.nothing} ${d?.impact?M.html`<p><strong>Impact:</strong> ${d.impact}</p>`:M.nothing} ${d?.timing?M.html`<p><strong>Timing:</strong> ${d.timing}</p>`:M.nothing} ${d?.guidance?M.html`<p><strong>Guidance:</strong> ${d.guidance}</p>`:M.nothing} ${d?.keywords?.length?M.html`<div class="interp-keywords">${d.keywords.map(p=>M.html`<span class="kw">${p}</span>`)}</div>`:M.nothing}</div></details>`})}</div>`}};Ke.styles=[g,Je,fr,M.css`.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)}`],l([(0,Sr.property)({attribute:!1})],Ke.prototype,"data",2),l([(0,Sr.state)()],Ke.prototype,"tab",2),Ke=l([(0,Sr.customElement)("roxy-transits-table")],Ke);var Kr=require("lit"),yr=require("lit/decorators.js");var ve=class extends Kr.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e};new y(this)}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?oa(this.data.meta,"D1 Rashi",this.resolveReference()):null}render(){let e=this.viewModel();if(!e)return Kr.html`<div class="roxy-empty" role="status">No kundli data</div>`;let r=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return Kr.html`<div class="wrap"><div class="header"><h2 class="title">${r}</h2>${ia(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>${na(e,this.chartStyle)}</svg></div>`}};ve.styles=[g,la,Je],l([(0,yr.property)({attribute:!1})],ve.prototype,"data",2),l([(0,yr.property)({type:String,reflect:!0,attribute:"chart-style"})],ve.prototype,"chartStyle",2),l([(0,yr.property)({type:String,reflect:!0,attribute:"chart-reference"})],ve.prototype,"chartReference",2),l([(0,yr.property)({type:String,reflect:!0,attribute:"lagna-override"})],ve.prototype,"lagnaOverride",2),ve=l([(0,yr.customElement)("roxy-vedic-kundli")],ve);var S=require("lit"),ba=require("lit/decorators.js");var ys=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],or=class extends S.LitElement{constructor(){super();this.data=null;new y(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,a=[];for(let t of ys){let s=e[t];s&&(a.push([t,s]),r.add(t))}for(let[t,s]of Object.entries(e))r.has(t)||a.push([t,s]);return a}render(){if(!this.data?.meta)return S.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return S.html`<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,a])=>{let t=(a.graha??r)==="Lagna",s=B[f(a.graha??r)]??"",i=ie[f(a.rashi??"")]??"";return S.html`<tr class="${t?"lagna":""}"><td class="graha">${s?S.html`<span class="glyph">${s}</span>`:S.nothing}${a.graha??r}</td><td>${i?S.html`<span class="glyph">${i}</span>`:S.nothing}${a.rashi??""}</td><td class="num">${typeof a.longitude=="number"?ta(a.longitude):""}</td><td>${a.nakshatra?.name??""}</td><td class="num">${a.nakshatra?.pada??""}</td><td>${a.nakshatra?.lord??""}</td><td class="num">${typeof a.house=="number"?a.house:""}</td><td>${a.awastha??""}</td><td>${a.isRetrograde?S.html`<span class="retro">R</span>`:S.nothing}</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?S.nothing:S.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${Se()}</summary><div class="panel-body">${e.map(r=>{let a=B[f(r.planet)]??"",t=v(r.distanceFromSun,2),s=v(r.orb,1);return S.html`<div class="condition"><span class="planet">${a?`${a} `:""}${r.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?S.nothing:S.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${Se()}</summary><div class="panel-body">${e.map(r=>{let a=v(r.distance,2);return S.html`<div class="condition"><span class="planet">${r.planet1} vs ${r.planet2}</span> <span class="detail">${a} deg apart</span> <span class="winner">${r.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},r=this.orderedRows().map(([a,t])=>[t.graha??a,e[t.graha??a]]).filter(([,a])=>a!=null);return r.length===0?S.nothing:S.html`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${Se()}</summary><div class="panel-body">${r.map(([a,t])=>{let s=B[f(a)]??"";return S.html`<div class="interp"><span class="planet">${s?`${s} `:""}${a}</span> ${t.rashi?S.html`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:S.nothing} ${t.nakshatra?S.html`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:S.nothing}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?S.nothing:S.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${Se()}</summary><div class="panel-body">${e.map(r=>S.html`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?S.html`<p class="desc">${r.description}</p>`:S.nothing}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?S.nothing:S.html`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${Se()}</summary><div class="panel-body">${e.map(r=>S.html`<div class="bhava"><span class="name">${r.name} ${r.quality?S.html`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:S.nothing}</span> ${r.result?S.html`<p class="desc">${r.result}</p>`:S.nothing}</div>`)}</div></details>`}};or.styles=[g,fr,S.css`.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)}`],l([(0,ba.property)({attribute:!1})],or.prototype,"data",2),or=l([(0,ba.customElement)("roxy-vedic-planets-table")],or);var te=require("lit"),fa=require("lit/decorators.js");var nr=class extends te.LitElement{constructor(){super();this.data=null;new y(this)}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.name,sign:a.sign,longitude:a.longitude,house:a.house,speed:a.speed,isRetrograde:a.isRetrograde}));for(let[a,t]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])t&&r.push({name:a,sign:t.sign,longitude:t.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return te.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return te.html`<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 a=B[f(r.name)]??"",t=ie[f(r.sign??"")]??"",s=typeof r.speed=="number"?v(r.speed,3):"";return te.html`<tr class="${r.isPoint?"point":""}"><td class="body">${a?te.html`<span class="glyph">${a}</span>`:te.nothing}${r.name}</td><td>${t?te.html`<span class="glyph">${t}</span>`:te.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?ta(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${s?te.html`${s}°/day`:te.nothing} ${r.isRetrograde?te.html`<span class="retro">℞</span>`:te.nothing}</td></tr>`})}</tbody></table></div>`}};nr.styles=[g,te.css`.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}`],l([(0,fa.property)({attribute:!1})],nr.prototype,"data",2),nr=l([(0,fa.customElement)("roxy-western-planets-table")],nr);var F=require("lit"),Cr=require("lit/decorators.js");var qe=class extends F.LitElement{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new y(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return F.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return F.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):F.nothing}</p>${e.description?F.html`<p class="description">${e.description}</p>`:F.nothing} ${e.result?F.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:F.nothing}</div>`}render(){if(!this.data)return F.html`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let a=e;return F.html`<div class="wrap">${this.renderDetailCard(a)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let a=e.yogas;if(a.length>0&&"description"in a[0]){let c=a,m=r?c.filter(h=>h.name.toLowerCase().includes(r)):c,p=e.total;return F.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${p!==void 0?F.html`<span class="count">${p} total</span>`:F.nothing}</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">${m.length>0?m.map(h=>this.renderDetailCard(h)):F.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let s=a,i=r?s.filter(c=>c.name.toLowerCase().includes(r)):s,d=e.total;return F.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${d!==void 0?F.html`<span class="count">${d} total</span>`:F.nothing}</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">${i.length>0?i.map(c=>F.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):F.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return F.html`<div class="roxy-empty" role="status">No yoga data</div>`}};qe.styles=[g,F.css`.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}`],l([(0,Cr.property)({attribute:!1})],qe.prototype,"data",2),l([(0,Cr.state)()],qe.prototype,"filter",2),qe=l([(0,Cr.customElement)("roxy-yoga-list")],qe);var va=[{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 nt="0.10.0";var us=va.map(o=>o.slug);
92
92
  //# sourceMappingURL=index.cjs.map