@roxyapi/ui 0.11.0 → 0.12.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 (139) hide show
  1. package/AGENTS.md +6 -0
  2. package/README.md +6 -0
  3. package/components-catalog.json +111 -1
  4. package/dist/cdn/components/astrocartography-map.js +58 -0
  5. package/dist/cdn/components/astrocartography-map.js.map +7 -0
  6. package/dist/cdn/components/divisional-chart.js +7 -7
  7. package/dist/cdn/components/divisional-chart.js.map +1 -1
  8. package/dist/cdn/components/dosha-card.js +2 -2
  9. package/dist/cdn/components/dosha-card.js.map +3 -3
  10. package/dist/cdn/components/fixed-stars.js +52 -0
  11. package/dist/cdn/components/fixed-stars.js.map +7 -0
  12. package/dist/cdn/components/hd-variables.js +2 -2
  13. package/dist/cdn/components/hd-variables.js.map +3 -3
  14. package/dist/cdn/components/hexagram.js +3 -3
  15. package/dist/cdn/components/hexagram.js.map +3 -3
  16. package/dist/cdn/components/local-space-compass.js +58 -0
  17. package/dist/cdn/components/local-space-compass.js.map +7 -0
  18. package/dist/cdn/components/moon-phase.js +3 -3
  19. package/dist/cdn/components/moon-phase.js.map +3 -3
  20. package/dist/cdn/components/natal-chart.js +8 -8
  21. package/dist/cdn/components/natal-chart.js.map +2 -2
  22. package/dist/cdn/components/positions-table.js +52 -0
  23. package/dist/cdn/components/positions-table.js.map +7 -0
  24. package/dist/cdn/components/profection-card.js +52 -0
  25. package/dist/cdn/components/profection-card.js.map +7 -0
  26. package/dist/cdn/components/reference-card.js +3 -3
  27. package/dist/cdn/components/reference-card.js.map +3 -3
  28. package/dist/cdn/components/relocation-wheel.js +61 -0
  29. package/dist/cdn/components/relocation-wheel.js.map +7 -0
  30. package/dist/cdn/components/synastry-chart.js +4 -4
  31. package/dist/cdn/components/synastry-chart.js.map +2 -2
  32. package/dist/cdn/components/vedic-kundli.js +5 -5
  33. package/dist/cdn/components/vedic-kundli.js.map +1 -1
  34. package/dist/cdn/components/vedic-planets-table.js +2 -2
  35. package/dist/cdn/components/vedic-planets-table.js.map +1 -1
  36. package/dist/cdn/components/western-planets-table.js +2 -2
  37. package/dist/cdn/components/western-planets-table.js.map +1 -1
  38. package/dist/cdn/components/yoga-list.js +3 -3
  39. package/dist/cdn/components/yoga-list.js.map +3 -3
  40. package/dist/cdn/roxy-ui.js +83 -71
  41. package/dist/cdn/roxy-ui.js.map +4 -4
  42. package/dist/components/astrocartography-map.d.ts +27 -0
  43. package/dist/components/astrocartography-map.d.ts.map +1 -0
  44. package/dist/components/astrocartography-map.js +8 -0
  45. package/dist/components/astrocartography-map.js.map +7 -0
  46. package/dist/components/divisional-chart.js +22 -22
  47. package/dist/components/divisional-chart.js.map +1 -1
  48. package/dist/components/dosha-card.d.ts.map +1 -1
  49. package/dist/components/dosha-card.js +1 -1
  50. package/dist/components/dosha-card.js.map +3 -3
  51. package/dist/components/fixed-stars.d.ts +21 -0
  52. package/dist/components/fixed-stars.d.ts.map +1 -0
  53. package/dist/components/fixed-stars.js +2 -0
  54. package/dist/components/fixed-stars.js.map +7 -0
  55. package/dist/components/hd-variables.d.ts.map +1 -1
  56. package/dist/components/hd-variables.js +1 -1
  57. package/dist/components/hd-variables.js.map +3 -3
  58. package/dist/components/hexagram.d.ts +3 -1
  59. package/dist/components/hexagram.d.ts.map +1 -1
  60. package/dist/components/hexagram.js +1 -1
  61. package/dist/components/hexagram.js.map +3 -3
  62. package/dist/components/local-space-compass.d.ts +23 -0
  63. package/dist/components/local-space-compass.d.ts.map +1 -0
  64. package/dist/components/local-space-compass.js +8 -0
  65. package/dist/components/local-space-compass.js.map +7 -0
  66. package/dist/components/moon-phase.d.ts.map +1 -1
  67. package/dist/components/moon-phase.js +1 -1
  68. package/dist/components/moon-phase.js.map +3 -3
  69. package/dist/components/natal-chart.d.ts +2 -0
  70. package/dist/components/natal-chart.d.ts.map +1 -1
  71. package/dist/components/natal-chart.js +6 -6
  72. package/dist/components/natal-chart.js.map +2 -2
  73. package/dist/components/positions-table.d.ts +34 -0
  74. package/dist/components/positions-table.d.ts.map +1 -0
  75. package/dist/components/positions-table.js +2 -0
  76. package/dist/components/positions-table.js.map +7 -0
  77. package/dist/components/profection-card.d.ts +18 -0
  78. package/dist/components/profection-card.d.ts.map +1 -0
  79. package/dist/components/profection-card.js +2 -0
  80. package/dist/components/profection-card.js.map +7 -0
  81. package/dist/components/reference-card.d.ts.map +1 -1
  82. package/dist/components/reference-card.js +1 -1
  83. package/dist/components/reference-card.js.map +3 -3
  84. package/dist/components/relocation-wheel.d.ts +21 -0
  85. package/dist/components/relocation-wheel.d.ts.map +1 -0
  86. package/dist/components/relocation-wheel.js +11 -0
  87. package/dist/components/relocation-wheel.js.map +7 -0
  88. package/dist/components/synastry-chart.js +3 -3
  89. package/dist/components/synastry-chart.js.map +2 -2
  90. package/dist/components/vedic-kundli.js +14 -14
  91. package/dist/components/vedic-kundli.js.map +1 -1
  92. package/dist/components/vedic-planets-table.js +1 -1
  93. package/dist/components/vedic-planets-table.js.map +1 -1
  94. package/dist/components/western-planets-table.js +1 -1
  95. package/dist/components/western-planets-table.js.map +1 -1
  96. package/dist/components/yoga-list.d.ts +5 -2
  97. package/dist/components/yoga-list.d.ts.map +1 -1
  98. package/dist/components/yoga-list.js +1 -1
  99. package/dist/components/yoga-list.js.map +3 -3
  100. package/dist/generated/endpoint-bindings.d.ts.map +1 -1
  101. package/dist/index.cjs +62 -50
  102. package/dist/index.cjs.map +4 -4
  103. package/dist/index.d.ts +6 -0
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +62 -50
  106. package/dist/index.js.map +4 -4
  107. package/dist/manifest.d.ts.map +1 -1
  108. package/dist/manifest.json +6 -0
  109. package/dist/types/index.d.ts +1 -1
  110. package/dist/types/index.d.ts.map +1 -1
  111. package/dist/types/types.gen.d.ts +7864 -5381
  112. package/dist/types/types.gen.d.ts.map +1 -1
  113. package/dist/utils/degree.d.ts +2 -0
  114. package/dist/utils/degree.d.ts.map +1 -1
  115. package/dist/utils/planet-color.d.ts +3 -0
  116. package/dist/utils/planet-color.d.ts.map +1 -0
  117. package/dist/version.d.ts +1 -1
  118. package/package.json +2 -1
  119. package/src/components/astrocartography-map.ts +436 -0
  120. package/src/components/dosha-card.ts +48 -16
  121. package/src/components/fixed-stars.ts +254 -0
  122. package/src/components/hd-variables.ts +30 -2
  123. package/src/components/hexagram.ts +11 -11
  124. package/src/components/local-space-compass.ts +299 -0
  125. package/src/components/moon-phase.ts +21 -2
  126. package/src/components/natal-chart.ts +36 -24
  127. package/src/components/positions-table.ts +442 -0
  128. package/src/components/profection-card.ts +173 -0
  129. package/src/components/reference-card.ts +40 -8
  130. package/src/components/relocation-wheel.ts +170 -0
  131. package/src/components/yoga-list.ts +95 -2
  132. package/src/generated/endpoint-bindings.ts +62 -0
  133. package/src/index.ts +6 -0
  134. package/src/manifest.ts +79 -0
  135. package/src/types/index.ts +1 -1
  136. package/src/types/types.gen.ts +7814 -5263
  137. package/src/utils/degree.ts +11 -0
  138. package/src/utils/planet-color.ts +45 -0
  139. package/src/version.ts +1 -1
package/dist/index.cjs CHANGED
@@ -1,14 +1,20 @@
1
- "use strict";var Zr=Object.defineProperty;var Xa=Object.getOwnPropertyDescriptor;var Wt=Object.getOwnPropertyNames;var Jt=Object.prototype.hasOwnProperty;var Xt=(n,a)=>{for(var e in a)Zr(n,e,{get:a[e],enumerable:!0})},Zt=(n,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of Wt(a))!Jt.call(n,t)&&t!==e&&Zr(n,t,{get:()=>a[t],enumerable:!(r=Xa(a,t))||r.enumerable});return n};var Qt=n=>Zt(Zr({},"__esModule",{value:!0}),n),d=(n,a,e,r)=>{for(var t=r>1?void 0:r?Xa(a,e):a,s=n.length-1,o;s>=0;s--)(o=n[s])&&(t=(r?o(a,e,t):o(t))||t);return r&&t&&Zr(a,e,t),t};var lo={};Xt(lo,{ROXY_COMPONENTS:()=>Na,ROXY_UI_COMPONENTS:()=>io,ROXY_UI_VERSION:()=>Ut,RoxyAngelNumberCard:()=>cr,RoxyAngelNumberLookup:()=>pr,RoxyAshtakavargaGrid:()=>Ie,RoxyAspectsTable:()=>yr,RoxyBiorhythmChart:()=>_e,RoxyBodygraph:()=>xr,RoxyChoghadiyaGrid:()=>hr,RoxyCompatibilityCard:()=>Fe,RoxyCrystalCard:()=>fr,RoxyCrystalGrid:()=>qe,RoxyDashaTimeline:()=>Ve,RoxyData:()=>Ye,RoxyDivisionalChart:()=>We,RoxyDoshaCard:()=>Je,RoxyDreamCard:()=>$r,RoxyDreamSearch:()=>wr,RoxyEndpointForm:()=>ce,RoxyForecastDigest:()=>kr,RoxyForecastTimeline:()=>Sr,RoxyGunaMilan:()=>Rr,RoxyHdConnection:()=>Cr,RoxyHdPenta:()=>Tr,RoxyHdVariables:()=>Er,RoxyHexagram:()=>Xe,RoxyHoraTable:()=>Dr,RoxyHoroscopeCard:()=>Ze,RoxyKpChart:()=>Qe,RoxyKpPlanetsTable:()=>Pr,RoxyKpRulingPlanets:()=>zr,RoxyLocationSearch:()=>ie,RoxyMoonPhase:()=>er,RoxyNakshatraCard:()=>Ar,RoxyNatalChart:()=>je,RoxyNumerologyCard:()=>rr,RoxyPanchangTable:()=>ar,RoxyReferenceCard:()=>Nr,RoxyShadbalaTable:()=>Lr,RoxySynastryChart:()=>Mr,RoxyTarotCard:()=>tr,RoxyTarotCatalog:()=>sr,RoxyTarotSpread:()=>nr,RoxyTransitsTable:()=>ir,RoxyVedicAspects:()=>Gr,RoxyVedicKundli:()=>Ge,RoxyVedicPlanetsTable:()=>Hr,RoxyWesternPlanetsTable:()=>Or,RoxyYogaList:()=>lr,roxyDataScript:()=>rt,serializeRoxyData:()=>La});module.exports=Qt(lo);var G=require("lit"),tt=require("lit/decorators.js");var es=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"money",label:"Money"},{key:"twinFlame",label:"Twin flame"}];function Qr(n,a,e){let r=[];if(n)for(let t of es){let s=n[t.key];s&&r.push({label:t.label,body:s})}return a&&r.push({label:"Biblical",body:a}),e&&r.push({label:"Shadow",body:e}),r}var Be=require("lit"),Se=require("lit/decorators.js"),at=require("lit/directives/if-defined.js");var Za=require("lit"),g=Za.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}:host([bare]){--roxy-surface:transparent;--roxy-shadow-sm:none;--roxy-shadow-md:none}*,: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)}.roxy-error{gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-lg,1.5rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}.roxy-surface{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var rs="https://roxyapi.com/api/v2",ea=class{constructor(a){this.baseUrl=rs;this.host=a,a.addController(this)}hostDisconnected(){this.abort?.abort(),this.abort=void 0}async run(a){if(!this.submitUrl&&this.secretKeyRefused())return;this.abort?.abort();let e=new AbortController;this.abort=e,this.host.loading=!0,this.host.error=null;try{let r=this.submitUrl?await fetch(this.submitUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a),signal:e.signal}):await this.callApi(a,e.signal);if(!r.ok)throw new Error(await this.readError(r));let t=await r.json();if(e.signal.aborted)return;this.host.data=t}catch(r){if(r?.name==="AbortError")return;this.host.error=r instanceof Error?r.message:String(r)}finally{this.abort===e&&(this.abort=void 0),e.signal.aborted||(this.host.loading=!1)}}callApi(a,e){let r=new URL(`${this.baseUrl}${a.path}`);for(let[s,o]of Object.entries(a.query??{}))o!=null&&r.searchParams.set(s,String(o));let t={Accept:"application/json"};return this.publishableKey&&(t["X-API-Key"]=this.publishableKey),a.body!=null&&(t["Content-Type"]="application/json"),fetch(r,{method:a.method??"GET",headers:t,body:a.body!=null?JSON.stringify(a.body):void 0,signal:e})}secretKeyRefused(){let a=this.publishableKey;return!a||a.startsWith("pk_")?!1:(this.host.error="Client-side components accept a pk_ publishable key only. Use a publishable key with an origin allowlist, or render server-side.",this.host.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key"},bubbles:!0,composed:!0})),!0)}async readError(a){try{let e=await a.json();if(e?.error)return e.error}catch{}return`Request failed (${a.status})`}};function Qa(n,a,e){let r={...e},t=`/${n.replace(/^\//,"")}`.replace(/\{([^}]+)\}/g,(i,l)=>{let c=r[l];return delete r[l],encodeURIComponent(String(c??""))}),s={},o={};for(let[i,l]of Object.entries(r))l===void 0||l===""||(a==="GET"?s[i]=l:o[i]=l);return{path:t,method:a,query:s,body:a==="POST"?o:void 0}}var et="roxy-data";function La(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function rt(n){return`<script type="application/json" class="${et}">${La(n)}</script>`}function as(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var ra=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(as(a)&&a.classList.contains(et))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var m=class extends Be.LitElement{constructor(){super();this.data=null;this.endpoint="";this.method="POST";this.remember=!1;this.loading=!1;this.error=null;this.onFormSubmit=e=>{let r=e.detail;this.remember&&this.writeRemembered(r.values),this.fetcher.run(Qa(this.endpoint,this.method,r.values))};new ra(this),this.fetcher=new ea(this)}static{this.styles=[g]}willUpdate(e){e.has("publishableKey")&&(this.fetcher.publishableKey=this.publishableKey),e.has("baseUrl")&&this.baseUrl&&(this.fetcher.baseUrl=this.baseUrl),e.has("submitUrl")&&(this.fetcher.submitUrl=this.submitUrl)}render(){return this.loading?this.renderLoading():this.error!=null?this.renderError(this.error):this.data!=null?this.renderData(this.data):this.renderNoData()}renderNoData(){return this.endpoint?this.renderForm():this.renderEmpty()}renderForm(){return Be.html`<roxy-endpoint-form data-endpoint="${this.endpoint}" method="${this.method}" spec-url="${(0,at.ifDefined)(this.specUrl)}" .initialValues="${this.remember?this.readRemembered():void 0}" @roxy-submit="${this.onFormSubmit}"></roxy-endpoint-form>`}rememberKey(){return`roxy-ui:form:${this.endpoint}`}readRemembered(){try{let e=sessionStorage.getItem(this.rememberKey());return e?JSON.parse(e):void 0}catch{return}}writeRemembered(e){try{sessionStorage.setItem(this.rememberKey(),JSON.stringify(e))}catch{}}renderEmpty(){return Be.html`<div class="roxy-empty" role="status">No data</div>`}renderLoading(){return Be.html`<div class="roxy-skeleton" style="height:8rem" role="status" aria-label="Loading"></div>`}renderError(e){let r=Be.html`<div class="roxy-error" role="alert">${e}</div>`;return this.endpoint?Be.html`${r}${this.renderForm()}`:r}};d([(0,Se.property)({attribute:!1})],m.prototype,"data",2),d([(0,Se.property)({type:String,attribute:"data-endpoint"})],m.prototype,"endpoint",2),d([(0,Se.property)({type:String})],m.prototype,"method",2),d([(0,Se.property)({type:String,attribute:"publishable-key"})],m.prototype,"publishableKey",2),d([(0,Se.property)({type:String,attribute:"base-url"})],m.prototype,"baseUrl",2),d([(0,Se.property)({type:String,attribute:"spec-url"})],m.prototype,"specUrl",2),d([(0,Se.property)({type:String,attribute:"submit-url"})],m.prototype,"submitUrl",2),d([(0,Se.property)({type:Boolean})],m.prototype,"remember",2),d([(0,Se.state)()],m.prototype,"loading",2),d([(0,Se.state)()],m.prototype,"error",2);var cr=class extends m{renderData(a){let e=(a.energy??"").toLowerCase(),r=e==="positive"||e==="cautionary"||e==="neutral"?e:"",t=a.keywords??[],s=a.actionSteps??[];return G.html`<article class="card" aria-label="${`Angel number ${a.number??""}`}"><div class="hero">${a.number?G.html`<div class="numeral">${a.number}</div>`:G.nothing}<div><p class="label">Angel number</p>${a.title?G.html`<h2 class="title">${a.title}</h2>`:G.nothing}</div></div>${a.coreMessage?G.html`<p class="core">${a.coreMessage}</p>`:G.nothing}<div class="badges">${a.type?G.html`<span class="badge">${a.type}</span>`:G.nothing} ${typeof a.digitRoot=="number"?G.html`<span class="badge">Digit root ${a.digitRoot}</span>`:G.nothing} ${a.energy?G.html`<span class="${`badge ${r}`}">${a.energy}</span>`:G.nothing}</div>${t.length>0?G.html`<div class="chips">${t.map(o=>G.html`<span>${o}</span>`)}</div>`:G.nothing} ${this.renderSections(a)} ${a.affirmation?G.html`<p class="affirmation">${a.affirmation}</p>`:G.nothing} ${s.length>0?G.html`<div class="steps"><h3>Action steps</h3><ul>${s.map(o=>G.html`<li>${o}</li>`)}</ul></div>`:G.nothing}</article>`}renderEmpty(){return G.html`<div class="roxy-empty" role="status">No angel number</div>`}renderSections(a){let e=Qr(a.meaning,a.biblical,a.shadow);return e.length===0?G.nothing:G.html`<div class="sections">${e.map((r,t)=>G.html`<details name="angel-meaning" ?open="${t===0}"><summary>${r.label}</summary><p>${r.body}</p></details>`)}</div>`}};cr.styles=[g,G.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}`],cr=d([(0,tt.customElement)("roxy-angel-number-card")],cr);var $=require("lit"),st=require("lit/decorators.js");var pr=class extends m{renderEmpty(){return $.html`<div class="roxy-empty" role="status">No number analysis</div>`}renderData(a){let e=a.knownMeaning,r=a.digitRootMeaning,t=e?.title??"Number analysis";return $.html`<article class="card" aria-label="${`Number ${a.number??""}`}"><div class="hero">${a.number?$.html`<div class="numeral">${a.number}</div>`:$.nothing}<div><p class="label">Number analysis</p><h2 class="title">${t}</h2></div></div><div class="badges">${a.type?$.html`<span class="badge">${a.type}</span>`:$.nothing} ${typeof a.digits=="number"?$.html`<span class="badge">${a.digits} digits</span>`:$.nothing} ${typeof a.uniqueDigits=="number"?$.html`<span class="badge">${a.uniqueDigits} unique</span>`:$.nothing} ${typeof a.digitRoot=="number"?$.html`<span class="badge">Digit root ${a.digitRoot}</span>`:$.nothing} ${a.isPalindrome?$.html`<span class="badge flag">Palindrome</span>`:$.nothing} ${a.isRepeating?$.html`<span class="badge flag">Repeating</span>`:$.nothing}</div>${e?$.html`<div class="section"><p class="label">Known angel number</p>${e.coreMessage?$.html`<p>${e.coreMessage}</p>`:$.nothing} ${e.keywords&&e.keywords.length>0?$.html`<div class="chips">${e.keywords.map(s=>$.html`<span>${s}</span>`)}</div>`:$.nothing} ${this.renderMeaning(e.meaning,e.biblical,e.shadow)} ${e.affirmation?$.html`<p><em>${e.affirmation}</em></p>`:$.nothing}</div>`:$.nothing} ${r?$.html`<div class="section"><p class="label">Foundational digit root${r.number?` (${r.number})`:""}</p>${r.title?$.html`<h3>${r.title}</h3>`:$.nothing} ${r.coreMessage?$.html`<p>${r.coreMessage}</p>`:$.nothing} ${e?$.nothing:this.renderRootMeaning(r)}</div>`:$.nothing}</article>`}renderMeaning(a,e,r){let t=Qr(a,e,r);return t.length===0?$.nothing:$.html`${t.map((s,o)=>$.html`<details name="lookup-meaning" ?open="${o===0}"><summary>${s.label}</summary><p>${s.body}</p></details>`)}`}renderRootMeaning(a){return $.html`${a.keywords&&a.keywords.length>0?$.html`<div class="chips">${a.keywords.map(e=>$.html`<span>${e}</span>`)}</div>`:$.nothing}${this.renderMeaning(a.meaning)}${a.affirmation?$.html`<p><em>${a.affirmation}</em></p>`:$.nothing}`}};pr.styles=[g,$.css`.card{background:var(--roxy-surface,#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)}`],pr=d([(0,st.customElement)("roxy-angel-number-lookup")],pr);var re=require("lit"),ta=require("lit/decorators.js");var N={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"},ot={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"},pe={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},aa={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},te=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],Po=te.map(n=>n.toLowerCase()),Yr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},Ma={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"},nt={"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 ts={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},mr=["sarva","bhinna","pinda"],Ie=class extends m{constructor(){super(...arguments);this.activeTab="sarva"}renderEmpty(){return re.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`}renderData(e){let r=e.signs??[];return re.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${r.length?re.html`<p class="subtitle">${r.length} signs</p>`:re.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${mr.map(t=>re.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}}">${ts[t]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(r):this.activeTab==="bhinna"?this.renderBhinna(r):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=mr.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=mr[(r+1)%mr.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=mr[(r-1+mr.length)%mr.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?re.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,s)=>{let o=r.bindus[s]??0,i=this.sarvaHeat(o);return re.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${pe[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${o}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:re.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?re.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=>re.html`<th scope="col" title="${t}">${pe[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>re.html`<tr><td>${t.planet}</td>${t.bindus.map(s=>{let o=this.bhinnaHeat(s);return re.html`<td class="${`heat-cell ${o}`}">${s}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:re.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?re.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=>re.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:re.html`<p class="roxy-empty">No shodhya pinda data</p>`}};Ie.styles=[g,re.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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,ta.state)()],Ie.prototype,"activeTab",2),Ie=d([(0,ta.customElement)("roxy-ashtakavarga-grid")],Ie);var v=require("lit"),lt=require("lit/decorators.js");var sa=require("lit");function Re(){return sa.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 Ke=sa.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}}`;function Ne(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,r=new Date(e);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Ce(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Ga(n){if(!n)return"";let a=Ne(n.start),e=Ne(n.end);return a&&e?`${a} - ${e}`:a||e||""}function f(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function it(n,a=1){let e=f(n,a);return e?`${e}%`:""}var gr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function jr(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}function h(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function Y(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var yr=class extends m{renderEmpty(){return v.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e="aspects"in a?a.aspects??[]:[],r="patterns"in a?a.patterns??[]:[],t="summary"in a?a.summary:void 0;return e.length===0&&r.length===0?this.renderEmpty():v.html`<div class="wrap" aria-label="Aspects"><div class="head"><h2 class="title">Aspects</h2>${e.length>0?v.html`<p class="subtitle">${e.length} aspects</p>`:v.nothing}</div>${t?this.renderSummary(t):v.nothing} ${e.length>0?v.html`<div role="list" aria-label="Aspect list">${e.map((s,o)=>this.renderAspect(s,o))}</div>`:v.nothing} ${r.length>0?v.html`<div><p class="section-label">Patterns</p>${r.map(s=>this.renderPattern(s))}</div>`:v.nothing}</div>`}renderSummary(a){let e="totalAspects"in a?a.totalAspects:a.total;return v.html`<div class="summary-pills" role="region" aria-label="Aspect summary">${typeof e=="number"?v.html`<span class="pill pill--muted">Total: ${e}</span>`:v.nothing} <span class="pill pill--success">Harmonious: ${a.harmonious}</span> <span class="pill pill--danger">Challenging: ${a.challenging}</span> <span class="pill pill--muted">Neutral: ${a.neutral}</span></div>`}renderAspect(a,e){let r=N[h(a.planet1)]??"",t=N[h(a.planet2)]??"",s=(a.interpretation??"neutral").toLowerCase(),o=(a.type??"").toLowerCase().replace(/_/g," "),i=a.isApplying?"Applying":"Separating",l="meaning"in a?a.meaning:void 0,c="transitInterpretation"in a?a.transitInterpretation:void 0,p=!!(l||c),y=v.html`<span aria-hidden="true" class="glyph">${r}</span>${a.planet1} <span class="nature-badge ${s}">${o}</span> <span aria-hidden="true" class="glyph">${t}</span>${a.planet2} <span class="meta">${i} · orb ${f(a.orb,2)}° · str ${f(a.strength,0)}</span>`;return p?v.html`<details class="aspect-card" role="listitem" name="aspects" ?open="${e===0}"><summary>${y}${Re()}</summary><div class="interp-body">${l?this.renderMeaning(l):v.nothing} ${c?this.renderTransit(c):v.nothing}</div></details>`:v.html`<div class="aspect-card" role="listitem"><div class="summary" style="cursor:default">${y}</div></div>`}renderMeaning(a){let e=a.description?.short??a.description?.long;return v.html`${e?v.html`<p>${e}</p>`:v.nothing} ${a.keywords?.length?v.html`<div class="interp-keywords">${a.keywords.map(r=>v.html`<span class="kw">${r}</span>`)}</div>`:v.nothing}`}renderTransit(a){return v.html`${a.summary?v.html`<p>${a.summary}</p>`:v.nothing} ${a.impact?v.html`<p><strong>Impact:</strong> ${a.impact}</p>`:v.nothing} ${a.timing?v.html`<p><strong>Timing:</strong> ${a.timing}</p>`:v.nothing} ${a.guidance?v.html`<p><strong>Guidance:</strong> ${a.guidance}</p>`:v.nothing} ${a.keywords?.length?v.html`<div class="interp-keywords">${a.keywords.map(e=>v.html`<span class="kw">${e}</span>`)}</div>`:v.nothing}`}renderPattern(a){let e=a.planets??[];return v.html`<div class="pattern"><div class="pattern-head"><span class="pattern-name">${a.name??a.kind??"Pattern"}</span> ${e.length?v.html`<span class="pattern-planets">${e.join(", ")}</span>`:v.nothing} ${typeof a.tightness=="number"?v.html`<span class="pattern-tight">${f(a.tightness,0)}% tight</span>`:v.nothing}</div>${a.interpretation?v.html`<p class="pattern-interp">${a.interpretation}</p>`:v.nothing}</div>`}};yr.styles=[g,Ke,v.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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)}.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}.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}.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}.interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.glyph{font-size:1.1em;line-height:1}.nature-badge{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;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)}.pattern{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);gap:.35rem;display:grid}.pattern-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.pattern-name{font-weight:var(--roxy-weight-bold,600)}.pattern-planets{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}.pattern-tight{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.pattern-interp{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0;line-height:1.45}`],yr=d([(0,lt.customElement)("roxy-aspects-table")],yr);var ee=require("lit"),oa=require("lit/decorators.js");var dt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},_e=class extends m{constructor(){super(...arguments);this.mode="daily"}renderEmpty(){return ee.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderData(e){return this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e)}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([s,o])=>{let i=typeof o=="number"?o:0,l=Math.abs(i)>1?i/100:i;return[s,l]});return ee.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?ee.html`<span class="energy">Energy ${e.energyRating}/10</span>`:ee.nothing}</header><div class="bars" role="list">${t.map(([s,o])=>{let i=(o+1)/2*100,l=dt[s]??"var(--roxy-accent, #f59e0b)";return ee.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${s}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(o*100)}%</span></div>`})}</div>${e.dailyMessage?ee.html`<p class="advice">${e.dailyMessage}</p>`:ee.nothing} ${e.advice?ee.html`<p class="advice">${e.advice}</p>`:ee.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return ee.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,s=160,o=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return ee.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} ${s}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${s/2}" x2="${t}" y2="${s/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((y,x)=>{let j=y[l]??0,b=x*o,dr=s/2-j/100*(s/2-8);return`${b.toFixed(2)},${dr.toFixed(2)}`}).join(" "),p=dt[l]??"#475569";return ee.svg`<polyline points=${c} fill="none" stroke=${p} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?ee.html`<p class="advice">${e.summary.periodAdvice}</p>`:ee.nothing}</section>`}renderCritical(e){return ee.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=>ee.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};_e.styles=[g,ee.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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-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%;max-width:var(--roxy-chart-max-width,600px);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,oa.property)({type:String,reflect:!0})],_e.prototype,"mode",2),_e=d([(0,oa.customElement)("roxy-biorhythm-chart")],_e);var U=require("lit"),xt=require("lit/decorators.js");var Te=require("lit"),la=4,da=9,pt=(100+2*da)*la,ss=(100+2*da)*la;function fe(n,a){return{x:(n+da)*la,y:(a+da)*la}}var Ur=50,Ba=n=>2*Ur-n,Ha={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]}},os={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function ns(){let n={},a={};for(let[e,[r,t]]of Object.entries(Ha.spleen))Ha["solar-plexus"][os[Number(e)]]=[Ba(r),t];for(let[e,r]of Object.entries(Ha))for(let[t,[s,o]]of Object.entries(r))n[Number(t)]=fe(s,o),a[Number(t)]=e;return{points:n,centerOf:a}}var{points:ja,centerOf:Zo}=ns(),Qo=pt/2;function ur(n){return n.map(([a,e])=>fe(a,e))}function Oa(n,a,e){return ur([[Ur-n,a],[Ur+n,a],[Ur+n,e],[Ur-n,e]])}var ct=[[18.4,68],[18.4,81.8],[34.7,74.9]],is=[{id:"head",label:"Head",color:"gold",points:ur([[40,14.3],[60,14.3],[50,6]]),labelAnchor:fe(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:ur([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:fe(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Oa(9.5,30.4,43.6),labelAnchor:fe(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:ur([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:fe(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:ur([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:fe(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:ur(ct),labelAnchor:fe(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Oa(9.5,70.6,83.6),labelAnchor:fe(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:ur(ct.map(([n,a])=>[Ba(n),a])),labelAnchor:fe(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Oa(9.5,87.9,99.9),labelAnchor:fe(50,103),labelAlign:"middle"}],ls=[[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]],ds=cs();function cs(){let n=Ba,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${na(a[0])}`];for(let r=1;r+2<a.length;r+=3)e.push(`C ${na(a[r])} ${na(a[r+1])} ${na(a[r+2])}`);e.push(`L ${ia(a[a.length-1],n)}`);for(let r=a.length-3;r>=1;r-=3)e.push(`C ${ia(a[r+1],n)} ${ia(a[r],n)} ${ia(a[r-1],n)}`);return e.push("Z"),e.join(" ")}function na([n,a]){let e=fe(n,a);return`${e.x} ${e.y}`}function ia([n,a],e){let r=fe(e(n),a);return`${r.x} ${r.y}`}function ps(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function mt(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function ms(){return Te.svg`<path class="bg-body" d=${ds} />`}function gs(n,a){let e=[];for(let[r,t]of ls){let s=ja[r],o=ja[t];if(!s||!o)continue;if(e.push(Te.svg`<line class="bg-channel" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`),n.has(mt(r,t))){e.push(Te.svg`<line class="bg-channel on" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`);continue}let i={x:(s.x+o.x)/2,y:(s.y+o.y)/2};a.has(r)&&e.push(Te.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`),a.has(t)&&e.push(Te.svg`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`)}return e}function ys(n,a,e){let r=e.x-a.x,t=e.y-a.y,s=r*r+t*t;if(s===0)return a;let o=Math.max(0,Math.min(1,((n.x-a.x)*r+(n.y-a.y)*t)/s));return{x:a.x+o*r,y:a.y+o*t}}function us(n,a){let e=a[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<a.length;t++){let s=ys(n,a[t],a[(t+1)%a.length]),o=(s.x-n.x)**2+(s.y-n.y)**2;o<r&&(r=o,e=s)}return e}function xs(n){return is.map(a=>{let e=n.has(a.id),r=`bg-center bg-${a.color}${e?" defined":""}`,t=us(a.labelAnchor,a.points);return Te.svg`<g>
1
+ "use strict";var ba=Object.defineProperty;var $t=Object.getOwnPropertyDescriptor;var Ps=Object.getOwnPropertyNames;var Ds=Object.prototype.hasOwnProperty;var Ls=(n,a)=>{for(var e in a)ba(n,e,{get:a[e],enumerable:!0})},Ns=(n,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of Ps(a))!Ds.call(n,t)&&t!==e&&ba(n,t,{get:()=>a[t],enumerable:!(r=$t(a,t))||r.enumerable});return n};var Ms=n=>Ns(ba({},"__esModule",{value:!0}),n),d=(n,a,e,r)=>{for(var t=r>1?void 0:r?$t(a,e):a,s=n.length-1,o;s>=0;s--)(o=n[s])&&(t=(r?o(a,e,t):o(t))||t);return r&&t&&ba(a,e,t),t};var Zo={};Ls(Zo,{ROXY_COMPONENTS:()=>at,ROXY_UI_COMPONENTS:()=>Xo,ROXY_UI_VERSION:()=>As,RoxyAngelNumberCard:()=>vr,RoxyAngelNumberLookup:()=>$r,RoxyAshtakavargaGrid:()=>Xe,RoxyAspectsTable:()=>Sr,RoxyAstrocartographyMap:()=>Cr,RoxyBiorhythmChart:()=>Ze,RoxyBodygraph:()=>Tr,RoxyChoghadiyaGrid:()=>Er,RoxyCompatibilityCard:()=>Qe,RoxyCrystalCard:()=>Ar,RoxyCrystalGrid:()=>er,RoxyDashaTimeline:()=>rr,RoxyData:()=>ar,RoxyDivisionalChart:()=>sr,RoxyDoshaCard:()=>or,RoxyDreamCard:()=>Lr,RoxyDreamSearch:()=>Nr,RoxyEndpointForm:()=>fe,RoxyFixedStars:()=>Mr,RoxyForecastDigest:()=>Gr,RoxyForecastTimeline:()=>Hr,RoxyGunaMilan:()=>Or,RoxyHdConnection:()=>jr,RoxyHdPenta:()=>Br,RoxyHdVariables:()=>Ir,RoxyHexagram:()=>nr,RoxyHoraTable:()=>Kr,RoxyHoroscopeCard:()=>ir,RoxyKpChart:()=>lr,RoxyKpPlanetsTable:()=>_r,RoxyKpRulingPlanets:()=>Fr,RoxyLocalSpaceCompass:()=>Yr,RoxyLocationSearch:()=>ue,RoxyMoonPhase:()=>dr,RoxyNakshatraCard:()=>Vr,RoxyNatalChart:()=>Fe,RoxyNumerologyCard:()=>cr,RoxyPanchangTable:()=>pr,RoxyPositionsTable:()=>mr,RoxyProfectionCard:()=>Ur,RoxyReferenceCard:()=>Wr,RoxyRelocationWheel:()=>Jr,RoxyShadbalaTable:()=>Xr,RoxySynastryChart:()=>Zr,RoxyTarotCard:()=>gr,RoxyTarotCatalog:()=>yr,RoxyTarotSpread:()=>xr,RoxyTransitsTable:()=>hr,RoxyVedicAspects:()=>Qr,RoxyVedicKundli:()=>Ye,RoxyVedicPlanetsTable:()=>ea,RoxyWesternPlanetsTable:()=>ra,RoxyYogaList:()=>fr,roxyDataScript:()=>Rt,serializeRoxyData:()=>tt});module.exports=Ms(Zo);var B=require("lit"),zt=require("lit/decorators.js");var Gs=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"money",label:"Money"},{key:"twinFlame",label:"Twin flame"}];function va(n,a,e){let r=[];if(n)for(let t of Gs){let s=n[t.key];s&&r.push({label:t.label,body:s})}return a&&r.push({label:"Biblical",body:a}),e&&r.push({label:"Shadow",body:e}),r}var Je=require("lit"),De=require("lit/decorators.js"),Ct=require("lit/directives/if-defined.js");var wt=require("lit"),y=wt.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}:host([bare]){--roxy-surface:transparent;--roxy-shadow-sm:none;--roxy-shadow-md:none}*,: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)}.roxy-error{gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-lg,1.5rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}.roxy-surface{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var Hs="https://roxyapi.com/api/v2",$a=class{constructor(a){this.baseUrl=Hs;this.host=a,a.addController(this)}hostDisconnected(){this.abort?.abort(),this.abort=void 0}async run(a){if(!this.submitUrl&&this.secretKeyRefused())return;this.abort?.abort();let e=new AbortController;this.abort=e,this.host.loading=!0,this.host.error=null;try{let r=this.submitUrl?await fetch(this.submitUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a),signal:e.signal}):await this.callApi(a,e.signal);if(!r.ok)throw new Error(await this.readError(r));let t=await r.json();if(e.signal.aborted)return;this.host.data=t}catch(r){if(r?.name==="AbortError")return;this.host.error=r instanceof Error?r.message:String(r)}finally{this.abort===e&&(this.abort=void 0),e.signal.aborted||(this.host.loading=!1)}}callApi(a,e){let r=new URL(`${this.baseUrl}${a.path}`);for(let[s,o]of Object.entries(a.query??{}))o!=null&&r.searchParams.set(s,String(o));let t={Accept:"application/json"};return this.publishableKey&&(t["X-API-Key"]=this.publishableKey),a.body!=null&&(t["Content-Type"]="application/json"),fetch(r,{method:a.method??"GET",headers:t,body:a.body!=null?JSON.stringify(a.body):void 0,signal:e})}secretKeyRefused(){let a=this.publishableKey;return!a||a.startsWith("pk_")?!1:(this.host.error="Client-side components accept a pk_ publishable key only. Use a publishable key with an origin allowlist, or render server-side.",this.host.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key"},bubbles:!0,composed:!0})),!0)}async readError(a){try{let e=await a.json();if(e?.error)return e.error}catch{}return`Request failed (${a.status})`}};function kt(n,a,e){let r={...e},t=`/${n.replace(/^\//,"")}`.replace(/\{([^}]+)\}/g,(i,l)=>{let c=r[l];return delete r[l],encodeURIComponent(String(c??""))}),s={},o={};for(let[i,l]of Object.entries(r))l===void 0||l===""||(a==="GET"?s[i]=l:o[i]=l);return{path:t,method:a,query:s,body:a==="POST"?o:void 0}}var St="roxy-data";function tt(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function Rt(n){return`<script type="application/json" class="${St}">${tt(n)}</script>`}function Os(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var wa=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(Os(a)&&a.classList.contains(St))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var m=class extends Je.LitElement{constructor(){super();this.data=null;this.endpoint="";this.method="POST";this.remember=!1;this.loading=!1;this.error=null;this.onFormSubmit=e=>{let r=e.detail;this.remember&&this.writeRemembered(r.values),this.fetcher.run(kt(this.endpoint,this.method,r.values))};new wa(this),this.fetcher=new $a(this)}static{this.styles=[y]}willUpdate(e){e.has("publishableKey")&&(this.fetcher.publishableKey=this.publishableKey),e.has("baseUrl")&&this.baseUrl&&(this.fetcher.baseUrl=this.baseUrl),e.has("submitUrl")&&(this.fetcher.submitUrl=this.submitUrl)}render(){return this.loading?this.renderLoading():this.error!=null?this.renderError(this.error):this.data!=null?this.renderData(this.data):this.renderNoData()}renderNoData(){return this.endpoint?this.renderForm():this.renderEmpty()}renderForm(){return Je.html`<roxy-endpoint-form data-endpoint="${this.endpoint}" method="${this.method}" spec-url="${(0,Ct.ifDefined)(this.specUrl)}" .initialValues="${this.remember?this.readRemembered():void 0}" @roxy-submit="${this.onFormSubmit}"></roxy-endpoint-form>`}rememberKey(){return`roxy-ui:form:${this.endpoint}`}readRemembered(){try{let e=sessionStorage.getItem(this.rememberKey());return e?JSON.parse(e):void 0}catch{return}}writeRemembered(e){try{sessionStorage.setItem(this.rememberKey(),JSON.stringify(e))}catch{}}renderEmpty(){return Je.html`<div class="roxy-empty" role="status">No data</div>`}renderLoading(){return Je.html`<div class="roxy-skeleton" style="height:8rem" role="status" aria-label="Loading"></div>`}renderError(e){let r=Je.html`<div class="roxy-error" role="alert">${e}</div>`;return this.endpoint?Je.html`${r}${this.renderForm()}`:r}};d([(0,De.property)({attribute:!1})],m.prototype,"data",2),d([(0,De.property)({type:String,attribute:"data-endpoint"})],m.prototype,"endpoint",2),d([(0,De.property)({type:String})],m.prototype,"method",2),d([(0,De.property)({type:String,attribute:"publishable-key"})],m.prototype,"publishableKey",2),d([(0,De.property)({type:String,attribute:"base-url"})],m.prototype,"baseUrl",2),d([(0,De.property)({type:String,attribute:"spec-url"})],m.prototype,"specUrl",2),d([(0,De.property)({type:String,attribute:"submit-url"})],m.prototype,"submitUrl",2),d([(0,De.property)({type:Boolean})],m.prototype,"remember",2),d([(0,De.state)()],m.prototype,"loading",2),d([(0,De.state)()],m.prototype,"error",2);var vr=class extends m{renderData(a){let e=(a.energy??"").toLowerCase(),r=e==="positive"||e==="cautionary"||e==="neutral"?e:"",t=a.keywords??[],s=a.actionSteps??[];return B.html`<article class="card" aria-label="${`Angel number ${a.number??""}`}"><div class="hero">${a.number?B.html`<div class="numeral">${a.number}</div>`:B.nothing}<div><p class="label">Angel number</p>${a.title?B.html`<h2 class="title">${a.title}</h2>`:B.nothing}</div></div>${a.coreMessage?B.html`<p class="core">${a.coreMessage}</p>`:B.nothing}<div class="badges">${a.type?B.html`<span class="badge">${a.type}</span>`:B.nothing} ${typeof a.digitRoot=="number"?B.html`<span class="badge">Digit root ${a.digitRoot}</span>`:B.nothing} ${a.energy?B.html`<span class="${`badge ${r}`}">${a.energy}</span>`:B.nothing}</div>${t.length>0?B.html`<div class="chips">${t.map(o=>B.html`<span>${o}</span>`)}</div>`:B.nothing} ${this.renderSections(a)} ${a.affirmation?B.html`<p class="affirmation">${a.affirmation}</p>`:B.nothing} ${s.length>0?B.html`<div class="steps"><h3>Action steps</h3><ul>${s.map(o=>B.html`<li>${o}</li>`)}</ul></div>`:B.nothing}</article>`}renderEmpty(){return B.html`<div class="roxy-empty" role="status">No angel number</div>`}renderSections(a){let e=va(a.meaning,a.biblical,a.shadow);return e.length===0?B.nothing:B.html`<div class="sections">${e.map((r,t)=>B.html`<details name="angel-meaning" ?open="${t===0}"><summary>${r.label}</summary><p>${r.body}</p></details>`)}</div>`}};vr.styles=[y,B.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}`],vr=d([(0,zt.customElement)("roxy-angel-number-card")],vr);var $=require("lit"),Tt=require("lit/decorators.js");var $r=class extends m{renderEmpty(){return $.html`<div class="roxy-empty" role="status">No number analysis</div>`}renderData(a){let e=a.knownMeaning,r=a.digitRootMeaning,t=e?.title??"Number analysis";return $.html`<article class="card" aria-label="${`Number ${a.number??""}`}"><div class="hero">${a.number?$.html`<div class="numeral">${a.number}</div>`:$.nothing}<div><p class="label">Number analysis</p><h2 class="title">${t}</h2></div></div><div class="badges">${a.type?$.html`<span class="badge">${a.type}</span>`:$.nothing} ${typeof a.digits=="number"?$.html`<span class="badge">${a.digits} digits</span>`:$.nothing} ${typeof a.uniqueDigits=="number"?$.html`<span class="badge">${a.uniqueDigits} unique</span>`:$.nothing} ${typeof a.digitRoot=="number"?$.html`<span class="badge">Digit root ${a.digitRoot}</span>`:$.nothing} ${a.isPalindrome?$.html`<span class="badge flag">Palindrome</span>`:$.nothing} ${a.isRepeating?$.html`<span class="badge flag">Repeating</span>`:$.nothing}</div>${e?$.html`<div class="section"><p class="label">Known angel number</p>${e.coreMessage?$.html`<p>${e.coreMessage}</p>`:$.nothing} ${e.keywords&&e.keywords.length>0?$.html`<div class="chips">${e.keywords.map(s=>$.html`<span>${s}</span>`)}</div>`:$.nothing} ${this.renderMeaning(e.meaning,e.biblical,e.shadow)} ${e.affirmation?$.html`<p><em>${e.affirmation}</em></p>`:$.nothing}</div>`:$.nothing} ${r?$.html`<div class="section"><p class="label">Foundational digit root${r.number?` (${r.number})`:""}</p>${r.title?$.html`<h3>${r.title}</h3>`:$.nothing} ${r.coreMessage?$.html`<p>${r.coreMessage}</p>`:$.nothing} ${e?$.nothing:this.renderRootMeaning(r)}</div>`:$.nothing}</article>`}renderMeaning(a,e,r){let t=va(a,e,r);return t.length===0?$.nothing:$.html`${t.map((s,o)=>$.html`<details name="lookup-meaning" ?open="${o===0}"><summary>${s.label}</summary><p>${s.body}</p></details>`)}`}renderRootMeaning(a){return $.html`${a.keywords&&a.keywords.length>0?$.html`<div class="chips">${a.keywords.map(e=>$.html`<span>${e}</span>`)}</div>`:$.nothing}${this.renderMeaning(a.meaning)}${a.affirmation?$.html`<p><em>${a.affirmation}</em></p>`:$.nothing}`}};$r.styles=[y,$.css`.card{background:var(--roxy-surface,#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)}`],$r=d([(0,Tt.customElement)("roxy-angel-number-lookup")],$r);var ie=require("lit"),Sa=require("lit/decorators.js");var z={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"},Et={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},ae={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},ka={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},de=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],vn=de.map(n=>n.toLowerCase()),pa={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},st={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},ma={"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 js={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},wr=["sarva","bhinna","pinda"],Xe=class extends m{constructor(){super(...arguments);this.activeTab="sarva"}renderEmpty(){return ie.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`}renderData(e){let r=e.signs??[];return ie.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${r.length?ie.html`<p class="subtitle">${r.length} signs</p>`:ie.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${wr.map(t=>ie.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}}">${js[t]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(r):this.activeTab==="bhinna"?this.renderBhinna(r):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=wr.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=wr[(r+1)%wr.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=wr[(r-1+wr.length)%wr.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?ie.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,s)=>{let o=r.bindus[s]??0,i=this.sarvaHeat(o);return ie.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${ae[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${o}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:ie.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?ie.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=>ie.html`<th scope="col" title="${t}">${ae[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>ie.html`<tr><td>${t.planet}</td>${t.bindus.map(s=>{let o=this.bhinnaHeat(s);return ie.html`<td class="${`heat-cell ${o}`}">${s}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:ie.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?ie.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=>ie.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:ie.html`<p class="roxy-empty">No shodhya pinda data</p>`}};Xe.styles=[y,ie.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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,Sa.state)()],Xe.prototype,"activeTab",2),Xe=d([(0,Sa.customElement)("roxy-ashtakavarga-grid")],Xe);var v=require("lit"),Pt=require("lit/decorators.js");var Ra=require("lit");function le(){return Ra.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 ke=Ra.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}}`;function Ke(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,r=new Date(e);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Le(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function ot(n){if(!n)return"";let a=Ke(n.start),e=Ke(n.end);return a&&e?`${a} - ${e}`:a||e||""}function f(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function At(n,a=1){let e=f(n,a);return e?`${e}%`:""}var kr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function aa(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}function u(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function J(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var Sr=class extends m{renderEmpty(){return v.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e="aspects"in a?a.aspects??[]:[],r="patterns"in a?a.patterns??[]:[],t="summary"in a?a.summary:void 0;return e.length===0&&r.length===0?this.renderEmpty():v.html`<div class="wrap" aria-label="Aspects"><div class="head"><h2 class="title">Aspects</h2>${e.length>0?v.html`<p class="subtitle">${e.length} aspects</p>`:v.nothing}</div>${t?this.renderSummary(t):v.nothing} ${e.length>0?v.html`<div role="list" aria-label="Aspect list">${e.map((s,o)=>this.renderAspect(s,o))}</div>`:v.nothing} ${r.length>0?v.html`<div><p class="section-label">Patterns</p>${r.map(s=>this.renderPattern(s))}</div>`:v.nothing}</div>`}renderSummary(a){let e="totalAspects"in a?a.totalAspects:a.total;return v.html`<div class="summary-pills" role="region" aria-label="Aspect summary">${typeof e=="number"?v.html`<span class="pill pill--muted">Total: ${e}</span>`:v.nothing} <span class="pill pill--success">Harmonious: ${a.harmonious}</span> <span class="pill pill--danger">Challenging: ${a.challenging}</span> <span class="pill pill--muted">Neutral: ${a.neutral}</span></div>`}renderAspect(a,e){let r=z[u(a.planet1)]??"",t=z[u(a.planet2)]??"",s=(a.interpretation??"neutral").toLowerCase(),o=(a.type??"").toLowerCase().replace(/_/g," "),i=a.isApplying?"Applying":"Separating",l="meaning"in a?a.meaning:void 0,c="transitInterpretation"in a?a.transitInterpretation:void 0,p=!!(l||c),g=v.html`<span aria-hidden="true" class="glyph">${r}</span>${a.planet1} <span class="nature-badge ${s}">${o}</span> <span aria-hidden="true" class="glyph">${t}</span>${a.planet2} <span class="meta">${i} · orb ${f(a.orb,2)}° · str ${f(a.strength,0)}</span>`;return p?v.html`<details class="aspect-card" role="listitem" name="aspects" ?open="${e===0}"><summary>${g}${le()}</summary><div class="interp-body">${l?this.renderMeaning(l):v.nothing} ${c?this.renderTransit(c):v.nothing}</div></details>`:v.html`<div class="aspect-card" role="listitem"><div class="summary" style="cursor:default">${g}</div></div>`}renderMeaning(a){let e=a.description?.short??a.description?.long;return v.html`${e?v.html`<p>${e}</p>`:v.nothing} ${a.keywords?.length?v.html`<div class="interp-keywords">${a.keywords.map(r=>v.html`<span class="kw">${r}</span>`)}</div>`:v.nothing}`}renderTransit(a){return v.html`${a.summary?v.html`<p>${a.summary}</p>`:v.nothing} ${a.impact?v.html`<p><strong>Impact:</strong> ${a.impact}</p>`:v.nothing} ${a.timing?v.html`<p><strong>Timing:</strong> ${a.timing}</p>`:v.nothing} ${a.guidance?v.html`<p><strong>Guidance:</strong> ${a.guidance}</p>`:v.nothing} ${a.keywords?.length?v.html`<div class="interp-keywords">${a.keywords.map(e=>v.html`<span class="kw">${e}</span>`)}</div>`:v.nothing}`}renderPattern(a){let e=a.planets??[];return v.html`<div class="pattern"><div class="pattern-head"><span class="pattern-name">${a.name??a.kind??"Pattern"}</span> ${e.length?v.html`<span class="pattern-planets">${e.join(", ")}</span>`:v.nothing} ${typeof a.tightness=="number"?v.html`<span class="pattern-tight">${f(a.tightness,0)}% tight</span>`:v.nothing}</div>${a.interpretation?v.html`<p class="pattern-interp">${a.interpretation}</p>`:v.nothing}</div>`}};Sr.styles=[y,ke,v.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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)}.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}.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}.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}.interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.glyph{font-size:1.1em;line-height:1}.nature-badge{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;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)}.pattern{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);gap:.35rem;display:grid}.pattern-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.pattern-name{font-weight:var(--roxy-weight-bold,600)}.pattern-planets{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}.pattern-tight{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.pattern-interp{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0;line-height:1.45}`],Sr=d([(0,Pt.customElement)("roxy-aspects-table")],Sr);var P=require("lit"),Ot=require("lit/decorators.js");var Bs={Sun:"var(--roxy-accent)",Moon:"var(--roxy-secondary)",Mercury:"var(--roxy-info)",Venus:"var(--roxy-success)",Mars:"var(--roxy-danger)",Jupiter:"var(--roxy-warning)",Saturn:"var(--roxy-muted)",Uranus:"var(--roxy-info-fg)",Neptune:"var(--roxy-success-fg)",Pluto:"var(--roxy-danger-fg)"},Dt=["var(--roxy-accent)","var(--roxy-info)","var(--roxy-success)","var(--roxy-danger)","var(--roxy-warning)","var(--roxy-secondary)","var(--roxy-info-fg)","var(--roxy-success-fg)","var(--roxy-danger-fg)","var(--roxy-accent-ink)","var(--roxy-warning-fg)","var(--roxy-primary)"];function Rr(n,a=0){return Bs[u(n)]??Dt[a%Dt.length]??"var(--roxy-accent)"}var Ca=360,ta=180,ga=n=>n+180,sa=n=>90-n,Lt=23.44,Nt=66.56,Mt=n=>n===0?"0":`${Math.abs(n)}\xB0${n>0?"E":"W"}`,Gt=n=>n===0?"0":`${Math.abs(n)}\xB0${n>0?"N":"S"}`;function Is(n){let a=[],e=[],r=null;for(let t of n)r!==null&&Math.abs(t.longitude-r)>180&&(e.length&&a.push(e),e=[]),e.push(`${ga(t.longitude)},${sa(t.latitude)}`),r=t.longitude;return e.length&&a.push(e),a.filter(t=>t.length>1).map(t=>t.join(" "))}var Ht={mc:"MC",ic:"IC",ascendant:"AC",descendant:"DC"},Cr=class extends m{renderEmpty(){return P.html`<div class="roxy-empty" role="status">No astrocartography data</div>`}renderData(a){let e=a.lines??[],r=a.birthDetails;return P.html`<div class="wrap"><header><h2 class="title">Astrocartography</h2>${r?P.html`<div class="meta">${[r.date,r.time].filter(Boolean).join(" \xB7 ")} · ${Gt(Math.round(r.latitude))} ${Mt(Math.round(r.longitude))}</div>`:P.nothing}</header>${this.renderMap(e,r)} ${this.renderLegend(e)} ${a.summary?P.html`<p class="summary">${a.summary}</p>`:P.nothing} ${this.renderInterpretations(e)}</div>`}renderMap(a,e){return P.html`<svg viewBox="0 0 ${Ca} ${ta}" role="img" aria-label="World map of planetary astrocartography lines"><title>Astrocartography world map</title><desc>Equirectangular world map. Each body has a Midheaven and Imum Coeli meridian and a curved Ascendant and Descendant line, colored per body.</desc><rect class="map-frame" x="0" y="0" width="${Ca}" height="${ta}"/>${this.renderGraticule()} ${a.map((r,t)=>this.renderBodyLines(r,t))} ${e?P.svg`<text class="birthplace" x=${ga(e.longitude)} y=${sa(e.latitude)} text-anchor="middle" dominant-baseline="central"><title>Birthplace</title>★</text>`:P.nothing}</svg>`}renderGraticule(){let a=[];for(let t=-150;t<=150;t+=30){let s=ga(t),o=t===0;a.push(P.svg`<line class=${o?"grat-axis":"grat"} x1=${s} y1="0" x2=${s} y2=${ta} />`),a.push(P.svg`<text class="axis-label" x=${s} y=${ta-2} text-anchor="middle">${Mt(t)}</text>`)}let e=[];for(let t=-60;t<=60;t+=30){let s=sa(t),o=t===0;e.push(P.svg`<line class=${o?"grat-axis":"grat"} x1="0" y1=${s} x2=${Ca} y2=${s} />`),e.push(P.svg`<text class="axis-label" x="2" y=${s-1}>${Gt(t)}</text>`)}let r=[Lt,-Lt,Nt,-Nt].map(t=>P.svg`<line class="grat-ref" x1="0" y1=${sa(t)} x2=${Ca} y2=${sa(t)} />`);return P.svg`${a}${e}${r}`}renderBodyLines(a,e){let r=Rr(a.planet,e),t=a.symbol||a.planet.slice(0,2),s=[this.renderMeridian(a.mc.longitude,r,t,a.planet,"mc",!1),this.renderMeridian(a.ic.longitude,r,t,a.planet,"ic",!0),this.renderCurve(a.ascendant.points,r,t,a.planet,"ascendant",!1),this.renderCurve(a.descendant.points,r,t,a.planet,"descendant",!0)];return P.svg`${s}`}renderMeridian(a,e,r,t,s,o){let i=ga(a),l=s==="ic"?ta-7:9;return P.svg`<g>
2
+ <line class=${`acg-line${o?" dashed":""}`} stroke=${e} x1=${i} y1="0" x2=${i} y2=${ta}><title>${t} ${Ht[s]} line</title></line>
3
+ <text class="acg-glyph" fill=${e} x=${i} y=${l} text-anchor="middle" dominant-baseline="central">${r}</text>
4
+ </g>`}renderCurve(a,e,r,t,s,o){let i=Is(a??[]);if(i.length===0)return P.nothing;let l=(a??[]).reduce((c,p)=>Math.abs(p.latitude)<Math.abs(c.latitude)?p:c,a[0]??{latitude:0,longitude:0});return P.svg`<g>
5
+ ${i.map(c=>P.svg`<polyline class=${`acg-line${o?" dashed":""}`} stroke=${e} points=${c}><title>${t} ${Ht[s]} line</title></polyline>`)}
6
+ <text class="acg-glyph" fill=${e} x=${ga(l.longitude)} y=${sa(l.latitude)} text-anchor="middle" dominant-baseline="central">${r}</text>
7
+ </g>`}renderLegend(a){return a.length===0?P.nothing:P.html`<div class="legend">${a.map((e,r)=>{let t=Rr(e.planet,r);return P.html`<span class="legend-item"><span class="legend-swatch" style="${`border-top-color: ${t}`}"></span> ${e.symbol?P.html`${e.symbol}`:P.nothing}${e.planet}</span>`})} <span class="legend-note">Solid lines are the Ascendant and Midheaven, dashed are the Descendant and IC.</span></div>`}renderInterpretations(a){return a.length===0?P.nothing:P.html`<section class="interpretations"><h3>Planetary lines</h3>${a.map((e,r)=>{let t=Rr(e.planet,r),s=[["MC",e.mc.interpretation],["IC",e.ic.interpretation],["AC",e.ascendant.interpretation],["DC",e.descendant.interpretation]];return P.html`<details class="interp-card" name="acg-lines" ?open="${r===0}"><summary><span class="interp-head"><span class="interp-dot" style="${`background: ${t}`}"></span> ${e.symbol?P.html`${e.symbol}`:P.nothing}${e.planet} </span>${le()}</summary><div class="interp-body">${s.filter(([,o])=>o).map(([o,i])=>P.html`<p class="interp-line"><span class="code">${o}</span>${i}</p>`)}</div></details>`})}</section>`}};Cr.styles=[y,ke,P.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);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}.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{border-radius:var(--roxy-radius-sm,4px);width:100%;height:auto;display:block}.map-frame{fill:color-mix(in srgb, var(--roxy-border,#e4e4e7) 12%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:.8px}.grat{stroke:var(--roxy-border,#e4e4e7);stroke-width:.4px;fill:none}.grat-axis{stroke:var(--roxy-muted,#71717a);stroke-width:.6px;opacity:.6}.grat-ref{stroke:var(--roxy-secondary,#475569);stroke-width:.4px;stroke-dasharray:2 2;opacity:.5;fill:none}.axis-label{fill:var(--roxy-muted,#71717a);font-size:5px;font-family:var(--roxy-font-sans)}.acg-line{fill:none;stroke-width:1px;opacity:.95}.acg-line.dashed{stroke-dasharray:4 2.5}.acg-glyph{font-size:8px;font-family:var(--roxy-font-sans);font-weight:600}.birthplace{fill:var(--roxy-fg,#0a0a0a);font-size:9px}.legend{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-item{align-items:center;gap:.3rem;display:inline-flex}.legend-swatch{border-top-style:solid;border-top-width:2px;width:14px;height:0}.legend-note{width:100%;color:var(--roxy-muted,#71717a)}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.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,#0a0a0a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-head{align-items:center;gap:.5rem;display:inline-flex}.interp-dot{border-radius:50%;width:10px;height:10px}.interp-body{margin-top:var(--roxy-space-sm,.5rem);gap:var(--roxy-space-xs,.25rem);display:grid}.interp-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.interp-line .code{color:var(--roxy-accent-ink,#b45309);margin-right:.4rem;font-weight:600}`],Cr=d([(0,Ot.customElement)("roxy-astrocartography-map")],Cr);var se=require("lit"),za=require("lit/decorators.js");var jt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},Ze=class extends m{constructor(){super(...arguments);this.mode="daily"}renderEmpty(){return se.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderData(e){return this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e)}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([s,o])=>{let i=typeof o=="number"?o:0,l=Math.abs(i)>1?i/100:i;return[s,l]});return se.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?se.html`<span class="energy">Energy ${e.energyRating}/10</span>`:se.nothing}</header><div class="bars" role="list">${t.map(([s,o])=>{let i=(o+1)/2*100,l=jt[s]??"var(--roxy-accent, #f59e0b)";return se.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${s}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(o*100)}%</span></div>`})}</div>${e.dailyMessage?se.html`<p class="advice">${e.dailyMessage}</p>`:se.nothing} ${e.advice?se.html`<p class="advice">${e.advice}</p>`:se.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return se.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,s=160,o=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return se.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} ${s}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${s/2}" x2="${t}" y2="${s/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((g,h)=>{let S=g[l]??0,b=h*o,br=s/2-S/100*(s/2-8);return`${b.toFixed(2)},${br.toFixed(2)}`}).join(" "),p=jt[l]??"#475569";return se.svg`<polyline points=${c} fill="none" stroke=${p} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?se.html`<p class="advice">${e.summary.periodAdvice}</p>`:se.nothing}</section>`}renderCritical(e){return se.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=>se.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};Ze.styles=[y,se.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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-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%;max-width:var(--roxy-chart-max-width,600px);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,za.property)({type:String,reflect:!0})],Ze.prototype,"mode",2),Ze=d([(0,za.customElement)("roxy-biorhythm-chart")],Ze);var X=require("lit"),Vt=require("lit/decorators.js");var Ne=require("lit"),Aa=4,Pa=9,It=(100+2*Pa)*Aa,Ks=(100+2*Pa)*Aa;function ze(n,a){return{x:(n+Pa)*Aa,y:(a+Pa)*Aa}}var ya=50,dt=n=>2*ya-n,nt={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]}},_s={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function Fs(){let n={},a={};for(let[e,[r,t]]of Object.entries(nt.spleen))nt["solar-plexus"][_s[Number(e)]]=[dt(r),t];for(let[e,r]of Object.entries(nt))for(let[t,[s,o]]of Object.entries(r))n[Number(t)]=ze(s,o),a[Number(t)]=e;return{points:n,centerOf:a}}var{points:lt,centerOf:Jn}=Fs(),Xn=It/2;function zr(n){return n.map(([a,e])=>ze(a,e))}function it(n,a,e){return zr([[ya-n,a],[ya+n,a],[ya+n,e],[ya-n,e]])}var Bt=[[18.4,68],[18.4,81.8],[34.7,74.9]],Ys=[{id:"head",label:"Head",color:"gold",points:zr([[40,14.3],[60,14.3],[50,6]]),labelAnchor:ze(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:zr([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:ze(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:it(9.5,30.4,43.6),labelAnchor:ze(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:zr([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:ze(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:zr([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:ze(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:zr(Bt),labelAnchor:ze(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:it(9.5,70.6,83.6),labelAnchor:ze(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:zr(Bt.map(([n,a])=>[dt(n),a])),labelAnchor:ze(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:it(9.5,87.9,99.9),labelAnchor:ze(50,103),labelAlign:"middle"}],Vs=[[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]],qs=Us();function Us(){let n=dt,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${Ta(a[0])}`];for(let r=1;r+2<a.length;r+=3)e.push(`C ${Ta(a[r])} ${Ta(a[r+1])} ${Ta(a[r+2])}`);e.push(`L ${Ea(a[a.length-1],n)}`);for(let r=a.length-3;r>=1;r-=3)e.push(`C ${Ea(a[r+1],n)} ${Ea(a[r],n)} ${Ea(a[r-1],n)}`);return e.push("Z"),e.join(" ")}function Ta([n,a]){let e=ze(n,a);return`${e.x} ${e.y}`}function Ea([n,a],e){let r=ze(e(n),a);return`${r.x} ${r.y}`}function Ws(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function Kt(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function Js(){return Ne.svg`<path class="bg-body" d=${qs} />`}function Xs(n,a){let e=[];for(let[r,t]of Vs){let s=lt[r],o=lt[t];if(!s||!o)continue;if(e.push(Ne.svg`<line class="bg-channel" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`),n.has(Kt(r,t))){e.push(Ne.svg`<line class="bg-channel on" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`);continue}let i={x:(s.x+o.x)/2,y:(s.y+o.y)/2};a.has(r)&&e.push(Ne.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`),a.has(t)&&e.push(Ne.svg`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`)}return e}function Zs(n,a,e){let r=e.x-a.x,t=e.y-a.y,s=r*r+t*t;if(s===0)return a;let o=Math.max(0,Math.min(1,((n.x-a.x)*r+(n.y-a.y)*t)/s));return{x:a.x+o*r,y:a.y+o*t}}function Qs(n,a){let e=a[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<a.length;t++){let s=Zs(n,a[t],a[(t+1)%a.length]),o=(s.x-n.x)**2+(s.y-n.y)**2;o<r&&(r=o,e=s)}return e}function eo(n){return Ys.map(a=>{let e=n.has(a.id),r=`bg-center bg-${a.color}${e?" defined":""}`,t=Qs(a.labelAnchor,a.points);return Ne.svg`<g>
2
8
  <line class="bg-leader" x1=${a.labelAnchor.x} y1=${a.labelAnchor.y} x2=${t.x} y2=${t.y} />
3
- <polygon class=${r} points=${ps(a.points)}><title>${a.label}: ${e?"defined":"open"}</title></polygon>
9
+ <polygon class=${r} points=${Ws(a.points)}><title>${a.label}: ${e?"defined":"open"}</title></polygon>
4
10
  <text class="bg-center-label" x=${a.labelAnchor.x} y=${a.labelAnchor.y} text-anchor=${a.labelAlign} dominant-baseline="central">${a.label}</text>
5
- </g>`})}function hs(n,a){let e=[];for(let[r,t]of Object.entries(ja)){let s=Number(r);if(!n.has(s))continue;let o=a.get(s);e.push(Te.svg`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${s}${o?Te.svg`<title>${o}</title>`:Te.nothing}</text>`)}return e}function gt(n,a){return mt(n,a)}var yt=`0 0 ${pt} ${ss}`;function ut(n){return Te.svg`
6
- ${ms()}
7
- ${gs(n.activeChannels,n.activeGates)}
8
- ${xs(n.definedCenters)}
9
- ${hs(n.activeGates,n.gateTitles)}
10
- `}var xr=class extends m{renderEmpty(){return U.html`<div class="roxy-empty" role="status">No bodygraph data</div>`}renderData(a){let e=new Set((a.centers??[]).filter(o=>o.defined).map(o=>o.id)),r=new Set((a.gates??[]).map(o=>o.gate).filter(o=>o!=null)),t=new Set((a.channels??[]).map(o=>gt(o.gateA,o.gateB))),s=this.buildGateTitles(a.gates??[]);return U.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${a.type?U.html`<div class="type-line">${a.type}${a.profile?U.html`· Profile ${a.profile}`:U.nothing}</div>`:U.nothing}</header><div class="layout"><svg viewBox="${yt}" 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>${ut({definedCenters:e,activeChannels:t,activeGates:r,gateTitles:s})}</svg> ${this.renderSummary(a)}</div></div>`}buildGateTitles(a){let e=new Map;for(let r of a){if(r.gate==null)continue;let t=[`Gate ${r.gate}`];r.line!=null&&(t[0]+=`.${r.line}`),r.gateName&&t.push(r.gateName);let s=r.planet?h(r.planet):"",o=s?N[s]??s:"";o&&t.push(`${o} ${r.side??""}`.trim()),e.set(r.gate,t.join(" \xB7 "))}return e}renderSummary(a){let e=[{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile},{label:"Definition",value:a.definition}],r=a.incarnationCross;return U.html`<div class="summary"><div class="facts">${e.map(t=>t.value?U.html`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:U.nothing)}</div>${r?.name?U.html`<p class="cross">${r.name} ${r.gates?.length?U.html`<span class="gates">(${r.gates.join(", ")})</span>`:U.nothing}</p>`:U.nothing} ${a.signature||a.notSelf?U.html`<div class="themes">${a.signature?U.html`<span class="pill pill--good">Signature: ${a.signature}</span>`:U.nothing} ${a.notSelf?U.html`<span class="pill pill--shadow">Not-self: ${a.notSelf}</span>`:U.nothing}</div>`:U.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>`}};xr.styles=[g,U.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:var(--roxy-chart-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-surface,#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}`],xr=d([(0,xt.customElement)("roxy-bodygraph")],xr);var me=require("lit"),ft=require("lit/decorators.js");function ht(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var hr=class extends m{isCurrent(a){let e=Date.now(),r=Date.parse(a.start),t=Date.parse(a.end);return Number.isNaN(r)||Number.isNaN(t)?!1:e>=r&&e<t}renderTile(a){let e=a.effect==="Good"?"good":a.effect==="Bad"?"bad":"neutral",r=this.isCurrent(a),t=N[h(a.lord)]??"",s=`${ht(a.start)} - ${ht(a.end)}`;return me.html`<div class="cho-tile ${e}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${a.name}${r?me.html`<span class="now-badge">Now</span>`:me.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?me.html`<span aria-hidden="true">${t}</span>`:me.nothing} ${a.lord}</span></div>`}renderEmpty(){return me.html`<div class="roxy-empty" role="status">No choghadiya data</div>`}renderData(a){let{date:e,dayChoghadiya:r,nightChoghadiya:t}=a;return me.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?me.html`<p class="subtitle">${e}</p>`:me.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(s=>this.renderTile(s)):me.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(s=>this.renderTile(s)):me.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};hr.styles=[g,me.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.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}`],hr=d([(0,ft.customElement)("roxy-choghadiya-grid")],hr);var D=require("lit"),ca=require("lit/decorators.js");var Fe=class extends m{constructor(){super(...arguments);this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,s]of Object.entries(e.categories))typeof s=="number"&&Number.isFinite(s)&&(r[t]=s);return r}return{}}renderEmpty(){return D.html`<div class="roxy-empty" role="status">No compatibility data</div>`}renderData(e){let r=e.overallScore,t=this.getBreakdown(),s="rating"in e?e.rating:void 0,o="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,p="strengths"in e?e.strengths:void 0,y="challenges"in e?e.challenges:void 0,x="keyAspects"in e?e.keyAspects:void 0;return D.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?D.html`<div class="score">${f(r,0)}</div>`:D.nothing} ${s?D.html`<div class="rating">${s}</div>`:D.nothing}</div></div>${Object.keys(t).length>0?D.html`<div role="list">${Object.entries(t).map(([j,b])=>D.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${j}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,b))}%"></span></span> <span>${f(b,0)}</span></div>`)}</div>`:D.nothing} ${o?D.html`<p><span class="archetype">${o.label}</span> ${o.description?D.html`· ${o.description}`:D.nothing}</p>`:D.nothing} ${l?D.html`<p>${l}</p>`:D.nothing} ${c&&!l?D.html`<p>${c}</p>`:D.nothing} ${i?D.html`<p>${i}</p>`:D.nothing} ${(p?.length??0)>0||(y?.length??0)>0?D.html`<div class="lists">${p?.length?D.html`<div><h3>Strengths</h3><ul>${p.map(j=>D.html`<li>${j}</li>`)}</ul></div>`:D.nothing} ${y?.length?D.html`<div><h3>Challenges</h3><ul>${y.map(j=>D.html`<li>${j}</li>`)}</ul></div>`:D.nothing}</div>`:D.nothing} ${x?.length?D.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)">${x.slice(0,6).map(j=>D.html`<li>${fs(j)}</li>`)}</ul></div>`:D.nothing}</article>`}};Fe.styles=[g,D.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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,ca.property)({type:String,reflect:!0})],Fe.prototype,"mode",2),Fe=d([(0,ca.customElement)("roxy-compatibility-card")],Fe);function fs(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${f(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}var H=require("lit"),bt=require("lit/decorators.js");var bs=["January","February","March","April","May","June","July","August","September","October","November","December"],fr=class extends m{renderEmpty(){return H.html`<div class="roxy-empty" role="status">No crystal data</div>`}renderData(a){let e=a.colors??[],r=a.keywords??[],t=a.pairsWith??[],s=typeof a.birthMonth=="number"?bs[a.birthMonth-1]:void 0;return H.html`<article class="wrap" aria-label="${a.name??"Crystal"}"><div class="hero">${a.imageUrl?H.html`<img class="photo" src="${a.imageUrl}" alt="${a.name??"Crystal"}" loading="lazy">`:H.nothing}<div><h2 class="title">${a.name}</h2>${a.description?H.html`<p class="desc">${a.description}</p>`:H.nothing}</div></div><dl class="attrs">${this.attr("Planet",a.planet)} ${this.attr("Hardness",typeof a.hardness=="number"?`${a.hardness} Mohs`:void 0)} ${this.attr("Vibration",a.numericalVibration)} ${this.attr("Birthstone",s)} ${this.list("Chakras",a.chakras)} ${this.list("Zodiac",a.zodiacSigns)} ${this.list("Elements",a.elements)} ${e.length?H.html`<div class="attr"><dt>Colors</dt><dd><div class="colors">${e.map(o=>H.html`<span class="color"><span class="dot" style="background:${o}"></span>${o}</span>`)}</div></dd></div>`:H.nothing}</dl>${this.renderMeaning(a.meaning)} ${r.length?H.html`<div><p class="section-label">Keywords</p><div class="chips">${r.map(o=>H.html`<span class="chip">${o}</span>`)}</div></div>`:H.nothing} ${a.affirmation?H.html`<p class="affirmation">${a.affirmation}</p>`:H.nothing} ${t.length?H.html`<div><p class="section-label">Pairs with</p><div class="chips">${t.map(o=>H.html`<span class="chip">${String(o).replace(/-/g," ")}</span>`)}</div></div>`:H.nothing}</article>`}attr(a,e){return e==null||e===""?H.nothing:H.html`<div class="attr"><dt>${a}</dt><dd>${e}</dd></div>`}list(a,e){return e?.length?H.html`<div class="attr"><dt>${a}</dt><dd>${e.join(", ")}</dd></div>`:H.nothing}renderMeaning(a){if(!a)return H.nothing;let r=[["Spiritual",a.spiritual],["Emotional",a.emotional],["Physical",a.physical]].filter(([,t])=>!!t);return r.length===0?H.nothing:H.html`<div class="meaning">${r.map(([t,s])=>H.html`<h3>${t}</h3><p>${s}</p>`)}</div>`}};fr.styles=[g,H.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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{gap:var(--roxy-space-md,1rem);align-items:flex-start;display:flex}.photo{border-radius:var(--roxy-radius-md,8px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);flex:none;width:96px;height:96px}.title{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600)}.desc{line-height:1.55;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.attrs{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));display:grid}.attr{gap:2px;display:grid}.attr dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.attr dd{font-size:var(--roxy-text-sm,.875rem);margin:0;font-weight:500}.colors{flex-wrap:wrap;gap:.4rem;display:flex}.color{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;align-items:center;gap:.3rem;display:inline-flex}.dot{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:.7rem;height:.7rem}.meaning 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:.05em}.meaning p{margin:0 0 var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);line-height:1.55}.chips{flex-wrap:wrap;gap:.3rem;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:1px 8px}.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}.affirmation{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-left:3px solid var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);font-style:italic;font-size:var(--roxy-text-sm,.875rem);border-radius:0 var(--roxy-radius-sm,4px) var(--roxy-radius-sm,4px) 0;margin:0}`],fr=d([(0,bt.customElement)("roxy-crystal-card")],fr);var Ee=require("lit"),pa=require("lit/decorators.js");var vs=["January","February","March","April","May","June","July","August","September","October","November","December"],qe=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Ee.html`<div class="roxy-empty" role="status">No crystals</div>`}renderData(e){let r=e.crystals??[];if(r.length===0)return this.renderEmpty();let t=this.heading||this.deriveHeading(e),s="total"in e&&typeof e.total=="number"?e.total:r.length;return Ee.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(o=>Ee.html`<li class="tile">${o.imageUrl?Ee.html`<img class="photo" src="${o.imageUrl}" alt="${o.name??"Crystal"}" loading="lazy">`:Ee.html`<div class="photo" aria-hidden="true"></div>`}<p class="name">${o.name}</p>${o.colors&&o.colors.length>0?Ee.html`<div class="colors" aria-label="${`Colours: ${o.colors.join(", ")}`}">${o.colors.map(i=>Ee.html`<span class="swatch" style="${`background:${$s(i)}`}" title="${i}"></span>`)}</div>`:Ee.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"?`${vs[e.month-1]??""} birthstones`.trim():"Crystals"}};qe.styles=[g,Ee.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-surface,#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}`],d([(0,pa.property)({type:String,reflect:!0})],qe.prototype,"heading",2),qe=d([(0,pa.customElement)("roxy-crystal-grid")],qe);function $s(n){return n.trim().toLowerCase().replace(/\s+/g,"")}var R=require("lit"),ma=require("lit/decorators.js");var Ve=class extends m{constructor(){super(...arguments);this.period="current"}renderEmpty(){return R.html`<div class="roxy-empty" role="status">No dasha data</div>`}renderData(e){let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(s=>s.durationYears)):0;return R.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?R.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?R.html`(lord ${e.nakshatraLord})`:R.nothing}</div>`:R.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):R.nothing} ${r.length>0?R.html`<div class="timeline" role="list">${r.map(s=>this.renderBar(s,t))}</div>`:R.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return R.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",s=r.years??0,o=r.months??0,i=r.days??0,l=[];s&&l.push(`${s}y`),o&&l.push(`${o}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return R.html`<p class="balance">Birth dasha balance: ${c} of ${t?R.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?R.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:R.nothing}renderCurrent(e){return"mahadasha"in e?R.html`<div class="current">${"mahadasha"in e&&e.mahadasha?R.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?R.html`<small>${f(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing} ${"antardasha"in e&&e.antardasha?R.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?R.html`<small>${f(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?R.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?R.html`<small>${f(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing}</div>`:R.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),s=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(s)?!1:r>=t&&r<s}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),s=Date.now();return Number.isNaN(r)||Number.isNaN(t)||s<r||s>=t||t<=r?-1:(s-r)/(t-r)}renderBar(e,r){let t=e.durationYears,s=r>0?t/r*100:0,o=this.isCurrent(e),i=o?this.progressIn(e):-1,l=o?"bar-track bar-now":"bar-track";return R.html`<div class="${o?"bar now":"bar"}" role="listitem" aria-current="${o?"time":"false"}"><span><strong>${e.planet}</strong>${o?R.html`<span class="now-badge">Now</span>`:R.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${s}%"></span> ${i>=0?R.html`<span class="bar-progress" style="left:${i*s}%" aria-hidden="true"></span>`:R.nothing} </span><span class="dates">${e.startDate?vt(e.startDate):""} ${e.endDate?R.html`- ${vt(e.endDate)}`:""}</span></div>`}};Ve.styles=[g,R.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-surface,#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-surface,#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,ma.property)({type:String,reflect:!0})],Ve.prototype,"period",2),Ve=d([(0,ma.customElement)("roxy-dasha-timeline")],Ve);function vt(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var L=require("lit"),ga=require("lit/decorators.js");var ws=["title","name","label","heading","overview","summary"],ks=["imageUrl","image","icon","symbol"],Ss=["imageUrl","image"],Rs=6,Ye=class extends m{constructor(){super(...arguments);this.depth=0}renderData(e){return this.depth>=Rs?L.html`<div class="roxy-empty" role="status">…</div>`:L.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(e)}</div>`}renderValue(e){return e==null?L.nothing:typeof e=="string"?L.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?L.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?L.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(s=>s===null||["string","number","boolean"].includes(typeof s))?L.html`<ul class="roxy-chips">${e.map(s=>L.html`<li>${String(s)}</li>`)}</ul>`:e.every(s=>s!==null&&typeof s=="object"&&!Array.isArray(s))?this.renderTable(e):L.html`<ol>${e.map(s=>L.html`<li>${this.renderValue(s)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return L.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>L.html`<th>${Y(t)}</th>`)}</tr></thead><tbody>${e.map(t=>L.html`<tr>${r.map(s=>L.html`<td>${this.formatPrimitive(t[s])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=ws.find(i=>typeof e[i]=="string"),t=ks.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),s=r!=="summary"&&typeof e.summary=="string"?"summary":null,o=Object.entries(e).filter(([i,l])=>i!==r&&i!==s&&!Ss.includes(i)&&l!==null&&l!==void 0);return L.html`${t?L.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:L.nothing} ${r?L.html`<h3 class="roxy-title">${e[r]}</h3>`:L.nothing} ${s?L.html`<p class="roxy-summary">${e[s]}</p>`:L.nothing} ${o.length>0?L.html`<dl class="roxy-rows">${o.map(([i,l])=>L.html`<dt>${Y(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:L.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))?L.html`<ul class="roxy-chips">${e.map(t=>L.html`<li>${String(t)}</li>`)}</ul>`:L.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 s of Object.keys(t))r.add(s);return Array.from(r)}};Ye.styles=[g,L.css`.roxy-card{background:var(--roxy-surface,#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,ga.property)({attribute:!1})],Ye.prototype,"depth",2),Ye=d([(0,ga.customElement)("roxy-data")],Ye);var be=require("lit"),va=require("lit/decorators.js");var T=require("lit");function Le(n){let a=n%360;return a<0?a+360:a}function Me(n){let a=Le(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),s=(r-t)*60,o=Math.floor(s),i=Math.round((s-o)*60);return{sign:te[e]??"Aries",signIndex:e,degree:t,minute:o,second:i}}function ya(n){let{sign:a,degree:e,minute:r}=Me(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function Ia(n){return Le(n+180)}function $t(n,a){let e=Le(n),r=Le(a)-e;return r<0&&(r+=360),Le(e+r/2)}function B(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}var br=require("lit"),Ue=br.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 Br(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:s,controls:o=!1}=n;return br.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=a.findIndex(j=>j.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,y=a[(c+p+a.length)%a.length];if(!y)return;r(y.id);let x=l.currentTarget.getRootNode();requestAnimationFrame(()=>{x.querySelector(`#${s}-tab-${y.id}`)?.focus()})}}">${a.map(l=>br.html`<button type="button" class="roxy-tab" role="tab" id="${s}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${o&&e===l.id?`${s}-panel-${l.id}`:br.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ze=400,I=20,de=ze-2*I,W=ze/2,wt=Object.fromEntries(te.map(n=>[n.toLowerCase(),n])),Cs=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Ts="\u02B3";function kt(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:Me(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function Es(n,a){let e=ot[h(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?Ts:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||kt(n,a))return`${e}${r}`;let{degree:t}=Me(n.longitude);return`${e} ${t}\xB0${r}`}function Ds(n,a){let e=[h(n.graha)],r=kt(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=Me(n.longitude),s=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${s}' ${t.sign}`:`${t.degree}\xB0${s}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Ka(n,a,e,r,t){let s=r-(n.length-1)*t/2;return n.map((o,i)=>{let l=s+i*t;return T.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${Es(o,a)}<title>${Ds(o,a)}</title></text>`})}function xa(n,a,e){let r={};for(let o of te)r[o.toLowerCase()]=[];let t=e?wt[e.toLowerCase()]??"":"",s=t;for(let[o,i]of Object.entries(n??{})){let l=(i?.rashi??"").toLowerCase();if(o==="Lagna"||i?.graha==="Lagna"){t||(s=wt[l]??"");continue}!l||!(l in r)||r[l]?.push({graha:i.graha??o,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:s,placements:r,divisionLabel:a}}var vr=de/4,Ps={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 zs(n){let a=Ps[n]??{col:0,row:0};return{x:I+a.col*vr,y:I+a.row*vr,w:vr,h:vr}}function As(n){let a=I,e=I+vr,r=I+2*vr,t=I+3*vr,s=ze-I;return T.svg`
11
- <rect class="line" x=${a} y=${a} width=${de} height=${de} stroke-width="1.5" fill="none" />
11
+ </g>`})}function ro(n,a){let e=[];for(let[r,t]of Object.entries(lt)){let s=Number(r);if(!n.has(s))continue;let o=a.get(s);e.push(Ne.svg`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${s}${o?Ne.svg`<title>${o}</title>`:Ne.nothing}</text>`)}return e}function _t(n,a){return Kt(n,a)}var Ft=`0 0 ${It} ${Ks}`;function Yt(n){return Ne.svg`
12
+ ${Js()}
13
+ ${Xs(n.activeChannels,n.activeGates)}
14
+ ${eo(n.definedCenters)}
15
+ ${ro(n.activeGates,n.gateTitles)}
16
+ `}var Tr=class extends m{renderEmpty(){return X.html`<div class="roxy-empty" role="status">No bodygraph data</div>`}renderData(a){let e=new Set((a.centers??[]).filter(o=>o.defined).map(o=>o.id)),r=new Set((a.gates??[]).map(o=>o.gate).filter(o=>o!=null)),t=new Set((a.channels??[]).map(o=>_t(o.gateA,o.gateB))),s=this.buildGateTitles(a.gates??[]);return X.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${a.type?X.html`<div class="type-line">${a.type}${a.profile?X.html`· Profile ${a.profile}`:X.nothing}</div>`:X.nothing}</header><div class="layout"><svg viewBox="${Ft}" 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>${Yt({definedCenters:e,activeChannels:t,activeGates:r,gateTitles:s})}</svg> ${this.renderSummary(a)}</div></div>`}buildGateTitles(a){let e=new Map;for(let r of a){if(r.gate==null)continue;let t=[`Gate ${r.gate}`];r.line!=null&&(t[0]+=`.${r.line}`),r.gateName&&t.push(r.gateName);let s=r.planet?u(r.planet):"",o=s?z[s]??s:"";o&&t.push(`${o} ${r.side??""}`.trim()),e.set(r.gate,t.join(" \xB7 "))}return e}renderSummary(a){let e=[{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile},{label:"Definition",value:a.definition}],r=a.incarnationCross;return X.html`<div class="summary"><div class="facts">${e.map(t=>t.value?X.html`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:X.nothing)}</div>${r?.name?X.html`<p class="cross">${r.name} ${r.gates?.length?X.html`<span class="gates">(${r.gates.join(", ")})</span>`:X.nothing}</p>`:X.nothing} ${a.signature||a.notSelf?X.html`<div class="themes">${a.signature?X.html`<span class="pill pill--good">Signature: ${a.signature}</span>`:X.nothing} ${a.notSelf?X.html`<span class="pill pill--shadow">Not-self: ${a.notSelf}</span>`:X.nothing}</div>`:X.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>`}};Tr.styles=[y,X.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:var(--roxy-chart-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-surface,#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}`],Tr=d([(0,Vt.customElement)("roxy-bodygraph")],Tr);var be=require("lit"),Ut=require("lit/decorators.js");function qt(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var Er=class extends m{isCurrent(a){let e=Date.now(),r=Date.parse(a.start),t=Date.parse(a.end);return Number.isNaN(r)||Number.isNaN(t)?!1:e>=r&&e<t}renderTile(a){let e=a.effect==="Good"?"good":a.effect==="Bad"?"bad":"neutral",r=this.isCurrent(a),t=z[u(a.lord)]??"",s=`${qt(a.start)} - ${qt(a.end)}`;return be.html`<div class="cho-tile ${e}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${a.name}${r?be.html`<span class="now-badge">Now</span>`:be.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?be.html`<span aria-hidden="true">${t}</span>`:be.nothing} ${a.lord}</span></div>`}renderEmpty(){return be.html`<div class="roxy-empty" role="status">No choghadiya data</div>`}renderData(a){let{date:e,dayChoghadiya:r,nightChoghadiya:t}=a;return be.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?be.html`<p class="subtitle">${e}</p>`:be.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(s=>this.renderTile(s)):be.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(s=>this.renderTile(s)):be.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Er.styles=[y,be.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.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}`],Er=d([(0,Ut.customElement)("roxy-choghadiya-grid")],Er);var L=require("lit"),Da=require("lit/decorators.js");var Qe=class extends m{constructor(){super(...arguments);this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,s]of Object.entries(e.categories))typeof s=="number"&&Number.isFinite(s)&&(r[t]=s);return r}return{}}renderEmpty(){return L.html`<div class="roxy-empty" role="status">No compatibility data</div>`}renderData(e){let r=e.overallScore,t=this.getBreakdown(),s="rating"in e?e.rating:void 0,o="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,p="strengths"in e?e.strengths:void 0,g="challenges"in e?e.challenges:void 0,h="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">${f(r,0)}</div>`:L.nothing} ${s?L.html`<div class="rating">${s}</div>`:L.nothing}</div></div>${Object.keys(t).length>0?L.html`<div role="list">${Object.entries(t).map(([S,b])=>L.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${S}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,b))}%"></span></span> <span>${f(b,0)}</span></div>`)}</div>`:L.nothing} ${o?L.html`<p><span class="archetype">${o.label}</span> ${o.description?L.html`· ${o.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} ${(p?.length??0)>0||(g?.length??0)>0?L.html`<div class="lists">${p?.length?L.html`<div><h3>Strengths</h3><ul>${p.map(S=>L.html`<li>${S}</li>`)}</ul></div>`:L.nothing} ${g?.length?L.html`<div><h3>Challenges</h3><ul>${g.map(S=>L.html`<li>${S}</li>`)}</ul></div>`:L.nothing}</div>`:L.nothing} ${h?.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)">${h.slice(0,6).map(S=>L.html`<li>${ao(S)}</li>`)}</ul></div>`:L.nothing}</article>`}};Qe.styles=[y,L.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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,Da.property)({type:String,reflect:!0})],Qe.prototype,"mode",2),Qe=d([(0,Da.customElement)("roxy-compatibility-card")],Qe);function ao(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${f(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}var I=require("lit"),Wt=require("lit/decorators.js");var to=["January","February","March","April","May","June","July","August","September","October","November","December"],Ar=class extends m{renderEmpty(){return I.html`<div class="roxy-empty" role="status">No crystal data</div>`}renderData(a){let e=a.colors??[],r=a.keywords??[],t=a.pairsWith??[],s=typeof a.birthMonth=="number"?to[a.birthMonth-1]:void 0;return I.html`<article class="wrap" aria-label="${a.name??"Crystal"}"><div class="hero">${a.imageUrl?I.html`<img class="photo" src="${a.imageUrl}" alt="${a.name??"Crystal"}" loading="lazy">`:I.nothing}<div><h2 class="title">${a.name}</h2>${a.description?I.html`<p class="desc">${a.description}</p>`:I.nothing}</div></div><dl class="attrs">${this.attr("Planet",a.planet)} ${this.attr("Hardness",typeof a.hardness=="number"?`${a.hardness} Mohs`:void 0)} ${this.attr("Vibration",a.numericalVibration)} ${this.attr("Birthstone",s)} ${this.list("Chakras",a.chakras)} ${this.list("Zodiac",a.zodiacSigns)} ${this.list("Elements",a.elements)} ${e.length?I.html`<div class="attr"><dt>Colors</dt><dd><div class="colors">${e.map(o=>I.html`<span class="color"><span class="dot" style="background:${o}"></span>${o}</span>`)}</div></dd></div>`:I.nothing}</dl>${this.renderMeaning(a.meaning)} ${r.length?I.html`<div><p class="section-label">Keywords</p><div class="chips">${r.map(o=>I.html`<span class="chip">${o}</span>`)}</div></div>`:I.nothing} ${a.affirmation?I.html`<p class="affirmation">${a.affirmation}</p>`:I.nothing} ${t.length?I.html`<div><p class="section-label">Pairs with</p><div class="chips">${t.map(o=>I.html`<span class="chip">${String(o).replace(/-/g," ")}</span>`)}</div></div>`:I.nothing}</article>`}attr(a,e){return e==null||e===""?I.nothing:I.html`<div class="attr"><dt>${a}</dt><dd>${e}</dd></div>`}list(a,e){return e?.length?I.html`<div class="attr"><dt>${a}</dt><dd>${e.join(", ")}</dd></div>`:I.nothing}renderMeaning(a){if(!a)return I.nothing;let r=[["Spiritual",a.spiritual],["Emotional",a.emotional],["Physical",a.physical]].filter(([,t])=>!!t);return r.length===0?I.nothing:I.html`<div class="meaning">${r.map(([t,s])=>I.html`<h3>${t}</h3><p>${s}</p>`)}</div>`}};Ar.styles=[y,I.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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{gap:var(--roxy-space-md,1rem);align-items:flex-start;display:flex}.photo{border-radius:var(--roxy-radius-md,8px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);flex:none;width:96px;height:96px}.title{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600)}.desc{line-height:1.55;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.attrs{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));display:grid}.attr{gap:2px;display:grid}.attr dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.attr dd{font-size:var(--roxy-text-sm,.875rem);margin:0;font-weight:500}.colors{flex-wrap:wrap;gap:.4rem;display:flex}.color{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;align-items:center;gap:.3rem;display:inline-flex}.dot{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:.7rem;height:.7rem}.meaning 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:.05em}.meaning p{margin:0 0 var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);line-height:1.55}.chips{flex-wrap:wrap;gap:.3rem;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:1px 8px}.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}.affirmation{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-left:3px solid var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);font-style:italic;font-size:var(--roxy-text-sm,.875rem);border-radius:0 var(--roxy-radius-sm,4px) var(--roxy-radius-sm,4px) 0;margin:0}`],Ar=d([(0,Wt.customElement)("roxy-crystal-card")],Ar);var Me=require("lit"),La=require("lit/decorators.js");var so=["January","February","March","April","May","June","July","August","September","October","November","December"],er=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Me.html`<div class="roxy-empty" role="status">No crystals</div>`}renderData(e){let r=e.crystals??[];if(r.length===0)return this.renderEmpty();let t=this.heading||this.deriveHeading(e),s="total"in e&&typeof e.total=="number"?e.total:r.length;return Me.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(o=>Me.html`<li class="tile">${o.imageUrl?Me.html`<img class="photo" src="${o.imageUrl}" alt="${o.name??"Crystal"}" loading="lazy">`:Me.html`<div class="photo" aria-hidden="true"></div>`}<p class="name">${o.name}</p>${o.colors&&o.colors.length>0?Me.html`<div class="colors" aria-label="${`Colours: ${o.colors.join(", ")}`}">${o.colors.map(i=>Me.html`<span class="swatch" style="${`background:${oo(i)}`}" title="${i}"></span>`)}</div>`:Me.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"?`${so[e.month-1]??""} birthstones`.trim():"Crystals"}};er.styles=[y,Me.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-surface,#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}`],d([(0,La.property)({type:String,reflect:!0})],er.prototype,"heading",2),er=d([(0,La.customElement)("roxy-crystal-grid")],er);function oo(n){return n.trim().toLowerCase().replace(/\s+/g,"")}var T=require("lit"),Na=require("lit/decorators.js");var rr=class extends m{constructor(){super(...arguments);this.period="current"}renderEmpty(){return T.html`<div class="roxy-empty" role="status">No dasha data</div>`}renderData(e){let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(s=>s.durationYears)):0;return T.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?T.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?T.html`(lord ${e.nakshatraLord})`:T.nothing}</div>`:T.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):T.nothing} ${r.length>0?T.html`<div class="timeline" role="list">${r.map(s=>this.renderBar(s,t))}</div>`:T.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return T.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",s=r.years??0,o=r.months??0,i=r.days??0,l=[];s&&l.push(`${s}y`),o&&l.push(`${o}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return T.html`<p class="balance">Birth dasha balance: ${c} of ${t?T.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?T.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:T.nothing}renderCurrent(e){return"mahadasha"in e?T.html`<div class="current">${"mahadasha"in e&&e.mahadasha?T.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?T.html`<small>${f(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:T.nothing}</div>`:T.nothing} ${"antardasha"in e&&e.antardasha?T.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?T.html`<small>${f(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:T.nothing}</div>`:T.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?T.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?T.html`<small>${f(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:T.nothing}</div>`:T.nothing}</div>`:T.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),s=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(s)?!1:r>=t&&r<s}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),s=Date.now();return Number.isNaN(r)||Number.isNaN(t)||s<r||s>=t||t<=r?-1:(s-r)/(t-r)}renderBar(e,r){let t=e.durationYears,s=r>0?t/r*100:0,o=this.isCurrent(e),i=o?this.progressIn(e):-1,l=o?"bar-track bar-now":"bar-track";return T.html`<div class="${o?"bar now":"bar"}" role="listitem" aria-current="${o?"time":"false"}"><span><strong>${e.planet}</strong>${o?T.html`<span class="now-badge">Now</span>`:T.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${s}%"></span> ${i>=0?T.html`<span class="bar-progress" style="left:${i*s}%" aria-hidden="true"></span>`:T.nothing} </span><span class="dates">${e.startDate?Jt(e.startDate):""} ${e.endDate?T.html`- ${Jt(e.endDate)}`:""}</span></div>`}};rr.styles=[y,T.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-surface,#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-surface,#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,Na.property)({type:String,reflect:!0})],rr.prototype,"period",2),rr=d([(0,Na.customElement)("roxy-dasha-timeline")],rr);function Jt(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var O=require("lit"),Ma=require("lit/decorators.js");var no=["title","name","label","heading","overview","summary"],io=["imageUrl","image","icon","symbol"],lo=["imageUrl","image"],co=6,ar=class extends m{constructor(){super(...arguments);this.depth=0}renderData(e){return this.depth>=co?O.html`<div class="roxy-empty" role="status">…</div>`:O.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(e)}</div>`}renderValue(e){return e==null?O.nothing:typeof e=="string"?O.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?O.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?O.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(s=>s===null||["string","number","boolean"].includes(typeof s))?O.html`<ul class="roxy-chips">${e.map(s=>O.html`<li>${String(s)}</li>`)}</ul>`:e.every(s=>s!==null&&typeof s=="object"&&!Array.isArray(s))?this.renderTable(e):O.html`<ol>${e.map(s=>O.html`<li>${this.renderValue(s)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return O.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>O.html`<th>${J(t)}</th>`)}</tr></thead><tbody>${e.map(t=>O.html`<tr>${r.map(s=>O.html`<td>${this.formatPrimitive(t[s])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=no.find(i=>typeof e[i]=="string"),t=io.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),s=r!=="summary"&&typeof e.summary=="string"?"summary":null,o=Object.entries(e).filter(([i,l])=>i!==r&&i!==s&&!lo.includes(i)&&l!==null&&l!==void 0);return O.html`${t?O.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:O.nothing} ${r?O.html`<h3 class="roxy-title">${e[r]}</h3>`:O.nothing} ${s?O.html`<p class="roxy-summary">${e[s]}</p>`:O.nothing} ${o.length>0?O.html`<dl class="roxy-rows">${o.map(([i,l])=>O.html`<dt>${J(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:O.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))?O.html`<ul class="roxy-chips">${e.map(t=>O.html`<li>${String(t)}</li>`)}</ul>`:O.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 s of Object.keys(t))r.add(s);return Array.from(r)}};ar.styles=[y,O.css`.roxy-card{background:var(--roxy-surface,#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,Ma.property)({attribute:!1})],ar.prototype,"depth",2),ar=d([(0,Ma.customElement)("roxy-data")],ar);var Te=require("lit"),Ka=require("lit/decorators.js");var A=require("lit");function _e(n){let a=n%360;return a<0?a+360:a}function Ge(n){let a=_e(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),s=(r-t)*60,o=Math.floor(s),i=Math.round((s-o)*60);return{sign:de[e]??"Aries",signIndex:e,degree:t,minute:o,second:i}}function Ga(n){let{sign:a,degree:e,minute:r}=Ge(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function ua(n){let a=Math.floor(n),e=Math.round((n-a)*60);return e===60&&(e=0,a+=1),`${a}\xB0${String(e).padStart(2,"0")}'`}function ct(n){return _e(n+180)}function Xt(n,a){let e=_e(n),r=_e(a)-e;return r<0&&(r+=360),_e(e+r/2)}function _(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}var Pr=require("lit"),tr=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 oa(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:s,controls:o=!1}=n;return Pr.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=a.findIndex(S=>S.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,g=a[(c+p+a.length)%a.length];if(!g)return;r(g.id);let h=l.currentTarget.getRootNode();requestAnimationFrame(()=>{h.querySelector(`#${s}-tab-${g.id}`)?.focus()})}}">${a.map(l=>Pr.html`<button type="button" class="roxy-tab" role="tab" id="${s}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${o&&e===l.id?`${s}-panel-${l.id}`:Pr.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var Be=400,F=20,he=Be-2*F,Z=Be/2,Zt=Object.fromEntries(de.map(n=>[n.toLowerCase(),n])),po=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],mo="\u02B3";function Qt(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:Ge(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function go(n,a){let e=Et[u(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?mo:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||Qt(n,a))return`${e}${r}`;let{degree:t}=Ge(n.longitude);return`${e} ${t}\xB0${r}`}function yo(n,a){let e=[u(n.graha)],r=Qt(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=Ge(n.longitude),s=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${s}' ${t.sign}`:`${t.degree}\xB0${s}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function pt(n,a,e,r,t){let s=r-(n.length-1)*t/2;return n.map((o,i)=>{let l=s+i*t;return A.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${go(o,a)}<title>${yo(o,a)}</title></text>`})}function Oa(n,a,e){let r={};for(let o of de)r[o.toLowerCase()]=[];let t=e?Zt[e.toLowerCase()]??"":"",s=t;for(let[o,i]of Object.entries(n??{})){let l=(i?.rashi??"").toLowerCase();if(o==="Lagna"||i?.graha==="Lagna"){t||(s=Zt[l]??"");continue}!l||!(l in r)||r[l]?.push({graha:i.graha??o,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:s,placements:r,divisionLabel:a}}var Dr=he/4,uo={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 xo(n){let a=uo[n]??{col:0,row:0};return{x:F+a.col*Dr,y:F+a.row*Dr,w:Dr,h:Dr}}function ho(n){let a=F,e=F+Dr,r=F+2*Dr,t=F+3*Dr,s=Be-F;return A.svg`
17
+ <rect class="line" x=${a} y=${a} width=${he} height=${he} stroke-width="1.5" fill="none" />
12
18
  <line class="line" x1=${a} y1=${e} x2=${s} y2=${e} stroke-width="1" />
13
19
  <line class="line" x1=${a} y1=${t} x2=${s} y2=${t} stroke-width="1" />
14
20
  <line class="line" x1=${e} y1=${a} x2=${e} y2=${s} stroke-width="1" />
@@ -17,38 +23,38 @@
17
23
  <line class="line" x1=${t} y1=${r} x2=${s} y2=${r} stroke-width="1" />
18
24
  <line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
19
25
  <line class="line" x1=${r} y1=${t} x2=${r} y2=${s} stroke-width="1" />
20
- ${n?T.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
21
- `}function St(n,a){let e=te.findIndex(t=>t===a),r=te.findIndex(t=>t===n);return e===-1||r===-1?0:(r-e+12)%12+1}function Ns(n,a,e,r){let t=zs(n),s=t.x+t.w/2,o=t.y+t.h/2,i=aa[n]??n.slice(0,2),l=14;return T.svg`
26
+ ${n?A.svg`<text class="centre-label" x=${Z} y=${Z} text-anchor="middle" dominant-baseline="central">${n}</text>`:A.nothing}
27
+ `}function es(n,a){let e=de.findIndex(t=>t===a),r=de.findIndex(t=>t===n);return e===-1||r===-1?0:(r-e+12)%12+1}function fo(n,a,e,r){let t=xo(n),s=t.x+t.w/2,o=t.y+t.h/2,i=ka[n]??n.slice(0,2),l=14;return A.svg`
22
28
  <g class=${e?"cell lagna":"cell"}>
23
- ${e?T.svg`
29
+ ${e?A.svg`
24
30
  <rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
25
31
  <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
- `:T.nothing}
32
+ `:A.nothing}
27
33
  <text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
28
- ${r>0?T.svg`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:T.nothing}
29
- ${e?T.svg`<text class="lagna-marker" x=${s} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
30
- ${a.length?Ka(a,n,s,o+4,14):T.nothing}
34
+ ${r>0?A.svg`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:A.nothing}
35
+ ${e?A.svg`<text class="lagna-marker" x=${s} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:A.nothing}
36
+ ${a.length?pt(a,n,s,o+4,14):A.nothing}
31
37
  </g>
32
- `}function Ls(n){let a=n.lagnaSign.toLowerCase();return T.svg`
33
- ${As(n.divisionLabel)}
34
- ${te.map(e=>Ns(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,St(e,n.lagnaSign)))}
35
- `}var O={tl:{x:I,y:I},tr:{x:ze-I,y:I},br:{x:ze-I,y:ze-I},bl:{x:I,y:ze-I},top:{x:W,y:I},right:{x:ze-I,y:W},bottom:{x:W,y:ze-I},left:{x:I,y:W},tlMid:{x:W-de/4,y:W-de/4},trMid:{x:W+de/4,y:W-de/4},brMid:{x:W+de/4,y:W+de/4},blMid:{x:W-de/4,y:W+de/4}};function He(n){let a=n.reduce((r,t)=>r+t.x,0)/n.length,e=n.reduce((r,t)=>r+t.y,0)/n.length;return{x:a,y:e}}var Ms={1:{x:W,y:O.tlMid.y},2:He([O.tl,O.top,O.tlMid]),3:He([O.tl,O.left,O.tlMid]),4:{x:O.tlMid.x,y:W},5:He([O.bl,O.left,O.blMid]),6:He([O.bl,O.bottom,O.blMid]),7:{x:W,y:O.blMid.y},8:He([O.br,O.bottom,O.brMid]),9:He([O.br,O.right,O.brMid]),10:{x:O.brMid.x,y:W},11:He([O.tr,O.right,O.trMid]),12:He([O.tr,O.top,O.trMid])};function Gs(n,a){let e=te.findIndex(r=>r===a);return e===-1?n:(e+n-1)%12+1}function Hs(n){let{tl:a,tr:e,br:r,bl:t,top:s,right:o,bottom:i,left:l}=O;return T.svg`
36
- <rect class="line" x=${a.x} y=${a.y} width=${de} height=${de} stroke-width="1.5" fill="none" />
38
+ `}function bo(n){let a=n.lagnaSign.toLowerCase();return A.svg`
39
+ ${ho(n.divisionLabel)}
40
+ ${de.map(e=>fo(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,es(e,n.lagnaSign)))}
41
+ `}var K={tl:{x:F,y:F},tr:{x:Be-F,y:F},br:{x:Be-F,y:Be-F},bl:{x:F,y:Be-F},top:{x:Z,y:F},right:{x:Be-F,y:Z},bottom:{x:Z,y:Be-F},left:{x:F,y:Z},tlMid:{x:Z-he/4,y:Z-he/4},trMid:{x:Z+he/4,y:Z-he/4},brMid:{x:Z+he/4,y:Z+he/4},blMid:{x:Z-he/4,y:Z+he/4}};function Ve(n){let a=n.reduce((r,t)=>r+t.x,0)/n.length,e=n.reduce((r,t)=>r+t.y,0)/n.length;return{x:a,y:e}}var vo={1:{x:Z,y:K.tlMid.y},2:Ve([K.tl,K.top,K.tlMid]),3:Ve([K.tl,K.left,K.tlMid]),4:{x:K.tlMid.x,y:Z},5:Ve([K.bl,K.left,K.blMid]),6:Ve([K.bl,K.bottom,K.blMid]),7:{x:Z,y:K.blMid.y},8:Ve([K.br,K.bottom,K.brMid]),9:Ve([K.br,K.right,K.brMid]),10:{x:K.brMid.x,y:Z},11:Ve([K.tr,K.right,K.trMid]),12:Ve([K.tr,K.top,K.trMid])};function $o(n,a){let e=de.findIndex(r=>r===a);return e===-1?n:(e+n-1)%12+1}function wo(n){let{tl:a,tr:e,br:r,bl:t,top:s,right:o,bottom:i,left:l}=K;return A.svg`
42
+ <rect class="line" x=${a.x} y=${a.y} width=${he} height=${he} stroke-width="1.5" fill="none" />
37
43
  <polygon class="line" points="${s.x},${s.y} ${o.x},${o.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
38
44
  <line class="line" x1=${a.x} y1=${a.y} x2=${r.x} y2=${r.y} stroke-width="1" />
39
45
  <line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
40
- ${n?T.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
41
- `}function Os(n,a,e,r,t){let s=Ms[n];if(!s)return T.svg``;let o=Math.min(14,Math.abs(s.y-W)*.45+6),i=o+12,l=t?`${a} \xB7 ${aa[e]??e.slice(0,2)}`:`${a}`;return T.svg`
46
+ ${n?A.svg`<text class="centre-label" x=${Z} y=${Z} text-anchor="middle" dominant-baseline="central">${n}</text>`:A.nothing}
47
+ `}function ko(n,a,e,r,t){let s=vo[n];if(!s)return A.svg``;let o=Math.min(14,Math.abs(s.y-Z)*.45+6),i=o+12,l=t?`${a} \xB7 ${ka[e]??e.slice(0,2)}`:`${a}`;return A.svg`
42
48
  <g class=${t?"cell lagna":"cell"}>
43
49
  <text class="rashi-num" x=${s.x} y=${s.y-o} text-anchor="middle" dominant-baseline="central">${l}</text>
44
- ${t?T.svg`<text class="lagna-marker" x=${s.x} y=${s.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
45
- ${r.length?Ka(r,e,s.x,s.y+8,12):T.nothing}
50
+ ${t?A.svg`<text class="lagna-marker" x=${s.x} y=${s.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:A.nothing}
51
+ ${r.length?pt(r,e,s.x,s.y+8,12):A.nothing}
46
52
  </g>
47
- `}function js(n){let a=n.lagnaSign||"Aries";return T.svg`
48
- ${Hs(n.divisionLabel)}
49
- ${Array.from({length:12},(e,r)=>{let t=r+1,s=Gs(t,a),o=te[s-1]??"Aries";return Os(t,s,o,n.placements[o.toLowerCase()]??[],t===1)})}
50
- `}var ua=de/3;function Bs(){let n=I,a=I+ua,e=I+2*ua,r=ze-I,Pe={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:r}],Virgo:[{x:a,y:e},{x:a,y:r},{x:n,y:r}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:r},{x:a,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:a},{x:r,y:a},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:n},{x:r,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:r,y:n},{x:e,y:a}]},Vr={};for(let[Jr,Xr]of Object.entries(Pe))Vr[Jr]={points:[...Xr],centroid:He(Xr)};return Vr}var Is=Bs();function Ks(n){let a=I,e=I+ua,r=I+2*ua,t=ze-I;return T.svg`
51
- <rect class="line" x=${a} y=${a} width=${de} height=${de} stroke-width="1.5" fill="none" />
53
+ `}function So(n){let a=n.lagnaSign||"Aries";return A.svg`
54
+ ${wo(n.divisionLabel)}
55
+ ${Array.from({length:12},(e,r)=>{let t=r+1,s=$o(t,a),o=de[s-1]??"Aries";return ko(t,s,o,n.placements[o.toLowerCase()]??[],t===1)})}
56
+ `}var Ha=he/3;function Ro(){let n=F,a=F+Ha,e=F+2*Ha,r=Be-F,je={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:r}],Virgo:[{x:a,y:e},{x:a,y:r},{x:n,y:r}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:r},{x:a,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:a},{x:r,y:a},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:n},{x:r,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:r,y:n},{x:e,y:a}]},ca={};for(let[ha,fa]of Object.entries(je))ca[ha]={points:[...fa],centroid:Ve(fa)};return ca}var Co=Ro();function zo(n){let a=F,e=F+Ha,r=F+2*Ha,t=Be-F;return A.svg`
57
+ <rect class="line" x=${a} y=${a} width=${he} height=${he} stroke-width="1.5" fill="none" />
52
58
  <line class="line" x1=${a} y1=${e} x2=${e} y2=${e} stroke-width="1" />
53
59
  <line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
54
60
  <line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
@@ -61,32 +67,38 @@
61
67
  <line class="line" x1=${t} y1=${a} x2=${r} y2=${e} stroke-width="1" />
62
68
  <line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
63
69
  <line class="line" x1=${a} y1=${t} x2=${e} y2=${r} stroke-width="1" />
64
- ${n?T.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
65
- `}function _s(n,a,e,r){let t=Is[n];if(!t)return T.svg``;let{centroid:s,points:o}=t,i=aa[n]??n.slice(0,2),l=o.map(c=>`${c.x},${c.y}`).join(" ");return T.svg`
70
+ ${n?A.svg`<text class="centre-label" x=${Z} y=${Z} text-anchor="middle" dominant-baseline="central">${n}</text>`:A.nothing}
71
+ `}function To(n,a,e,r){let t=Co[n];if(!t)return A.svg``;let{centroid:s,points:o}=t,i=ka[n]??n.slice(0,2),l=o.map(c=>`${c.x},${c.y}`).join(" ");return A.svg`
66
72
  <g class=${e?"cell lagna":"cell"}>
67
- ${e?T.svg`<polygon class="lagna-bg" points=${l} />`:T.nothing}
73
+ ${e?A.svg`<polygon class="lagna-bg" points=${l} />`:A.nothing}
68
74
  <text class="sign-text" x=${s.x} y=${s.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
69
- ${r>0?T.svg`<text class="house-num" x=${s.x+18} y=${s.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:T.nothing}
70
- ${e?T.svg`<text class="lagna-marker" x=${s.x} y=${s.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
71
- ${a.length?Ka(a,n,s.x,s.y+4,12):T.nothing}
75
+ ${r>0?A.svg`<text class="house-num" x=${s.x+18} y=${s.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:A.nothing}
76
+ ${e?A.svg`<text class="lagna-marker" x=${s.x} y=${s.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:A.nothing}
77
+ ${a.length?pt(a,n,s.x,s.y+4,12):A.nothing}
72
78
  </g>
73
- `}function Fs(n){let a=n.lagnaSign.toLowerCase();return T.svg`
74
- ${Ks(n.divisionLabel)}
75
- ${te.map(e=>_s(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,St(e,n.lagnaSign)))}
76
- `}function ha(n,a){switch(a){case"north":return js(n);case"east":return Fs(n);default:return Ls(n)}}function fa(n,a){return Br({items:Cs,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var Rt=require("lit"),ba=Rt.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.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{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;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 We=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return xa(this.data.chart.meta,r)}renderEmpty(){return be.html`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let{division:t,vargottama:s}=e;return be.html`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?be.html`<span class="division-meta">· ${t.sanskritName}</span>`:be.nothing}</h2>${t.significance?be.html`<p class="significance">${t.significance}</p>`:be.nothing}</div>${fa(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${ha(r,this.chartStyle)}</svg> ${s&&s.length>0?be.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>be.html`<span class="vargottama-pill" role="listitem">${N[o]??""} ${o}</span>`)}</div>`:be.nothing}</div>`}};We.styles=[g,ba,Ue,be.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,va.property)({type:String,reflect:!0,attribute:"chart-style"})],We.prototype,"chartStyle",2),We=d([(0,va.customElement)("roxy-divisional-chart")],We);var ae=require("lit"),$a=require("lit/decorators.js");var qs={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Je=class extends m{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return ae.html`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=qs[this.type]??this.type,s=(e.severity??"").toLowerCase(),o=s==="severe"?3:s==="moderate"?2:s==="mild"?1:0,i=o*33,l=o===3?"var(--roxy-danger)":o===2?"var(--roxy-warning)":o===1?"var(--roxy-success)":"transparent";return ae.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?ae.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${o}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:ae.nothing} ${e.description?ae.html`<p class="description">${e.description}</p>`:ae.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?ae.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>ae.html`<li>${c}</li>`)}</ul></div>`:ae.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?ae.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>ae.html`<li>${c}</li>`)}</ul></div>`:ae.nothing}</article>`}renderEffects(e){if(!e.effects)return ae.nothing;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?ae.nothing:ae.html`<div class="effects">${r.map(([t,s])=>ae.html`<div><h3>${t}</h3><p>${s}</p></div>`)}</div>`}};Je.styles=[g,ae.css`.card{background:var(--roxy-surface,#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,$a.property)({type:String,reflect:!0})],Je.prototype,"type",2),Je=d([(0,$a.customElement)("roxy-dosha-card")],Je);var De=require("lit"),Ct=require("lit/decorators.js");var $r=class extends m{renderData(a){return De.html`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?De.html`<span class="letter" aria-hidden="true">${a.letter}</span>`:De.nothing}<div><p class="label">Dream symbol</p>${a.name?De.html`<h2 class="name">${a.name}</h2>`:De.nothing}</div></header>${a.meaning?De.html`<p class="meaning">${a.meaning}</p>`:De.nothing}</article>`}renderEmpty(){return De.html`<div class="roxy-empty" role="status">No dream symbol</div>`}};$r.styles=[g,De.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}`],$r=d([(0,Ct.customElement)("roxy-dream-card")],$r);var Oe=require("lit"),Tt=require("lit/decorators.js");var wr=class extends m{renderEmpty(){return Oe.html`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(a){let e=a.symbols??[];if(e.length===0)return this.renderEmpty();let r=typeof a.total=="number"?a.total:e.length;return Oe.html`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${r} match${r===1?"":"es"}</span></header><ul class="grid">${e.map(t=>Oe.html`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?Oe.html`<span class="letter" aria-hidden="true">${t.letter}</span>`:Oe.nothing} <span class="name">${t.name}</span></button></li>`)}</ul></section>`}select(a){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:a.id,name:a.name,letter:a.letter},bubbles:!0,composed:!0}))}};wr.styles=[g,Oe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.result{align-items:center;gap:var(--roxy-space-sm,.5rem);text-align:left;width:100%;font:inherit;color:var(--roxy-fg,#0a0a0a);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);cursor:pointer;background:0 0;transition:border-color .12s,background .12s;display:flex}.result:hover,.result:focus-visible{border-color:var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);outline:none}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:1.6rem;height:1.6rem;color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;flex:none;place-items:center;display:grid}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:500}`],wr=d([(0,Tt.customElement)("roxy-dream-search")],wr);var Q=require("lit"),ve=require("lit/decorators.js");var _a=new Map;async function Vs(n){let a=_a.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw _a.delete(n),e}),_a.set(n,a)),a}var ce=class extends Q.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.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(s=>s.required).filter(s=>this.values[s.key]===void 0||this.values[s.key]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.key)},bubbles:!0,composed:!0}));return}let t={};for(let s of this.fields){let o=this.values[s.key];if(!(o===void 0||o===""))if(s.group){let i=t[s.group]??{};i[s.name]=o,t[s.group]=i}else t[s.name]=o}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:t},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Vs(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 s=e.components?.schemas??{},o=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,s)}if(i?.properties){let c=new Set(i.required??[]);for(let[p,y]of Object.entries(i.properties)){let x=this.resolve(y,s)??{};if(x.type==="object"&&x.properties){let j=new Set(x.required??[]);for(let[b,dr]of Object.entries(x.properties)){let Pe=this.resolve(dr,s)??{};o.push({key:`${p}.${b}`,name:b,group:p,type:this.fieldType(Pe),required:c.has(p)&&j.has(b),description:Pe.description,enum:Pe.enum,min:Pe.minimum,max:Pe.maximum,default:Pe.default})}}else o.push({key:p,name:p,type:this.fieldType(x),required:c.has(p),description:x.description,enum:x.enum,min:x.minimum,max:x.maximum,default:x.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let p=this.resolve(c.schema,s)??{};o.push({key:c.name,name:c.name,type:this.fieldType(p),required:!!c.required,description:p.description,enum:p.enum,default:p.default})}this.fields=o;let l={};for(let c of o){c.default!==void 0&&(l[c.key]=c.default);let p=c.group?this.initialValues?.[c.group]?.[c.name]:this.initialValues?.[c.name];p!==void 0&&(l[c.key]=p)}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}}groupHasLocation(e){let r=this.fields.filter(t=>t.group===e);return["latitude","longitude","timezone"].every(t=>r.some(s=>s.name===t))}onLocationFor(e){let r=e?`${e}.`:"";return t=>{let s=t.detail;s&&(this.values={...this.values,[`${r}latitude`]:s.latitude,[`${r}longitude`]:s.longitude,[`${r}timezone`]:s.timezone??s.utcOffset})}}render(){if(!this.loaded)return Q.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return Q.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=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return Q.nothing;let i=`roxy-form-${o.key}`;return Q.html`<div class="field"><label for="${i}">${Y(o.name)}${o.required?Q.html`<span class="req" aria-hidden="true">*</span>`:Q.nothing}</label> ${o.enum?Q.html`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>Q.html`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:Q.html`<input id="${i}" type="${this.htmlType(o.type)}" ?required="${o.required}" min="${o.min??""}" max="${o.max??""}" step="${o.type==="number"?"any":""}" .value="${this.values[o.key]??""}" @input="${l=>this.setValue(o.key,this.coerce(o.type,l.target.value))}">`} ${o.description?Q.html`<small class="help">${o.description}</small>`:Q.nothing}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?Q.html`<div class="location-block"><label>${o?`${Y(o)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(o)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:Q.nothing,s=o=>Q.html`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return Q.html`<form @submit="${this.onSubmit}"><h2 class="title">${Y(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):Q.html`<fieldset class="person-group"><legend>${Y(o)}</legend>${s(o)}</fieldset>`)} <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}}};ce.styles=[g,Q.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}.person-group{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);margin:0 0 var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);min-inline-size:0;display:grid}.person-group legend{padding:0 var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.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,ve.property)({type:String,attribute:"data-endpoint"})],ce.prototype,"endpoint",2),d([(0,ve.property)({type:String})],ce.prototype,"method",2),d([(0,ve.property)({type:String,attribute:"spec-url"})],ce.prototype,"specUrl",2),d([(0,ve.property)({type:String,attribute:"submit-label"})],ce.prototype,"submitLabel",2),d([(0,ve.property)({attribute:!1})],ce.prototype,"initialValues",2),d([(0,ve.state)()],ce.prototype,"fields",2),d([(0,ve.state)()],ce.prototype,"values",2),d([(0,ve.state)()],ce.prototype,"loaded",2),d([(0,ve.state)()],ce.prototype,"specError",2),ce=d([(0,ve.customElement)("roxy-endpoint-form")],ce);var ge=require("lit"),Et=require("lit/decorators.js");var kr=class extends m{renderEmpty(){return ge.html`<div class="roxy-empty" role="status">No digest data</div>`}renderData(a){let e=a.windows??[];if(e.length===0)return this.renderEmpty();let r=[Ce(a.startDate),Ce(a.endDate)].filter(Boolean).join(" \u2013 ");return ge.html`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?ge.html`<p class="subtitle">${r}</p>`:ge.nothing}</div>${e.map(t=>this.renderWindow(t))}</div>`}windowLabel(a){return a===1?"Next 24 hours":typeof a=="number"?`Next ${a} days`:"Window"}renderWindow(a){let e=a.top??[],r=a.byDomain??{},t=Object.entries(r);return ge.html`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(a.days)}</span> <span class="window-count">${a.count??0} event${a.count===1?"":"s"}</span></div>${t.length>0?ge.html`<div class="domains">${t.map(([s,o])=>ge.html`<span class="domain-chip"><span class="swatch sw-${s}"></span>${Y(s)} ${o}</span>`)}</div>`:ge.nothing} ${e.length>0?ge.html`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:ge.html`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return ge.html`<div class="event" role="listitem"><span class="event-date">${Ce(a.date)}</span> <span class="event-desc">${a.description??Y(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${f(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};kr.styles=[g,ge.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}.window{gap:var(--roxy-space-sm,.5rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);display:grid}.window:first-of-type{border-top:none;padding-top:0}.window-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.window-label{font-weight:var(--roxy-weight-bold,600)}.window-count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.domains{flex-wrap:wrap;gap:.4rem;display:flex}.domain-chip{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:.35rem;display:inline-flex}.swatch{border-radius:2px;width:.65rem;height:.65rem;display:inline-block}.sw-western{background:var(--roxy-accent,#f59e0b)}.sw-vedic{background:var(--roxy-info,#2563eb)}.sw-biorhythm{background:var(--roxy-success,#16a34a)}.event{grid-template-columns:auto 1fr;align-items:baseline;gap:.25rem .6rem;display:grid}.event-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;white-space:nowrap}.event-desc{font-size:var(--roxy-text-sm,.875rem);line-height:1.4}.sig{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:2px;grid-column:2;height:4px;overflow:hidden}.sig-fill{border-radius:2px;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)}.quiet{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}`],kr=d([(0,Et.customElement)("roxy-forecast-digest")],kr);var J=require("lit"),Dt=require("lit/decorators.js");var Ys={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Us=["western","vedic","biorhythm"],Sr=class extends m{renderEmpty(){return J.html`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=Us.filter(s=>e.some(o=>o.domain===s));return J.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?J.html`<div class="range">${Ce(a.startDate)} - ${Ce(a.endDate)} · ${a.count??e.length} events</div>`:J.nothing}</header>${t.length?J.html`<div class="legend">${t.map(s=>J.html`<span><span class="swatch swatch-${s}"></span>${Ys[s]}</span>`)}</div>`:J.nothing} ${r.length?J.html`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:J.html`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(a){let e=new Map;for(let r of a){let t=r.date??"",s=e.get(t)??[];s.push(r),e.set(t,s)}return[...e.entries()]}renderDay(a,e){return J.html`<div class="day" role="listitem"><div class="day-date">${Ce(a)}</div><div class="events">${e.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0,r=Math.max(0,Math.min(100,e));return J.html`<div class="event"><span class="dot dot-${a.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(a)}</div>${a.description?J.html`<p class="event-desc">${a.description}</p>`:J.nothing}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${a.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(a){let e=a.body?h(a.body):"",r=a.target?h(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=gr[t]??"",o=t?Yr[t]??t:"",i=typeof a.orb=="number"?f(a.orb,1):"",l=this.typeQualifier(a);return t&&r?J.html`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?J.html`<span class="kind">orb ${i}°</span>`:J.nothing}`:J.html`<strong>${e||Y(a.type??"")}</strong>${l?J.html`<span class="kind">${l}</span>`:J.nothing}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${h(a.target)}`:a.type==="retrograde-station"&&a.station?a.station:a.type==="eclipse"?[a.kind,"eclipse"].filter(Boolean).join(" "):a.type==="critical-day"?"critical day":a.type==="dasha-change"&&a.target?`dasha ${h(a.target)}`:Y(a.type??"")}};Sr.styles=[g,J.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}`],Sr=d([(0,Dt.customElement)("roxy-forecast-timeline")],Sr);var ne=require("lit"),Pt=require("lit/decorators.js");var Rr=class extends m{renderEmpty(){return ne.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(a){let e=(a.breakdown??[]).filter(p=>p?.category!==void 0),r=a.total??0,t=a.maxScore??36,s=r/t*100,o="color-mix(in srgb, var(--roxy-border) 50%, transparent)",i=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",l=s*2.827,c=(100-s)*2.827;return ne.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">${f(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?ne.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${it(a.percentage,1)}</small>`:ne.nothing}</div>${a.recommendation?ne.html`<span class="recommendation">${a.recommendation}</span>`:ne.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${o}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8" stroke-dasharray="${l},${c}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${e.length>0?ne.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${e.map(p=>{let y=p.score??0,x=p.maxScore??Ws(p.category),j=x?y/x*100:0;return ne.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${j}%"></span></div></td><td class="score">${f(y,1)} / ${x}</td></tr>`})}</tbody></table>`:ne.nothing} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?ne.html`<div class="tags">${a.doshas?.map(p=>ne.html`<span class="dosha">${p}</span>`)} ${a.doshaCancellations?.map(p=>ne.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:ne.nothing}</article>`}};Rr.styles=[g,ne.css`.card{background:var(--roxy-surface,#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)}`],Rr=d([(0,Pt.customElement)("roxy-guna-milan")],Rr);function Ws(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var se=require("lit"),zt=require("lit/decorators.js");var Cr=class extends m{renderData(a){let e=a.channels??[];return se.html`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?se.html`<span class="count">${a.totalChannels} channels</span>`:se.nothing}</header>${a.combinedDefinition?se.html`<p class="def">Combined definition: <strong>${Y(String(a.combinedDefinition))}</strong></p>`:se.nothing} ${this.renderSummary(a.summary)} ${e.length>0?se.html`<div class="scroll"><table role="table" aria-label="Connection channels"><thead><tr><th scope="col">Channel</th><th scope="col">Gates</th><th scope="col">Circuit</th><th scope="col">Dynamic</th><th scope="col">Held by</th></tr></thead><tbody>${e.map(r=>this.renderChannel(r))}</tbody></table></div>`:se.nothing}</div>`}renderSummary(a){if(!a)return se.nothing;let e=[["Electromagnetic",a.electromagnetic],["Dominance",a.dominance],["Compromise",a.compromise],["Companionship",a.companionship]];return se.html`<div class="stats" aria-label="Channel dynamics">${e.map(([r,t])=>typeof t=="number"?se.html`<span class="stat">${r} <b>${t}</b></span>`:se.nothing)}</div>`}renderChannel(a){let e=a.personAGates??[],r=a.personBGates??[],t=[e.length?"A":"",r.length?"B":""].filter(Boolean).join(" + ")||"-";return se.html`<tr><td>${a.name??""}</td><td class="gates">${a.gateA}-${a.gateB}</td><td>${a.circuit??""}</td><td>${a.dynamic?se.html`<span class="dyn">${a.dynamic}</span>`:""}</td><td class="who">${t}</td></tr>`}renderEmpty(){return se.html`<div class="roxy-empty" role="status">No connection data</div>`}};Cr.styles=[g,se.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums}.def{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.def strong{color:var(--roxy-fg,#0a0a0a);text-transform:capitalize}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);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:last-child td{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.dyn{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);padding:1px 8px;display:inline-block}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.scroll{overflow-x:auto}`],Cr=d([(0,zt.customElement)("roxy-hd-connection")],Cr);var X=require("lit"),At=require("lit/decorators.js");var Tr=class extends m{renderData(a){let e=a.channels??[],r=e.filter(s=>s.position==="upper"),t=e.filter(s=>s.position==="lower");return X.html`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?X.html`<span class="count">${a.memberCount} members</span>`:X.nothing}</header>${this.renderSummary(a.summary)} ${this.renderGroup("Upper (direction)",r)} ${this.renderGroup("Lower (execution)",t)}</div>`}renderSummary(a){if(!a)return X.nothing;let e=a.gapGates??[];return X.html`<div class="stats" aria-label="Penta summary">${typeof a.definedChannels=="number"?X.html`<span class="stat">Defined channels <b>${a.definedChannels}</b></span>`:X.nothing} ${typeof a.filledGates=="number"?X.html`<span class="stat">Filled gates <b>${a.filledGates}</b></span>`:X.nothing} ${e.length>0?X.html`<span class="stat">Gap gates <b>${e.join(", ")}</b></span>`:X.nothing} ${typeof a.coreDefined=="boolean"?X.html`<span class="stat">${a.coreDefined?"Core defined":"Core open"}</span>`:X.nothing}</div>`}renderGroup(a,e){return e.length===0?X.nothing:X.html`<div class="section"><h3>${a}</h3>${e.map(r=>X.html`<div class="row"><span class="gates">${r.gateA}-${r.gateB}</span> <span class="cname">${r.name??""}</span> <span class="badge ${r.defined?"defined":"open"}">${r.defined?"Defined":"Open"}</span> ${r.isCore?X.html`<span class="badge core">Core</span>`:X.nothing}</div>`)}</div>`}renderEmpty(){return X.html`<div class="roxy-empty" role="status">No penta data</div>`}};Tr.styles=[g,X.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section 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}.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);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;display:flex}.row:last-child{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600);min-width:3.5rem}.cname{flex:1;min-width:8rem}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 8px;display:inline-flex}.badge.defined{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.open{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.core{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a)}`],Tr=d([(0,At.customElement)("roxy-hd-penta")],Tr);var $e=require("lit"),Nt=require("lit/decorators.js");var Er=class extends m{renderData(a){let e=a.arrows??[];return $e.html`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(r=>this.renderArrow(r))}</div>${a.confident===!1?$e.html`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof a.confidenceMarginDeg=="number"?` (within ${a.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:$e.nothing}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return $e.html`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?$e.html`<span class="layer">${a.layer}</span>`:$e.nothing} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?$e.html`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}</span>`:$e.nothing}</div>`}renderEmpty(){return $e.html`<div class="roxy-empty" role="status">No variables data</div>`}};Er.styles=[g,$e.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,1fr);display:grid}.arrow{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-xs,.25rem);display:grid}.arrow-head{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:1.75rem;line-height:1}.name{font-weight:var(--roxy-weight-bold,600)}.layer{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.labels{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.ctb{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.note{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-warning-fg,#9a3412)}@container (width<=28rem){.grid{grid-template-columns:1fr}}`],Er=d([(0,Nt.customElement)("roxy-hd-variables")],Er);var P=require("lit"),wa=require("lit/decorators.js");var Xe=class extends m{constructor(){super(...arguments);this.mode="lookup"}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}}renderEmpty(){return P.html`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:r,lines:t,changingLinePositions:s,dailyMessage:o,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(s??[]);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">${l.slice().reverse().map((p,y)=>{let x=l.length-1-y+1,j=c.has(x),b=p===6||p===8;return P.html`<div class="line ${`${b?"broken":"solid"}${j?" changing":""}`}">${b?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">${Ma[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:P.nothing} ${r.lowerTrigram?P.html`<div>Lower <span class="tri-glyph">${Ma[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} ${o?P.html`<p class="message">${o}</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((p,y)=>p-y).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 t=r-19904,s=[];for(let o=0;o<6;o++){let i=t>>o&1;s.push(i?8:7)}return s}return Array.from({length:6},()=>7)}};Xe.styles=[g,P.css`.card{background:var(--roxy-surface,#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,wa.property)({type:String,reflect:!0})],Xe.prototype,"mode",2),Xe=d([(0,wa.customElement)("roxy-hexagram")],Xe);var we=require("lit"),Mt=require("lit/decorators.js");function Lt(n){return n?String(n).slice(11,16)||String(n):""}var Dr=class extends m{renderEmpty(){return we.html`<div class="roxy-empty" role="status">No hora data</div>`}renderData(a){let e=a.dayHoras??[],r=a.nightHoras??[];return e.length===0&&r.length===0?this.renderEmpty():we.html`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?we.html`<p class="subtitle">${a.date}</p>`:we.nothing}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?we.nothing:we.html`<div class="col"><p class="section-label">${a}</p>${e.map(r=>we.html`<div class="row"><span class="glyph" aria-hidden="true">${N[h(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${Lt(r.start)}-${Lt(r.end)}</span> ${typeof r.number=="number"?we.html`<span class="num">${r.number}</span>`:we.nothing}</div>`)}</div>`}};Dr.styles=[g,we.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}.cols{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,1fr);display:grid}.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}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-xs,.25rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);display:flex}.row:last-child{border-bottom:none}.glyph{color:var(--roxy-accent-ink,#b45309);text-align:center;width:1.25em;font-size:1.15em;line-height:1}.planet{flex:1;font-weight:500}.time{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;white-space:nowrap}.num{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right;width:1.5em}@container (width<=30rem){.cols{grid-template-columns:1fr}}`],Dr=d([(0,Mt.customElement)("roxy-hora-table")],Dr);var E=require("lit"),ka=require("lit/decorators.js");var Ze=class extends m{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return E.html`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?pe[h(r)]??"":"",s="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,o="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return E.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>${o?E.html`<div class="date">${o}</div>`:E.nothing}</div>${s!==null?E.html`<span class="energy" aria-label="${`Energy ${s} of 10`}">Energy ${s}/10 <span class="energy-bar"><span style="width:${s/10*100}%"></span></span></span>`:E.nothing}</header>${e.overview?E.html`<p class="overview">${e.overview}</p>`:E.nothing}<div class="sections">${e.love?E.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:E.nothing} ${e.career?E.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:E.nothing} ${e.health?E.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:E.nothing} ${e.finance?E.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:E.nothing} ${"advice"in e&&e.advice?E.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:E.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:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],y=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&p.length===0&&y.length===0?E.nothing:E.html`<div class="lucky">${i!==void 0?E.html`<span>Lucky number <strong>${i}</strong></span>`:E.nothing} ${l?E.html`<span>Lucky color <strong>${l}</strong></span>`:E.nothing} ${c.length?E.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:E.nothing} ${p.length?E.html`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:E.nothing} ${y.length?E.html`<span class="compat-wrap">Best with <span class="compat">${y.map(x=>E.html`<span>${x}</span>`)}</span></span>`:E.nothing}</div>`})()}</article>`}};Ze.styles=[g,E.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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,ka.property)({type:String,reflect:!0})],Ze.prototype,"period",2),Ze=d([(0,ka.customElement)("roxy-horoscope-card")],Ze);var K=require("lit"),Sa=require("lit/decorators.js");var Qe=class extends m{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(s=>({name:s.planet,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,kpNumber:s.kpNumber,retrograde:s.retrograde})),t=e.nodes;for(let[s,o]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])o&&r.push({name:s,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.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()})}renderEmpty(){return K.html`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return K.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?K.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?K.html`· ${r.nakshatra}`:K.nothing} ${r.subLord?K.html`· sub lord ${r.subLord}`:K.nothing} ${typeof r.kpNumber=="number"?K.html`· KP ${r.kpNumber}`:K.nothing}</div>`:K.nothing} ${typeof e.meta?.ayanamsa=="number"?K.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${f(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?K.html`· ${e.meta.houseSystem} houses`:K.nothing}</div>`:K.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>K.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?K.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=>K.html`<tr><td class="body">${r.name}${r.retrograde?K.html`<span class="retro">R</span>`:K.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>`:K.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?K.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=>K.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>`:K.html`<p class="roxy-empty" role="status">No cusps</p>`}};Qe.styles=[g,K.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);width:100%;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,Sa.state)()],Qe.prototype,"activeTab",2),Qe=d([(0,Sa.customElement)("roxy-kp-chart")],Qe);var Ae=require("lit"),Gt=require("lit/decorators.js");var Pr=class extends m{renderEmpty(){return Ae.html`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return Ae.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?Ae.html`<span class="ayanamsa">Ayanamsa: ${f(a.ayanamsa,2)}°</span>`:Ae.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=>Ae.html`<tr><td class="planet">${r.planet} ${r.retrograde?Ae.html`<span class="retro">R</span>`:Ae.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>`}};Pr.styles=[g,Ae.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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}`],Pr=d([(0,Gt.customElement)("roxy-kp-planets-table")],Pr);var ue=require("lit"),Ht=require("lit/decorators.js");var zr=class extends m{renderEmpty(){return ue.html`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return ue.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?ue.html`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:ue.nothing}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${a.moonSignLord??""}</dd><dt>Star lord</dt><dd>${a.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${a.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${a.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${a.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${a.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.lagnaSubSublord??""}</dd></dl></div></div>${a.rulingPlanets?.length?ue.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>ue.html`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:ue.nothing} ${e.length?ue.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${e.map(r=>ue.html`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:ue.nothing}</div>`}};zr.styles=[g,ue.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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}`],zr=d([(0,Ht.customElement)("roxy-kp-ruling-planets")],zr);var xe=require("lit"),he=require("lit/decorators.js");function Ot(n,a){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...t)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ie=class extends xe.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=Ot(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 s={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 o=this.publishableKey??this.apiKey;o&&(s["X-API-Key"]=o);let i=await fetch(t,{headers:s,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 xe.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?xe.html`<span class="spinner" role="status" aria-label="Loading"></span>`:xe.nothing} ${this.isOpen?xe.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?xe.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>xe.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?xe.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:xe.nothing}</div>`}};ie.styles=[g,xe.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,he.property)({type:String,attribute:"api-key"})],ie.prototype,"apiKey",2),d([(0,he.property)({type:String,attribute:"publishable-key"})],ie.prototype,"publishableKey",2),d([(0,he.property)({type:String})],ie.prototype,"endpoint",2),d([(0,he.property)({type:String})],ie.prototype,"placeholder",2),d([(0,he.property)({type:String,attribute:"default-value"})],ie.prototype,"defaultValue",2),d([(0,he.state)()],ie.prototype,"query",2),d([(0,he.state)()],ie.prototype,"results",2),d([(0,he.state)()],ie.prototype,"isOpen",2),d([(0,he.state)()],ie.prototype,"isLoading",2),d([(0,he.state)()],ie.prototype,"highlight",2),ie=d([(0,he.customElement)("roxy-location-search")],ie);var F=require("lit"),Ra=require("lit/decorators.js");var er=class extends m{constructor(){super(...arguments);this.mode="current"}renderEmpty(){return F.html`<div class="roxy-empty" role="status">No moon phase data</div>`}renderData(e){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,s="year"in e?e.year:void 0;return F.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${s??""}</h2><div class="list" role="list">${r.map(o=>this.renderListItem(o))}</div></article>`}return"phase"in e?this.renderSingle(e):F.nothing}renderSingle(e){let r=jt(e.phase);return F.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?F.html`<div class="date">${e.date}</div>`:F.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?F.html`<div><span>Illumination</span> <strong>${Js(e.illumination)}</strong></div>`:F.nothing} ${typeof e.age=="number"?F.html`<div><span>Age</span> <strong>${f(e.age,1)} days</strong></div>`:F.nothing} ${e.sign?F.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:F.nothing} ${typeof e.distance=="number"?F.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:F.nothing}</div>${e.meaning?.description?F.html`<p class="meaning">${e.meaning.description}</p>`:F.nothing} ${e.meaning?.keywords?.length?F.html`<div class="keywords">${e.meaning.keywords.map(t=>F.html`<span>${t}</span>`)}</div>`:F.nothing}</article>`}renderListItem(e){let r=jt(e.phase);return F.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};er.styles=[g,F.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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,Ra.property)({type:String,reflect:!0})],er.prototype,"mode",2),er=d([(0,Ra.customElement)("roxy-moon-phase")],er);function jt(n){return n?nt[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Js(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var _=require("lit"),Bt=require("lit/decorators.js");var Ar=class extends m{renderData(a){let e=a.remedies;return _.html`<article class="wrap" aria-label="${`Nakshatra ${a.name}`}"><header class="head"><h2 class="name">${a.name}</h2>${typeof a.number=="number"?_.html`<span class="number">Nakshatra ${a.number} of 27</span>`:_.nothing} ${a.range?_.html`<span class="range">${a.range}</span>`:_.nothing}</header><dl class="facts">${a.lord?_.html`<div class="fact"><dt>Lord</dt><dd>${a.lord}</dd></div>`:_.nothing} ${a.deity?_.html`<div class="fact"><dt>Deity</dt><dd>${a.deity}</dd></div>`:_.nothing} ${a.symbol?_.html`<div class="fact"><dt>Symbol</dt><dd>${a.symbol}</dd></div>`:_.nothing}</dl>${a.characteristics?_.html`<div class="section"><h3>Characteristics</h3><p>${a.characteristics}</p></div>`:_.nothing} ${e?_.html`<div class="section"><h3>Remedies</h3><div class="remedies">${e.mantras?_.html`<div class="remedy"><strong>Mantras:</strong> ${e.mantras}</div>`:_.nothing} ${e.gemstones?_.html`<div class="remedy"><strong>Gemstones:</strong> ${e.gemstones}</div>`:_.nothing} ${e.rituals?_.html`<div class="remedy"><strong>Rituals:</strong> ${e.rituals}</div>`:_.nothing}</div></div>`:_.nothing}</article>`}renderEmpty(){return _.html`<div class="roxy-empty" role="status">No nakshatra data</div>`}};Ar.styles=[g,_.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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)}`],Ar=d([(0,Bt.customElement)("roxy-nakshatra-card")],Ar);var u=require("lit"),_r=require("lit/decorators.js");var qa=420,k=qa/2,Ir=164,Fa=146,Wr=120,Kr=96,Xs=178,Zs=196,je=class extends m{constructor(){super(...arguments);this.houseSystem="placidus";this.view="wheel"}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}renderEmpty(){return u.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(e){let r=this.getPlanets(),t=e.aspects??[],s=this.view;return u.html`<div class="wrap"><header><h2 class="title">Natal chart</h2>${e.birthDetails?u.html`<div class="meta">${[e.birthDetails.date,e.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:u.nothing}</header>${Br({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:s,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${s}" role="tabpanel" aria-labelledby="natal-tab-${s}">${s==="wheel"?this.renderWheel(r,t):this.renderAspectGrid(r,t)}</div><div class="legend"><span>${r.length} planets</span> <span>${t.length} aspects</span> ${e.houseSystem?u.html`<span>${e.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 ${qa} ${qa}" 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="${k}" cy="${k}" r="${Ir}" stroke-width="1.5"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Fa-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Wr}" stroke-width="1"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Kr-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(o=>h(o.name)),s=new Map;for(let o of r){let i=[h(o.planet1),h(o.planet2)].sort().join("|");s.set(i,o)}return t.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>${t.slice(0,-1).map(o=>{let i=N[o]??o.slice(0,2);return u.html`<th scope="col" title="${o}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((o,i)=>{let l=N[o]??o.slice(0,2);return u.html`<tr><th scope="row" title="${o}">${l}</th>${t.slice(0,i+1).map(c=>{let p=s.get([o,c].sort().join("|"));if(!p)return u.html`<td class="empty"></td>`;let y=jr(p),x=Yr[y]??Yr[y.replace(/-/g,"")]??y.slice(0,3),j=gr[y]??"aspect-other",b=f(p.orb,1);return u.html`<td class="${`cell ${j}`}" title="${`${o} ${y} ${c}${b?` (orb ${b}\xB0)`:""}`}"><span class="asp">${x}</span></td>`})} ${t.slice(i+1,-1).map(()=>u.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Ia(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Ia(r),"IC")));let s=this.data?.partOfFortune?.longitude;typeof s=="number"&&t.push(this.renderAngleMark(Le(s),"PoF"));let o=this.data?.vertex?.longitude;return typeof o=="number"&&t.push(this.renderAngleMark(Le(o),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),s=B(k,k,Ir,t),o=B(k,k,Xs,t),i=B(k,k,Zs,t);return u.svg`
79
+ `}function Eo(n){let a=n.lagnaSign.toLowerCase();return A.svg`
80
+ ${zo(n.divisionLabel)}
81
+ ${de.map(e=>To(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,es(e,n.lagnaSign)))}
82
+ `}function ja(n,a){switch(a){case"north":return So(n);case"east":return Eo(n);default:return bo(n)}}function Ba(n,a){return oa({items:po,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var rs=require("lit"),Ia=rs.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.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{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;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 sr=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}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)}renderEmpty(){return Te.html`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let{division:t,vargottama:s}=e;return Te.html`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?Te.html`<span class="division-meta">· ${t.sanskritName}</span>`:Te.nothing}</h2>${t.significance?Te.html`<p class="significance">${t.significance}</p>`:Te.nothing}</div>${Ba(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${ja(r,this.chartStyle)}</svg> ${s&&s.length>0?Te.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>Te.html`<span class="vargottama-pill" role="listitem">${z[o]??""} ${o}</span>`)}</div>`:Te.nothing}</div>`}};sr.styles=[y,Ia,tr,Te.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,Ka.property)({type:String,reflect:!0,attribute:"chart-style"})],sr.prototype,"chartStyle",2),sr=d([(0,Ka.customElement)("roxy-divisional-chart")],sr);var Q=require("lit"),_a=require("lit/decorators.js");var Ao={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},or=class extends m{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return Q.html`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=Ao[this.type]??this.type,s=(e.severity??"").toLowerCase(),o=s==="severe"?3:s==="moderate"?2:s==="mild"?1:0,i=o*33,l=o===3?"var(--roxy-danger)":o>=1?"var(--roxy-warning)":"transparent";return Q.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>${"type"in e&&e.type?Q.html`<p class="subtype"><span class="subtype-label">${this.type==="sadhesati"?"Current phase":"Type"}</span>${e.type}</p>`:Q.nothing} ${e.severity?Q.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${o}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:Q.nothing} ${e.description?Q.html`<p class="description">${e.description}</p>`:Q.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?Q.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>Q.html`<li>${c}</li>`)}</ul></div>`:Q.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?Q.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>Q.html`<li>${c}</li>`)}</ul></div>`:Q.nothing}</article>`}renderEffects(e){if(!e.effects)return Q.nothing;let r=[];for(let[t,s]of Object.entries(e.effects))if(typeof s=="string"&&s.length>0)r.push(Q.html`<div><h3>${t}</h3><p>${s}</p></div>`);else if(s&&typeof s=="object")for(let[o,i]of Object.entries(s))typeof i=="string"&&i.length>0&&r.push(Q.html`<div><h3>${o}</h3><p>${i}</p></div>`);return r.length===0?Q.nothing:Q.html`<div class="effects">${r}</div>`}};or.styles=[y,Q.css`.card{background:var(--roxy-surface,#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}.subtype{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.subtype .subtype-label{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-size:var(--roxy-text-xs,.75rem);margin-right:.4rem}.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,_a.property)({type:String,reflect:!0})],or.prototype,"type",2),or=d([(0,_a.customElement)("roxy-dosha-card")],or);var He=require("lit"),as=require("lit/decorators.js");var Lr=class extends m{renderData(a){return He.html`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?He.html`<span class="letter" aria-hidden="true">${a.letter}</span>`:He.nothing}<div><p class="label">Dream symbol</p>${a.name?He.html`<h2 class="name">${a.name}</h2>`:He.nothing}</div></header>${a.meaning?He.html`<p class="meaning">${a.meaning}</p>`:He.nothing}</article>`}renderEmpty(){return He.html`<div class="roxy-empty" role="status">No dream symbol</div>`}};Lr.styles=[y,He.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}`],Lr=d([(0,as.customElement)("roxy-dream-card")],Lr);var qe=require("lit"),ts=require("lit/decorators.js");var Nr=class extends m{renderEmpty(){return qe.html`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(a){let e=a.symbols??[];if(e.length===0)return this.renderEmpty();let r=typeof a.total=="number"?a.total:e.length;return qe.html`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${r} match${r===1?"":"es"}</span></header><ul class="grid">${e.map(t=>qe.html`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?qe.html`<span class="letter" aria-hidden="true">${t.letter}</span>`:qe.nothing} <span class="name">${t.name}</span></button></li>`)}</ul></section>`}select(a){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:a.id,name:a.name,letter:a.letter},bubbles:!0,composed:!0}))}};Nr.styles=[y,qe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.result{align-items:center;gap:var(--roxy-space-sm,.5rem);text-align:left;width:100%;font:inherit;color:var(--roxy-fg,#0a0a0a);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);cursor:pointer;background:0 0;transition:border-color .12s,background .12s;display:flex}.result:hover,.result:focus-visible{border-color:var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);outline:none}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:1.6rem;height:1.6rem;color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;flex:none;place-items:center;display:grid}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:500}`],Nr=d([(0,ts.customElement)("roxy-dream-search")],Nr);var te=require("lit"),Ee=require("lit/decorators.js");var mt=new Map;async function Po(n){let a=mt.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw mt.delete(n),e}),mt.set(n,a)),a}var fe=class extends te.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.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(s=>s.required).filter(s=>this.values[s.key]===void 0||this.values[s.key]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.key)},bubbles:!0,composed:!0}));return}let t={};for(let s of this.fields){let o=this.values[s.key];if(!(o===void 0||o===""))if(s.group){let i=t[s.group]??{};i[s.name]=o,t[s.group]=i}else t[s.name]=o}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:t},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Po(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 s=e.components?.schemas??{},o=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,s)}if(i?.properties){let c=new Set(i.required??[]);for(let[p,g]of Object.entries(i.properties)){let h=this.resolve(g,s)??{};if(h.type==="object"&&h.properties){let S=new Set(h.required??[]);for(let[b,br]of Object.entries(h.properties)){let je=this.resolve(br,s)??{};o.push({key:`${p}.${b}`,name:b,group:p,type:this.fieldType(je),required:c.has(p)&&S.has(b),description:je.description,enum:je.enum,min:je.minimum,max:je.maximum,default:je.default})}}else o.push({key:p,name:p,type:this.fieldType(h),required:c.has(p),description:h.description,enum:h.enum,min:h.minimum,max:h.maximum,default:h.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let p=this.resolve(c.schema,s)??{};o.push({key:c.name,name:c.name,type:this.fieldType(p),required:!!c.required,description:p.description,enum:p.enum,default:p.default})}this.fields=o;let l={};for(let c of o){c.default!==void 0&&(l[c.key]=c.default);let p=c.group?this.initialValues?.[c.group]?.[c.name]:this.initialValues?.[c.name];p!==void 0&&(l[c.key]=p)}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}}groupHasLocation(e){let r=this.fields.filter(t=>t.group===e);return["latitude","longitude","timezone"].every(t=>r.some(s=>s.name===t))}onLocationFor(e){let r=e?`${e}.`:"";return t=>{let s=t.detail;s&&(this.values={...this.values,[`${r}latitude`]:s.latitude,[`${r}longitude`]:s.longitude,[`${r}timezone`]:s.timezone??s.utcOffset})}}render(){if(!this.loaded)return te.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return te.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=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return te.nothing;let i=`roxy-form-${o.key}`;return te.html`<div class="field"><label for="${i}">${J(o.name)}${o.required?te.html`<span class="req" aria-hidden="true">*</span>`:te.nothing}</label> ${o.enum?te.html`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>te.html`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:te.html`<input id="${i}" type="${this.htmlType(o.type)}" ?required="${o.required}" min="${o.min??""}" max="${o.max??""}" step="${o.type==="number"?"any":""}" .value="${this.values[o.key]??""}" @input="${l=>this.setValue(o.key,this.coerce(o.type,l.target.value))}">`} ${o.description?te.html`<small class="help">${o.description}</small>`:te.nothing}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?te.html`<div class="location-block"><label>${o?`${J(o)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(o)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:te.nothing,s=o=>te.html`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return te.html`<form @submit="${this.onSubmit}"><h2 class="title">${J(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):te.html`<fieldset class="person-group"><legend>${J(o)}</legend>${s(o)}</fieldset>`)} <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}}};fe.styles=[y,te.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}.person-group{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);margin:0 0 var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);min-inline-size:0;display:grid}.person-group legend{padding:0 var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.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,Ee.property)({type:String,attribute:"data-endpoint"})],fe.prototype,"endpoint",2),d([(0,Ee.property)({type:String})],fe.prototype,"method",2),d([(0,Ee.property)({type:String,attribute:"spec-url"})],fe.prototype,"specUrl",2),d([(0,Ee.property)({type:String,attribute:"submit-label"})],fe.prototype,"submitLabel",2),d([(0,Ee.property)({attribute:!1})],fe.prototype,"initialValues",2),d([(0,Ee.state)()],fe.prototype,"fields",2),d([(0,Ee.state)()],fe.prototype,"values",2),d([(0,Ee.state)()],fe.prototype,"loaded",2),d([(0,Ee.state)()],fe.prototype,"specError",2),fe=d([(0,Ee.customElement)("roxy-endpoint-form")],fe);var oe=require("lit"),ss=require("lit/decorators.js");var Mr=class extends m{renderEmpty(){return oe.html`<div class="roxy-empty" role="status">No fixed star data</div>`}renderData(a){let e=a.conjunctions??[],r=a.stars??[];return oe.html`<div class="wrap"><header><h2 class="title">Fixed stars</h2>${typeof a.orb=="number"?oe.html`<span class="badge"><b>Orb</b> ${f(a.orb,1)}°</span>`:oe.nothing}</header>${a.summary?oe.html`<p class="summary">${a.summary}</p>`:oe.nothing} ${e.length?oe.html`<section><p class="subhead">Conjunctions to the chart</p>${e.map((t,s)=>oe.html`<details class="interp-card" name="fixed-star-contacts" ?open="${s===0}"><summary><span class="contact"><span class="point">${t.point}</span> conjunct ${t.star}</span> <span class="interp-aside"><small>orb ${f(t.orb,2)}°</small> ${le()}</span></summary>${t.interpretation?oe.html`<div class="interp-body">${t.interpretation}</div>`:oe.nothing}</details>`)}</section>`:oe.html`<p class="empty-note">No star sits within the orb of a natal point.</p>`} ${r.length?this.renderCatalog(r):oe.nothing}</div>`}renderCatalog(a){return oe.html`<details class="catalog"><summary>${le()} Star catalog (${a.length})</summary><div class="scroll"><table><caption class="subhead">Precessed positions for the chart date</caption><thead><tr><th scope="col">Star</th><th scope="col">Position</th><th scope="col" class="num">Mag</th><th scope="col">Nature</th><th scope="col">Keywords</th></tr></thead><tbody>${a.map(e=>{let r=ae[u(e.sign)];return oe.html`<tr><td>${e.name}</td><td>${r?oe.html`<span class="sg">${r}</span>`:oe.nothing}${ua(e.degree)} ${e.sign}</td><td class="num">${f(e.magnitude,1)}</td><td>${e.nature}</td><td><div class="kw">${(e.keywords??[]).map(t=>oe.html`<span>${t}</span>`)}</div></td></tr>`})}</tbody></table></div></details>`}};Mr.styles=[y,ke,oe.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);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}header{align-items:baseline;gap:var(--roxy-space-sm,.5rem) 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);color:var(--roxy-primary,#0f172a);margin:0}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);padding:2px 8px}.badge b{color:var(--roxy-accent-ink,#b45309);font-weight:600}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.empty-note{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.subhead{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,#0a0a0a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.contact{align-items:baseline;gap:.4rem;display:inline-flex}.contact .point{color:var(--roxy-accent-ink,#b45309);font-weight:600}.interp-aside{align-items:center;gap:.5rem;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem)}.catalog summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);align-items:center;gap:.5rem;font-weight:600;display:flex}.scroll{margin-top:var(--roxy-space-sm,.5rem);overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap;vertical-align:top;padding:6px 10px}th{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.04em;font-weight:600;font-size:var(--roxy-text-xs,.75rem)}td.num{text-align:right;font-variant-numeric:tabular-nums}.sg{color:var(--roxy-secondary,#475569);margin-right:.3rem}.kw{white-space:normal;flex-wrap:wrap;gap:.2rem;max-width:18rem;display:flex}.kw span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a);padding:0 6px}`],Mr=d([(0,ss.customElement)("roxy-fixed-stars")],Mr);var ve=require("lit"),os=require("lit/decorators.js");var Gr=class extends m{renderEmpty(){return ve.html`<div class="roxy-empty" role="status">No digest data</div>`}renderData(a){let e=a.windows??[];if(e.length===0)return this.renderEmpty();let r=[Le(a.startDate),Le(a.endDate)].filter(Boolean).join(" \u2013 ");return ve.html`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?ve.html`<p class="subtitle">${r}</p>`:ve.nothing}</div>${e.map(t=>this.renderWindow(t))}</div>`}windowLabel(a){return a===1?"Next 24 hours":typeof a=="number"?`Next ${a} days`:"Window"}renderWindow(a){let e=a.top??[],r=a.byDomain??{},t=Object.entries(r);return ve.html`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(a.days)}</span> <span class="window-count">${a.count??0} event${a.count===1?"":"s"}</span></div>${t.length>0?ve.html`<div class="domains">${t.map(([s,o])=>ve.html`<span class="domain-chip"><span class="swatch sw-${s}"></span>${J(s)} ${o}</span>`)}</div>`:ve.nothing} ${e.length>0?ve.html`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:ve.html`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return ve.html`<div class="event" role="listitem"><span class="event-date">${Le(a.date)}</span> <span class="event-desc">${a.description??J(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${f(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};Gr.styles=[y,ve.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}.window{gap:var(--roxy-space-sm,.5rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);display:grid}.window:first-of-type{border-top:none;padding-top:0}.window-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.window-label{font-weight:var(--roxy-weight-bold,600)}.window-count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.domains{flex-wrap:wrap;gap:.4rem;display:flex}.domain-chip{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:.35rem;display:inline-flex}.swatch{border-radius:2px;width:.65rem;height:.65rem;display:inline-block}.sw-western{background:var(--roxy-accent,#f59e0b)}.sw-vedic{background:var(--roxy-info,#2563eb)}.sw-biorhythm{background:var(--roxy-success,#16a34a)}.event{grid-template-columns:auto 1fr;align-items:baseline;gap:.25rem .6rem;display:grid}.event-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;white-space:nowrap}.event-desc{font-size:var(--roxy-text-sm,.875rem);line-height:1.4}.sig{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:2px;grid-column:2;height:4px;overflow:hidden}.sig-fill{border-radius:2px;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)}.quiet{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}`],Gr=d([(0,os.customElement)("roxy-forecast-digest")],Gr);var ee=require("lit"),ns=require("lit/decorators.js");var Do={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Lo=["western","vedic","biorhythm"],Hr=class extends m{renderEmpty(){return ee.html`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=Lo.filter(s=>e.some(o=>o.domain===s));return ee.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?ee.html`<div class="range">${Le(a.startDate)} - ${Le(a.endDate)} · ${a.count??e.length} events</div>`:ee.nothing}</header>${t.length?ee.html`<div class="legend">${t.map(s=>ee.html`<span><span class="swatch swatch-${s}"></span>${Do[s]}</span>`)}</div>`:ee.nothing} ${r.length?ee.html`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:ee.html`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(a){let e=new Map;for(let r of a){let t=r.date??"",s=e.get(t)??[];s.push(r),e.set(t,s)}return[...e.entries()]}renderDay(a,e){return ee.html`<div class="day" role="listitem"><div class="day-date">${Le(a)}</div><div class="events">${e.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0,r=Math.max(0,Math.min(100,e));return ee.html`<div class="event"><span class="dot dot-${a.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(a)}</div>${a.description?ee.html`<p class="event-desc">${a.description}</p>`:ee.nothing}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${a.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(a){let e=a.body?u(a.body):"",r=a.target?u(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=kr[t]??"",o=t?pa[t]??t:"",i=typeof a.orb=="number"?f(a.orb,1):"",l=this.typeQualifier(a);return t&&r?ee.html`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?ee.html`<span class="kind">orb ${i}°</span>`:ee.nothing}`:ee.html`<strong>${e||J(a.type??"")}</strong>${l?ee.html`<span class="kind">${l}</span>`:ee.nothing}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${u(a.target)}`:a.type==="retrograde-station"&&a.station?a.station:a.type==="eclipse"?[a.kind,"eclipse"].filter(Boolean).join(" "):a.type==="critical-day"?"critical day":a.type==="dasha-change"&&a.target?`dasha ${u(a.target)}`:J(a.type??"")}};Hr.styles=[y,ee.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}`],Hr=d([(0,ns.customElement)("roxy-forecast-timeline")],Hr);var ye=require("lit"),is=require("lit/decorators.js");var Or=class extends m{renderEmpty(){return ye.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(a){let e=(a.breakdown??[]).filter(p=>p?.category!==void 0),r=a.total??0,t=a.maxScore??36,s=r/t*100,o="color-mix(in srgb, var(--roxy-border) 50%, transparent)",i=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",l=s*2.827,c=(100-s)*2.827;return ye.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">${f(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?ye.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${At(a.percentage,1)}</small>`:ye.nothing}</div>${a.recommendation?ye.html`<span class="recommendation">${a.recommendation}</span>`:ye.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${o}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8" stroke-dasharray="${l},${c}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${e.length>0?ye.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${e.map(p=>{let g=p.score??0,h=p.maxScore??No(p.category),S=h?g/h*100:0;return ye.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${S}%"></span></div></td><td class="score">${f(g,1)} / ${h}</td></tr>`})}</tbody></table>`:ye.nothing} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?ye.html`<div class="tags">${a.doshas?.map(p=>ye.html`<span class="dosha">${p}</span>`)} ${a.doshaCancellations?.map(p=>ye.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:ye.nothing}</article>`}};Or.styles=[y,ye.css`.card{background:var(--roxy-surface,#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)}`],Or=d([(0,is.customElement)("roxy-guna-milan")],Or);function No(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var ce=require("lit"),ls=require("lit/decorators.js");var jr=class extends m{renderData(a){let e=a.channels??[];return ce.html`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?ce.html`<span class="count">${a.totalChannels} channels</span>`:ce.nothing}</header>${a.combinedDefinition?ce.html`<p class="def">Combined definition: <strong>${J(String(a.combinedDefinition))}</strong></p>`:ce.nothing} ${this.renderSummary(a.summary)} ${e.length>0?ce.html`<div class="scroll"><table role="table" aria-label="Connection channels"><thead><tr><th scope="col">Channel</th><th scope="col">Gates</th><th scope="col">Circuit</th><th scope="col">Dynamic</th><th scope="col">Held by</th></tr></thead><tbody>${e.map(r=>this.renderChannel(r))}</tbody></table></div>`:ce.nothing}</div>`}renderSummary(a){if(!a)return ce.nothing;let e=[["Electromagnetic",a.electromagnetic],["Dominance",a.dominance],["Compromise",a.compromise],["Companionship",a.companionship]];return ce.html`<div class="stats" aria-label="Channel dynamics">${e.map(([r,t])=>typeof t=="number"?ce.html`<span class="stat">${r} <b>${t}</b></span>`:ce.nothing)}</div>`}renderChannel(a){let e=a.personAGates??[],r=a.personBGates??[],t=[e.length?"A":"",r.length?"B":""].filter(Boolean).join(" + ")||"-";return ce.html`<tr><td>${a.name??""}</td><td class="gates">${a.gateA}-${a.gateB}</td><td>${a.circuit??""}</td><td>${a.dynamic?ce.html`<span class="dyn">${a.dynamic}</span>`:""}</td><td class="who">${t}</td></tr>`}renderEmpty(){return ce.html`<div class="roxy-empty" role="status">No connection data</div>`}};jr.styles=[y,ce.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums}.def{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.def strong{color:var(--roxy-fg,#0a0a0a);text-transform:capitalize}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);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:last-child td{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.dyn{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);padding:1px 8px;display:inline-block}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.scroll{overflow-x:auto}`],jr=d([(0,ls.customElement)("roxy-hd-connection")],jr);var re=require("lit"),ds=require("lit/decorators.js");var Br=class extends m{renderData(a){let e=a.channels??[],r=e.filter(s=>s.position==="upper"),t=e.filter(s=>s.position==="lower");return re.html`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?re.html`<span class="count">${a.memberCount} members</span>`:re.nothing}</header>${this.renderSummary(a.summary)} ${this.renderGroup("Upper (direction)",r)} ${this.renderGroup("Lower (execution)",t)}</div>`}renderSummary(a){if(!a)return re.nothing;let e=a.gapGates??[];return re.html`<div class="stats" aria-label="Penta summary">${typeof a.definedChannels=="number"?re.html`<span class="stat">Defined channels <b>${a.definedChannels}</b></span>`:re.nothing} ${typeof a.filledGates=="number"?re.html`<span class="stat">Filled gates <b>${a.filledGates}</b></span>`:re.nothing} ${e.length>0?re.html`<span class="stat">Gap gates <b>${e.join(", ")}</b></span>`:re.nothing} ${typeof a.coreDefined=="boolean"?re.html`<span class="stat">${a.coreDefined?"Core defined":"Core open"}</span>`:re.nothing}</div>`}renderGroup(a,e){return e.length===0?re.nothing:re.html`<div class="section"><h3>${a}</h3>${e.map(r=>re.html`<div class="row"><span class="gates">${r.gateA}-${r.gateB}</span> <span class="cname">${r.name??""}</span> <span class="badge ${r.defined?"defined":"open"}">${r.defined?"Defined":"Open"}</span> ${r.isCore?re.html`<span class="badge core">Core</span>`:re.nothing}</div>`)}</div>`}renderEmpty(){return re.html`<div class="roxy-empty" role="status">No penta data</div>`}};Br.styles=[y,re.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section 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}.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);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;display:flex}.row:last-child{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600);min-width:3.5rem}.cname{flex:1;min-width:8rem}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 8px;display:inline-flex}.badge.defined{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.open{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.core{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a)}`],Br=d([(0,ds.customElement)("roxy-hd-penta")],Br);var $e=require("lit"),ps=require("lit/decorators.js");var Ir=class extends m{renderData(a){let e=[...a.arrows??[]].sort((r,t)=>cs(r.position)-cs(t.position));return $e.html`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(r=>this.renderArrow(r))}</div>${a.confident===!1?$e.html`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof a.confidenceMarginDeg=="number"?` (within ${a.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:$e.nothing}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return $e.html`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?$e.html`<span class="layer">${a.layer}</span>`:$e.nothing} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?$e.html`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}${a.activation?.planet?` \xB7 ${a.activation.planet}${a.activation.side?` (${a.activation.side})`:""}`:""}</span>`:$e.nothing} ${a.confident===!1?$e.html`<span class="note" role="note">Knife-edge: could flip with a more precise birth time.</span>`:$e.nothing}</div>`}renderEmpty(){return $e.html`<div class="roxy-empty" role="status">No variables data</div>`}};Ir.styles=[y,$e.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,1fr);display:grid}.arrow{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-xs,.25rem);display:grid}.arrow-head{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:1.75rem;line-height:1}.name{font-weight:var(--roxy-weight-bold,600)}.layer{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.labels{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.ctb{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.note{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-warning-fg,#9a3412)}@container (width<=28rem){.grid{grid-template-columns:1fr}}`],Ir=d([(0,ps.customElement)("roxy-hd-variables")],Ir);function cs(n){switch(n){case"Top left":return 0;case"Top right":return 1;case"Bottom left":return 2;case"Bottom right":return 3;default:return 99}}var N=require("lit"),Fa=require("lit/decorators.js");var nr=class extends m{constructor(){super(...arguments);this.mode="lookup"}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}}renderEmpty(){return N.html`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:r,lines:t,changingLinePositions:s,dailyMessage:o,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(s??[]);return N.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?N.html`<div class="symbol">${r.symbol}</div>`:N.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((p,g)=>{let h=l.length-1-g+1,S=c.has(h),b=p===6||p===8;return N.html`<div class="line ${`${b?"broken":"solid"}${S?" changing":""}`}">${b?N.svg`<span class="seg"></span><span class="seg"></span>`:N.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?N.html`${r.number}.`:N.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?N.html`${r.chinese}`:N.nothing} ${r.pinyin?N.html`· ${r.pinyin}`:N.nothing}</p><div class="trigrams">${r.upperTrigram?N.html`<div>Upper <span class="tri-glyph">${st[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:N.nothing} ${r.lowerTrigram?N.html`<div>Lower <span class="tri-glyph">${st[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:N.nothing}</div>${r.judgment?N.html`<p class="judgment">${r.judgment}</p>`:N.nothing} ${r.image?N.html`<p class="image">${r.image}</p>`:N.nothing} ${o?N.html`<p class="message">${o}</p>`:N.nothing} ${r.interpretation?.general?N.html`<p>${r.interpretation.general}</p>`:N.nothing} ${c.size>0?N.html`<div class="changing">Changing lines: ${Array.from(c).sort((p,g)=>p-g).join(", ")}. ${i?.english?N.html`Becomes hexagram ${i.number} ${i.english}.`:N.nothing}</div>`:N.nothing}</div></article>`}derivedLines(e){let r=e.binary??"";return/^[01]{6}$/.test(r)?Array.from(r,t=>t==="1"?7:8).reverse():Array.from({length:6},()=>7)}};nr.styles=[y,N.css`.card{background:var(--roxy-surface,#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,Fa.property)({type:String,reflect:!0})],nr.prototype,"mode",2),nr=d([(0,Fa.customElement)("roxy-hexagram")],nr);var Ae=require("lit"),gs=require("lit/decorators.js");function ms(n){return n?String(n).slice(11,16)||String(n):""}var Kr=class extends m{renderEmpty(){return Ae.html`<div class="roxy-empty" role="status">No hora data</div>`}renderData(a){let e=a.dayHoras??[],r=a.nightHoras??[];return e.length===0&&r.length===0?this.renderEmpty():Ae.html`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?Ae.html`<p class="subtitle">${a.date}</p>`:Ae.nothing}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?Ae.nothing:Ae.html`<div class="col"><p class="section-label">${a}</p>${e.map(r=>Ae.html`<div class="row"><span class="glyph" aria-hidden="true">${z[u(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${ms(r.start)}-${ms(r.end)}</span> ${typeof r.number=="number"?Ae.html`<span class="num">${r.number}</span>`:Ae.nothing}</div>`)}</div>`}};Kr.styles=[y,Ae.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}.cols{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,1fr);display:grid}.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}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-xs,.25rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);display:flex}.row:last-child{border-bottom:none}.glyph{color:var(--roxy-accent-ink,#b45309);text-align:center;width:1.25em;font-size:1.15em;line-height:1}.planet{flex:1;font-weight:500}.time{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;white-space:nowrap}.num{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right;width:1.5em}@container (width<=30rem){.cols{grid-template-columns:1fr}}`],Kr=d([(0,gs.customElement)("roxy-hora-table")],Kr);var D=require("lit"),Ya=require("lit/decorators.js");var ir=class extends m{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return D.html`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?ae[u(r)]??"":"",s="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,o="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return D.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>${o?D.html`<div class="date">${o}</div>`:D.nothing}</div>${s!==null?D.html`<span class="energy" aria-label="${`Energy ${s} of 10`}">Energy ${s}/10 <span class="energy-bar"><span style="width:${s/10*100}%"></span></span></span>`:D.nothing}</header>${e.overview?D.html`<p class="overview">${e.overview}</p>`:D.nothing}<div class="sections">${e.love?D.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:D.nothing} ${e.career?D.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:D.nothing} ${e.health?D.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:D.nothing} ${e.finance?D.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:D.nothing} ${"advice"in e&&e.advice?D.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:D.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:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],g=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&p.length===0&&g.length===0?D.nothing:D.html`<div class="lucky">${i!==void 0?D.html`<span>Lucky number <strong>${i}</strong></span>`:D.nothing} ${l?D.html`<span>Lucky color <strong>${l}</strong></span>`:D.nothing} ${c.length?D.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:D.nothing} ${p.length?D.html`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:D.nothing} ${g.length?D.html`<span class="compat-wrap">Best with <span class="compat">${g.map(h=>D.html`<span>${h}</span>`)}</span></span>`:D.nothing}</div>`})()}</article>`}};ir.styles=[y,D.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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,Ya.property)({type:String,reflect:!0})],ir.prototype,"period",2),ir=d([(0,Ya.customElement)("roxy-horoscope-card")],ir);var Y=require("lit"),Va=require("lit/decorators.js");var lr=class extends m{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(s=>({name:s.planet,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,kpNumber:s.kpNumber,retrograde:s.retrograde})),t=e.nodes;for(let[s,o]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])o&&r.push({name:s,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.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()})}renderEmpty(){return Y.html`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return Y.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?Y.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?Y.html`· ${r.nakshatra}`:Y.nothing} ${r.subLord?Y.html`· sub lord ${r.subLord}`:Y.nothing} ${typeof r.kpNumber=="number"?Y.html`· KP ${r.kpNumber}`:Y.nothing}</div>`:Y.nothing} ${typeof e.meta?.ayanamsa=="number"?Y.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${f(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?Y.html`· ${e.meta.houseSystem} houses`:Y.nothing}</div>`:Y.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>Y.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?Y.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=>Y.html`<tr><td class="body">${r.name}${r.retrograde?Y.html`<span class="retro">R</span>`:Y.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>`:Y.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?Y.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=>Y.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>`:Y.html`<p class="roxy-empty" role="status">No cusps</p>`}};lr.styles=[y,Y.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);width:100%;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,Va.state)()],lr.prototype,"activeTab",2),lr=d([(0,Va.customElement)("roxy-kp-chart")],lr);var Ie=require("lit"),ys=require("lit/decorators.js");var _r=class extends m{renderEmpty(){return Ie.html`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return Ie.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?Ie.html`<span class="ayanamsa">Ayanamsa: ${f(a.ayanamsa,2)}°</span>`:Ie.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=>Ie.html`<tr><td class="planet">${r.planet} ${r.retrograde?Ie.html`<span class="retro">R</span>`:Ie.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>`}};_r.styles=[y,Ie.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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}`],_r=d([(0,ys.customElement)("roxy-kp-planets-table")],_r);var Se=require("lit"),us=require("lit/decorators.js");var Fr=class extends m{renderEmpty(){return Se.html`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return Se.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?Se.html`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:Se.nothing}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${a.moonSignLord??""}</dd><dt>Star lord</dt><dd>${a.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${a.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${a.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${a.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${a.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.lagnaSubSublord??""}</dd></dl></div></div>${a.rulingPlanets?.length?Se.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>Se.html`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:Se.nothing} ${e.length?Se.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${e.map(r=>Se.html`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:Se.nothing}</div>`}};Fr.styles=[y,Se.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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}`],Fr=d([(0,us.customElement)("roxy-kp-ruling-planets")],Fr);var ne=require("lit"),xs=require("lit/decorators.js");var gt=320,Oe=gt/2,Ue=128,Mo=118,Go=140,Ho=150;function We(n,a){let e=n*Math.PI/180;return{x:Oe+a*Math.sin(e),y:Oe-a*Math.cos(e)}}var Oo=[{az:0,label:"N"},{az:45,label:"NE"},{az:90,label:"E"},{az:135,label:"SE"},{az:180,label:"S"},{az:225,label:"SW"},{az:270,label:"W"},{az:315,label:"NW"}],Yr=class extends m{renderEmpty(){return ne.html`<div class="roxy-empty" role="status">No local space data</div>`}renderData(a){let e=a.bodies??[],r=a.birthDetails;return ne.html`<div class="wrap"><header><h2 class="title">Local space</h2>${r?ne.html`<div class="meta">${[r.date,r.time].filter(Boolean).join(" \xB7 ")}</div>`:ne.nothing}</header>${this.renderDial(e)} ${a.summary?ne.html`<p class="summary">${a.summary}</p>`:ne.nothing} ${this.renderList(e)}</div>`}renderDial(a){return ne.html`<svg viewBox="0 0 ${gt} ${gt}" role="img" aria-label="Local space compass of planetary directions from the birthplace"><title>Local space compass</title><desc>A compass centered on the birthplace. Each body is a line pointing to its azimuth, clockwise from north. Bodies below the horizon are dimmed.</desc><circle class="dial-fill" cx="${Oe}" cy="${Oe}" r="${Ue}"/><circle class="dial" cx="${Oe}" cy="${Oe}" r="${Ue*.66}" stroke-width="0.5"/><circle class="dial" cx="${Oe}" cy="${Oe}" r="${Ue*.33}" stroke-width="0.5"/>${this.renderCompassRing()} ${this.renderSpokes(a)}<circle class="center-dot" cx="${Oe}" cy="${Oe}" r="2.5"/></svg>`}renderCompassRing(){let a=[];for(let i=0;i<360;i+=22.5){let l=We(i,Ue),c=We(i,Ue-(i%45===0?8:4));a.push(ne.svg`<line class="tick" x1=${c.x} y1=${c.y} x2=${l.x} y2=${l.y} />`)}let e=We(0,Ue),r=We(180,Ue),t=We(90,Ue),s=We(270,Ue),o=Oo.map(({az:i,label:l})=>{let c=We(i,Ho),p=i%90===0;return ne.svg`<text class=${`compass-label${p?" cardinal":""}`} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${l}</text>`});return ne.svg`
83
+ <line class="cardinal-axis" x1=${e.x} y1=${e.y} x2=${r.x} y2=${r.y} />
84
+ <line class="cardinal-axis" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} />
85
+ ${a}${o}`}renderSpokes(a){return a.map((e,r)=>{let t=Rr(e.planet,r),s=e.aboveHorizon===!1,o=We(e.azimuth,Mo),i=We(e.azimuth,Go),l=e.symbol||e.planet.slice(0,2),c=`${e.altitude>0?"+":""}${Math.round(e.altitude)}\xB0`;return ne.svg`<g>
86
+ <line class=${`spoke${s?" below":""}`} stroke=${t} x1=${Oe} y1=${Oe} x2=${o.x} y2=${o.y}><title>${e.planet} ${e.compassDirection} ${Math.round(e.azimuth)}° altitude ${c}</title></line>
87
+ <text class=${`body-glyph${s?" below":""}`} fill=${t} x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>
88
+ </g>`})}renderList(a){return a.length===0?ne.nothing:ne.html`<table class="list"><thead><tr><th>Body</th><th>Direction</th><th class="num">Azimuth</th><th class="num">Altitude</th><th>Horizon</th></tr></thead><tbody>${a.map((e,r)=>{let t=Rr(e.planet,r),s=e.aboveHorizon===!1;return ne.html`<tr><td><span class="body-cell"><span class="body-dot" style="${`background: ${t}`}"></span> ${e.symbol?ne.html`${e.symbol}`:ne.nothing}${e.planet}</span></td><td>${e.compassDirection}</td><td class="num">${Math.round(e.azimuth)}°</td><td class="num">${e.altitude>0?"+":""}${Math.round(e.altitude)}°</td><td><span class="${`horizon-pill ${s?"down":"up"}`}">${s?"Below":"Above"}</span></td></tr>`})}</tbody></table>`}};Yr.styles=[y,ne.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);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}.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{width:100%;max-width:var(--roxy-chart-max-width,480px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.dial{fill:none;stroke:var(--roxy-border,#e4e4e7)}.dial-fill{fill:color-mix(in srgb, var(--roxy-border,#e4e4e7) 10%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.cardinal-axis{stroke:var(--roxy-border,#e4e4e7);stroke-width:.5px}.tick{stroke:var(--roxy-secondary,#475569);stroke-width:.6px;opacity:.5}.compass-label{fill:var(--roxy-secondary,#475569);font-size:9px;font-weight:600;font-family:var(--roxy-font-sans)}.compass-label.cardinal,.center-dot{fill:var(--roxy-fg,#0a0a0a)}.spoke{stroke-width:1.4px}.spoke.below{stroke-dasharray:3 3;opacity:.4}.body-glyph{font-size:11px;font-weight:600;font-family:var(--roxy-font-sans)}.body-glyph.below{opacity:.45}.list{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}.list th,.list td{text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:4px 8px}.list th{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.04em;font-weight:600;font-size:var(--roxy-text-xs,.75rem)}.list td.num{text-align:right;font-variant-numeric:tabular-nums}.body-cell{align-items:center;gap:.4rem;display:inline-flex}.body-dot{border-radius:50%;flex-shrink:0;width:10px;height:10px}.horizon-pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:1px 7px}.horizon-pill.up{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.horizon-pill.down{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}`],Yr=d([(0,xs.customElement)("roxy-local-space-compass")],Yr);var Re=require("lit"),Ce=require("lit/decorators.js");function hs(n,a){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...t)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ue=class extends Re.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=hs(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 s={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 o=this.publishableKey??this.apiKey;o&&(s["X-API-Key"]=o);let i=await fetch(t,{headers:s,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 Re.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?Re.html`<span class="spinner" role="status" aria-label="Loading"></span>`:Re.nothing} ${this.isOpen?Re.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?Re.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>Re.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?Re.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:Re.nothing}</div>`}};ue.styles=[y,Re.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,Ce.property)({type:String,attribute:"api-key"})],ue.prototype,"apiKey",2),d([(0,Ce.property)({type:String,attribute:"publishable-key"})],ue.prototype,"publishableKey",2),d([(0,Ce.property)({type:String})],ue.prototype,"endpoint",2),d([(0,Ce.property)({type:String})],ue.prototype,"placeholder",2),d([(0,Ce.property)({type:String,attribute:"default-value"})],ue.prototype,"defaultValue",2),d([(0,Ce.state)()],ue.prototype,"query",2),d([(0,Ce.state)()],ue.prototype,"results",2),d([(0,Ce.state)()],ue.prototype,"isOpen",2),d([(0,Ce.state)()],ue.prototype,"isLoading",2),d([(0,Ce.state)()],ue.prototype,"highlight",2),ue=d([(0,Ce.customElement)("roxy-location-search")],ue);var q=require("lit"),qa=require("lit/decorators.js");var dr=class extends m{constructor(){super(...arguments);this.mode="current"}renderEmpty(){return q.html`<div class="roxy-empty" role="status">No moon phase data</div>`}renderData(e){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,s="year"in e?e.year:void 0;return q.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${s??""}</h2><div class="list" role="list">${r.map(o=>this.renderListItem(o))}</div></article>`}return"phase"in e?this.renderSingle(e):q.nothing}renderSingle(e){let r=e.meaning?.symbol||fs(e.phase);return q.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?q.html`<div class="date">${e.date}</div>`:q.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?q.html`<div><span>Illumination</span> <strong>${jo(e.illumination)}</strong></div>`:q.nothing} ${typeof e.age=="number"?q.html`<div><span>Age</span> <strong>${f(e.age,1)} days</strong></div>`:q.nothing} ${e.sign?q.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:q.nothing} ${typeof e.distance=="number"?q.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:q.nothing}</div>${e.meaning?.description?q.html`<p class="meaning">${e.meaning.description}</p>`:q.nothing} ${e.meaning?.keywords?.length?q.html`<div class="keywords">${e.meaning.keywords.map(t=>q.html`<span>${t}</span>`)}</div>`:q.nothing}</article>`}renderListItem(e){let r=fs(e.phase);return q.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};dr.styles=[y,q.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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,qa.property)({type:String,reflect:!0})],dr.prototype,"mode",2),dr=d([(0,qa.customElement)("roxy-moon-phase")],dr);function fs(n){if(!n)return"\u{1F319}";let a=n.toLowerCase().trim(),e=a.replace(/\s*moon$/,"").trim(),r=e==="third quarter"?"last quarter":e;return ma[a]??ma[e]??ma[r]??ma[`${r} moon`]??"\u{1F319}"}function jo(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var V=require("lit"),bs=require("lit/decorators.js");var Vr=class extends m{renderData(a){let e=a.remedies;return V.html`<article class="wrap" aria-label="${`Nakshatra ${a.name}`}"><header class="head"><h2 class="name">${a.name}</h2>${typeof a.number=="number"?V.html`<span class="number">Nakshatra ${a.number} of 27</span>`:V.nothing} ${a.range?V.html`<span class="range">${a.range}</span>`:V.nothing}</header><dl class="facts">${a.lord?V.html`<div class="fact"><dt>Lord</dt><dd>${a.lord}</dd></div>`:V.nothing} ${a.deity?V.html`<div class="fact"><dt>Deity</dt><dd>${a.deity}</dd></div>`:V.nothing} ${a.symbol?V.html`<div class="fact"><dt>Symbol</dt><dd>${a.symbol}</dd></div>`:V.nothing}</dl>${a.characteristics?V.html`<div class="section"><h3>Characteristics</h3><p>${a.characteristics}</p></div>`:V.nothing} ${e?V.html`<div class="section"><h3>Remedies</h3><div class="remedies">${e.mantras?V.html`<div class="remedy"><strong>Mantras:</strong> ${e.mantras}</div>`:V.nothing} ${e.gemstones?V.html`<div class="remedy"><strong>Gemstones:</strong> ${e.gemstones}</div>`:V.nothing} ${e.rituals?V.html`<div class="remedy"><strong>Rituals:</strong> ${e.rituals}</div>`:V.nothing}</div></div>`:V.nothing}</article>`}renderEmpty(){return V.html`<div class="roxy-empty" role="status">No nakshatra data</div>`}};Vr.styles=[y,V.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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)}`],Vr=d([(0,bs.customElement)("roxy-nakshatra-card")],Vr);var x=require("lit"),qr=require("lit/decorators.js");var ut=420,R=ut/2,na=164,yt=146,xa=120,ia=96,Bo=178,Io=196,Fe=class extends m{constructor(){super(...arguments);this.houseSystem="placidus";this.heading="Natal chart";this.view="wheel"}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}renderEmpty(){return x.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(e){let r=this.getPlanets(),t=e.aspects??[],s=this.view;return x.html`<div class="wrap"><header><h2 class="title">${this.heading}</h2>${e.birthDetails?x.html`<div class="meta">${[e.birthDetails.date,e.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:x.nothing}</header>${t.length>0?x.html`${oa({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:s,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${s}" role="tabpanel" aria-labelledby="natal-tab-${s}">${s==="wheel"?this.renderWheel(r,t):this.renderAspectGrid(r,t)}</div>`:this.renderWheel(r,t)}<div class="legend"><span>${r.length} planets</span> ${t.length>0?x.html`<span>${t.length} aspects</span>`:x.nothing} ${e.houseSystem?x.html`<span>${e.houseSystem} houses</span>`:x.nothing} ${t.length>0?x.html`<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>`:x.nothing}</div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return x.html`<svg viewBox="0 0 ${ut} ${ut}" 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="${R}" cy="${R}" r="${na}" stroke-width="1.5"/><circle class="wheel-line" cx="${R}" cy="${R}" r="${yt-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${R}" cy="${R}" r="${xa}" stroke-width="1"/><circle class="wheel-line" cx="${R}" cy="${R}" r="${ia-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(o=>u(o.name)),s=new Map;for(let o of r){let i=[u(o.planet1),u(o.planet2)].sort().join("|");s.set(i,o)}return t.length===0?x.html`<p class="roxy-empty" role="status">No planets to grid</p>`:x.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(o=>{let i=z[o]??o.slice(0,2);return x.html`<th scope="col" title="${o}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((o,i)=>{let l=z[o]??o.slice(0,2);return x.html`<tr><th scope="row" title="${o}">${l}</th>${t.slice(0,i+1).map(c=>{let p=s.get([o,c].sort().join("|"));if(!p)return x.html`<td class="empty"></td>`;let g=aa(p),h=pa[g]??pa[g.replace(/-/g,"")]??g.slice(0,3),S=kr[g]??"aspect-other",b=f(p.orb,1);return x.html`<td class="${`cell ${S}`}" title="${`${o} ${g} ${c}${b?` (orb ${b}\xB0)`:""}`}"><span class="asp">${h}</span></td>`})} ${t.slice(i+1,-1).map(()=>x.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(ct(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(ct(r),"IC")));let s=this.data?.partOfFortune?.longitude;typeof s=="number"&&t.push(this.renderAngleMark(_e(s),"PoF"));let o=this.data?.vertex?.longitude;return typeof o=="number"&&t.push(this.renderAngleMark(_e(o),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),s=_(R,R,na,t),o=_(R,R,Bo,t),i=_(R,R,Io,t);return x.svg`
77
89
  <g>
78
90
  <line class="angle-tick" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />
79
91
  <text class="angle-marker" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r}</text>
80
92
  </g>
81
- `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,s)=>this.getAscendant()+s*30)).map(t=>{let s=this.toAngle(t),o=B(k,k,Wr,s),i=B(k,k,Ir,s);return u.svg`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return te.map((e,r)=>{let t=this.toAngle(r*30+15),s=B(k,k,Fa,t);return u.svg`<text class="sign-glyph" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${pe[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,s)=>{let o=e[(s+1)%12],i=$t(t.longitude,o?o.longitude:t.longitude+30),l=B(k,k,Wr-12,this.toAngle(i));return u.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,s)=>{let o=this.toAngle(s*30+15),i=B(k,k,Wr-12,o),l=(s-r+12)%12+1;return u.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),s=r%30===0,o=s?Fa-14:Ir-5,i=B(k,k,o,t),l=B(k,k,Ir,t);e.push(u.svg`<line class=${s?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${s?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?u.nothing:e.map(r=>{let t=this.toAngle(r.longitude),s=B(k,k,Wr+9,t),o=Me(r.longitude);return u.svg`<text class="cusp-deg" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${o.degree}°${String(o.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(o=>Number.isFinite(o.longitude)).map(o=>({p:o,trueLon:Le(o.longitude),displayLon:Le(o.longitude)})).sort((o,i)=>o.trueLon-i.trueLon);for(let o=1;o<t.length;o++){let i=t[o-1],l=t[o];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let s=t[t.length-1];if(s&&s.displayLon>360){let o=s.displayLon-360;for(let i of t)i.displayLon-=o}return t.map(({p:o,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),p=this.toAngle(l),y=B(k,k,Kr,p),x=B(k,k,Kr-13,p),j=B(k,k,Ir-4,c),b=B(k,k,Kr+8,p),dr=N[h(o.name)]??o.name.slice(0,2),Pe=Me(o.longitude),Vr=o.isRetrograde===!0,Jr=`${Pe.degree}\xB0${String(Pe.minute).padStart(2,"0")}'`,Xr=Math.abs(l-i)>.5;return u.svg`<g>
82
- ${Xr?u.svg`<line class="planet-leader" x1=${j.x} y1=${j.y} x2=${b.x} y2=${b.y} />`:u.nothing}
83
- <text class="planet-glyph" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}${Vr?" retrograde":""} - ${Jr} ${o.sign??""}</title>${dr}</text>
84
- <text class="planet-deg" x=${x.x} y=${x.y} text-anchor="middle" dominant-baseline="central">${Jr}${Vr?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 t=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} ${t.length>0?u.html`<div class="pill-row">${t.map(s=>{let o=N[s]??s.slice(0,2);return u.html`<span class="pill pill--muted">${o} ${s} 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"],t=["Cardinal","Fixed","Mutable"],s=te,o={};for(let i of r)o[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=s.indexOf(h(i.sign??""));if(l<0)continue;let c=r[l%4],p=t[l%3],y=N[h(i.name)]??h(i.name).slice(0,2);o[c]?.[p]?.push(y)}return u.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>u.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,p)=>c+(o[i]?.[p]?.length??0),0);return u.html`<tr><th scope="row">${i}</th>${t.map(c=>u.html`<td>${(o[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>u.html`<td class="em-total">${r.reduce((l,c)=>l+(o[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,t)=>{let s=r.interpretation,o=N[h(r.name)]??"",i=f(r.degree??0,1);return u.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${o} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${Re()}</span></summary><div class="interp-body">${s.summary?u.html`<p class="interp-summary">${s.summary}</p>`:u.nothing} ${s.detailed?u.html`<p class="interp-detail">${s.detailed}</p>`:u.nothing} ${s.keywords?.length?u.html`<div class="interp-keywords">${s.keywords.map(l=>u.html`<span class="kw">${l}</span>`)}</div>`:u.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let s of e){if(typeof s.longitude!="number")continue;let o=h(s.name);o&&t.set(o,s.longitude)}return r.map(s=>{let o=t.get(h(s.planet1)),i=t.get(h(s.planet2));if(o===void 0||i===void 0)return u.nothing;let l=B(k,k,Kr-18,this.toAngle(o)),c=B(k,k,Kr-18,this.toAngle(i)),p=jr(s),y=gr[p]??"aspect-other",x=f(s.orb,1);return u.svg`<line class=${`aspect ${y}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p||""} ${s.planet2}${x?` (orb ${x}\xB0)`:""}</title></line>`})}};je.styles=[g,Ue,Ke,u.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);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}.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{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;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,_r.property)({type:String,attribute:"house-system",reflect:!0})],je.prototype,"houseSystem",2),d([(0,_r.state)()],je.prototype,"view",2),je=d([(0,_r.customElement)("roxy-natal-chart")],je);var S=require("lit"),Ca=require("lit/decorators.js");var rr=class extends m{constructor(){super(...arguments);this.type="life-path"}renderData(e){let r=Qs[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalDay"in e?this.renderPeriod(r,e.personalDay,e.theme,e.guidance):"personalMonth"in e?this.renderPeriod(r,e.personalMonth,e.theme,e.focus):"personalYear"in e?this.renderPersonalYear(e,r):"dailyMessage"in e?this.renderPeriod(r,e.number,e.meaning?.title,e.dailyMessage):this.renderNumberCard(e,r)}renderPeriod(e,r,t,s){return S.html`<article class="card" aria-label="${e}"><div class="hero">${typeof r=="number"?S.html`<div class="numeral">${r}</div>`:S.nothing}<div><p class="label">${e}</p>${t?S.html`<h2 class="title">${t}</h2>`:S.nothing}</div></div>${s?S.html`<p class="meaning">${s}</p>`:S.nothing}</article>`}renderEmpty(){return S.html`<div class="roxy-empty" role="status">No numerology data</div>`}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return S.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?S.html`<div class="numeral">${e.number}</div>`:S.nothing}<div><p class="label">${r}</p>${e.meaning?.title?S.html`<h2 class="title">${e.meaning.title}</h2>`:S.nothing}</div></div>${e.meaning?.description?S.html`<p class="meaning">${e.meaning.description}</p>`:S.nothing} ${e.calculation?S.html`<pre class="calc">${e.calculation}</pre>`:S.nothing} ${t.length>0?S.html`<div class="chips">${t.map(s=>S.html`<span>${s}</span>`)}</div>`:S.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?S.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${eo(e.karmicDebtMeaning)}</div>`:S.nothing}</article>`}renderPersonalYear(e,r){return S.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?S.html`<div class="numeral">${e.personalYear}</div>`:S.nothing}<div><p class="label">${r}</p>${e.theme?S.html`<h2 class="title">${e.theme}</h2>`:S.nothing}</div></div>${e.forecast?S.html`<p class="meaning">${e.forecast}</p>`:S.nothing} ${e.advice?S.html`<p>${e.advice}</p>`:S.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,s])=>s!=null);return S.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?S.html`<h2 class="title">${e.profile.name}</h2>`:S.nothing}</div>${t.length>0?S.html`<div class="cores">${t.map(([s,o])=>S.html`<div class="item"><span>${Y(s)}</span> <strong>${o.number??""}</strong></div>`)}</div>`:S.nothing}</article>`}};rr.styles=[g,S.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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,Ca.property)({type:String,reflect:!0})],rr.prototype,"type",2),rr=d([(0,Ca.customElement)("roxy-numerology-card")],rr);var Qs={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","birth-day":"Birth Day",maturity:"Maturity",daily:"Daily Number","personal-day":"Personal Day","personal-month":"Personal Month","personal-year":"Personal Year",chart:"Numerology chart"};function eo(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var q=require("lit"),Ta=require("lit/decorators.js");var ar=class extends m{constructor(){super(...arguments);this.detail="detailed"}renderEmpty(){return q.html`<div class="roxy-empty" role="status">No panchang data</div>`}renderData(e){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 s=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(y=>!!y[1]):[],o=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],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)]:[],p=r&&"transitions"in r?r.transitions:void 0;return q.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?Ce(r.date):""}</span></header><table><tbody>${t.map(([y,x])=>q.html`<tr><th>${y}</th><td>${x}</td></tr>`)} ${r?.sunrise?q.html`<tr><th>Sunrise</th><td>${Ne(r.sunrise)}</td></tr>`:q.nothing} ${r?.sunset?q.html`<tr><th>Sunset</th><td>${Ne(r.sunset)}</td></tr>`:q.nothing} ${r?.moonrise?q.html`<tr><th>Moonrise</th><td>${Ne(r.moonrise)}</td></tr>`:q.nothing} ${r?.moonset?q.html`<tr><th>Moonset</th><td>${Ne(r.moonset)}</td></tr>`:q.nothing} ${s.map(([y,x])=>q.html`<tr><th>${y}</th><td>${x}</td></tr>`)}</tbody></table>${p?q.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",p.tithi)} ${this.renderTransitionRow("Nakshatra",p.nakshatra)} ${this.renderTransitionRow("Yoga",p.yoga)} ${this.renderTransitionRow("Karana",p.karana)}</tbody></table>`:q.nothing} ${this.detail==="detailed"&&(o.some(y=>!!y[1])||i.length>0||l.some(y=>!!y[1])||c.length>0)?q.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...o.filter(y=>!!y[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(y=>!!y[1]),...c])}</tbody></table>`:q.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let s=Ga(t);return s?q.html`<tr><th>${r}</th><td>${s}</td></tr>`:q.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,s)=>[r.length>1?`${e} ${s+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return q.nothing;let t=Ne(r.endsAt),s=r.next?` \u2192 ${r.next}`:"";return q.html`<tr><th>${e}</th><td>ends ${t}${s}</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=Ga(e);return r?`${e.current} (${r})`:e.current}};ar.styles=[g,q.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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,Ta.property)({type:String,reflect:!0})],ar.prototype,"detail",2),ar=d([(0,Ta.customElement)("roxy-panchang-table")],ar);var le=require("lit"),It=require("lit/decorators.js");var Kt=["name","english","title"],ro=new Set(["description","meaning","characteristics","tagline","definedMeaning","undefinedMeaning","motto"]),ao=new Set(["id","symbol","keywords",...Kt]),Nr=class extends m{renderData(a){let e=a,r=this.deriveTitle(e),t=typeof e.symbol=="string"?e.symbol:void 0,s=Array.isArray(e.keywords)?e.keywords.map(String):[],o=[],i=[],l=[];for(let[c,p]of Object.entries(e))if(!(ao.has(c)||p==null))if(Array.isArray(p)){let y=p.filter(x=>x!=null).map(String);y.length>0&&i.push([c,y])}else typeof p=="string"?ro.has(c)||p.length>48?o.push([c,p]):l.push([c,p]):(typeof p=="number"||typeof p=="boolean")&&l.push([c,String(p)]);return le.html`<article class="card" aria-label="${r}"><header class="head">${t?le.html`<span class="symbol" aria-hidden="true">${t}</span>`:le.nothing}<div><p class="label">Reference</p><h2 class="name">${r}</h2></div></header>${s.length>0?le.html`<div class="chips">${s.map(c=>le.html`<span>${c}</span>`)}</div>`:le.nothing} ${o.map(([c,p])=>le.html`<p class="prose"><span class="prose-label">${Y(c)}</span>${p}</p>`)} ${l.length>0?le.html`<div class="facts-wrap"><dl class="facts">${l.map(([c,p])=>le.html`<div class="fact"><dt>${Y(c)}</dt><dd>${p}</dd></div>`)}</dl></div>`:le.nothing} ${i.map(([c,p])=>le.html`<div class="list"><h3>${Y(c)}</h3><div class="chips">${p.map(y=>le.html`<span>${y}</span>`)}</div></div>`)}</article>`}renderEmpty(){return le.html`<div class="roxy-empty" role="status">No reference data</div>`}deriveTitle(a){for(let t of Kt)if(typeof a[t]=="string")return a[t];let e=typeof a.type=="string"?Y(a.type):"",r=a.number;return r!=null?`${e} ${r}`.trim():"Reference"}};Nr.styles=[g,le.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.symbol{color:var(--roxy-accent-ink,#b45309);flex:none;font-size:2.5rem;line-height:1}.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);margin:0}.prose{margin:0;line-height:1.6}.prose .prose-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px;display:block}.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}.list h3,.facts-wrap 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}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));margin:0;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize}.fact dd{font-size:var(--roxy-text-sm,.875rem);margin:0}`],Nr=d([(0,It.customElement)("roxy-reference-card")],Nr);var ke=require("lit"),_t=require("lit/decorators.js");var Va=[{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)"}],Lr=class extends m{renderEmpty(){return ke.html`<div class="roxy-empty" role="status">No shadbala data</div>`}renderData(a){if(!a.planets?.length)return this.renderEmpty();let e=[...a.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return ke.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">${Va.map(r=>ke.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(a){let e=N[h(a.planet)]??"",r=Va.map(c=>Math.max(0,a[c.key])),t=r.reduce((c,p)=>c+p,0),s=typeof a.strengthRatio=="number"&&a.strengthRatio>=1,o=s?"adequacy-badge--adequate":"adequacy-badge--weak",i=s?"adequate":"weak",l=f(a.totalRupas,2)&&f(a.minRequired,2)?`${f(a.totalRupas,2)} / ${f(a.minRequired,2)} R`:"";return ke.html`<div class="planet-row" role="listitem" aria-label="${a.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${e}</span> ${a.planet} <span class="rank-badge" aria-label="rank ${a.relativeRank}">#${a.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${a.planet}">${t>0?Va.map((c,p)=>{let y=r[p];if(y<=0)return ke.nothing;let x=y/t*100;return ke.html`<div class="bar-segment" style="flex-grow:${x};background:${c.color}" title="${c.label}: ${f(y,1)}"></div>`}):ke.nothing}</div></div><div class="pills">${l?ke.html`<span class="rupas-label">${l}</span>`:ke.nothing} <span class="${`adequacy-badge ${o}`}">${i}</span></div></div>`}};Lr.styles=[g,ke.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}}`],Lr=d([(0,_t.customElement)("roxy-shadbala-table")],Lr);var w=require("lit"),Ft=require("lit/decorators.js");var Wa=360,V=Wa/2,Ya=170,to=154,Ua=124,Fr=96,Mr=class extends m{renderEmpty(){return w.html`<div class="roxy-empty" role="status">No synastry data</div>`}renderData(a){let{person1:e,person2:r,compatibilityScore:t,analysis:s}=a,o=a.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,p=s?.overall,y=s?.strengths??[],x=s?.challenges??[];return i.length>0&&l.length>0?w.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?w.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:w.nothing}</div><svg viewBox="0 0 ${Wa} ${Wa}" 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="${Ya}" stroke-width="1.5"/><circle class="wheel-line" cx="${V}" cy="${V}" r="${Fr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${V}" cy="${V}" r="${Fr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,o)} ${this.renderRing(i,Ua,"p1",1)} ${this.renderRing(l,Fr,"p2",2)} ${this.renderAscendants(a)}</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>${p?w.html`<p class="summary">${p}</p>`:w.nothing} ${o.length>0?this.renderAspects(o):w.nothing} ${y.length>0||x.length>0?w.html`<div class="lists">${y.length?w.html`<div><h3>Strengths</h3><ul>${y.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing} ${x.length?w.html`<div><h3>Challenges</h3><ul>${x.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing}</div>`:w.nothing}</div>`:w.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?w.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:w.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>${p?w.html`<p class="summary">${p}</p>`:w.nothing} ${o.length>0?this.renderAspects(o):w.nothing} ${y.length>0||x.length>0?w.html`<div class="lists">${y.length?w.html`<div><h3>Strengths</h3><ul>${y.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing} ${x.length?w.html`<div><h3>Challenges</h3><ul>${x.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing}</div>`:w.nothing}</div>`}toAngle(a){return 180-a}renderSpokes(){return Array.from({length:12},(a,e)=>{let r=this.toAngle(e*30),t=B(V,V,Fr-14,r),s=B(V,V,Ya,r);return w.svg`<line class="wheel-line" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return te.map((a,e)=>{let r=this.toAngle(e*30+15),t=B(V,V,to,r);return w.svg`<text class="sign" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${pe[a]}</text>`})}renderRing(a,e,r,t){return a.map(s=>{if(!Number.isFinite(s.longitude))return w.nothing;let o=this.toAngle(s.longitude),i=B(V,V,e,o),c=B(V,V,e+(t===1?-12:-10),o),p=N[h(s.name)]??s.name.slice(0,2),y=Me(s.longitude),x=s.isRetrograde===!0,j=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,b=`${s.name}${x?" retrograde":""} - ${j} ${y.sign}`;return w.svg`<g>
93
+ `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,s)=>this.getAscendant()+s*30)).map(t=>{let s=this.toAngle(t),o=_(R,R,xa,s),i=_(R,R,na,s);return x.svg`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return de.map((e,r)=>{let t=this.toAngle(r*30+15),s=_(R,R,yt,t);return x.svg`<text class="sign-glyph" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${ae[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,s)=>{let o=e[(s+1)%12],i=Xt(t.longitude,o?o.longitude:t.longitude+30),l=_(R,R,xa-12,this.toAngle(i));return x.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,s)=>{let o=this.toAngle(s*30+15),i=_(R,R,xa-12,o),l=(s-r+12)%12+1;return x.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),s=r%30===0,o=s?yt-14:na-5,i=_(R,R,o,t),l=_(R,R,na,t);e.push(x.svg`<line class=${s?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${s?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?x.nothing:e.map(r=>{let t=this.toAngle(r.longitude),s=_(R,R,xa+9,t),o=Ge(r.longitude);return x.svg`<text class="cusp-deg" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${o.degree}°${String(o.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(o=>Number.isFinite(o.longitude)).map(o=>({p:o,trueLon:_e(o.longitude),displayLon:_e(o.longitude)})).sort((o,i)=>o.trueLon-i.trueLon);for(let o=1;o<t.length;o++){let i=t[o-1],l=t[o];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let s=t[t.length-1];if(s&&s.displayLon>360){let o=s.displayLon-360;for(let i of t)i.displayLon-=o}return t.map(({p:o,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),p=this.toAngle(l),g=_(R,R,ia,p),h=_(R,R,ia-13,p),S=_(R,R,na-4,c),b=_(R,R,ia+8,p),br=z[u(o.name)]??o.name.slice(0,2),je=Ge(o.longitude),ca=o.isRetrograde===!0,ha=`${je.degree}\xB0${String(je.minute).padStart(2,"0")}'`,fa=Math.abs(l-i)>.5;return x.svg`<g>
94
+ ${fa?x.svg`<line class="planet-leader" x1=${S.x} y1=${S.y} x2=${b.x} y2=${b.y} />`:x.nothing}
95
+ <text class="planet-glyph" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}${ca?" retrograde":""} - ${ha} ${o.sign??""}</title>${br}</text>
96
+ <text class="planet-deg" x=${h.x} y=${h.y} text-anchor="middle" dominant-baseline="central">${ha}${ca?x.svg`<tspan class="retro"> ℞</tspan>`:x.nothing}</text>
97
+ </g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return x.nothing;let t=e?.retrogradePlanets??[];return x.html`<div class="details">${e?.dominantElement||e?.dominantModality?x.html`<div class="pill-row">${e.dominantElement?x.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:x.nothing} ${e.dominantModality?x.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:x.nothing}</div>`:x.nothing} ${r?x.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>`:x.nothing} ${t.length>0?x.html`<div class="pill-row">${t.map(s=>{let o=z[s]??s.slice(0,2);return x.html`<span class="pill pill--muted">${o} ${s} R</span>`})}</div>`:x.nothing} ${r?.summary?x.html`<p class="summary">${r.summary}</p>`:x.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return x.nothing;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],s=de,o={};for(let i of r)o[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=s.indexOf(u(i.sign??""));if(l<0)continue;let c=r[l%4],p=t[l%3],g=z[u(i.name)]??u(i.name).slice(0,2);o[c]?.[p]?.push(g)}return x.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>x.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,p)=>c+(o[i]?.[p]?.length??0),0);return x.html`<tr><th scope="row">${i}</th>${t.map(c=>x.html`<td>${(o[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>x.html`<td class="em-total">${r.reduce((l,c)=>l+(o[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?x.nothing:x.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let s=r.interpretation,o=z[u(r.name)]??"",i=f(r.degree??0,1);return x.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${o} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${le()}</span></summary><div class="interp-body">${s.summary?x.html`<p class="interp-summary">${s.summary}</p>`:x.nothing} ${s.detailed?x.html`<p class="interp-detail">${s.detailed}</p>`:x.nothing} ${s.keywords?.length?x.html`<div class="interp-keywords">${s.keywords.map(l=>x.html`<span class="kw">${l}</span>`)}</div>`:x.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let s of e){if(typeof s.longitude!="number")continue;let o=u(s.name);o&&t.set(o,s.longitude)}return r.map(s=>{let o=t.get(u(s.planet1)),i=t.get(u(s.planet2));if(o===void 0||i===void 0)return x.nothing;let l=_(R,R,ia-18,this.toAngle(o)),c=_(R,R,ia-18,this.toAngle(i)),p=aa(s),g=kr[p]??"aspect-other",h=f(s.orb,1);return x.svg`<line class=${`aspect ${g}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p||""} ${s.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}};Fe.styles=[y,tr,ke,x.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);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}.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{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;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,qr.property)({type:String,attribute:"house-system",reflect:!0})],Fe.prototype,"houseSystem",2),d([(0,qr.property)({type:String})],Fe.prototype,"heading",2),d([(0,qr.state)()],Fe.prototype,"view",2),Fe=d([(0,qr.customElement)("roxy-natal-chart")],Fe);var C=require("lit"),Ua=require("lit/decorators.js");var cr=class extends m{constructor(){super(...arguments);this.type="life-path"}renderData(e){let r=Ko[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalDay"in e?this.renderPeriod(r,e.personalDay,e.theme,e.guidance):"personalMonth"in e?this.renderPeriod(r,e.personalMonth,e.theme,e.focus):"personalYear"in e?this.renderPersonalYear(e,r):"dailyMessage"in e?this.renderPeriod(r,e.number,e.meaning?.title,e.dailyMessage):this.renderNumberCard(e,r)}renderPeriod(e,r,t,s){return C.html`<article class="card" aria-label="${e}"><div class="hero">${typeof r=="number"?C.html`<div class="numeral">${r}</div>`:C.nothing}<div><p class="label">${e}</p>${t?C.html`<h2 class="title">${t}</h2>`:C.nothing}</div></div>${s?C.html`<p class="meaning">${s}</p>`:C.nothing}</article>`}renderEmpty(){return C.html`<div class="roxy-empty" role="status">No numerology data</div>`}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return C.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?C.html`<div class="numeral">${e.number}</div>`:C.nothing}<div><p class="label">${r}</p>${e.meaning?.title?C.html`<h2 class="title">${e.meaning.title}</h2>`:C.nothing}</div></div>${e.meaning?.description?C.html`<p class="meaning">${e.meaning.description}</p>`:C.nothing} ${e.calculation?C.html`<pre class="calc">${e.calculation}</pre>`:C.nothing} ${t.length>0?C.html`<div class="chips">${t.map(s=>C.html`<span>${s}</span>`)}</div>`:C.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?C.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${_o(e.karmicDebtMeaning)}</div>`:C.nothing}</article>`}renderPersonalYear(e,r){return C.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?C.html`<div class="numeral">${e.personalYear}</div>`:C.nothing}<div><p class="label">${r}</p>${e.theme?C.html`<h2 class="title">${e.theme}</h2>`:C.nothing}</div></div>${e.forecast?C.html`<p class="meaning">${e.forecast}</p>`:C.nothing} ${e.advice?C.html`<p>${e.advice}</p>`:C.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,s])=>s!=null);return C.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?C.html`<h2 class="title">${e.profile.name}</h2>`:C.nothing}</div>${t.length>0?C.html`<div class="cores">${t.map(([s,o])=>C.html`<div class="item"><span>${J(s)}</span> <strong>${o.number??""}</strong></div>`)}</div>`:C.nothing}</article>`}};cr.styles=[y,C.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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,Ua.property)({type:String,reflect:!0})],cr.prototype,"type",2),cr=d([(0,Ua.customElement)("roxy-numerology-card")],cr);var Ko={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","birth-day":"Birth Day",maturity:"Maturity",daily:"Daily Number","personal-day":"Personal Day","personal-month":"Personal Month","personal-year":"Personal Year",chart:"Numerology chart"};function _o(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var U=require("lit"),Wa=require("lit/decorators.js");var pr=class extends m{constructor(){super(...arguments);this.detail="detailed"}renderEmpty(){return U.html`<div class="roxy-empty" role="status">No panchang data</div>`}renderData(e){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 s=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(g=>!!g[1]):[],o=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],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)]:[],p=r&&"transitions"in r?r.transitions:void 0;return U.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?Le(r.date):""}</span></header><table><tbody>${t.map(([g,h])=>U.html`<tr><th>${g}</th><td>${h}</td></tr>`)} ${r?.sunrise?U.html`<tr><th>Sunrise</th><td>${Ke(r.sunrise)}</td></tr>`:U.nothing} ${r?.sunset?U.html`<tr><th>Sunset</th><td>${Ke(r.sunset)}</td></tr>`:U.nothing} ${r?.moonrise?U.html`<tr><th>Moonrise</th><td>${Ke(r.moonrise)}</td></tr>`:U.nothing} ${r?.moonset?U.html`<tr><th>Moonset</th><td>${Ke(r.moonset)}</td></tr>`:U.nothing} ${s.map(([g,h])=>U.html`<tr><th>${g}</th><td>${h}</td></tr>`)}</tbody></table>${p?U.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",p.tithi)} ${this.renderTransitionRow("Nakshatra",p.nakshatra)} ${this.renderTransitionRow("Yoga",p.yoga)} ${this.renderTransitionRow("Karana",p.karana)}</tbody></table>`:U.nothing} ${this.detail==="detailed"&&(o.some(g=>!!g[1])||i.length>0||l.some(g=>!!g[1])||c.length>0)?U.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...o.filter(g=>!!g[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(g=>!!g[1]),...c])}</tbody></table>`:U.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let s=ot(t);return s?U.html`<tr><th>${r}</th><td>${s}</td></tr>`:U.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,s)=>[r.length>1?`${e} ${s+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return U.nothing;let t=Ke(r.endsAt),s=r.next?` \u2192 ${r.next}`:"";return U.html`<tr><th>${e}</th><td>ends ${t}${s}</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=ot(e);return r?`${e.current} (${r})`:e.current}};pr.styles=[y,U.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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,Wa.property)({type:String,reflect:!0})],pr.prototype,"detail",2),pr=d([(0,Wa.customElement)("roxy-panchang-table")],pr);var w=require("lit"),Ja=require("lit/decorators.js");var mr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return w.html`<div class="roxy-empty" role="status">No positions data</div>`}renderData(e){let r=this.toViewModel(e),t=r.cols,s=r.rows.filter(o=>o.interpretation);return w.html`<div class="wrap"><header><h2 class="title">${this.heading||r.title}</h2>${r.badges.length?w.html`<div class="badges">${r.badges.map(o=>w.html`<span class="badge"><b>${o.label}</b> ${o.value}</span>`)}</div>`:w.nothing}</header>${r.summary?w.html`<p class="summary">${r.summary}</p>`:w.nothing}<div class="scroll"><table><caption>${r.title}</caption><thead><tr><th scope="col">Body</th><th scope="col">Position</th>${t.natal?w.html`<th scope="col">Natal</th>`:w.nothing} ${t.house?w.html`<th scope="col" class="num">House</th>`:w.nothing} ${t.motion?w.html`<th scope="col">Motion</th>`:w.nothing} ${t.formula?w.html`<th scope="col">Formula</th>`:w.nothing}</tr></thead><tbody>${r.rows.map(o=>this.renderRow(o,t))}</tbody></table></div>${s.length?w.html`<section class="readings"><h3>Readings</h3>${s.map((o,i)=>this.renderReading(o,i===0))}</section>`:w.nothing}</div>`}renderRow(e,r){let t=z[u(e.label)];return w.html`<tr class="${e.isAngle?"angle":""}"><td class="body-cell">${t?w.html`<span class="glyph">${t}</span>`:w.nothing}${e.label}</td><td>${this.signCell(e.sign,e.degree)}</td>${r.natal?w.html`<td>${e.natalLongitude!=null?this.signFromLongitude(e.natalLongitude):w.html`—`}</td>`:w.nothing} ${r.house?w.html`<td class="num">${e.house!=null?e.house:w.html`—`}</td>`:w.nothing} ${r.motion?w.html`<td>${e.speed!=null?w.html`${f(e.speed,3)}°/day${e.isRetrograde?w.html`<span class="retro">℞</span>`:w.nothing}`:w.html`—`}</td>`:w.nothing} ${r.formula?w.html`<td class="formula">${e.formula??w.html`—`}</td>`:w.nothing}</tr>`}signCell(e,r){let t=ae[u(e)];return w.html`<span class="sign">${t?w.html`<span class="sg">${t}</span>`:w.nothing}${ua(r)} ${e}</span>`}signFromLongitude(e){let r=Ge(e);return this.signCell(r.sign,r.degree+r.minute/60)}renderReading(e,r){let t=z[u(e.label)]??"";return w.html`<details class="interp-card" name="positions-readings" ?open="${r}"><summary><span>${t?w.html`${t}`:w.nothing}${e.label}</span> <span class="interp-aside"><small>${e.sign} ${ua(e.degree)}</small> ${le()}</span></summary><div class="interp-body">${e.interpretation}</div></details>`}toViewModel(e){if("asteroids"in e)return{title:"Asteroids",badges:e.houseSystem?[{label:"Houses",value:e.houseSystem}]:[],summary:e.summary,cols:{house:!0,motion:!0,formula:!1,natal:!1},rows:e.asteroids.map(t=>({label:t.name,sign:t.sign,degree:t.degree,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde,interpretation:t.interpretation}))};if("lilith"in e)return{title:"Black Moon Lilith",badges:e.houseSystem?[{label:"Houses",value:e.houseSystem}]:[],summary:e.summary,cols:{house:!0,motion:!0,formula:!1,natal:!1},rows:e.lilith.map(t=>({label:`${u(t.variant)} apogee`,sign:t.sign,degree:t.degree,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde,interpretation:t.interpretation}))};if("directed"in e)return{title:"Solar arc directions",badges:[{label:"Arc",value:`${f(e.solarArc,2)}\xB0`},{label:"Directed to",value:e.targetDate}],summary:e.summary,cols:{house:!1,motion:!1,formula:!1,natal:!0},rows:e.directed.map(t=>({label:t.name,sign:t.sign,degree:t.degree,natalLongitude:t.natalLongitude,interpretation:t.interpretation}))};if("lots"in e)return{title:"Arabic lots",badges:e.sect?[{label:"Sect",value:u(e.sect)}]:[],summary:e.summary,cols:{house:!1,motion:!1,formula:!0,natal:!1},rows:e.lots.map(t=>({label:t.name,sign:t.sign,degree:t.degree,formula:t.formula,interpretation:t.interpretation}))};let r=[];return e.ascendant&&r.push({label:"Ascendant",sign:e.ascendant.sign,degree:e.ascendant.degree,isAngle:!0}),e.midheaven&&r.push({label:"Midheaven",sign:e.midheaven.sign,degree:e.midheaven.degree,isAngle:!0}),{title:"Secondary progressions",badges:[{label:"Progressed to",value:e.targetDate},{label:"Elapsed",value:`${f(e.elapsedYears,1)} yrs`}],summary:e.summary,cols:{house:!0,motion:!0,formula:!1,natal:!1},rows:[...r,...e.planets.map(t=>({label:t.name,sign:t.sign,degree:t.degree,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde,interpretation:t.interpretation}))]}}};mr.styles=[y,ke,w.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);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}header{align-items:baseline;gap:var(--roxy-space-sm,.5rem) 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);color:var(--roxy-primary,#0f172a);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);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);padding:2px 8px}.badge b{color:var(--roxy-accent-ink,#b45309);font-weight:600}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}caption{text-align:left;color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);padding-bottom:var(--roxy-space-xs,.25rem)}th,td{text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap;padding:6px 10px}th{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.04em;font-weight:600;font-size:var(--roxy-text-xs,.75rem)}td.num{text-align:right;font-variant-numeric:tabular-nums}.body-cell{color:var(--roxy-fg,#0a0a0a);font-weight:500}.body-cell .glyph{color:var(--roxy-accent-ink,#b45309);margin-right:.35rem}tr.angle td{color:var(--roxy-secondary,#475569)}.sign{align-items:baseline;gap:.3rem;display:inline-flex}.sign .sg{color:var(--roxy-secondary,#475569)}.retro{color:var(--roxy-danger,#dc2626);font-weight:600}.formula{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;white-space:normal}.readings 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,#0a0a0a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.5rem;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,#0a0a0a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,Ja.property)({type:String})],mr.prototype,"heading",2),mr=d([(0,Ja.customElement)("roxy-positions-table")],mr);var pe=require("lit"),vs=require("lit/decorators.js");var Ur=class extends m{renderEmpty(){return pe.html`<div class="roxy-empty" role="status">No profection data</div>`}renderData(a){let e=ae[u(a.profectedSign??"")],r=z[u(a.lordOfYear??"")],t=ae[u(a.lordNatalPosition?.sign??"")];return pe.html`<div class="wrap"><header><h2 class="title">Annual profection</h2>${a.targetDate?pe.html`<span class="badge"><b>For</b> ${a.targetDate}</span>`:pe.nothing}</header><div class="focus"><div class="age"><span class="n">${a.age}</span> <span class="l">Age</span></div><span class="arrow">activates</span><div class="house"><span class="h">House ${a.profectedHouse}</span> <span class="sign">${e?pe.html`<span class="sg">${e}</span>`:pe.nothing}${a.profectedSign}</span></div></div><div class="lord"><span class="label">Lord of the year</span> <span class="value">${r?pe.html`${r}`:pe.nothing}${a.lordOfYear}</span> ${a.lordNatalPosition?pe.html`<span class="sub">natal ${t?pe.html`<span>${t}</span>`:pe.nothing}${a.lordNatalPosition.sign} · house ${a.lordNatalPosition.house}</span>`:pe.nothing}</div>${a.interpretation?pe.html`<p class="interp">${a.interpretation}</p>`:pe.nothing}</div>`}};Ur.styles=[y,pe.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);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}header{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-primary,#0f172a);margin:0}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);padding:2px 8px}.badge b{color:var(--roxy-accent-ink,#b45309);font-weight:600}.focus{align-items:center;gap:var(--roxy-space-md,1rem);padding:var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 9%, transparent);flex-wrap:wrap;display:flex}.age{justify-items:center;min-width:4.5rem;display:grid}.age .n{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:2rem;font-weight:700;line-height:1}.age .l{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.arrow{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.house{gap:2px;display:grid}.house .h{font-size:var(--roxy-text-lg,1.125rem);color:var(--roxy-fg,#0a0a0a);font-weight:600}.house .sign{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.house .sign .sg{margin-right:.3rem}.lord{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4rem .75rem;display:flex}.lord .label{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-size:var(--roxy-text-xs,.75rem)}.lord .value{color:var(--roxy-fg,#0a0a0a);font-weight:600}.lord .sub{color:var(--roxy-muted,#71717a)}.interp{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5);margin:0}`],Ur=d([(0,vs.customElement)("roxy-profection-card")],Ur);var xe=require("lit"),$s=require("lit/decorators.js");var ws=["name","english","title"],Fo=new Set(["description","meaning","characteristics","tagline","definedMeaning","undefinedMeaning","motto"]),Yo=new Set(["id","symbol",...ws]);function Vo(n){return Object.values(n).filter(a=>typeof a=="string"||typeof a=="number").map(String).join(" \xB7 ")}var Wr=class extends m{renderData(a){let e=a,r=this.deriveTitle(e),t=typeof e.symbol=="string"?e.symbol:void 0,s=Array.isArray(e.keywords)?e.keywords.map(String):[],o=[],i=[],l=[],c=(p,g,h)=>{if(g!=null){if(Array.isArray(g)){let S=g.filter(b=>b!=null).map(b=>typeof b=="object"?Vo(b):String(b)).filter(b=>b.length>0);S.length>0&&i.push([p,S])}else if(typeof g=="string")Fo.has(p)||g.length>48?o.push([p,g]):l.push([p,g]);else if(typeof g=="number"||typeof g=="boolean")l.push([p,String(g)]);else if(typeof g=="object"&&h<2)for(let[S,b]of Object.entries(g))c(`${p} ${S}`,b,h+1)}};for(let[p,g]of Object.entries(e))Yo.has(p)||p==="keywords"&&Array.isArray(g)||c(p,g,0);return xe.html`<article class="card" aria-label="${r}"><header class="head">${t?xe.html`<span class="symbol" aria-hidden="true">${t}</span>`:xe.nothing}<div><p class="label">Reference</p><h2 class="name">${r}</h2></div></header>${s.length>0?xe.html`<div class="chips">${s.map(p=>xe.html`<span>${p}</span>`)}</div>`:xe.nothing} ${o.map(([p,g])=>xe.html`<p class="prose"><span class="prose-label">${J(p)}</span>${g}</p>`)} ${l.length>0?xe.html`<div class="facts-wrap"><dl class="facts">${l.map(([p,g])=>xe.html`<div class="fact"><dt>${J(p)}</dt><dd>${g}</dd></div>`)}</dl></div>`:xe.nothing} ${i.map(([p,g])=>xe.html`<div class="list"><h3>${J(p)}</h3><div class="chips">${g.map(h=>xe.html`<span>${h}</span>`)}</div></div>`)}</article>`}renderEmpty(){return xe.html`<div class="roxy-empty" role="status">No reference data</div>`}deriveTitle(a){for(let t of ws)if(typeof a[t]=="string")return a[t];let e=typeof a.type=="string"?J(a.type):"",r=a.number;return r!=null?`${e} ${r}`.trim():"Reference"}};Wr.styles=[y,xe.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.symbol{color:var(--roxy-accent-ink,#b45309);flex:none;font-size:2.5rem;line-height:1}.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);margin:0}.prose{margin:0;line-height:1.6}.prose .prose-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px;display:block}.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}.list h3,.facts-wrap 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}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));margin:0;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize}.fact dd{font-size:var(--roxy-text-sm,.875rem);margin:0}`],Wr=d([(0,$s.customElement)("roxy-reference-card")],Wr);var me=require("lit"),Ss=require("lit/decorators.js");var ks=n=>z[u(n)]??z[n]??"",Jr=class extends m{renderEmpty(){return me.html`<div class="roxy-empty" role="status">No relocation data</div>`}renderData(a){let e=a.changes;return me.html`<div class="stack"><roxy-natal-chart heading="Relocation chart" .data="${a}"></roxy-natal-chart><section class="changes"><h3 class="title">What changes at this location</h3><div class="move">${typeof e?.distanceKm=="number"?me.html`<span>${Math.round(e.distanceKm).toLocaleString()} km ${e.direction??""} of birthplace</span>`:me.nothing} ${e?me.html`<span>Ascendant ${e.ascendantSignChanged?"changes sign":"keeps its sign"}</span>`:me.nothing}</div>${a.interpretation?.summary?me.html`<p class="summary">${a.interpretation.summary}</p>`:me.nothing} ${e?.angularPlanets?.length?me.html`<div><p class="block-label">Angular planets here</p><div class="chips">${e.angularPlanets.map(r=>me.html`<span class="chip">${ks(r)} ${r}</span>`)}</div></div>`:me.nothing}<div><p class="block-label">Planets that change house</p>${e?.planetsChangedHouse?.length?me.html`<ul class="moves-list">${e.planetsChangedHouse.map(r=>me.html`<li>${ks(r.planet)} ${r.planet}: house ${r.natalHouse} <span class="arrow">to</span> ${r.relocatedHouse}</li>`)}</ul>`:me.html`<p class="empty-note">No planet changes house at this location.</p>`}</div></section></div>`}};Jr.styles=[y,me.css`.stack{gap:var(--roxy-space-md,1rem);display:grid}.changes{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.move{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.summary{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.block-label{font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;color:var(--roxy-muted,#71717a);margin:0 0 var(--roxy-space-xs,.25rem);font-weight:600}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);padding:2px 10px}.moves-list{gap:2px;margin:0;padding:0;list-style:none;display:grid}.moves-list li{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.moves-list .arrow{color:var(--roxy-muted,#71717a)}.empty-note{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}`],Jr=d([(0,Ss.customElement)("roxy-relocation-wheel")],Jr);var Pe=require("lit"),Rs=require("lit/decorators.js");var xt=[{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)"}],Xr=class extends m{renderEmpty(){return Pe.html`<div class="roxy-empty" role="status">No shadbala data</div>`}renderData(a){if(!a.planets?.length)return this.renderEmpty();let e=[...a.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return Pe.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">${xt.map(r=>Pe.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(a){let e=z[u(a.planet)]??"",r=xt.map(c=>Math.max(0,a[c.key])),t=r.reduce((c,p)=>c+p,0),s=typeof a.strengthRatio=="number"&&a.strengthRatio>=1,o=s?"adequacy-badge--adequate":"adequacy-badge--weak",i=s?"adequate":"weak",l=f(a.totalRupas,2)&&f(a.minRequired,2)?`${f(a.totalRupas,2)} / ${f(a.minRequired,2)} R`:"";return Pe.html`<div class="planet-row" role="listitem" aria-label="${a.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${e}</span> ${a.planet} <span class="rank-badge" aria-label="rank ${a.relativeRank}">#${a.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${a.planet}">${t>0?xt.map((c,p)=>{let g=r[p];if(g<=0)return Pe.nothing;let h=g/t*100;return Pe.html`<div class="bar-segment" style="flex-grow:${h};background:${c.color}" title="${c.label}: ${f(g,1)}"></div>`}):Pe.nothing}</div></div><div class="pills">${l?Pe.html`<span class="rupas-label">${l}</span>`:Pe.nothing} <span class="${`adequacy-badge ${o}`}">${i}</span></div></div>`}};Xr.styles=[y,Pe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}}`],Xr=d([(0,Rs.customElement)("roxy-shadbala-table")],Xr);var k=require("lit"),Cs=require("lit/decorators.js");var bt=360,W=bt/2,ht=170,qo=154,ft=124,la=96,Zr=class extends m{renderEmpty(){return k.html`<div class="roxy-empty" role="status">No synastry data</div>`}renderData(a){let{person1:e,person2:r,compatibilityScore:t,analysis:s}=a,o=a.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,p=s?.overall,g=s?.strengths??[],h=s?.challenges??[];return i.length>0&&l.length>0?k.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?k.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:k.nothing}</div><svg viewBox="0 0 ${bt} ${bt}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${W}" cy="${W}" r="${ht}" stroke-width="1.5"/><circle class="wheel-line" cx="${W}" cy="${W}" r="${la+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${W}" cy="${W}" r="${la-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,o)} ${this.renderRing(i,ft,"p1",1)} ${this.renderRing(l,la,"p2",2)} ${this.renderAscendants(a)}</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>${p?k.html`<p class="summary">${p}</p>`:k.nothing} ${o.length>0?this.renderAspects(o):k.nothing} ${g.length>0||h.length>0?k.html`<div class="lists">${g.length?k.html`<div><h3>Strengths</h3><ul>${g.map(b=>k.html`<li>${b}</li>`)}</ul></div>`:k.nothing} ${h.length?k.html`<div><h3>Challenges</h3><ul>${h.map(b=>k.html`<li>${b}</li>`)}</ul></div>`:k.nothing}</div>`:k.nothing}</div>`:k.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?k.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:k.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>${p?k.html`<p class="summary">${p}</p>`:k.nothing} ${o.length>0?this.renderAspects(o):k.nothing} ${g.length>0||h.length>0?k.html`<div class="lists">${g.length?k.html`<div><h3>Strengths</h3><ul>${g.map(b=>k.html`<li>${b}</li>`)}</ul></div>`:k.nothing} ${h.length?k.html`<div><h3>Challenges</h3><ul>${h.map(b=>k.html`<li>${b}</li>`)}</ul></div>`:k.nothing}</div>`:k.nothing}</div>`}toAngle(a){return 180-a}renderSpokes(){return Array.from({length:12},(a,e)=>{let r=this.toAngle(e*30),t=_(W,W,la-14,r),s=_(W,W,ht,r);return k.svg`<line class="wheel-line" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return de.map((a,e)=>{let r=this.toAngle(e*30+15),t=_(W,W,qo,r);return k.svg`<text class="sign" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${ae[a]}</text>`})}renderRing(a,e,r,t){return a.map(s=>{if(!Number.isFinite(s.longitude))return k.nothing;let o=this.toAngle(s.longitude),i=_(W,W,e,o),c=_(W,W,e+(t===1?-12:-10),o),p=z[u(s.name)]??s.name.slice(0,2),g=Ge(s.longitude),h=s.isRetrograde===!0,S=`${g.degree}\xB0${String(g.minute).padStart(2,"0")}'`,b=`${s.name}${h?" retrograde":""} - ${S} ${g.sign}`;return k.svg`<g>
86
98
  <text class=${r} x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central"><title>${b}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${t}</tspan></text>
87
- <text class="planet-deg" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${y.degree}°${x?w.svg`<tspan class="retro"> ℞</tspan>`:w.nothing}</text>
88
- </g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=te.findIndex(x=>x.toLowerCase()===t.sign.toLowerCase());if(o===-1)return;let i=o*30+t.degree,l=this.toAngle(i),c=s===1?Ua+14:Fr+14,p=B(V,V,c,l),y=B(V,V,Ya+14,l);e.push(w.svg`<g>
89
- <line class="asc-tick" x1=${p.x} y1=${p.y} x2=${y.x} y2=${y.y} />
90
- <text class="asc-label" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
91
- </g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=h(o);for(let l of s)if(h(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return w.nothing;let l=B(V,V,Ua-12,this.toAngle(o)),c=B(V,V,Fr+8,this.toAngle(i)),p=jr(s),y=gr[p]??"aspect-other",x=f(s.orb,1);return w.svg`<line class=${`aspect ${y}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p} ${s.planet2}${x?` (orb ${x}\xB0)`:""}</title></line>`})}renderAspects(a){return w.html`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(e=>w.html`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${jr(e)||""}</td><td class="orb">${f(e.orb,1)}</td><td>${so(e.strength)}</td></tr>`)}</tbody></table>`}};Mr.styles=[g,w.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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);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{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;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}`],Mr=d([(0,Ft.customElement)("roxy-synastry-chart")],Mr);function so(n){return typeof n=="number"?Math.round(n).toString():""}var A=require("lit"),Ea=require("lit/decorators.js");var tr=class extends m{constructor(){super(...arguments);this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}renderEmpty(){return A.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderData(e){return"card"in e?this.renderDailyCard(e):this.renderFullCard(e)}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,s=r.keywords??[];return A.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?A.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:A.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?A.html`${r.arcana} arcana`:A.nothing} ${t?A.html`· reversed`:A.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?A.html`<p class="message">${e.dailyMessage}</p>`:A.nothing} ${r.meaning?A.html`<p>${r.meaning}</p>`:A.nothing} ${s.length>0?A.html`<div class="chips">${s.map(o=>A.html`<span>${o}</span>`)}</div>`:A.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,s=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return A.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?A.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:A.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?A.html`${e.arcana} arcana`:A.nothing} ${e.number!==void 0&&e.number!==null?A.html`· ${e.number}`:A.nothing} ${r?A.html`· reversed`:A.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?A.html`<p>${t.description}</p>`:A.nothing} ${s.length>0?A.html`<div class="chips">${s.map(o=>A.html`<span>${o}</span>`)}</div>`:A.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};tr.styles=[g,A.css`.card{background:var(--roxy-surface,#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,Ea.state)()],tr.prototype,"flipped",2),tr=d([(0,Ea.customElement)("roxy-tarot-card")],tr);var or=require("lit"),Da=require("lit/decorators.js");var sr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return or.html`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let r=e.cards??[];if(r.length===0)return this.renderEmpty();let t=this.heading||"Tarot deck",s=typeof e.total=="number"?e.total:r.length;return or.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"card":"cards"}</span></header><ul class="grid">${r.map(o=>or.html`<li class="tile">${o.imageUrl?or.html`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:or.html`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${oo(o)}</p></li>`)}</ul></section>`}};sr.styles=[g,or.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(7rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#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}.art{aspect-ratio:2/3;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}.meta{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0}`],d([(0,Da.property)({type:String,reflect:!0})],sr.prototype,"heading",2),sr=d([(0,Da.customElement)("roxy-tarot-catalog")],sr);function oo(n){return n.suit?`${h(n.arcana)} \xB7 ${h(n.suit)}`:`${h(n.arcana)} Arcana`}var z=require("lit"),Pa=require("lit/decorators.js");var nr=class extends m{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return z.html`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let r="answer"in e,t="cards"in e&&!("spread"in e),s=t?[]:"positions"in e?e.positions??[]:[],o=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," "),p="question"in e?e.question:void 0,y="summary"in e?e.summary:void 0,x=r?e.interpretation:void 0,j=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return z.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?z.html`<span class="question">"${p}"</span>`:z.nothing}</header>${r?z.html`<div><span class="${`answer ${j}`}">${i}</span> ${l?z.html`<small>· ${l}</small>`:z.nothing}</div>`:z.nothing} ${s.length>0?z.html`<div class="grid">${s.map(b=>z.html`<div class="card"><p class="label">${b.name??""}</p><div class="image">${b.card?.imageUrl?z.html`<img src="${b.card.imageUrl}" alt="${b.card.name??"tarot card"}" class="${b.card.reversed?"reversed":""}">`:z.html`${b.card?.name??"?"}`}</div><p class="name">${b.card?.name??""} ${b.card?.reversed?z.html`<small>(reversed)</small>`:z.nothing}</p>${b.interpretation?z.html`<p class="interp">${b.interpretation}</p>`:z.nothing}</div>`)}</div>`:z.nothing} ${o.length>0?z.html`<div class="grid">${o.map(b=>z.html`<div class="card"><div class="image">${b.imageUrl?z.html`<img src="${b.imageUrl}" alt="${b.name??"tarot card"}" class="${b.reversed?"reversed":""}">`:z.html`${b.name??"?"}`}</div><p class="name">${b.name??""} ${b.reversed?z.html`<small>(reversed)</small>`:z.nothing}</p>${b.meaning?z.html`<p class="interp">${b.meaning}</p>`:z.nothing}</div>`)}</div>`:z.nothing} ${y?z.html`<p class="reading">${y}</p>`:z.nothing} ${x?z.html`<p class="reading">${x}</p>`:z.nothing}</article>`}};nr.styles=[g,z.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-surface,#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,Pa.property)({type:String,reflect:!0})],nr.prototype,"spread",2),nr=d([(0,Pa.customElement)("roxy-tarot-spread")],nr);var M=require("lit"),za=require("lit/decorators.js");var ir=class extends m{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return M.html`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:r,transitTime:t,transitPlanets:s,transitAspects:o,summary:i}=e,l=[Ce(r),Ne(t)].filter(Boolean).join(" "),c=o?.length??0,p=this.tab;return M.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?M.html`<p class="subtitle">${l}</p>`:M.nothing}</div>${c>0?M.html`${Br({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:p,onSelect:y=>{this.tab=y},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?M.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:M.html`${i?this.renderSummaryPills(i):M.nothing}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:M.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</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 t=N[h(r.name)]??"",s=pe[h(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return M.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</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">${s}</span> ${r.sign}</div></td><td class="num">${f(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${f(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return M.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=N[h(r.transitPlanet)]??"",o=N[h(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return M.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${s}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${o}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${f(r.orb,2)}° · strength ${f(r.strength,1)} </span>${Re()}</summary><div class="interp-body">${l?.summary?M.html`<p>${l.summary}</p>`:M.nothing} ${l?.impact?M.html`<p><strong>Impact:</strong> ${l.impact}</p>`:M.nothing} ${l?.timing?M.html`<p><strong>Timing:</strong> ${l.timing}</p>`:M.nothing} ${l?.guidance?M.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:M.nothing} ${l?.keywords?.length?M.html`<div class="interp-keywords">${l.keywords.map(y=>M.html`<span class="kw">${y}</span>`)}</div>`:M.nothing}</div></details>`})}</div>`}};ir.styles=[g,Ue,Ke,M.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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,za.state)()],ir.prototype,"tab",2),ir=d([(0,za.customElement)("roxy-transits-table")],ir);var oe=require("lit"),qt=require("lit/decorators.js");var Gr=class extends m{renderEmpty(){return oe.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[];if(e.length===0&&r.length===0)return this.renderEmpty();let t=a.datetime?String(a.datetime).replace("T"," "):"";return oe.html`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${t?oe.html`<p class="subtitle">${t}</p>`:oe.nothing}</div>${r.length>0?oe.html`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(s=>oe.html`<span class="mutual-pill">${s.planet1} ⟷ ${s.planet2} ${s.aspectType?oe.html`<span class="rel">${s.aspectType}</span>`:oe.nothing}</span>`)}</div></div>`:oe.nothing} ${e.length>0?oe.html`<div class="overflow-scroll"><table><thead><tr><th scope="col">From</th><th scope="col">Aspect</th><th scope="col">To</th><th scope="col">Strength</th><th scope="col">Orb</th></tr></thead><tbody>${e.map(s=>oe.html`<tr><td>${s.aspectingPlanet}</td><td><span class="kind">${s.aspectType}</span></td><td>${s.aspectedPlanet}</td><td>${typeof s.strength=="number"?oe.html`<span class="bar" style="width:${Math.max(4,Math.min(100,s.strength)*.4)}px"></span><span class="num">${f(s.strength,0)}</span>`:oe.nothing}</td><td class="num">${typeof s.orb=="number"?`${f(s.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:oe.nothing}</div>`}};Gr.styles=[g,oe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}.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}.mutual{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.mutual-pill{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:.35rem;padding:2px 10px;display:inline-flex}.mutual-pill .rel{font-size:var(--roxy-text-xs,.75rem);font-weight:400}.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: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:.06em}tbody tr:last-child td{border-bottom:none}.kind{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);font-size:var(--roxy-text-xs,.75rem);padding:1px 8px;font-weight:600;display:inline-block}.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.bar{background:var(--roxy-accent,#f59e0b);vertical-align:middle;border-radius:3px;height:6px;margin-right:6px;display:inline-block}`],Gr=d([(0,qt.customElement)("roxy-vedic-aspects")],Gr);var Ja=require("lit"),qr=require("lit/decorators.js");var Ge=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e}}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?xa(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return Ja.html`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let t=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return Ja.html`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${fa(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>${ha(r,this.chartStyle)}</svg></div>`}};Ge.styles=[g,ba,Ue],d([(0,qr.property)({type:String,reflect:!0,attribute:"chart-style"})],Ge.prototype,"chartStyle",2),d([(0,qr.property)({type:String,reflect:!0,attribute:"chart-reference"})],Ge.prototype,"chartReference",2),d([(0,qr.property)({type:String,reflect:!0,attribute:"lagna-override"})],Ge.prototype,"lagnaOverride",2),Ge=d([(0,qr.customElement)("roxy-vedic-kundli")],Ge);var C=require("lit"),Vt=require("lit/decorators.js");var no=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Hr=class extends m{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of no){let s=a[t];s&&(r.push([t,s]),e.add(t))}for(let[t,s]of Object.entries(a))e.has(t)||r.push([t,s]);return r}renderEmpty(){return C.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return C.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 s=(t.graha??r)==="Lagna",o=N[h(t.graha??r)]??"",i=pe[h(t.rashi??"")]??"";return C.html`<tr class="${s?"lagna":""}"><td class="graha">${o?C.html`<span class="glyph">${o}</span>`:C.nothing}${t.graha??r}</td><td>${i?C.html`<span class="glyph">${i}</span>`:C.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?ya(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?C.html`<span class="retro">R</span>`:C.nothing}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let a=this.data?.combustion??[];return a.length===0?C.nothing:C.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>{let r=N[h(e.planet)]??"",t=f(e.distanceFromSun,2),s=f(e.orb,1);return C.html`<div class="condition"><span class="planet">${r?`${r} `:""}${e.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let a=this.data?.planetaryWar??[];return a.length===0?C.nothing:C.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>{let r=f(e.distance,2);return C.html`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let a=this.data?.interpretations??{},e=this.orderedRows().map(([r,t])=>[t.graha??r,a[t.graha??r]]).filter(([,r])=>r!=null);return e.length===0?C.nothing:C.html`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${Re()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=N[h(r)]??"";return C.html`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?C.html`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:C.nothing} ${t.nakshatra?C.html`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:C.nothing}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?C.nothing:C.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>C.html`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?C.html`<p class="desc">${e.description}</p>`:C.nothing}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?C.nothing:C.html`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>C.html`<div class="bhava"><span class="name">${e.name} ${e.quality?C.html`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:C.nothing}</span> ${e.result?C.html`<p class="desc">${e.result}</p>`:C.nothing}</div>`)}</div></details>`}};Hr.styles=[g,Ke,C.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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)}`],Hr=d([(0,Vt.customElement)("roxy-vedic-planets-table")],Hr);var ye=require("lit"),Yt=require("lit/decorators.js");var Or=class extends m{rows(){let a=this.data;if(!a)return[];let e=(a.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,t]of[["Ascendant",a.ascendant],["Midheaven",a.midheaven],["Part of Fortune",a.partOfFortune],["Vertex",a.vertex]])t&&e.push({name:r,sign:t.sign,longitude:t.longitude,isPoint:!0});return e}renderEmpty(){return ye.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return ye.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=N[h(r.name)]??"",s=pe[h(r.sign??"")]??"",o=typeof r.speed=="number"?f(r.speed,3):"";return ye.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?ye.html`<span class="glyph">${t}</span>`:ye.nothing}${r.name}</td><td>${s?ye.html`<span class="glyph">${s}</span>`:ye.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?ya(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?ye.html`${o}°/day`:ye.nothing} ${r.isRetrograde?ye.html`<span class="retro">℞</span>`:ye.nothing}</td></tr>`})}</tbody></table></div>`}};Or.styles=[g,ye.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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}`],Or=d([(0,Yt.customElement)("roxy-western-planets-table")],Or);var Z=require("lit"),Aa=require("lit/decorators.js");var lr=class extends m{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Z.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return Z.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Z.nothing}</p>${e.description?Z.html`<p class="description">${e.description}</p>`:Z.nothing} ${e.result?Z.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Z.nothing}</div>`}renderEmpty(){return Z.html`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return Z.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,p=r?c.filter(x=>x.name.toLowerCase().includes(r)):c,y=e.total;return Z.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${y!==void 0?Z.html`<span class="count">${y} total</span>`:Z.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">${p.length>0?p.map(x=>this.renderDetailCard(x)):Z.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let o=t,i=r?o.filter(c=>c.name.toLowerCase().includes(r)):o,l=e.total;return Z.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Z.html`<span class="count">${l} total</span>`:Z.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=>Z.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Z.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Z.html`<div class="roxy-empty" role="status">No yoga data</div>`}};lr.styles=[g,Z.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-surface,#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-surface,#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-surface,#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,Aa.state)()],lr.prototype,"filter",2),lr=d([(0,Aa.customElement)("roxy-yoga-list")],lr);var Na=[{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:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",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:"RoxyVedicAspects",tag:"roxy-vedic-aspects",slug:"vedic-aspects",heading:"Vedic aspects",description:"Vedic graha drishti table: which planet aspects which, with mutual aspects surfaced first",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/aspects",docsSummary:"Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",topic:"Vedic"},{pascal:"RoxyHoraTable",tag:"roxy-hora-table",slug:"hora-table",heading:"Hora",description:"Vedic Hora (planetary hours) table: 12 day and 12 night horas by ruling planet for electional timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/hora",docsSummary:"Day and night planetary hours with ruling planet and window",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,birth-day,maturity,daily,personal-day,personal-month,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:"RoxyTarotCatalog",tag:"roxy-tarot-catalog",slug:"tarot-catalog",heading:"Tarot deck",description:"Responsive tarot deck gallery with card art, name, and an arcana and suit caption from the tarot catalog response",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards",docsSummary:"Deck gallery tiles with card art, name, and arcana and suit",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:"RoxyHdConnection",tag:"roxy-hd-connection",slug:"hd-connection",heading:"HD connection",description:"Human Design connection chart: the composite channels two people form, with circuit, dynamic, and which person holds each gate",docsLabel:"Human Design",endpointLabel:"POST /human-design/connection",docsSummary:"Electromagnetic, compromise, and dominance channels between two charts",topic:"Human Design"},{pascal:"RoxyHdPenta",tag:"roxy-hd-penta",slug:"hd-penta",heading:"HD penta",description:"Human Design penta for a 3 to 5 person group: upper and lower triangle channels, defined or open, with core channels and member coverage",docsLabel:"Human Design",endpointLabel:"POST /human-design/penta",docsSummary:"Group penta channels split into upper and lower triangles",topic:"Human Design"},{pascal:"RoxyHdVariables",tag:"roxy-hd-variables",slug:"hd-variables",heading:"HD variables",description:"Human Design variables: the four PHS arrows (determination, environment, perspective, motivation) with left/right direction and color, tone, and base",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction and PHS labels",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:"RoxyForecastDigest",tag:"roxy-forecast-digest",slug:"forecast-digest",heading:"Forecast digest",description:"Rolled-up forecast across the next 24 hours, 7, 30, and 90 days with per-domain breakdown and top events",docsLabel:"Forecast",endpointLabel:"POST /forecast/digest",docsSummary:"Per-window event counts, domain breakdown, and the highest-significance events",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:"RoxyCrystalCard",tag:"roxy-crystal-card",slug:"crystal-card",heading:"Crystal detail",description:"Single-crystal detail card with photo, spiritual, emotional, and physical meaning, metaphysical attributes, affirmation, and pairings",docsLabel:"Crystals",endpointLabel:"GET /crystals/{id}",docsSummary:"Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",topic:"Crystals"},{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:"RoxyDreamSearch",tag:"roxy-dream-search",slug:"dream-search",heading:"Dream search",description:"Dream-symbol search results as selectable tiles; emits roxy-symbol-select to pair with roxy-dream-card",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols",docsSummary:"Matched dream symbols as selectable tiles with a 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, money, twin flame, biblical, and shadow 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:"RoxyReferenceCard",tag:"roxy-reference-card",slug:"reference-card",heading:"Reference card",description:"Glossary entry for any reference lookup: zodiac sign, planet meaning, rashi, I Ching trigram, Human Design gate or center, numerology number or compound number",docsLabel:"Reference",endpointLabel:"GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/rashis/{id}, /iching/trigrams/{id}, /human-design/{gates,centers}/{id}, /numerology/{meanings,compound-number}/{number}",docsSummary:"Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",topic:"Helpers"},{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, from the spec",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 Ut="0.11.0";var io=Na.map(n=>n.slug);
99
+ <text class="planet-deg" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${g.degree}°${h?k.svg`<tspan class="retro"> ℞</tspan>`:k.nothing}</text>
100
+ </g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=de.findIndex(h=>h.toLowerCase()===t.sign.toLowerCase());if(o===-1)return;let i=o*30+t.degree,l=this.toAngle(i),c=s===1?ft+14:la+14,p=_(W,W,c,l),g=_(W,W,ht+14,l);e.push(k.svg`<g>
101
+ <line class="asc-tick" x1=${p.x} y1=${p.y} x2=${g.x} y2=${g.y} />
102
+ <text class="asc-label" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
103
+ </g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=u(o);for(let l of s)if(u(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return k.nothing;let l=_(W,W,ft-12,this.toAngle(o)),c=_(W,W,la+8,this.toAngle(i)),p=aa(s),g=kr[p]??"aspect-other",h=f(s.orb,1);return k.svg`<line class=${`aspect ${g}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p} ${s.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}renderAspects(a){return k.html`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(e=>k.html`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${aa(e)||""}</td><td class="orb">${f(e.orb,1)}</td><td>${Uo(e.strength)}</td></tr>`)}</tbody></table>`}};Zr.styles=[y,k.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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);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{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;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}`],Zr=d([(0,Cs.customElement)("roxy-synastry-chart")],Zr);function Uo(n){return typeof n=="number"?Math.round(n).toString():""}var G=require("lit"),Xa=require("lit/decorators.js");var gr=class extends m{constructor(){super(...arguments);this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}renderEmpty(){return G.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderData(e){return"card"in e?this.renderDailyCard(e):this.renderFullCard(e)}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,s=r.keywords??[];return G.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?G.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:G.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?G.html`${r.arcana} arcana`:G.nothing} ${t?G.html`· reversed`:G.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?G.html`<p class="message">${e.dailyMessage}</p>`:G.nothing} ${r.meaning?G.html`<p>${r.meaning}</p>`:G.nothing} ${s.length>0?G.html`<div class="chips">${s.map(o=>G.html`<span>${o}</span>`)}</div>`:G.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,s=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return G.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?G.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:G.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?G.html`${e.arcana} arcana`:G.nothing} ${e.number!==void 0&&e.number!==null?G.html`· ${e.number}`:G.nothing} ${r?G.html`· reversed`:G.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?G.html`<p>${t.description}</p>`:G.nothing} ${s.length>0?G.html`<div class="chips">${s.map(o=>G.html`<span>${o}</span>`)}</div>`:G.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};gr.styles=[y,G.css`.card{background:var(--roxy-surface,#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,Xa.state)()],gr.prototype,"flipped",2),gr=d([(0,Xa.customElement)("roxy-tarot-card")],gr);var ur=require("lit"),Za=require("lit/decorators.js");var yr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return ur.html`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let r=e.cards??[];if(r.length===0)return this.renderEmpty();let t=this.heading||"Tarot deck",s=typeof e.total=="number"?e.total:r.length;return ur.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"card":"cards"}</span></header><ul class="grid">${r.map(o=>ur.html`<li class="tile">${o.imageUrl?ur.html`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:ur.html`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${Wo(o)}</p></li>`)}</ul></section>`}};yr.styles=[y,ur.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(7rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#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}.art{aspect-ratio:2/3;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}.meta{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0}`],d([(0,Za.property)({type:String,reflect:!0})],yr.prototype,"heading",2),yr=d([(0,Za.customElement)("roxy-tarot-catalog")],yr);function Wo(n){return n.suit?`${u(n.arcana)} \xB7 ${u(n.suit)}`:`${u(n.arcana)} Arcana`}var M=require("lit"),Qa=require("lit/decorators.js");var xr=class extends m{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return M.html`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let r="answer"in e,t="cards"in e&&!("spread"in e),s=t?[]:"positions"in e?e.positions??[]:[],o=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," "),p="question"in e?e.question:void 0,g="summary"in e?e.summary:void 0,h=r?e.interpretation:void 0,S=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return M.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?M.html`<span class="question">"${p}"</span>`:M.nothing}</header>${r?M.html`<div><span class="${`answer ${S}`}">${i}</span> ${l?M.html`<small>· ${l}</small>`:M.nothing}</div>`:M.nothing} ${s.length>0?M.html`<div class="grid">${s.map(b=>M.html`<div class="card"><p class="label">${b.name??""}</p><div class="image">${b.card?.imageUrl?M.html`<img src="${b.card.imageUrl}" alt="${b.card.name??"tarot card"}" class="${b.card.reversed?"reversed":""}">`:M.html`${b.card?.name??"?"}`}</div><p class="name">${b.card?.name??""} ${b.card?.reversed?M.html`<small>(reversed)</small>`:M.nothing}</p>${b.interpretation?M.html`<p class="interp">${b.interpretation}</p>`:M.nothing}</div>`)}</div>`:M.nothing} ${o.length>0?M.html`<div class="grid">${o.map(b=>M.html`<div class="card"><div class="image">${b.imageUrl?M.html`<img src="${b.imageUrl}" alt="${b.name??"tarot card"}" class="${b.reversed?"reversed":""}">`:M.html`${b.name??"?"}`}</div><p class="name">${b.name??""} ${b.reversed?M.html`<small>(reversed)</small>`:M.nothing}</p>${b.meaning?M.html`<p class="interp">${b.meaning}</p>`:M.nothing}</div>`)}</div>`:M.nothing} ${g?M.html`<p class="reading">${g}</p>`:M.nothing} ${h?M.html`<p class="reading">${h}</p>`:M.nothing}</article>`}};xr.styles=[y,M.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-surface,#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,Qa.property)({type:String,reflect:!0})],xr.prototype,"spread",2),xr=d([(0,Qa.customElement)("roxy-tarot-spread")],xr);var j=require("lit"),et=require("lit/decorators.js");var hr=class extends m{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return j.html`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:r,transitTime:t,transitPlanets:s,transitAspects:o,summary:i}=e,l=[Le(r),Ke(t)].filter(Boolean).join(" "),c=o?.length??0,p=this.tab;return j.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?j.html`<p class="subtitle">${l}</p>`:j.nothing}</div>${c>0?j.html`${oa({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:p,onSelect:g=>{this.tab=g},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?j.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:j.html`${i?this.renderSummaryPills(i):j.nothing}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:j.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return j.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 j.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=z[u(r.name)]??"",s=ae[u(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return j.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?j.html`<span class="retro-badge" aria-label="retrograde">R</span>`:j.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${f(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${f(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return j.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=z[u(r.transitPlanet)]??"",o=z[u(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return j.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${s}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${o}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${f(r.orb,2)}° · strength ${f(r.strength,1)} </span>${le()}</summary><div class="interp-body">${l?.summary?j.html`<p>${l.summary}</p>`:j.nothing} ${l?.impact?j.html`<p><strong>Impact:</strong> ${l.impact}</p>`:j.nothing} ${l?.timing?j.html`<p><strong>Timing:</strong> ${l.timing}</p>`:j.nothing} ${l?.guidance?j.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:j.nothing} ${l?.keywords?.length?j.html`<div class="interp-keywords">${l.keywords.map(g=>j.html`<span class="kw">${g}</span>`)}</div>`:j.nothing}</div></details>`})}</div>`}};hr.styles=[y,tr,ke,j.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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,et.state)()],hr.prototype,"tab",2),hr=d([(0,et.customElement)("roxy-transits-table")],hr);var ge=require("lit"),zs=require("lit/decorators.js");var Qr=class extends m{renderEmpty(){return ge.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[];if(e.length===0&&r.length===0)return this.renderEmpty();let t=a.datetime?String(a.datetime).replace("T"," "):"";return ge.html`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${t?ge.html`<p class="subtitle">${t}</p>`:ge.nothing}</div>${r.length>0?ge.html`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(s=>ge.html`<span class="mutual-pill">${s.planet1} ⟷ ${s.planet2} ${s.aspectType?ge.html`<span class="rel">${s.aspectType}</span>`:ge.nothing}</span>`)}</div></div>`:ge.nothing} ${e.length>0?ge.html`<div class="overflow-scroll"><table><thead><tr><th scope="col">From</th><th scope="col">Aspect</th><th scope="col">To</th><th scope="col">Strength</th><th scope="col">Orb</th></tr></thead><tbody>${e.map(s=>ge.html`<tr><td>${s.aspectingPlanet}</td><td><span class="kind">${s.aspectType}</span></td><td>${s.aspectedPlanet}</td><td>${typeof s.strength=="number"?ge.html`<span class="bar" style="width:${Math.max(4,Math.min(100,s.strength)*.4)}px"></span><span class="num">${f(s.strength,0)}</span>`:ge.nothing}</td><td class="num">${typeof s.orb=="number"?`${f(s.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:ge.nothing}</div>`}};Qr.styles=[y,ge.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);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: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}.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}.mutual{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.mutual-pill{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:.35rem;padding:2px 10px;display:inline-flex}.mutual-pill .rel{font-size:var(--roxy-text-xs,.75rem);font-weight:400}.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: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:.06em}tbody tr:last-child td{border-bottom:none}.kind{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);font-size:var(--roxy-text-xs,.75rem);padding:1px 8px;font-weight:600;display:inline-block}.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.bar{background:var(--roxy-accent,#f59e0b);vertical-align:middle;border-radius:3px;height:6px;margin-right:6px;display:inline-block}`],Qr=d([(0,zs.customElement)("roxy-vedic-aspects")],Qr);var vt=require("lit"),da=require("lit/decorators.js");var Ye=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e}}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}renderEmpty(){return vt.html`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let t=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return vt.html`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${Ba(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>${ja(r,this.chartStyle)}</svg></div>`}};Ye.styles=[y,Ia,tr],d([(0,da.property)({type:String,reflect:!0,attribute:"chart-style"})],Ye.prototype,"chartStyle",2),d([(0,da.property)({type:String,reflect:!0,attribute:"chart-reference"})],Ye.prototype,"chartReference",2),d([(0,da.property)({type:String,reflect:!0,attribute:"lagna-override"})],Ye.prototype,"lagnaOverride",2),Ye=d([(0,da.customElement)("roxy-vedic-kundli")],Ye);var E=require("lit"),Ts=require("lit/decorators.js");var Jo=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],ea=class extends m{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of Jo){let s=a[t];s&&(r.push([t,s]),e.add(t))}for(let[t,s]of Object.entries(a))e.has(t)||r.push([t,s]);return r}renderEmpty(){return E.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return E.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 s=(t.graha??r)==="Lagna",o=z[u(t.graha??r)]??"",i=ae[u(t.rashi??"")]??"";return E.html`<tr class="${s?"lagna":""}"><td class="graha">${o?E.html`<span class="glyph">${o}</span>`:E.nothing}${t.graha??r}</td><td>${i?E.html`<span class="glyph">${i}</span>`:E.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Ga(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?E.html`<span class="retro">R</span>`:E.nothing}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let a=this.data?.combustion??[];return a.length===0?E.nothing:E.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${le()}</summary><div class="panel-body">${a.map(e=>{let r=z[u(e.planet)]??"",t=f(e.distanceFromSun,2),s=f(e.orb,1);return E.html`<div class="condition"><span class="planet">${r?`${r} `:""}${e.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let a=this.data?.planetaryWar??[];return a.length===0?E.nothing:E.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${le()}</summary><div class="panel-body">${a.map(e=>{let r=f(e.distance,2);return E.html`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let a=this.data?.interpretations??{},e=this.orderedRows().map(([r,t])=>[t.graha??r,a[t.graha??r]]).filter(([,r])=>r!=null);return e.length===0?E.nothing:E.html`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${le()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=z[u(r)]??"";return E.html`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?E.html`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:E.nothing} ${t.nakshatra?E.html`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:E.nothing}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?E.nothing:E.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${le()}</summary><div class="panel-body">${a.map(e=>E.html`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?E.html`<p class="desc">${e.description}</p>`:E.nothing}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?E.nothing:E.html`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${le()}</summary><div class="panel-body">${a.map(e=>E.html`<div class="bhava"><span class="name">${e.name} ${e.quality?E.html`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:E.nothing}</span> ${e.result?E.html`<p class="desc">${e.result}</p>`:E.nothing}</div>`)}</div></details>`}};ea.styles=[y,ke,E.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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)}`],ea=d([(0,Ts.customElement)("roxy-vedic-planets-table")],ea);var we=require("lit"),Es=require("lit/decorators.js");var ra=class extends m{rows(){let a=this.data;if(!a)return[];let e=(a.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,t]of[["Ascendant",a.ascendant],["Midheaven",a.midheaven],["Part of Fortune",a.partOfFortune],["Vertex",a.vertex]])t&&e.push({name:r,sign:t.sign,longitude:t.longitude,isPoint:!0});return e}renderEmpty(){return we.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return we.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=z[u(r.name)]??"",s=ae[u(r.sign??"")]??"",o=typeof r.speed=="number"?f(r.speed,3):"";return we.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?we.html`<span class="glyph">${t}</span>`:we.nothing}${r.name}</td><td>${s?we.html`<span class="glyph">${s}</span>`:we.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Ga(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?we.html`${o}°/day`:we.nothing} ${r.isRetrograde?we.html`<span class="retro">℞</span>`:we.nothing}</td></tr>`})}</tbody></table></div>`}};ra.styles=[y,we.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#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}`],ra=d([(0,Es.customElement)("roxy-western-planets-table")],ra);var H=require("lit"),rt=require("lit/decorators.js");var fr=class extends m{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return H.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return H.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):H.nothing}</p>${e.description?H.html`<p class="description">${e.description}</p>`:H.nothing} ${e.result?H.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:H.nothing}</div>`}renderDetectCard(e){return H.html`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):H.nothing} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?H.html`<p class="description">${e.description}</p>`:H.nothing} ${e.present&&e.result?H.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:H.nothing} ${e.evidence?H.html`<p class="evidence">${e.evidence}</p>`:H.nothing}</div>`}renderEmpty(){return H.html`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return H.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"present"in t[0]){let c=t,p=r?c.filter(S=>S.name.toLowerCase().includes(r)):c,g=[...p.filter(S=>S.present),...p.filter(S=>!S.present)],h=e.total??c.filter(S=>S.present).length;return H.html`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${h} of ${c.length} present</span></div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter detected yogas by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Detected yogas">${g.length>0?g.map(S=>this.renderDetectCard(S)):H.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}if(t.length>0&&"description"in t[0]){let c=t,p=r?c.filter(h=>h.name.toLowerCase().includes(r)):c,g=e.total;return H.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${g!==void 0?H.html`<span class="count">${g} total</span>`:H.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">${p.length>0?p.map(h=>this.renderDetailCard(h)):H.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let o=t,i=r?o.filter(c=>c.name.toLowerCase().includes(r)):o,l=e.total;return H.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?H.html`<span class="count">${l} total</span>`:H.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=>H.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):H.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return H.html`<div class="roxy-empty" role="status">No yoga data</div>`}};fr.styles=[y,H.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-surface,#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-surface,#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-surface,#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)}.present-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.present-badge.is-present{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.present-badge.is-absent{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);color:var(--roxy-fg,#0a0a0a)}.detail-card.absent{opacity:.72}.evidence{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.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,rt.state)()],fr.prototype,"filter",2),fr=d([(0,rt.customElement)("roxy-yoga-list")],fr);var at=[{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:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",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:"RoxyAstrocartographyMap",tag:"roxy-astrocartography-map",slug:"astrocartography-map",heading:"Astrocartography",description:"Astrocartography world map plotting each body Midheaven, IC, Ascendant, and Descendant relocation lines",docsLabel:"Western",endpointLabel:"POST /astrology/astrocartography",docsSummary:"World map of planetary MC, IC, Ascendant, and Descendant lines with per-line interpretations",topic:"Astrology"},{pascal:"RoxyLocalSpaceCompass",tag:"roxy-local-space-compass",slug:"local-space-compass",heading:"Local space",description:"Local space compass plotting each body direction from the birthplace by azimuth and altitude",docsLabel:"Western",endpointLabel:"POST /astrology/local-space",docsSummary:"Compass dial of planetary azimuth lines from the birthplace, dimmed below the horizon",topic:"Astrology"},{pascal:"RoxyRelocationWheel",tag:"roxy-relocation-wheel",slug:"relocation-wheel",heading:"Relocation chart",description:"Relocation chart wheel recomputing houses and angles for a new place, with the planets that change house",docsLabel:"Western",endpointLabel:"POST /astrology/relocation-chart",docsSummary:"Relocated chart wheel plus the move geometry, angular planets, and planets that change house",topic:"Astrology"},{pascal:"RoxyPositionsTable",tag:"roxy-positions-table",slug:"positions-table",heading:"Positions table",description:"Editorial positions table for asteroids, Black Moon Lilith, secondary progressions, solar arc directions, and the Arabic lots",docsLabel:"Western",endpointLabel:"POST /astrology/asteroids, /astrology/lilith, /astrology/progressions, /astrology/solar-arc, /astrology/arabic-lots",docsSummary:"Body, sign, degree, and per-shape columns (house, motion, formula, or natal arc) plus each reading",topic:"Astrology"},{pascal:"RoxyFixedStars",tag:"roxy-fixed-stars",slug:"fixed-stars",heading:"Fixed stars",description:"Fixed star conjunctions to the natal chart, tightest first, with the precessed star catalog",docsLabel:"Western",endpointLabel:"POST /astrology/fixed-stars",docsSummary:"Star to natal point conjunctions with readings, plus a catalog of position, magnitude, nature, and keywords",topic:"Astrology"},{pascal:"RoxyProfectionCard",tag:"roxy-profection-card",slug:"profection-card",heading:"Annual profection",description:"Annual profection card with the profected house and sign, the lord of the year, and its natal placement",docsLabel:"Western",endpointLabel:"POST /astrology/profections",docsSummary:"Profected house and sign for the year, the lord of the year, its natal placement, and the reading",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:"RoxyVedicAspects",tag:"roxy-vedic-aspects",slug:"vedic-aspects",heading:"Vedic aspects",description:"Vedic graha drishti table: which planet aspects which, with mutual aspects surfaced first",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/aspects",docsSummary:"Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",topic:"Vedic"},{pascal:"RoxyHoraTable",tag:"roxy-hora-table",slug:"hora-table",heading:"Hora",description:"Vedic Hora (planetary hours) table: 12 day and 12 night horas by ruling planet for electional timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/hora",docsSummary:"Day and night planetary hours with ruling planet and window",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,birth-day,maturity,daily,personal-day,personal-month,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:"RoxyTarotCatalog",tag:"roxy-tarot-catalog",slug:"tarot-catalog",heading:"Tarot deck",description:"Responsive tarot deck gallery with card art, name, and an arcana and suit caption from the tarot catalog response",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards",docsSummary:"Deck gallery tiles with card art, name, and arcana and suit",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:"RoxyHdConnection",tag:"roxy-hd-connection",slug:"hd-connection",heading:"HD connection",description:"Human Design connection chart: the composite channels two people form, with circuit, dynamic, and which person holds each gate",docsLabel:"Human Design",endpointLabel:"POST /human-design/connection",docsSummary:"Electromagnetic, compromise, and dominance channels between two charts",topic:"Human Design"},{pascal:"RoxyHdPenta",tag:"roxy-hd-penta",slug:"hd-penta",heading:"HD penta",description:"Human Design penta for a 3 to 5 person group: upper and lower triangle channels, defined or open, with core channels and member coverage",docsLabel:"Human Design",endpointLabel:"POST /human-design/penta",docsSummary:"Group penta channels split into upper and lower triangles",topic:"Human Design"},{pascal:"RoxyHdVariables",tag:"roxy-hd-variables",slug:"hd-variables",heading:"HD variables",description:"Human Design variables: the four PHS arrows (determination, environment, perspective, motivation) with left/right direction and color, tone, and base",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction and PHS labels",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:"RoxyForecastDigest",tag:"roxy-forecast-digest",slug:"forecast-digest",heading:"Forecast digest",description:"Rolled-up forecast across the next 24 hours, 7, 30, and 90 days with per-domain breakdown and top events",docsLabel:"Forecast",endpointLabel:"POST /forecast/digest",docsSummary:"Per-window event counts, domain breakdown, and the highest-significance events",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:"RoxyCrystalCard",tag:"roxy-crystal-card",slug:"crystal-card",heading:"Crystal detail",description:"Single-crystal detail card with photo, spiritual, emotional, and physical meaning, metaphysical attributes, affirmation, and pairings",docsLabel:"Crystals",endpointLabel:"GET /crystals/{id}",docsSummary:"Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",topic:"Crystals"},{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:"RoxyDreamSearch",tag:"roxy-dream-search",slug:"dream-search",heading:"Dream search",description:"Dream-symbol search results as selectable tiles; emits roxy-symbol-select to pair with roxy-dream-card",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols",docsSummary:"Matched dream symbols as selectable tiles with a 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, money, twin flame, biblical, and shadow 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:"RoxyReferenceCard",tag:"roxy-reference-card",slug:"reference-card",heading:"Reference card",description:"Glossary entry for any reference lookup: zodiac sign, planet meaning, rashi, I Ching trigram, Human Design gate or center, numerology number or compound number",docsLabel:"Reference",endpointLabel:"GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/rashis/{id}, /iching/trigrams/{id}, /human-design/{gates,centers}/{id}, /numerology/{meanings,compound-number}/{number}",docsSummary:"Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",topic:"Helpers"},{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, from the spec",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 As="0.12.0";var Xo=at.map(n=>n.slug);
92
104
  //# sourceMappingURL=index.cjs.map