@roxyapi/ui 0.6.0 → 0.7.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.
- package/AGENTS.md +13 -0
- package/README.md +1 -1
- package/THEMING.md +1 -1
- package/dist/cdn/components/ashtakavarga-grid.js +1 -1
- package/dist/cdn/components/ashtakavarga-grid.js.map +2 -2
- package/dist/cdn/components/biorhythm-chart.js +3 -3
- package/dist/cdn/components/biorhythm-chart.js.map +2 -2
- package/dist/cdn/components/choghadiya-grid.js +1 -1
- package/dist/cdn/components/choghadiya-grid.js.map +2 -2
- package/dist/cdn/components/compatibility-card.js +1 -1
- package/dist/cdn/components/compatibility-card.js.map +2 -2
- package/dist/cdn/components/dasha-timeline.js +3 -3
- package/dist/cdn/components/dasha-timeline.js.map +4 -4
- package/dist/cdn/components/divisional-chart.js +67 -1
- package/dist/cdn/components/divisional-chart.js.map +2 -2
- package/dist/cdn/components/endpoint-form.js +2 -2
- package/dist/cdn/components/endpoint-form.js.map +2 -2
- package/dist/cdn/components/guna-milan.js +1 -1
- package/dist/cdn/components/guna-milan.js.map +2 -2
- package/dist/cdn/components/hexagram.js +1 -1
- package/dist/cdn/components/hexagram.js.map +2 -2
- package/dist/cdn/components/horoscope-card.js +1 -1
- package/dist/cdn/components/horoscope-card.js.map +2 -2
- package/dist/cdn/components/kp-chart.js +1 -1
- package/dist/cdn/components/kp-chart.js.map +2 -2
- package/dist/cdn/components/kp-ruling-planets.js +1 -1
- package/dist/cdn/components/kp-ruling-planets.js.map +2 -2
- package/dist/cdn/components/location-search.js +1 -1
- package/dist/cdn/components/location-search.js.map +2 -2
- package/dist/cdn/components/nakshatra-card.js +1 -1
- package/dist/cdn/components/nakshatra-card.js.map +2 -2
- package/dist/cdn/components/natal-chart.js +12 -3
- package/dist/cdn/components/natal-chart.js.map +2 -2
- package/dist/cdn/components/numerology-card.js +2 -2
- package/dist/cdn/components/numerology-card.js.map +2 -2
- package/dist/cdn/components/panchang-table.js +3 -3
- package/dist/cdn/components/panchang-table.js.map +3 -3
- package/dist/cdn/components/shadbala-table.js +1 -1
- package/dist/cdn/components/shadbala-table.js.map +2 -2
- package/dist/cdn/components/synastry-chart.js +8 -2
- package/dist/cdn/components/synastry-chart.js.map +2 -2
- package/dist/cdn/components/transits-table.js +2 -2
- package/dist/cdn/components/transits-table.js.map +2 -2
- package/dist/cdn/components/vedic-kundli.js +67 -1
- package/dist/cdn/components/vedic-kundli.js.map +2 -2
- package/dist/cdn/components/vedic-planets-table.js +3 -3
- package/dist/cdn/components/vedic-planets-table.js.map +4 -4
- package/dist/cdn/components/yoga-list.js +2 -2
- package/dist/cdn/components/yoga-list.js.map +2 -2
- package/dist/cdn/roxy-ui.js +84 -3
- package/dist/cdn/roxy-ui.js.map +4 -4
- package/dist/components/ashtakavarga-grid.js +1 -1
- package/dist/components/ashtakavarga-grid.js.map +3 -3
- package/dist/components/biorhythm-chart.js +1 -1
- package/dist/components/biorhythm-chart.js.map +2 -2
- package/dist/components/choghadiya-grid.js +1 -1
- package/dist/components/choghadiya-grid.js.map +2 -2
- package/dist/components/compatibility-card.js +1 -1
- package/dist/components/compatibility-card.js.map +2 -2
- package/dist/components/dasha-timeline.d.ts.map +1 -1
- package/dist/components/dasha-timeline.js +1 -1
- package/dist/components/dasha-timeline.js.map +4 -4
- package/dist/components/divisional-chart.js +67 -1
- package/dist/components/divisional-chart.js.map +2 -2
- package/dist/components/endpoint-form.js +1 -1
- package/dist/components/endpoint-form.js.map +2 -2
- package/dist/components/guna-milan.js +1 -1
- package/dist/components/guna-milan.js.map +2 -2
- package/dist/components/hexagram.js +1 -1
- package/dist/components/hexagram.js.map +2 -2
- package/dist/components/horoscope-card.js +1 -1
- package/dist/components/horoscope-card.js.map +2 -2
- package/dist/components/kp-chart.js +1 -1
- package/dist/components/kp-chart.js.map +2 -2
- package/dist/components/kp-ruling-planets.js +1 -1
- package/dist/components/kp-ruling-planets.js.map +2 -2
- package/dist/components/location-search.js +1 -1
- package/dist/components/location-search.js.map +2 -2
- package/dist/components/nakshatra-card.js +1 -1
- package/dist/components/nakshatra-card.js.map +2 -2
- package/dist/components/natal-chart.js +10 -1
- package/dist/components/natal-chart.js.map +2 -2
- package/dist/components/numerology-card.js +1 -1
- package/dist/components/numerology-card.js.map +2 -2
- package/dist/components/panchang-table.d.ts +22 -1
- package/dist/components/panchang-table.d.ts.map +1 -1
- package/dist/components/panchang-table.js +1 -1
- package/dist/components/panchang-table.js.map +3 -3
- package/dist/components/shadbala-table.js +1 -1
- package/dist/components/shadbala-table.js.map +2 -2
- package/dist/components/synastry-chart.js +7 -1
- package/dist/components/synastry-chart.js.map +2 -2
- package/dist/components/transits-table.js +1 -1
- package/dist/components/transits-table.js.map +2 -2
- package/dist/components/vedic-kundli.js +67 -1
- package/dist/components/vedic-kundli.js.map +2 -2
- package/dist/components/vedic-planets-table.d.ts +14 -0
- package/dist/components/vedic-planets-table.d.ts.map +1 -1
- package/dist/components/vedic-planets-table.js +1 -1
- package/dist/components/vedic-planets-table.js.map +4 -4
- package/dist/components/yoga-list.js +1 -1
- package/dist/components/yoga-list.js.map +2 -2
- package/dist/index.cjs +82 -1
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +82 -1
- package/dist/index.js.map +4 -4
- package/dist/styles/tokens.css +4 -4
- package/dist/types/types.gen.d.ts +679 -40
- package/dist/types/types.gen.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/ashtakavarga-grid.ts +1 -1
- package/src/components/biorhythm-chart.ts +1 -1
- package/src/components/choghadiya-grid.ts +1 -1
- package/src/components/compatibility-card.ts +2 -2
- package/src/components/dasha-timeline.ts +10 -19
- package/src/components/endpoint-form.ts +2 -2
- package/src/components/guna-milan.ts +1 -1
- package/src/components/hexagram.ts +3 -3
- package/src/components/horoscope-card.ts +1 -1
- package/src/components/kp-chart.ts +1 -1
- package/src/components/kp-ruling-planets.ts +1 -1
- package/src/components/location-search.ts +1 -1
- package/src/components/nakshatra-card.ts +1 -1
- package/src/components/natal-chart.ts +5 -5
- package/src/components/numerology-card.ts +2 -2
- package/src/components/panchang-table.ts +112 -18
- package/src/components/shadbala-table.ts +1 -1
- package/src/components/synastry-chart.ts +4 -4
- package/src/components/transits-table.ts +1 -1
- package/src/components/vedic-planets-table.ts +221 -3
- package/src/components/yoga-list.ts +1 -1
- package/src/styles/tokens.css +4 -4
- package/src/types/types.gen.ts +680 -41
- package/src/utils/kundli-styles.ts +2 -2
- package/src/utils/tablist.ts +1 -1
- package/src/version.ts +1 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1,83 @@
|
|
|
1
|
-
var Dt=Object.defineProperty;var Gt=Object.getOwnPropertyDescriptor;var d=(o,n,e,r)=>{for(var t=r>1?void 0:r?Gt(n,e):n,a=o.length-1,s;a>=0;a--)(s=o[a])&&(t=(r?s(n,e,t):s(t))||t);return r&&t&&Dt(n,e,t),t};import{css as jt,html as Y,LitElement as Kt,nothing as Bt}from"lit";import{customElement as _t,property as Yt,state as Vt}from"lit/decorators.js";var C={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"},_={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Rr={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},D=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],No=D.map(o=>o.toLowerCase()),Kr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},Br={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}"};import{css as Ot}from"lit";var g=Ot`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var Ht="roxy-data";function It(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var h=class{constructor(n){this.host=n,n.addController(this)}hostConnected(){if(this.host.data!=null)return;let n=this.read();n!==void 0&&(this.host.data=n,this.host.requestUpdate())}read(){let n=this.findInlineScript();return n?this.parse(n.textContent):void 0}findInlineScript(){for(let n of Array.from(this.host.children))if(It(n)&&n.classList.contains(Ht))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var qt={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Be=["sarva","bhinna","pinda"],fe=class extends Kt{constructor(){super();this.data=null;this.activeTab="sarva";new h(this)}render(){if(!this.data)return Y`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return Y`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?Y`<p class="subtitle">${e.length} signs</p>`:Bt}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Be.map(r=>Y`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${qt[r]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=Be.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Be[(r+1)%Be.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Be[(r-1+Be.length)%Be.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?Y`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,a)=>{let s=r.bindus[a]??0,i=this.sarvaHeat(s);return Y`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${_[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${s}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:Y`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?Y`<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=>Y`<th scope="col" title="${t}">${_[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>Y`<tr><td>${t.planet}</td>${t.bindus.map(a=>{let s=this.bhinnaHeat(a);return Y`<td class="${`heat-cell ${s}`}">${a}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:Y`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?Y`<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=>Y`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:Y`<p class="roxy-empty">No shodhya pinda data</p>`}};fe.styles=[g,jt`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-fg,#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([Yt({attribute:!1})],fe.prototype,"data",2),d([Vt()],fe.prototype,"activeTab",2),fe=d([_t("roxy-ashtakavarga-grid")],fe);import{css as Ft,html as se,LitElement as Ut,nothing as Pr,svg as Wt}from"lit";import{customElement as Jt,property as it}from"lit/decorators.js";var lt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},be=class extends Ut{constructor(){super();this.data=null;this.mode="daily";new h(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):se`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([a,s])=>{let i=typeof s=="number"?s:0,l=Math.abs(i)>1?i/100:i;return[a,l]});return se`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?se`<span class="energy">Energy ${e.energyRating}/10</span>`:Pr}</header><div class="bars" role="list">${t.map(([a,s])=>{let i=(s+1)/2*100,l=lt[a]??"var(--roxy-accent, #f59e0b)";return se`<div class="bar" role="listitem"><span style="text-transform:capitalize">${a}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(s*100)}%</span></div>`})}</div>${e.dailyMessage?se`<p class="advice">${e.dailyMessage}</p>`:Pr} ${e.advice?se`<p class="advice">${e.advice}</p>`:Pr}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return se`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,a=160,s=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return se`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${a}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${a/2}" x2="${t}" y2="${a/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((m,y)=>{let b=m[l]??0,u=y*s,Ke=a/2-b/100*(a/2-8);return`${u.toFixed(2)},${Ke.toFixed(2)}`}).join(" "),p=lt[l]??"#475569";return Wt`<polyline points="${c}" fill="none" stroke="${p}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">`})}</svg> ${e.summary?.periodAdvice?se`<p class="advice">${e.summary.periodAdvice}</p>`:Pr}</section>`}renderCritical(e){return se`<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`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};be.styles=[g,Ft`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-fg,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([it({attribute:!1})],be.prototype,"data",2),d([it({type:String,reflect:!0})],be.prototype,"mode",2),be=d([Jt("roxy-biorhythm-chart")],be);import{css as Xt,html as $e,LitElement as Zt,nothing as _r}from"lit";import{customElement as Qt,property as ea}from"lit/decorators.js";function v(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function ve(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,n=>n.toUpperCase())}function dt(o){try{let n=new Date(o);return Number.isNaN(n.getTime())?o:n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return o}}var _e=class extends Zt{constructor(){super();this.data=null;new h(this)}isCurrent(e){let r=Date.now(),t=Date.parse(e.start),a=Date.parse(e.end);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",t=this.isCurrent(e),a=C[v(e.lord)]??"",s=`${dt(e.start)} - ${dt(e.end)}`;return $e`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?$e`<span class="now-badge">Now</span>`:_r} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${a?$e`<span aria-hidden="true">${a}</span>`:_r} ${e.lord}</span></div>`}render(){if(!this.data)return $e`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return $e`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?$e`<p class="subtitle">${e}</p>`:_r}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(a=>this.renderTile(a)):$e`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(a=>this.renderTile(a)):$e`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};_e.styles=[g,Xt`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],d([ea({attribute:!1})],_e.prototype,"data",2),_e=d([Qt("roxy-choghadiya-grid")],_e);import{css as ra,html as G,LitElement as ta,nothing as Z}from"lit";import{customElement as aa,property as pt}from"lit/decorators.js";function le(o){if(typeof o!="string"||o.length===0||/^\d{4}-\d{2}-\d{2}$/.test(o))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(o)?`1970-01-01T${o}`:o,r=new Date(e);return Number.isNaN(r.getTime())?o:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Ar(o){if(typeof o!="string"||o.length===0)return"";let n=new Date(/^\d{4}-\d{2}-\d{2}$/.test(o)?`${o}T00:00:00`:o);return Number.isNaN(n.getTime())?o:n.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Yr(o){if(!o)return"";let n=le(o.start),e=le(o.end);return n&&e?`${n} - ${e}`:n||e||""}function f(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function ct(o,n=1){let e=f(o,n);return e?`${e}%`:""}var xr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function ar(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var we=class extends ta{constructor(){super();this.data=null;this.mode="astrology";new h(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,a]of Object.entries(e.categories))typeof a=="number"&&Number.isFinite(a)&&(r[t]=a);return r}return{}}render(){let e=this.data;if(!e)return G`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),a="rating"in e?e.rating:void 0,s="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,p="strengths"in e?e.strengths:void 0,m="challenges"in e?e.challenges:void 0,y="keyAspects"in e?e.keyAspects:void 0;return G`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?G`<div class="score">${f(r,0)}</div>`:Z} ${a?G`<div class="rating">${a}</div>`:Z}</div></div>${Object.keys(t).length>0?G`<div role="list">${Object.entries(t).map(([b,u])=>G`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${b}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,u))}%"></span></span> <span>${f(u,0)}</span></div>`)}</div>`:Z} ${s?G`<p><span class="archetype">${s.label}</span> ${s.description?G`· ${s.description}`:Z}</p>`:Z} ${l?G`<p>${l}</p>`:Z} ${c&&!l?G`<p>${c}</p>`:Z} ${i?G`<p>${i}</p>`:Z} ${(p?.length??0)>0||(m?.length??0)>0?G`<div class="lists">${p?.length?G`<div><h3>Strengths</h3><ul>${p.map(b=>G`<li>${b}</li>`)}</ul></div>`:Z} ${m?.length?G`<div><h3>Challenges</h3><ul>${m.map(b=>G`<li>${b}</li>`)}</ul></div>`:Z}</div>`:Z} ${y?.length?G`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${y.slice(0,6).map(b=>G`<li>${sa(b)}</li>`)}</ul></div>`:Z}</article>`}};we.styles=[g,ra`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#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-fg,#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([pt({attribute:!1})],we.prototype,"data",2),d([pt({type:String,reflect:!0})],we.prototype,"mode",2),we=d([aa("roxy-compatibility-card")],we);function sa(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${f(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}import{css as ia,html as A,LitElement as la,nothing as V}from"lit";import{customElement as da,property as mt}from"lit/decorators.js";import{css as oa,html as na}from"lit";function sr(){return na`<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 or=oa`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var ke=class extends la{constructor(){super();this.data=null;this.period="current";new h(this)}render(){let e=this.data;if(!e)return A`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(a=>a.durationYears)):0;return A`<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?A`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?A`(lord ${e.nakshatraLord})`:V}</div>`:V}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):V} ${r.length>0?A`<div class="timeline" role="list">${r.map(a=>this.renderBar(a,t))}</div>`:V} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return V;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",a=r.years??0,s=r.months??0,i=r.days??0,l=[];a&&l.push(`${a}y`),s&&l.push(`${s}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return A`<p class="balance">Birth dasha balance: ${c} of ${t?A`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?A`<details class="interp"><summary><span>${r.planet} mahadasha interpretation</span> ${sr()}</summary><p>${r.interpretation}</p></details>`:V}renderCurrent(e){return"mahadasha"in e?A`<div class="current">${"mahadasha"in e&&e.mahadasha?A`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?A`<small>${f(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:V}</div>`:V} ${"antardasha"in e&&e.antardasha?A`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?A`<small>${f(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:V}</div>`:V} ${"pratyantardasha"in e&&e.pratyantardasha?A`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?A`<small>${f(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:V}</div>`:V}</div>`:V}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),a=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),a=Date.now();return Number.isNaN(r)||Number.isNaN(t)||a<r||a>=t||t<=r?-1:(a-r)/(t-r)}renderBar(e,r){let t=e.durationYears,a=r>0?t/r*100:0,s=this.isCurrent(e),i=s?this.progressIn(e):-1,l=s?"bar-track bar-now":"bar-track";return A`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?A`<span class="now-badge">Now</span>`:V} </span><span class="${l}"><span class="bar-fill" style="width:${a}%"></span> ${i>=0?A`<span class="bar-progress" style="left:${i*a}%" aria-hidden="true"></span>`:V} </span><span class="dates">${e.startDate?gt(e.startDate):""} ${e.endDate?A`- ${gt(e.endDate)}`:""}</span></div>`}};ke.styles=[g,or,ia`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-fg,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#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-fg,#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}details.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}details.interp summary{cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);display:flex}details.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([mt({attribute:!1})],ke.prototype,"data",2),d([mt({type:String,reflect:!0})],ke.prototype,"period",2),ke=d([da("roxy-dasha-timeline")],ke);function gt(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}import{css as ca,html as T,LitElement as pa,nothing as fr}from"lit";import{customElement as ma,property as yt}from"lit/decorators.js";var ga=["title","name","label","heading","overview","summary"],ya=["imageUrl","image","icon","symbol"],ha=["imageUrl","image"],ua=6,Se=class extends pa{constructor(){super();this.data=null;this.depth=0;new h(this)}render(){return this.data==null?T`<div class="roxy-empty" role="status">No data</div>`:this.depth>=ua?T`<div class="roxy-empty" role="status">…</div>`:T`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?fr:typeof e=="string"?T`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?T`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?T`<div class="roxy-empty" role="status">Empty list</div>`:e.every(a=>a===null||["string","number","boolean"].includes(typeof a))?T`<ul class="roxy-chips">${e.map(a=>T`<li>${String(a)}</li>`)}</ul>`:e.every(a=>a!==null&&typeof a=="object"&&!Array.isArray(a))?this.renderTable(e):T`<ol>${e.map(a=>T`<li>${this.renderValue(a)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return T`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>T`<th>${ve(t)}</th>`)}</tr></thead><tbody>${e.map(t=>T`<tr>${r.map(a=>T`<td>${this.formatPrimitive(t[a])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=ga.find(i=>typeof e[i]=="string"),t=ya.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),a=r!=="summary"&&typeof e.summary=="string"?"summary":null,s=Object.entries(e).filter(([i,l])=>i!==r&&i!==a&&!ha.includes(i)&&l!==null&&l!==void 0);return T`${t?T`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:fr} ${r?T`<h3 class="roxy-title">${e[r]}</h3>`:fr} ${a?T`<p class="roxy-summary">${e[a]}</p>`:fr} ${s.length>0?T`<dl class="roxy-rows">${s.map(([i,l])=>T`<dt>${ve(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:fr}`}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))?T`<ul class="roxy-chips">${e.map(t=>T`<li>${String(t)}</li>`)}</ul>`:T`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let a of Object.keys(t))r.add(a);return Array.from(r)}};Se.styles=[g,ca`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([yt({attribute:!1})],Se.prototype,"data",2),d([yt({attribute:!1})],Se.prototype,"depth",2),Se=d([ma("roxy-data")],Se);import{css as ja,html as ir,LitElement as Ka,nothing as Fr}from"lit";import{customElement as Ba,property as bt}from"lit/decorators.js";import{nothing as X,svg as P}from"lit";function de(o){let n=o%360;return n<0?n+360:n}function ce(o){let n=de(o),e=Math.floor(n/30)%12,r=n%30,t=Math.floor(r),a=(r-t)*60,s=Math.floor(a),i=Math.round((a-s)*60);return{sign:D[e]??"Aries",signIndex:e,degree:t,minute:s,second:i}}function zr(o){let{sign:n,degree:e,minute:r}=ce(o);return`${e}\xB0 ${n} ${String(r).padStart(2,"0")}'`}function Vr(o){return de(o+180)}function ht(o,n){let e=de(o),r=de(n)-e;return r<0&&(r+=360),de(e+r/2)}function k(o,n,e,r){let t=r*Math.PI/180;return{x:o+e*Math.cos(t),y:n+e*Math.sin(t)}}import{css as xa,html as ut,nothing as fa}from"lit";var Le=xa`.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-fg,#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 nr(o){let{items:n,active:e,onSelect:r,label:t,idPrefix:a,controls:s=!1}=o;return ut`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=n.findIndex(b=>b.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,m=n[(c+p+n.length)%n.length];if(!m)return;r(m.id);let y=l.currentTarget.getRootNode();requestAnimationFrame(()=>{y.querySelector(`#${a}-tab-${m.id}`)?.focus()})}}">${n.map(l=>ut`<button type="button" class="roxy-tab" role="tab" id="${a}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${s&&e===l.id?`${a}-panel-${l.id}`:fa}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var oe=400,S=20,j=oe-2*S,R=oe/2,ba=Object.fromEntries(D.map(o=>[o.toLowerCase(),o])),va=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],$a="\u02B3";function xt(o,n){return typeof o.longitude!="number"||!Number.isFinite(o.longitude)?!1:ce(o.longitude).sign.toLowerCase()!==n.toLowerCase()}function wa(o,n){let e=ot[v(o.graha)]??o.graha.slice(0,2),r=o.isRetrograde?$a:"";if(typeof o.longitude!="number"||!Number.isFinite(o.longitude)||xt(o,n))return`${e}${r}`;let{degree:t}=ce(o.longitude);return`${e} ${t}\xB0${r}`}function ka(o,n){let e=[v(o.graha)],r=xt(o,n);if(r&&e.push(`in ${n}`),typeof o.longitude=="number"&&Number.isFinite(o.longitude)){let t=ce(o.longitude),a=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${a}' ${t.sign}`:`${t.degree}\xB0${a}' ${t.sign}`)}if(o.nakshatra?.name){let t=o.nakshatra.pada?` pada ${o.nakshatra.pada}`:"";e.push(`${o.nakshatra.name}${t}`)}return o.awastha&&e.push(o.awastha),o.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function qr(o,n,e,r,t){let a=r-(o.length-1)*t/2;return o.map((s,i)=>{let l=a+i*t;return P`<text class="planet-text" x="${e}" y="${l}" text-anchor="middle" dominant-baseline="central">${wa(s,n)}<title>${ka(s,n)}</title></text>`})}function Er(o,n){let e={};for(let t of D)e[t.toLowerCase()]=[];let r="";for(let[t,a]of Object.entries(o??{})){let s=(a?.rashi??"").toLowerCase();if(t==="Lagna"||a?.graha==="Lagna"){r=ba[s]??"";continue}!s||!(s in e)||e[s]?.push({graha:a.graha??t,longitude:a.longitude,nakshatra:a.nakshatra,isRetrograde:a.isRetrograde,awastha:a.awastha})}return{lagnaSign:r,placements:e,divisionLabel:n}}var Ye=j/4,Sa={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 La(o){let n=Sa[o]??{col:0,row:0};return{x:S+n.col*Ye,y:S+n.row*Ye,w:Ye,h:Ye}}function Ca(o){let n=S,e=S+Ye,r=S+2*Ye,t=S+3*Ye,a=oe-S;return P`<rect class="line" x="${n}" y="${n}" width="${j}" height="${j}" stroke-width="1.5" fill="none"><line class="line" x1="${n}" y1="${e}" x2="${a}" y2="${e}" stroke-width="1"><line class="line" x1="${n}" y1="${t}" x2="${a}" y2="${t}" stroke-width="1"><line class="line" x1="${e}" y1="${n}" x2="${e}" y2="${a}" stroke-width="1"><line class="line" x1="${t}" y1="${n}" x2="${t}" y2="${a}" stroke-width="1"><line class="line" x1="${n}" y1="${r}" x2="${e}" y2="${r}" stroke-width="1"><line class="line" x1="${t}" y1="${r}" x2="${a}" y2="${r}" stroke-width="1"><line class="line" x1="${r}" y1="${n}" x2="${r}" y2="${e}" stroke-width="1"><line class="line" x1="${r}" y1="${t}" x2="${r}" y2="${a}" stroke-width="1">${o?P`<text class="centre-label" x="${R}" y="${R}" text-anchor="middle" dominant-baseline="central">${o}</text>`:X}`}function ft(o,n){let e=D.findIndex(t=>t===n),r=D.findIndex(t=>t===o);return e===-1||r===-1?0:(r-e+12)%12+1}function Ta(o,n,e,r){let t=La(o),a=t.x+t.w/2,s=t.y+t.h/2,i=Rr[o]??o.slice(0,2),l=14;return P`<g class="${e?"cell lagna":"cell"}">${e?P`<rect class="lagna-bg" x="${t.x}" y="${t.y}" width="${t.w}" height="${t.h}"><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">`:X}<text class="sign-text" x="${t.x+6}" y="${t.y+12}" text-anchor="start" dominant-baseline="central">${i}</text>${r>0?P`<text class="house-num" x="${t.x+t.w-6}" y="${t.y+12}" text-anchor="end" dominant-baseline="central">${r}</text>`:X} ${e?P`<text class="lagna-marker" x="${a}" y="${t.y+26}" text-anchor="middle" dominant-baseline="central">Asc</text>`:X} ${n.length?qr(n,o,a,s+4,14):X}</g>`}function Ra(o){let n=o.lagnaSign.toLowerCase();return P`${Ca(o.divisionLabel)} ${D.map(e=>Ta(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,ft(e,o.lagnaSign)))}`}var w={tl:{x:S,y:S},tr:{x:oe-S,y:S},br:{x:oe-S,y:oe-S},bl:{x:S,y:oe-S},top:{x:R,y:S},right:{x:oe-S,y:R},bottom:{x:R,y:oe-S},left:{x:S,y:R},tlMid:{x:R-j/4,y:R-j/4},trMid:{x:R+j/4,y:R-j/4},brMid:{x:R+j/4,y:R+j/4},blMid:{x:R-j/4,y:R+j/4}};function he(o){let n=o.reduce((r,t)=>r+t.x,0)/o.length,e=o.reduce((r,t)=>r+t.y,0)/o.length;return{x:n,y:e}}var Pa={1:{x:R,y:w.tlMid.y},2:he([w.tl,w.top,w.tlMid]),3:he([w.tl,w.left,w.tlMid]),4:{x:w.tlMid.x,y:R},5:he([w.bl,w.left,w.blMid]),6:he([w.bl,w.bottom,w.blMid]),7:{x:R,y:w.blMid.y},8:he([w.br,w.bottom,w.brMid]),9:he([w.br,w.right,w.brMid]),10:{x:w.brMid.x,y:R},11:he([w.tr,w.right,w.trMid]),12:he([w.tr,w.top,w.trMid])};function Aa(o,n){let e=D.findIndex(r=>r===n);return e===-1?o:(e+o-1)%12+1}function za(o){let{tl:n,tr:e,br:r,bl:t,top:a,right:s,bottom:i,left:l}=w;return P`<rect class="line" x="${n.x}" y="${n.y}" width="${j}" height="${j}" stroke-width="1.5" fill="none"><polygon class="line" points="${a.x},${a.y} ${s.x},${s.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none"><line class="line" x1="${n.x}" y1="${n.y}" x2="${r.x}" y2="${r.y}" stroke-width="1"><line class="line" x1="${e.x}" y1="${e.y}" x2="${t.x}" y2="${t.y}" stroke-width="1">${o?P`<text class="centre-label" x="${R}" y="${R}" text-anchor="middle" dominant-baseline="central">${o}</text>`:X}`}function Ma(o,n,e,r,t){let a=Pa[o];if(!a)return P``;let s=Math.min(14,Math.abs(a.y-R)*.45+6),i=s+12,l=t?`${n} \xB7 ${Rr[e]??e.slice(0,2)}`:`${n}`;return P`<g class="${t?"cell lagna":"cell"}"><text class="rashi-num" x="${a.x}" y="${a.y-s}" text-anchor="middle" dominant-baseline="central">${l}</text>${t?P`<text class="lagna-marker" x="${a.x}" y="${a.y-i}" text-anchor="middle" dominant-baseline="central">Asc</text>`:X} ${r.length?qr(r,e,a.x,a.y+8,12):X}</g>`}function Ea(o){let n=o.lagnaSign||"Aries";return P`${za(o.divisionLabel)} ${Array.from({length:12},(e,r)=>{let t=r+1,a=Aa(t,n),s=D[a-1]??"Aries";return Ma(t,a,s,o.placements[s.toLowerCase()]??[],t===1)})}`}var Mr=j/3;function Na(){let o=S,n=S+Mr,e=S+2*Mr,r=oe-S,Lr={Aries:[{x:n,y:o},{x:e,y:o},{x:e,y:n},{x:n,y:n}],Taurus:[{x:o,y:o},{x:n,y:o},{x:n,y:n}],Gemini:[{x:o,y:o},{x:n,y:n},{x:o,y:n}],Cancer:[{x:o,y:n},{x:n,y:n},{x:n,y:e},{x:o,y:e}],Leo:[{x:o,y:e},{x:n,y:e},{x:o,y:r}],Virgo:[{x:n,y:e},{x:n,y:r},{x:o,y:r}],Libra:[{x:n,y:e},{x:e,y:e},{x:e,y:r},{x:n,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:n},{x:r,y:n},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:o},{x:r,y:n},{x:e,y:n}],Pisces:[{x:e,y:o},{x:r,y:o},{x:e,y:n}]},ur={};for(let[Cr,Tr]of Object.entries(Lr))ur[Cr]={points:[...Tr],centroid:he(Tr)};return ur}var Da=Na();function Ga(o){let n=S,e=S+Mr,r=S+2*Mr,t=oe-S;return P`<rect class="line" x="${n}" y="${n}" width="${j}" height="${j}" stroke-width="1.5" fill="none"><line class="line" x1="${n}" y1="${e}" x2="${e}" y2="${e}" stroke-width="1"><line class="line" x1="${r}" y1="${e}" x2="${t}" y2="${e}" stroke-width="1"><line class="line" x1="${n}" y1="${r}" x2="${e}" y2="${r}" stroke-width="1"><line class="line" x1="${r}" y1="${r}" x2="${t}" y2="${r}" stroke-width="1"><line class="line" x1="${e}" y1="${n}" x2="${e}" y2="${e}" stroke-width="1"><line class="line" x1="${e}" y1="${r}" x2="${e}" y2="${t}" stroke-width="1"><line class="line" x1="${r}" y1="${n}" x2="${r}" y2="${e}" stroke-width="1"><line class="line" x1="${r}" y1="${r}" x2="${r}" y2="${t}" stroke-width="1"><line class="line" x1="${n}" y1="${n}" x2="${e}" y2="${e}" stroke-width="1"><line class="line" x1="${t}" y1="${n}" x2="${r}" y2="${e}" stroke-width="1"><line class="line" x1="${t}" y1="${t}" x2="${r}" y2="${r}" stroke-width="1"><line class="line" x1="${n}" y1="${t}" x2="${e}" y2="${r}" stroke-width="1">${o?P`<text class="centre-label" x="${R}" y="${R}" text-anchor="middle" dominant-baseline="central">${o}</text>`:X}`}function Oa(o,n,e,r){let t=Da[o];if(!t)return P``;let{centroid:a,points:s}=t,i=Rr[o]??o.slice(0,2),l=s.map(c=>`${c.x},${c.y}`).join(" ");return P`<g class="${e?"cell lagna":"cell"}">${e?P`<polygon class="lagna-bg" points="${l}">`:X}<text class="sign-text" x="${a.x}" y="${a.y-16}" text-anchor="middle" dominant-baseline="central">${i}</text>${r>0?P`<text class="house-num" x="${a.x+18}" y="${a.y-16}" text-anchor="start" dominant-baseline="central">${r}</text>`:X} ${e?P`<text class="lagna-marker" x="${a.x}" y="${a.y-30}" text-anchor="middle" dominant-baseline="central">Asc</text>`:X} ${n.length?qr(n,o,a.x,a.y+4,12):X}</g>`}function Ha(o){let n=o.lagnaSign.toLowerCase();return P`${Ga(o.divisionLabel)} ${D.map(e=>Oa(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,ft(e,o.lagnaSign)))}`}function Nr(o,n){switch(n){case"north":return Ea(o);case"east":return Ha(o);default:return Ra(o)}}function Dr(o,n){return nr({items:va,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}import{css as Ia}from"lit";var Gr=Ia`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-fg,#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-fg,#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 Ce=class extends Ka{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Er(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return ir`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return ir`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?ir`<span class="division-meta">· ${r.sanskritName}</span>`:Fr}</h2>${r.significance?ir`<p class="significance">${r.significance}</p>`:Fr}</div>${Dr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${r.number} ${r.name} divisional chart with twelve sign houses"><title>D${r.number} ${r.name}</title>${Nr(e,this.chartStyle)}</svg> ${t&&t.length>0?ir`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(a=>ir`<span class="vargottama-pill" role="listitem">${C[a]??""} ${a}</span>`)}</div>`:Fr}</div>`}};Ce.styles=[g,Gr,Le,ja`.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([bt({attribute:!1})],Ce.prototype,"data",2),d([bt({type:String,reflect:!0,attribute:"chart-style"})],Ce.prototype,"chartStyle",2),Ce=d([Ba("roxy-divisional-chart")],Ce);import{css as _a,html as pe,LitElement as Ya,nothing as lr}from"lit";import{customElement as Va,property as vt}from"lit/decorators.js";var qa={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Te=class extends Ya{constructor(){super();this.data=null;this.type="manglik";new h(this)}render(){let e=this.data;if(!e)return pe`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=qa[this.type]??this.type,a=(e.severity??"").toLowerCase(),s=a==="severe"?3:a==="moderate"?2:a==="mild"?1:0,i=s*33,l=s===3?"var(--roxy-danger)":s===2?"var(--roxy-warning)":s===1?"var(--roxy-success)":"transparent";return pe`<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?pe`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${s}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:lr} ${e.description?pe`<p class="description">${e.description}</p>`:lr} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?pe`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>pe`<li>${c}</li>`)}</ul></div>`:lr} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?pe`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>pe`<li>${c}</li>`)}</ul></div>`:lr}</article>`}renderEffects(e){if(!e.effects)return lr;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?lr:pe`<div class="effects">${r.map(([t,a])=>pe`<div><h3>${t}</h3><p>${a}</p></div>`)}</div>`}};Te.styles=[g,_a`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([vt({attribute:!1})],Te.prototype,"data",2),d([vt({type:String,reflect:!0})],Te.prototype,"type",2),Te=d([Va("roxy-dosha-card")],Te);import{css as Fa,html as me,LitElement as Ua,nothing as Or}from"lit";import{customElement as Wa,property as Hr,state as br}from"lit/decorators.js";var Ur=new Map;async function Ja(o){let n=Ur.get(o);return n||(n=fetch(o).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Ur.delete(o),e}),Ur.set(o,n)),n}var q=class extends Ua{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(t=>t.required).filter(t=>this.values[t.name]===void 0||this.values[t.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(t=>t.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Ja(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let a=e.components?.schemas??{},s=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,a)}if(i?.properties){let c=new Set(i.required??[]);for(let[p,m]of Object.entries(i.properties)){let y=this.resolve(m,a)??{};s.push({name:p,type:this.fieldType(y),required:c.has(p),description:y.description,enum:y.enum,min:y.minimum,max:y.maximum,default:y.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let p=this.resolve(c.schema,a)??{};s.push({name:c.name,type:this.fieldType(p),required:!!c.required,description:p.description,enum:p.enum,default:p.default})}this.fields=s,this.hasLocation=s.some(c=>c.name==="latitude")&&s.some(c=>c.name==="longitude")&&s.some(c=>c.name==="timezone");let l={};for(let c of s)c.default!==void 0&&(l[c.name]=c.default);this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return me`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return me`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return Or;let t=`roxy-form-${r.name}`;return me`<div class="field"><label for="${t}">${ve(r.name)}${r.required?me`<span class="req" aria-hidden="true">*</span>`:Or}</label> ${r.enum?me`<select id="${t}" ?required="${r.required}" @change="${a=>this.setValue(r.name,a.target.value)}"><option value="">Choose</option>${r.enum.map(a=>me`<option value="${a}" ?selected="${this.values[r.name]===a}">${a}</option>`)}</select>`:me`<input id="${t}" type="${this.htmlType(r.type)}" ?required="${r.required}" min="${r.min??""}" max="${r.max??""}" step="${r.type==="number"?"any":""}" .value="${this.values[r.name]??""}" @input="${a=>this.setValue(r.name,this.coerce(r.type,a.target.value))}">`} ${r.description?me`<small class="help">${r.description}</small>`:Or}</div>`};return me`<form @submit="${this.onSubmit}"><h2 class="title">${ve(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?me`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:Or}<div class="fields">${this.fields.map(r=>e(r))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};q.styles=[g,Fa`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-fg,#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-fg,#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([Hr({type:String,attribute:"data-endpoint"})],q.prototype,"endpoint",2),d([Hr({type:String})],q.prototype,"method",2),d([Hr({type:String,attribute:"spec-url"})],q.prototype,"specUrl",2),d([Hr({type:String,attribute:"submit-label"})],q.prototype,"submitLabel",2),d([br()],q.prototype,"fields",2),d([br()],q.prototype,"values",2),d([br()],q.prototype,"hasLocation",2),d([br()],q.prototype,"loaded",2),d([br()],q.prototype,"specError",2),q=d([Wa("roxy-endpoint-form")],q);import{css as Xa,html as ue,LitElement as Za,nothing as Ir}from"lit";import{customElement as Qa,property as es}from"lit/decorators.js";var Ve=class extends Za{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return ue`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(m=>m?.category!==void 0),t=e.total??0,a=e.maxScore??36,s=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",l=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,p=(100-s)*2.827;return ue`<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(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?ue`<small style="margin-left:.5rem;color:var(--roxy-muted)">${ct(e.percentage,1)}</small>`:Ir}</div>${e.recommendation?ue`<span class="recommendation">${e.recommendation}</span>`:Ir}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${l}" stroke-width="8" stroke-dasharray="${c},${p}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${r.length>0?ue`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(m=>{let y=m.score??0,b=m.maxScore??rs(m.category),u=b?y/b*100:0;return ue`<tr><td>${m.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${u}%"></span></div></td><td class="score">${f(y,1)} / ${b}</td></tr>`})}</tbody></table>`:Ir} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?ue`<div class="tags">${e.doshas?.map(m=>ue`<span class="dosha">${m}</span>`)} ${e.doshaCancellations?.map(m=>ue`<span class="cancel" title="${m.reason}">${m.dosha} cancelled</span>`)}</div>`:Ir}</article>`}};Ve.styles=[g,Xa`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],d([es({attribute:!1})],Ve.prototype,"data",2),Ve=d([Qa("roxy-guna-milan")],Ve);function rs(o){if(!o)return 1;switch(o.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}import{css as ts,html as F,LitElement as as,nothing as Q,svg as $t}from"lit";import{customElement as ss,property as wt}from"lit/decorators.js";var Re=class extends as{constructor(){super();this.data=null;this.mode="lookup";new h(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return F`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:a,dailyMessage:s,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(a??[]);return F`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?F`<div class="symbol">${r.symbol}</div>`:Q}<div class="lines" aria-hidden="true">${l.slice().reverse().map((p,m)=>{let y=l.length-1-m+1,b=c.has(y),u=p===6||p===8;return F`<div class="line ${`${u?"broken":"solid"}${b?" changing":""}`}">${u?$t`<span class="seg"></span><span class="seg"></span>`:$t`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?F`${r.number}.`:Q}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?F`${r.chinese}`:Q} ${r.pinyin?F`· ${r.pinyin}`:Q}</p><div class="trigrams">${r.upperTrigram?F`<div>Upper <span class="tri-glyph">${Br[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:Q} ${r.lowerTrigram?F`<div>Lower <span class="tri-glyph">${Br[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:Q}</div>${r.judgment?F`<p class="judgment">${r.judgment}</p>`:Q} ${r.image?F`<p class="image">${r.image}</p>`:Q} ${s?F`<p class="message">${s}</p>`:Q} ${r.interpretation?.general?F`<p>${r.interpretation.general}</p>`:Q} ${c.size>0?F`<div class="changing">Changing lines: ${Array.from(c).sort((p,m)=>p-m).join(", ")}. ${i?.english?F`Becomes hexagram ${i.number} ${i.english}.`:Q}</div>`:Q}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,a=[];for(let s=0;s<6;s++){let i=t>>s&1;a.push(i?8:7)}return a}return Array.from({length:6},()=>7)}};Re.styles=[g,ts`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-fg,#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-fg,#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-fg,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([wt({attribute:!1})],Re.prototype,"data",2),d([wt({type:String,reflect:!0})],Re.prototype,"mode",2),Re=d([ss("roxy-hexagram")],Re);import{css as os,html as I,LitElement as ns,nothing as W}from"lit";import{customElement as is,property as kt}from"lit/decorators.js";var Pe=class extends ns{constructor(){super();this.data=null;this.period="daily";new h(this)}render(){let e=this.data;if(!e)return I`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?_[v(r)]??"":"",a="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,s="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return I`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${s?I`<div class="date">${s}</div>`:W}</div>${a!==null?I`<span class="energy" aria-label="${`Energy ${a} of 10`}">Energy ${a}/10 <span class="energy-bar"><span style="width:${a/10*100}%"></span></span></span>`:W}</header>${e.overview?I`<p class="overview">${e.overview}</p>`:W}<div class="sections">${e.love?I`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:W} ${e.career?I`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:W} ${e.health?I`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:W} ${e.finance?I`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:W} ${"advice"in e&&e.advice?I`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:W}</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:[],m=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&p.length===0&&m.length===0?W:I`<div class="lucky">${i!==void 0?I`<span>Lucky number <strong>${i}</strong></span>`:W} ${l?I`<span>Lucky color <strong>${l}</strong></span>`:W} ${c.length?I`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:W} ${p.length?I`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:W} ${m.length?I`<span class="compat-wrap">Best with <span class="compat">${m.map(y=>I`<span>${y}</span>`)}</span></span>`:W}</div>`})()}</article>`}};Pe.styles=[g,os`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-fg,#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([kt({attribute:!1})],Pe.prototype,"data",2),d([kt({type:String,reflect:!0})],Pe.prototype,"period",2),Pe=d([is("roxy-horoscope-card")],Pe);import{css as ls,html as K,LitElement as ds,nothing as qe}from"lit";import{customElement as cs,property as ps,state as ms}from"lit/decorators.js";var Ae=class extends ds{constructor(){super();this.data=null;this.activeTab="planets";new h(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.planet,sign:a.sign,house:a.house,nakshatra:a.nakshatra,starLord:a.starLord,subLord:a.subLord,subSubLord:a.subSubLord,kpNumber:a.kpNumber,retrograde:a.retrograde})),t=e.nodes;for(let[a,s]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])s&&r.push({name:a,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}render(){if(!this.data)return K`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return K`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?K`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?K`· ${r.nakshatra}`:qe} ${r.subLord?K`· sub lord ${r.subLord}`:qe} ${typeof r.kpNumber=="number"?K`· KP ${r.kpNumber}`:qe}</div>`:qe} ${typeof e.meta?.ayanamsa=="number"?K`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${f(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?K`· ${e.meta.houseSystem} houses`:qe}</div>`:qe}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>K`<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`<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`<tr><td class="body">${r.name}${r.retrograde?K`<span class="retro">R</span>`:qe}</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`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?K`<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`<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`<p class="roxy-empty" role="status">No cusps</p>`}};Ae.styles=[g,ls`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-fg,#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([ps({attribute:!1})],Ae.prototype,"data",2),d([ms()],Ae.prototype,"activeTab",2),Ae=d([cs("roxy-kp-chart")],Ae);import{css as gs,html as vr,LitElement as ys,nothing as St}from"lit";import{customElement as hs,property as us}from"lit/decorators.js";var Fe=class extends ys{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return vr`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return vr`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?vr`<span class="ayanamsa">Ayanamsa: ${f(this.data.ayanamsa,2)}°</span>`:St}</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=>vr`<tr><td class="planet">${r.planet} ${r.retrograde?vr`<span class="retro">R</span>`:St}</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>`}};Fe.styles=[g,gs`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],d([us({attribute:!1})],Fe.prototype,"data",2),Fe=d([hs("roxy-kp-planets-table")],Fe);import{css as xs,html as Ue,LitElement as fs,nothing as Wr}from"lit";import{customElement as bs,property as vs}from"lit/decorators.js";var We=class extends fs{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return Ue`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return Ue`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?Ue`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:Wr}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?Ue`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,a)=>Ue`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:Wr} ${r.length?Ue`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>Ue`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:Wr}</div>`}};We.styles=[g,xs`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-fg,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],d([vs({attribute:!1})],We.prototype,"data",2),We=d([bs("roxy-kp-ruling-planets")],We);import{css as $s,html as dr,LitElement as ws,nothing as Ct}from"lit";import{customElement as ks,property as $r,state as wr}from"lit/decorators.js";function Lt(o,n){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,o(...t)},n)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var B=class extends ws{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=Lt(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let a={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let s=this.publishableKey??this.apiKey;s&&(a["X-API-Key"]=s);let i=await fetch(t,{headers:a,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return dr`<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?dr`<span class="spinner" role="status" aria-label="Loading"></span>`:Ct} ${this.isOpen?dr`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?dr`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>dr`<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?dr`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:Ct}</div>`}};B.styles=[g,$s`: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-fg,#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([$r({type:String,attribute:"api-key"})],B.prototype,"apiKey",2),d([$r({type:String,attribute:"publishable-key"})],B.prototype,"publishableKey",2),d([$r({type:String})],B.prototype,"endpoint",2),d([$r({type:String})],B.prototype,"placeholder",2),d([$r({type:String,attribute:"default-value"})],B.prototype,"defaultValue",2),d([wr()],B.prototype,"query",2),d([wr()],B.prototype,"results",2),d([wr()],B.prototype,"isOpen",2),d([wr()],B.prototype,"isLoading",2),d([wr()],B.prototype,"highlight",2),B=d([ks("roxy-location-search")],B);import{css as Ss,html as ee,LitElement as Ls,nothing as ze}from"lit";import{customElement as Cs,property as Tt}from"lit/decorators.js";var Me=class extends Ls{constructor(){super();this.data=null;this.mode="current";new h(this)}render(){let e=this.data;if(!e)return ee`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,a="year"in e?e.year:void 0;return ee`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${a??""}</h2><div class="list" role="list">${r.map(s=>this.renderListItem(s))}</div></article>`}return"phase"in e?this.renderSingle(e):ze}renderSingle(e){let r=Rt(e.phase);return ee`<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?ee`<div class="date">${e.date}</div>`:ze}</div></div><div class="stats">${typeof e.illumination=="number"?ee`<div><span>Illumination</span> <strong>${Ts(e.illumination)}</strong></div>`:ze} ${typeof e.age=="number"?ee`<div><span>Age</span> <strong>${f(e.age,1)} days</strong></div>`:ze} ${e.sign?ee`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:ze} ${typeof e.distance=="number"?ee`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:ze}</div>${e.meaning?.description?ee`<p class="meaning">${e.meaning.description}</p>`:ze} ${e.meaning?.keywords?.length?ee`<div class="keywords">${e.meaning.keywords.map(t=>ee`<span>${t}</span>`)}</div>`:ze}</article>`}renderListItem(e){let r=Rt(e.phase);return ee`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};Me.styles=[g,Ss`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([Tt({attribute:!1})],Me.prototype,"data",2),d([Tt({type:String,reflect:!0})],Me.prototype,"mode",2),Me=d([Cs("roxy-moon-phase")],Me);function Rt(o){return o?nt[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Ts(o){let n=o<=1?o*100:o;return`${Math.round(n)}%`}import{css as Rs,html as re,LitElement as Ps,nothing as ge}from"lit";import{customElement as As,property as zs}from"lit/decorators.js";var Je=class extends Ps{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return re`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return re`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?re`<span class="number">Nakshatra ${e.number} of 27</span>`:ge} ${e.range?re`<span class="range">${e.range}</span>`:ge}</header><dl class="facts">${e.lord?re`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:ge} ${e.deity?re`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:ge} ${e.symbol?re`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:ge}</dl>${e.characteristics?re`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:ge} ${r?re`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?re`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:ge} ${r.gemstones?re`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:ge} ${r.rituals?re`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:ge}</div></div>`:ge}</article>`}};Je.styles=[g,Rs`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-fg,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],d([zs({attribute:!1})],Je.prototype,"data",2),Je=d([As("roxy-nakshatra-card")],Je);import{css as Ms,html as $,LitElement as Es,nothing as O,svg as ne}from"lit";import{customElement as Ns,property as Pt,state as Ds}from"lit/decorators.js";var Xr=420,x=Xr/2,cr=164,Jr=146,kr=120,pr=96,Gs=178,Os=196,xe=class extends Es{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new h(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return $`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return $`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?$`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:O}</header>${nr({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:a=>{this.view=a},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?$`<span>${this.data.houseSystem} houses</span>`:O} <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 $`<svg viewBox="0 0 ${Xr} ${Xr}" 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="${x}" cy="${x}" r="${cr}" stroke-width="1.5"/><circle class="wheel-line" cx="${x}" cy="${x}" r="${Jr-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${x}" cy="${x}" r="${kr}" stroke-width="1"/><circle class="wheel-line" cx="${x}" cy="${x}" r="${pr-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(s=>v(s.name)),a=new Map;for(let s of r){let i=[v(s.planet1),v(s.planet2)].sort().join("|");a.set(i,s)}return t.length===0?$`<p class="roxy-empty" role="status">No planets to grid</p>`:$`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(s=>{let i=C[s]??s.slice(0,2);return $`<th scope="col" title="${s}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((s,i)=>{let l=C[s]??s.slice(0,2);return $`<tr><th scope="row" title="${s}">${l}</th>${t.slice(0,i+1).map(c=>{let p=a.get([s,c].sort().join("|"));if(!p)return $`<td class="empty"></td>`;let m=ar(p),y=Kr[m]??Kr[m.replace(/-/g,"")]??m.slice(0,3),b=xr[m]??"aspect-other",u=f(p.orb,1);return $`<td class="${`cell ${b}`}" title="${`${s} ${m} ${c}${u?` (orb ${u}\xB0)`:""}`}"><span class="asp">${y}</span></td>`})} ${t.slice(i+1,-1).map(()=>$`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Vr(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Vr(r),"IC")));let a=this.data?.partOfFortune?.longitude;typeof a=="number"&&t.push(this.renderAngleMark(de(a),"PoF"));let s=this.data?.vertex?.longitude;return typeof s=="number"&&t.push(this.renderAngleMark(de(s),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),a=k(x,x,cr,t),s=k(x,x,Gs,t),i=k(x,x,Os,t);return ne`<g><line class="angle-tick" x1="${a.x}" y1="${a.y}" x2="${s.x}" y2="${s.y}"><text class="angle-marker" x="${i.x}" y="${i.y}" text-anchor="middle" dominant-baseline="central">${r}</text></g>`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,a)=>this.getAscendant()+a*30)).map(t=>{let a=this.toAngle(t),s=k(x,x,kr,a),i=k(x,x,cr,a);return ne`<line class="wheel-line" x1="${s.x}" y1="${s.y}" x2="${i.x}" y2="${i.y}" stroke-width="0.8">`})}renderSigns(){return D.map((e,r)=>{let t=this.toAngle(r*30+15),a=k(x,x,Jr,t);return ne`<text class="sign-glyph" x="${a.x}" y="${a.y}" text-anchor="middle" dominant-baseline="central">${_[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,a)=>{let s=e[(a+1)%12],i=ht(t.longitude,s?s.longitude:t.longitude+30),l=k(x,x,kr-12,this.toAngle(i));return ne`<text class="house-num" x="${l.x}" y="${l.y}" text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,a)=>{let s=this.toAngle(a*30+15),i=k(x,x,kr-12,s),l=(a-r+12)%12+1;return ne`<text class="house-num" x="${i.x}" y="${i.y}" text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),a=r%30===0,s=a?Jr-14:cr-5,i=k(x,x,s,t),l=k(x,x,cr,t);e.push(ne`<line class="${a?"tick tick-major":"tick"}" x1="${i.x}" y1="${i.y}" x2="${l.x}" y2="${l.y}" stroke-width="${a?1:.5}">`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?O:e.map(r=>{let t=this.toAngle(r.longitude),a=k(x,x,kr+9,t),s=ce(r.longitude);return ne`<text class="cusp-deg" x="${a.x}" y="${a.y}" text-anchor="middle" dominant-baseline="central">${s.degree}°${String(s.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(s=>Number.isFinite(s.longitude)).map(s=>({p:s,trueLon:de(s.longitude),displayLon:de(s.longitude)})).sort((s,i)=>s.trueLon-i.trueLon);for(let s=1;s<t.length;s++){let i=t[s-1],l=t[s];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let a=t[t.length-1];if(a&&a.displayLon>360){let s=a.displayLon-360;for(let i of t)i.displayLon-=s}return t.map(({p:s,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),p=this.toAngle(l),m=k(x,x,pr,p),y=k(x,x,pr-13,p),b=k(x,x,cr-4,c),u=k(x,x,pr+8,p),Ke=C[v(s.name)]??s.name.slice(0,2),Lr=ce(s.longitude),ur=s.isRetrograde===!0,Cr=`${Lr.degree}\xB0${String(Lr.minute).padStart(2,"0")}'`,Tr=Math.abs(l-i)>.5;return ne`<g>${Tr?ne`<line class="planet-leader" x1="${b.x}" y1="${b.y}" x2="${u.x}" y2="${u.y}">`:O}<text class="planet-glyph" x="${m.x}" y="${m.y}" text-anchor="middle" dominant-baseline="central"><title>${s.name}${ur?" retrograde":""} - ${Cr} ${s.sign??""}</title>${Ke}</text><text class="planet-deg" x="${y.x}" y="${y.y}" text-anchor="middle" dominant-baseline="central">${Cr}${ur?ne`<tspan class="retro">℞</tspan>`:O}</text></g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return O;let t=e?.retrogradePlanets??[];return $`<div class="details">${e?.dominantElement||e?.dominantModality?$`<div class="pill-row">${e.dominantElement?$`<span class="pill">Dominant element: ${e.dominantElement}</span>`:O} ${e.dominantModality?$`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:O}</div>`:O} ${r?$`<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>`:O} ${t.length>0?$`<div class="pill-row">${t.map(a=>{let s=C[a]??a.slice(0,2);return $`<span class="pill pill--muted">${s} ${a} R</span>`})}</div>`:O} ${r?.summary?$`<p class="summary">${r.summary}</p>`:O} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return O;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],a=D,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=a.indexOf(v(i.sign??""));if(l<0)continue;let c=r[l%4],p=t[l%3],m=C[v(i.name)]??v(i.name).slice(0,2);s[c]?.[p]?.push(m)}return $`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>$`<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+(s[i]?.[p]?.length??0),0);return $`<tr><th scope="row">${i}</th>${t.map(c=>$`<td>${(s[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>$`<td class="em-total">${r.reduce((l,c)=>l+(s[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?O:$`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let a=r.interpretation,s=C[v(r.name)]??"",i=f(r.degree??0,1);return $`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${s} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${sr()}</span></summary><div class="interp-body">${a.summary?$`<p class="interp-summary">${a.summary}</p>`:O} ${a.detailed?$`<p class="interp-detail">${a.detailed}</p>`:O} ${a.keywords?.length?$`<div class="interp-keywords">${a.keywords.map(l=>$`<span class="kw">${l}</span>`)}</div>`:O}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let a of e){if(typeof a.longitude!="number")continue;let s=v(a.name);s&&t.set(s,a.longitude)}return r.map(a=>{let s=t.get(v(a.planet1)),i=t.get(v(a.planet2));if(s===void 0||i===void 0)return O;let l=k(x,x,pr-18,this.toAngle(s)),c=k(x,x,pr-18,this.toAngle(i)),p=ar(a),m=xr[p]??"aspect-other",y=f(a.orb,1);return ne`<line class="${`aspect ${m}`}" x1="${l.x}" y1="${l.y}" x2="${c.x}" y2="${c.y}"><title>${a.planet1} ${p||""} ${a.planet2}${y?` (orb ${y}\xB0)`:""}</title></line>`})}};xe.styles=[g,Le,or,Ms`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-fg,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-fg,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-fg,#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-fg,#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-fg,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([Pt({attribute:!1})],xe.prototype,"data",2),d([Pt({type:String,attribute:"house-system",reflect:!0})],xe.prototype,"houseSystem",2),d([Ds()],xe.prototype,"view",2),xe=d([Ns("roxy-natal-chart")],xe);import{css as Hs,html as H,LitElement as Is,nothing as te}from"lit";import{customElement as js,property as At}from"lit/decorators.js";var Ee=class extends Is{constructor(){super();this.data=null;this.type="life-path";new h(this)}render(){let e=this.data;if(!e)return H`<div class="roxy-empty" role="status">No numerology data</div>`;let r=Ks[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return H`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?H`<div class="numeral">${e.number}</div>`:te}<div><p class="label">${r}</p>${e.meaning?.title?H`<h2 class="title">${e.meaning.title}</h2>`:te}</div></div>${e.meaning?.description?H`<p class="meaning">${e.meaning.description}</p>`:te} ${e.calculation?H`<pre class="calc">${e.calculation}</pre>`:te} ${t.length>0?H`<div class="chips">${t.map(a=>H`<span>${a}</span>`)}</div>`:te} ${e.hasKarmicDebt&&e.karmicDebtNumber?H`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Bs(e.karmicDebtMeaning)}</div>`:te}</article>`}renderPersonalYear(e,r){return H`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?H`<div class="numeral">${e.personalYear}</div>`:te}<div><p class="label">${r}</p>${e.theme?H`<h2 class="title">${e.theme}</h2>`:te}</div></div>${e.forecast?H`<p class="meaning">${e.forecast}</p>`:te} ${e.advice?H`<p>${e.advice}</p>`:te}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,a])=>a!=null);return H`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?H`<h2 class="title">${e.profile.name}</h2>`:te}</div>${t.length>0?H`<div class="cores">${t.map(([a,s])=>H`<div class="item"><span>${ve(a)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:te}</article>`}};Ee.styles=[g,Hs`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#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-fg,#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([At({attribute:!1})],Ee.prototype,"data",2),d([At({type:String,reflect:!0})],Ee.prototype,"type",2),Ee=d([js("roxy-numerology-card")],Ee);var Ks={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Bs(o){return o?[o.description,o.challenge,o.resolution].filter(Boolean).join(" "):""}import{css as _s,html as ae,LitElement as Ys,nothing as Xe}from"lit";import{customElement as Vs,property as zt}from"lit/decorators.js";var Ne=class extends Ys{constructor(){super();this.data=null;this.detail="detailed";new h(this)}render(){let e=this.data;if(!e)return ae`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let a=r?[["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]]:[],s=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],i=r&&"transitions"in r?r.transitions:void 0;return ae`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?Ar(r.date):""}</span></header><table><tbody>${t.map(([l,c])=>ae`<tr><th>${l}</th><td>${c}</td></tr>`)} ${r?.sunrise?ae`<tr><th>Sunrise</th><td>${le(r.sunrise)}</td></tr>`:Xe} ${r?.sunset?ae`<tr><th>Sunset</th><td>${le(r.sunset)}</td></tr>`:Xe} ${r?.moonrise?ae`<tr><th>Moonrise</th><td>${le(r.moonrise)}</td></tr>`:Xe} ${r?.moonset?ae`<tr><th>Moonset</th><td>${le(r.moonset)}</td></tr>`:Xe}</tbody></table>${i?ae`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",i.tithi)} ${this.renderTransitionRow("Nakshatra",i.nakshatra)} ${this.renderTransitionRow("Yoga",i.yoga)} ${this.renderTransitionRow("Karana",i.karana)}</tbody></table>`:Xe} ${this.detail==="detailed"&&(a.some(l=>!!l[1])||s.some(l=>!!l[1]))?ae`<div class="section">Auspicious muhurtas</div><table><tbody>${a.filter(([,l])=>!!l).map(([l,c])=>ae`<tr><th>${l}</th><td>${Yr(c)}</td></tr>`)}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${s.filter(([,l])=>!!l).map(([l,c])=>ae`<tr><th>${l}</th><td>${Yr(c)}</td></tr>`)}</tbody></table>`:Xe}</div>`}renderTransitionRow(e,r){if(!r?.endsAt)return Xe;let t=le(r.endsAt),a=r.next?` \u2192 ${r.next}`:"";return ae`<tr><th>${e}</th><td>ends ${t}${a}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}};Ne.styles=[g,_s`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([zt({attribute:!1})],Ne.prototype,"data",2),d([zt({type:String,reflect:!0})],Ne.prototype,"detail",2),Ne=d([Vs("roxy-panchang-table")],Ne);import{css as qs,html as mr,LitElement as Fs,nothing as Zr}from"lit";import{customElement as Us,property as Ws}from"lit/decorators.js";var Qr=[{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)"}],Ze=class extends Fs{constructor(){super();this.data=null;new h(this)}render(){if(!this.data?.planets?.length)return mr`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return mr`<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">${Qr.map(r=>mr`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=C[v(e.planet)]??"",t=Qr.map(p=>Math.max(0,e[p.key])),a=t.reduce((p,m)=>p+m,0),s=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,i=s?"adequacy-badge--adequate":"adequacy-badge--weak",l=s?"adequate":"weak",c=f(e.totalRupas,2)&&f(e.minRequired,2)?`${f(e.totalRupas,2)} / ${f(e.minRequired,2)} R`:"";return mr`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${r}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${a>0?Qr.map((p,m)=>{let y=t[m];if(y<=0)return Zr;let b=y/a*100;return mr`<div class="bar-segment" style="flex-grow:${b};background:${p.color}" title="${p.label}: ${f(y,1)}"></div>`}):Zr}</div></div><div class="pills">${c?mr`<span class="rupas-label">${c}</span>`:Zr} <span class="${`adequacy-badge ${i}`}">${l}</span></div></div>`}};Ze.styles=[g,qs`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-fg,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],d([Ws({attribute:!1})],Ze.prototype,"data",2),Ze=d([Us("roxy-shadbala-table")],Ze);import{css as Js,html as z,LitElement as Xs,nothing as U,svg as gr}from"lit";import{customElement as Zs,property as Qs}from"lit/decorators.js";var tt=360,L=tt/2,et=170,eo=154,rt=124,yr=96,Qe=class extends Xs{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return z`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:a}=this.data,s=this.data.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,p=a?.overall,m=a?.strengths??[],y=a?.challenges??[];return i.length>0&&l.length>0?z`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?z`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:U}</div><svg viewBox="0 0 ${tt} ${tt}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${L}" cy="${L}" r="${et}" stroke-width="1.5"/><circle class="wheel-line" cx="${L}" cy="${L}" r="${yr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${L}" cy="${L}" r="${yr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,s)} ${this.renderRing(i,rt,"p1",1)} ${this.renderRing(l,yr,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${p?z`<p class="summary">${p}</p>`:U} ${s.length>0?this.renderAspects(s):U} ${m.length>0||y.length>0?z`<div class="lists">${m.length?z`<div><h3>Strengths</h3><ul>${m.map(u=>z`<li>${u}</li>`)}</ul></div>`:U} ${y.length?z`<div><h3>Challenges</h3><ul>${y.map(u=>z`<li>${u}</li>`)}</ul></div>`:U}</div>`:U}</div>`:z`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?z`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:U}</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><roxy-data></code> fallback.</div>${p?z`<p class="summary">${p}</p>`:U} ${s.length>0?this.renderAspects(s):U} ${m.length>0||y.length>0?z`<div class="lists">${m.length?z`<div><h3>Strengths</h3><ul>${m.map(u=>z`<li>${u}</li>`)}</ul></div>`:U} ${y.length?z`<div><h3>Challenges</h3><ul>${y.map(u=>z`<li>${u}</li>`)}</ul></div>`:U}</div>`:U}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),a=k(L,L,yr-14,t),s=k(L,L,et,t);return gr`<line class="wheel-line" x1="${a.x}" y1="${a.y}" x2="${s.x}" y2="${s.y}" stroke-width="0.6">`})}renderSigns(){return D.map((e,r)=>{let t=this.toAngle(r*30+15),a=k(L,L,eo,t);return gr`<text class="sign" x="${a.x}" y="${a.y}" text-anchor="middle" dominant-baseline="central">${_[e]}</text>`})}renderRing(e,r,t,a){return e.map(s=>{if(!Number.isFinite(s.longitude))return U;let i=this.toAngle(s.longitude),l=k(L,L,r,i),p=k(L,L,r+(a===1?-12:-10),i),m=C[v(s.name)]??s.name.slice(0,2),y=ce(s.longitude),b=s.isRetrograde===!0,u=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,Ke=`${s.name}${b?" retrograde":""} - ${u} ${y.sign}`;return gr`<g><text class="${t}" x="${l.x}" y="${l.y}" text-anchor="middle" dominant-baseline="central"><title>${Ke}</title>${m}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${a}</tspan></text><text class="planet-deg" x="${p.x}" y="${p.y}" text-anchor="middle" dominant-baseline="central">${y.degree}°${b?gr`<tspan class="retro">℞</tspan>`:U}</text></g>`})}renderAscendants(e){let r=[],t=(a,s)=>{if(!a)return;let i=D.findIndex(b=>b.toLowerCase()===a.sign.toLowerCase());if(i===-1)return;let l=i*30+a.degree,c=this.toAngle(l),p=s===1?rt+14:yr+14,m=k(L,L,p,c),y=k(L,L,et+14,c);r.push(gr`<g><line class="asc-tick" x1="${m.x}" y1="${m.y}" x2="${y.x}" y2="${y.y}"><text class="asc-label" x="${y.x}" y="${y.y}" text-anchor="middle" dominant-baseline="central">Asc${s}</text></g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=v(i);for(let c of s)if(v(c.name)===l&&typeof c.longitude=="number")return c.longitude};return t.map(s=>{let i=a(e,s.planet1),l=a(r,s.planet2);if(i===void 0||l===void 0)return U;let c=k(L,L,rt-12,this.toAngle(i)),p=k(L,L,yr+8,this.toAngle(l)),m=ar(s),y=xr[m]??"aspect-other",b=f(s.orb,1);return gr`<line class="${`aspect ${y}`}" x1="${c.x}" y1="${c.y}" x2="${p.x}" y2="${p.y}"><title>${s.planet1} ${m} ${s.planet2}${b?` (orb ${b}\xB0)`:""}</title></line>`})}renderAspects(e){return z`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(r=>z`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${ar(r)||""}</td><td class="orb">${f(r.orb,1)}</td><td>${ro(r.strength)}</td></tr>`)}</tbody></table>`}};Qe.styles=[g,Js`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-fg,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-fg,#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-fg,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],d([Qs({attribute:!1})],Qe.prototype,"data",2),Qe=d([Zs("roxy-synastry-chart")],Qe);function ro(o){return typeof o=="number"?Math.round(o).toString():""}import{css as to,html as M,LitElement as ao,nothing as ye}from"lit";import{customElement as so,property as oo,state as no}from"lit/decorators.js";var De=class extends ao{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new h(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):M`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,a=r.keywords??[];return M`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?M`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:M`<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?M`${r.arcana} arcana`:ye} ${t?M`· reversed`:ye}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?M`<p class="message">${e.dailyMessage}</p>`:ye} ${r.meaning?M`<p>${r.meaning}</p>`:ye} ${a.length>0?M`<div class="chips">${a.map(s=>M`<span>${s}</span>`)}</div>`:ye} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,a=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return M`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?M`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:M`<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?M`${e.arcana} arcana`:ye} ${e.number!==void 0&&e.number!==null?M`· ${e.number}`:ye} ${r?M`· reversed`:ye}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?M`<p>${t.description}</p>`:ye} ${a.length>0?M`<div class="chips">${a.map(s=>M`<span>${s}</span>`)}</div>`:ye} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};De.styles=[g,to`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([oo({attribute:!1})],De.prototype,"data",2),d([no()],De.prototype,"flipped",2),De=d([so("roxy-tarot-card")],De);import{css as io,html as E,LitElement as lo,nothing as ie}from"lit";import{customElement as co,property as Mt}from"lit/decorators.js";var Ge=class extends lo{constructor(){super();this.data=null;this.spread="three-card";new h(this)}render(){let e=this.data;if(!e)return E`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),a=t?[]:"positions"in e?e.positions??[]:[],s=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),p="question"in e?e.question:void 0,m="summary"in e?e.summary:void 0,y=r?e.interpretation:void 0,b=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return E`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?E`<span class="question">"${p}"</span>`:ie}</header>${r?E`<div><span class="${`answer ${b}`}">${i}</span> ${l?E`<small>· ${l}</small>`:ie}</div>`:ie} ${a.length>0?E`<div class="grid">${a.map(u=>E`<div class="card"><p class="label">${u.name??""}</p><div class="image">${u.card?.imageUrl?E`<img src="${u.card.imageUrl}" alt="${u.card.name??"tarot card"}" class="${u.card.reversed?"reversed":""}">`:E`${u.card?.name??"?"}`}</div><p class="name">${u.card?.name??""} ${u.card?.reversed?E`<small>(reversed)</small>`:ie}</p>${u.interpretation?E`<p class="interp">${u.interpretation}</p>`:ie}</div>`)}</div>`:ie} ${s.length>0?E`<div class="grid">${s.map(u=>E`<div class="card"><div class="image">${u.imageUrl?E`<img src="${u.imageUrl}" alt="${u.name??"tarot card"}" class="${u.reversed?"reversed":""}">`:E`${u.name??"?"}`}</div><p class="name">${u.name??""} ${u.reversed?E`<small>(reversed)</small>`:ie}</p>${u.meaning?E`<p class="interp">${u.meaning}</p>`:ie}</div>`)}</div>`:ie} ${m?E`<p class="reading">${m}</p>`:ie} ${y?E`<p class="reading">${y}</p>`:ie}</article>`}};Ge.styles=[g,io`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([Mt({attribute:!1})],Ge.prototype,"data",2),d([Mt({type:String,reflect:!0})],Ge.prototype,"spread",2),Ge=d([co("roxy-tarot-spread")],Ge);import{css as po,html as N,LitElement as mo,nothing as Oe}from"lit";import{customElement as go,property as yo,state as ho}from"lit/decorators.js";var He=class extends mo{constructor(){super();this.data=null;this.tab="positions";new h(this)}render(){if(!this.data?.transitPlanets?.length)return N`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:a,summary:s}=this.data,i=[Ar(e),le(r)].filter(Boolean).join(" "),l=a?.length??0,c=this.tab;return N`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${i?N`<p class="subtitle">${i}</p>`:Oe}</div>${l>0?N`${nr({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${l})`}],active:c,onSelect:p=>{this.tab=p},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?N`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:N`${s?this.renderSummaryPills(s):Oe}<div class="overflow-scroll">${this.renderAspectsList(a??[])}</div>`}</div>`:N`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return N`<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 N`<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=C[v(r.name)]??"",a=_[v(r.sign)]??"",s=r.speed>=0?"\u2191":"\u2193";return N`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?N`<span class="retro-badge" aria-label="retrograde">R</span>`:Oe}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${r.sign}</div></td><td class="num">${f(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${f(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return N`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let a=C[v(r.transitPlanet)]??"",s=C[v(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return N`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${a}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${f(r.orb,2)}° · strength ${f(r.strength,1)} </span>${sr()}</summary><div class="interp-body">${l?.summary?N`<p>${l.summary}</p>`:Oe} ${l?.impact?N`<p><strong>Impact:</strong> ${l.impact}</p>`:Oe} ${l?.timing?N`<p><strong>Timing:</strong> ${l.timing}</p>`:Oe} ${l?.guidance?N`<p><strong>Guidance:</strong> ${l.guidance}</p>`:Oe} ${l?.keywords?.length?N`<div class="interp-keywords">${l.keywords.map(m=>N`<span class="kw">${m}</span>`)}</div>`:Oe}</div></details>`})}</div>`}};He.styles=[g,Le,or,po`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-fg,#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([yo({attribute:!1})],He.prototype,"data",2),d([ho()],He.prototype,"tab",2),He=d([go("roxy-transits-table")],He);import{html as Et,LitElement as uo}from"lit";import{customElement as xo,property as Nt}from"lit/decorators.js";var Ie=class extends uo{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){return this.data?.meta?Er(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?Et`<div class="wrap"><div class="header"><h2 class="title">Vedic kundli</h2>${Dr(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>${Nr(e,this.chartStyle)}</svg></div>`:Et`<div class="roxy-empty" role="status">No kundli data</div>`}};Ie.styles=[g,Gr,Le],d([Nt({attribute:!1})],Ie.prototype,"data",2),d([Nt({type:String,reflect:!0,attribute:"chart-style"})],Ie.prototype,"chartStyle",2),Ie=d([xo("roxy-vedic-kundli")],Ie);import{css as fo,html as hr,LitElement as bo,nothing as at}from"lit";import{customElement as vo,property as $o}from"lit/decorators.js";var wo=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],er=class extends bo{constructor(){super();this.data=null;new h(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let a of wo){let s=e[a];s&&(t.push([a,s]),r.add(a))}for(let[a,s]of Object.entries(e))r.has(a)||t.push([a,s]);return t}render(){if(!this.data?.meta)return hr`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return hr`<div class="wrap" aria-label="Vedic planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let a=(t.graha??r)==="Lagna",s=C[v(t.graha??r)]??"",i=_[v(t.rashi??"")]??"";return hr`<tr class="${a?"lagna":""}"><td class="graha">${s?hr`<span class="glyph">${s}</span>`:at}${t.graha??r}</td><td>${i?hr`<span class="glyph">${i}</span>`:at}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?zr(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?hr`<span class="retro">R</span>`:at}</td></tr>`})}</tbody></table></div>`}};er.styles=[g,fo`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width: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-fg,#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}`],d([$o({attribute:!1})],er.prototype,"data",2),er=d([vo("roxy-vedic-planets-table")],er);import{css as ko,html as rr,LitElement as So,nothing as jr}from"lit";import{customElement as Lo,property as Co}from"lit/decorators.js";var tr=class extends So{constructor(){super();this.data=null;new h(this)}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,a]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])a&&r.push({name:t,sign:a.sign,longitude:a.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return rr`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return rr`<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=C[v(r.name)]??"",a=_[v(r.sign??"")]??"",s=typeof r.speed=="number"?f(r.speed,3):"";return rr`<tr class="${r.isPoint?"point":""}"><td class="body">${t?rr`<span class="glyph">${t}</span>`:jr}${r.name}</td><td>${a?rr`<span class="glyph">${a}</span>`:jr}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?zr(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${s?rr`${s}°/day`:jr} ${r.isRetrograde?rr`<span class="retro">℞</span>`:jr}</td></tr>`})}</tbody></table></div>`}};tr.styles=[g,ko`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],d([Co({attribute:!1})],tr.prototype,"data",2),tr=d([Lo("roxy-western-planets-table")],tr);import{css as To,html as J,LitElement as Ro,nothing as Sr}from"lit";import{customElement as Po,property as Ao,state as zo}from"lit/decorators.js";var je=class extends Ro{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new h(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return J`<span class="${r}">${e}</span>`}renderDetailCard(e){return J`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Sr}</p>${e.description?J`<p class="description">${e.description}</p>`:Sr} ${e.result?J`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Sr}</div>`}render(){if(!this.data)return J`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return J`<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(y=>y.name.toLowerCase().includes(r)):c,m=e.total;return J`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${m!==void 0?J`<span class="count">${m} total</span>`:Sr}</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(y=>this.renderDetailCard(y)):J`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let s=t,i=r?s.filter(c=>c.name.toLowerCase().includes(r)):s,l=e.total;return J`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?J`<span class="count">${l} total</span>`:Sr}</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=>J`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):J`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return J`<div class="roxy-empty" role="status">No yoga data</div>`}};je.styles=[g,To`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-fg,#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([Ao({attribute:!1})],je.prototype,"data",2),d([zo()],je.prototype,"filter",2),je=d([Po("roxy-yoga-list")],je);var st=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,personal-year,chart}",docsSummary:"Life path, expression, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Mo="0.6.0";var bc=st.map(o=>o.slug);export{st as ROXY_COMPONENTS,bc as ROXY_UI_COMPONENTS,Mo as ROXY_UI_VERSION,fe as RoxyAshtakavargaGrid,be as RoxyBiorhythmChart,_e as RoxyChoghadiyaGrid,we as RoxyCompatibilityCard,ke as RoxyDashaTimeline,Se as RoxyData,Ce as RoxyDivisionalChart,Te as RoxyDoshaCard,q as RoxyEndpointForm,Ve as RoxyGunaMilan,Re as RoxyHexagram,Pe as RoxyHoroscopeCard,Ae as RoxyKpChart,Fe as RoxyKpPlanetsTable,We as RoxyKpRulingPlanets,B as RoxyLocationSearch,Me as RoxyMoonPhase,Je as RoxyNakshatraCard,xe as RoxyNatalChart,Ee as RoxyNumerologyCard,Ne as RoxyPanchangTable,Ze as RoxyShadbalaTable,Qe as RoxySynastryChart,De as RoxyTarotCard,Ge as RoxyTarotSpread,He as RoxyTransitsTable,Ie as RoxyVedicKundli,er as RoxyVedicPlanetsTable,tr as RoxyWesternPlanetsTable,je as RoxyYogaList};
|
|
1
|
+
var Dt=Object.defineProperty;var Gt=Object.getOwnPropertyDescriptor;var d=(o,n,e,r)=>{for(var t=r>1?void 0:r?Gt(n,e):n,a=o.length-1,s;a>=0;a--)(s=o[a])&&(t=(r?s(n,e,t):s(t))||t);return r&&t&&Dt(n,e,t),t};import{css as jt,html as q,LitElement as Kt,nothing as Bt}from"lit";import{customElement as _t,property as Yt,state as qt}from"lit/decorators.js";var L={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},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"},Y={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Rr={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},G=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],Eo=G.map(o=>o.toLowerCase()),Br={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},_r={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}"};import{css as Ot}from"lit";var y=Ot`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var Ht="roxy-data";function It(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var h=class{constructor(n){this.host=n,n.addController(this)}hostConnected(){if(this.host.data!=null)return;let n=this.read();n!==void 0&&(this.host.data=n,this.host.requestUpdate())}read(){let n=this.findInlineScript();return n?this.parse(n.textContent):void 0}findInlineScript(){for(let n of Array.from(this.host.children))if(It(n)&&n.classList.contains(Ht))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var Vt={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Ve=["sarva","bhinna","pinda"],$e=class extends Kt{constructor(){super();this.data=null;this.activeTab="sarva";new h(this)}render(){if(!this.data)return q`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return q`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?q`<p class="subtitle">${e.length} signs</p>`:Bt}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Ve.map(r=>q`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${Vt[r]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=Ve.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Ve[(r+1)%Ve.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Ve[(r-1+Ve.length)%Ve.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?q`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,a)=>{let s=r.bindus[a]??0,i=this.sarvaHeat(s);return q`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${Y[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${s}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:q`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?q`<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=>q`<th scope="col" title="${t}">${Y[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>q`<tr><td>${t.planet}</td>${t.bindus.map(a=>{let s=this.bhinnaHeat(a);return q`<td class="${`heat-cell ${s}`}">${a}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:q`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?q`<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=>q`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:q`<p class="roxy-empty">No shodhya pinda data</p>`}};$e.styles=[y,jt`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([Yt({attribute:!1})],$e.prototype,"data",2),d([qt()],$e.prototype,"activeTab",2),$e=d([_t("roxy-ashtakavarga-grid")],$e);import{css as Ft,html as ne,LitElement as Ut,nothing as Ar,svg as Wt}from"lit";import{customElement as Jt,property as it}from"lit/decorators.js";var lt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},we=class extends Ut{constructor(){super();this.data=null;this.mode="daily";new h(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):ne`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([a,s])=>{let i=typeof s=="number"?s:0,l=Math.abs(i)>1?i/100:i;return[a,l]});return ne`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?ne`<span class="energy">Energy ${e.energyRating}/10</span>`:Ar}</header><div class="bars" role="list">${t.map(([a,s])=>{let i=(s+1)/2*100,l=lt[a]??"var(--roxy-accent, #f59e0b)";return ne`<div class="bar" role="listitem"><span style="text-transform:capitalize">${a}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(s*100)}%</span></div>`})}</div>${e.dailyMessage?ne`<p class="advice">${e.dailyMessage}</p>`:Ar} ${e.advice?ne`<p class="advice">${e.advice}</p>`:Ar}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return ne`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,a=160,s=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return ne`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${a}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${a/2}" x2="${t}" y2="${a/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((p,g)=>{let v=p[l]??0,u=g*s,qe=a/2-v/100*(a/2-8);return`${u.toFixed(2)},${qe.toFixed(2)}`}).join(" "),m=lt[l]??"#475569";return Wt`<polyline points=${c} fill="none" stroke=${m} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?ne`<p class="advice">${e.summary.periodAdvice}</p>`:Ar}</section>`}renderCritical(e){return ne`<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=>ne`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};we.styles=[y,Ft`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([it({attribute:!1})],we.prototype,"data",2),d([it({type:String,reflect:!0})],we.prototype,"mode",2),we=d([Jt("roxy-biorhythm-chart")],we);import{css as Xt,html as Se,LitElement as Zt,nothing as Yr}from"lit";import{customElement as Qt,property as ea}from"lit/decorators.js";function b(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function ke(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,n=>n.toUpperCase())}function dt(o){try{let n=new Date(o);return Number.isNaN(n.getTime())?o:n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return o}}var Fe=class extends Zt{constructor(){super();this.data=null;new h(this)}isCurrent(e){let r=Date.now(),t=Date.parse(e.start),a=Date.parse(e.end);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",t=this.isCurrent(e),a=L[b(e.lord)]??"",s=`${dt(e.start)} - ${dt(e.end)}`;return Se`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?Se`<span class="now-badge">Now</span>`:Yr} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${a?Se`<span aria-hidden="true">${a}</span>`:Yr} ${e.lord}</span></div>`}render(){if(!this.data)return Se`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return Se`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?Se`<p class="subtitle">${e}</p>`:Yr}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(a=>this.renderTile(a)):Se`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(a=>this.renderTile(a)):Se`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Fe.styles=[y,Xt`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],d([ea({attribute:!1})],Fe.prototype,"data",2),Fe=d([Qt("roxy-choghadiya-grid")],Fe);import{css as ra,html as O,LitElement as ta,nothing as ee}from"lit";import{customElement as aa,property as pt}from"lit/decorators.js";function ce(o){if(typeof o!="string"||o.length===0||/^\d{4}-\d{2}-\d{2}$/.test(o))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(o)?`1970-01-01T${o}`:o,r=new Date(e);return Number.isNaN(r.getTime())?o:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function zr(o){if(typeof o!="string"||o.length===0)return"";let n=new Date(/^\d{4}-\d{2}-\d{2}$/.test(o)?`${o}T00:00:00`:o);return Number.isNaN(n.getTime())?o:n.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function qr(o){if(!o)return"";let n=ce(o.start),e=ce(o.end);return n&&e?`${n} - ${e}`:n||e||""}function x(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function ct(o,n=1){let e=x(o,n);return e?`${e}%`:""}var fr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function nr(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var Le=class extends ta{constructor(){super();this.data=null;this.mode="astrology";new h(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,a]of Object.entries(e.categories))typeof a=="number"&&Number.isFinite(a)&&(r[t]=a);return r}return{}}render(){let e=this.data;if(!e)return O`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),a="rating"in e?e.rating:void 0,s="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,m="strengths"in e?e.strengths:void 0,p="challenges"in e?e.challenges:void 0,g="keyAspects"in e?e.keyAspects:void 0;return O`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?O`<div class="score">${x(r,0)}</div>`:ee} ${a?O`<div class="rating">${a}</div>`:ee}</div></div>${Object.keys(t).length>0?O`<div role="list">${Object.entries(t).map(([v,u])=>O`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${v}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,u))}%"></span></span> <span>${x(u,0)}</span></div>`)}</div>`:ee} ${s?O`<p><span class="archetype">${s.label}</span> ${s.description?O`· ${s.description}`:ee}</p>`:ee} ${l?O`<p>${l}</p>`:ee} ${c&&!l?O`<p>${c}</p>`:ee} ${i?O`<p>${i}</p>`:ee} ${(m?.length??0)>0||(p?.length??0)>0?O`<div class="lists">${m?.length?O`<div><h3>Strengths</h3><ul>${m.map(v=>O`<li>${v}</li>`)}</ul></div>`:ee} ${p?.length?O`<div><h3>Challenges</h3><ul>${p.map(v=>O`<li>${v}</li>`)}</ul></div>`:ee}</div>`:ee} ${g?.length?O`<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)">${g.slice(0,6).map(v=>O`<li>${sa(v)}</li>`)}</ul></div>`:ee}</article>`}};Le.styles=[y,ra`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([pt({attribute:!1})],Le.prototype,"data",2),d([pt({type:String,reflect:!0})],Le.prototype,"mode",2),Le=d([aa("roxy-compatibility-card")],Le);function sa(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${x(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}import{css as oa,html as z,LitElement as na,nothing as V}from"lit";import{customElement as ia,property as mt}from"lit/decorators.js";var Ce=class extends na{constructor(){super();this.data=null;this.period="current";new h(this)}render(){let e=this.data;if(!e)return z`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(a=>a.durationYears)):0;return z`<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?z`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?z`(lord ${e.nakshatraLord})`:V}</div>`:V}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):V} ${r.length>0?z`<div class="timeline" role="list">${r.map(a=>this.renderBar(a,t))}</div>`:V} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return V;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",a=r.years??0,s=r.months??0,i=r.days??0,l=[];a&&l.push(`${a}y`),s&&l.push(`${s}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return z`<p class="balance">Birth dasha balance: ${c} of ${t?z`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?z`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:V}renderCurrent(e){return"mahadasha"in e?z`<div class="current">${"mahadasha"in e&&e.mahadasha?z`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?z`<small>${x(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:V}</div>`:V} ${"antardasha"in e&&e.antardasha?z`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?z`<small>${x(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:V}</div>`:V} ${"pratyantardasha"in e&&e.pratyantardasha?z`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?z`<small>${x(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:V}</div>`:V}</div>`:V}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),a=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),a=Date.now();return Number.isNaN(r)||Number.isNaN(t)||a<r||a>=t||t<=r?-1:(a-r)/(t-r)}renderBar(e,r){let t=e.durationYears,a=r>0?t/r*100:0,s=this.isCurrent(e),i=s?this.progressIn(e):-1,l=s?"bar-track bar-now":"bar-track";return z`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?z`<span class="now-badge">Now</span>`:V} </span><span class="${l}"><span class="bar-fill" style="width:${a}%"></span> ${i>=0?z`<span class="bar-progress" style="left:${i*a}%" aria-hidden="true"></span>`:V} </span><span class="dates">${e.startDate?gt(e.startDate):""} ${e.endDate?z`- ${gt(e.endDate)}`:""}</span></div>`}};Ce.styles=[y,oa`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([mt({attribute:!1})],Ce.prototype,"data",2),d([mt({type:String,reflect:!0})],Ce.prototype,"period",2),Ce=d([ia("roxy-dasha-timeline")],Ce);function gt(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}import{css as la,html as P,LitElement as da,nothing as br}from"lit";import{customElement as ca,property as yt}from"lit/decorators.js";var pa=["title","name","label","heading","overview","summary"],ma=["imageUrl","image","icon","symbol"],ga=["imageUrl","image"],ya=6,Pe=class extends da{constructor(){super();this.data=null;this.depth=0;new h(this)}render(){return this.data==null?P`<div class="roxy-empty" role="status">No data</div>`:this.depth>=ya?P`<div class="roxy-empty" role="status">…</div>`:P`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?br:typeof e=="string"?P`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?P`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?P`<div class="roxy-empty" role="status">Empty list</div>`:e.every(a=>a===null||["string","number","boolean"].includes(typeof a))?P`<ul class="roxy-chips">${e.map(a=>P`<li>${String(a)}</li>`)}</ul>`:e.every(a=>a!==null&&typeof a=="object"&&!Array.isArray(a))?this.renderTable(e):P`<ol>${e.map(a=>P`<li>${this.renderValue(a)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return P`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>P`<th>${ke(t)}</th>`)}</tr></thead><tbody>${e.map(t=>P`<tr>${r.map(a=>P`<td>${this.formatPrimitive(t[a])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=pa.find(i=>typeof e[i]=="string"),t=ma.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),a=r!=="summary"&&typeof e.summary=="string"?"summary":null,s=Object.entries(e).filter(([i,l])=>i!==r&&i!==a&&!ga.includes(i)&&l!==null&&l!==void 0);return P`${t?P`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:br} ${r?P`<h3 class="roxy-title">${e[r]}</h3>`:br} ${a?P`<p class="roxy-summary">${e[a]}</p>`:br} ${s.length>0?P`<dl class="roxy-rows">${s.map(([i,l])=>P`<dt>${ke(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:br}`}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))?P`<ul class="roxy-chips">${e.map(t=>P`<li>${String(t)}</li>`)}</ul>`:P`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let a of Object.keys(t))r.add(a);return Array.from(r)}};Pe.styles=[y,la`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([yt({attribute:!1})],Pe.prototype,"data",2),d([yt({attribute:!1})],Pe.prototype,"depth",2),Pe=d([ca("roxy-data")],Pe);import{css as Ha,html as lr,LitElement as Ia,nothing as Ur}from"lit";import{customElement as ja,property as bt}from"lit/decorators.js";import{nothing as Z,svg as R}from"lit";function pe(o){let n=o%360;return n<0?n+360:n}function me(o){let n=pe(o),e=Math.floor(n/30)%12,r=n%30,t=Math.floor(r),a=(r-t)*60,s=Math.floor(a),i=Math.round((a-s)*60);return{sign:G[e]??"Aries",signIndex:e,degree:t,minute:s,second:i}}function Nr(o){let{sign:n,degree:e,minute:r}=me(o);return`${e}\xB0 ${n} ${String(r).padStart(2,"0")}'`}function Vr(o){return pe(o+180)}function ht(o,n){let e=pe(o),r=pe(n)-e;return r<0&&(r+=360),pe(e+r/2)}function k(o,n,e,r){let t=r*Math.PI/180;return{x:o+e*Math.cos(t),y:n+e*Math.sin(t)}}import{css as ha,html as ut,nothing as ua}from"lit";var Te=ha`.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 ir(o){let{items:n,active:e,onSelect:r,label:t,idPrefix:a,controls:s=!1}=o;return ut`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=n.findIndex(v=>v.id===e);if(c===-1)return;let m=l.key==="ArrowRight"?1:-1,p=n[(c+m+n.length)%n.length];if(!p)return;r(p.id);let g=l.currentTarget.getRootNode();requestAnimationFrame(()=>{g.querySelector(`#${a}-tab-${p.id}`)?.focus()})}}">${n.map(l=>ut`<button type="button" class="roxy-tab" role="tab" id="${a}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${s&&e===l.id?`${a}-panel-${l.id}`:ua}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ie=400,S=20,K=ie-2*S,T=ie/2,xa=Object.fromEntries(G.map(o=>[o.toLowerCase(),o])),fa=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],ba="\u02B3";function xt(o,n){return typeof o.longitude!="number"||!Number.isFinite(o.longitude)?!1:me(o.longitude).sign.toLowerCase()!==n.toLowerCase()}function va(o,n){let e=ot[b(o.graha)]??o.graha.slice(0,2),r=o.isRetrograde?ba:"";if(typeof o.longitude!="number"||!Number.isFinite(o.longitude)||xt(o,n))return`${e}${r}`;let{degree:t}=me(o.longitude);return`${e} ${t}\xB0${r}`}function $a(o,n){let e=[b(o.graha)],r=xt(o,n);if(r&&e.push(`in ${n}`),typeof o.longitude=="number"&&Number.isFinite(o.longitude)){let t=me(o.longitude),a=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${a}' ${t.sign}`:`${t.degree}\xB0${a}' ${t.sign}`)}if(o.nakshatra?.name){let t=o.nakshatra.pada?` pada ${o.nakshatra.pada}`:"";e.push(`${o.nakshatra.name}${t}`)}return o.awastha&&e.push(o.awastha),o.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Fr(o,n,e,r,t){let a=r-(o.length-1)*t/2;return o.map((s,i)=>{let l=a+i*t;return R`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${va(s,n)}<title>${$a(s,n)}</title></text>`})}function Er(o,n){let e={};for(let t of G)e[t.toLowerCase()]=[];let r="";for(let[t,a]of Object.entries(o??{})){let s=(a?.rashi??"").toLowerCase();if(t==="Lagna"||a?.graha==="Lagna"){r=xa[s]??"";continue}!s||!(s in e)||e[s]?.push({graha:a.graha??t,longitude:a.longitude,nakshatra:a.nakshatra,isRetrograde:a.isRetrograde,awastha:a.awastha})}return{lagnaSign:r,placements:e,divisionLabel:n}}var Ue=K/4,wa={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 ka(o){let n=wa[o]??{col:0,row:0};return{x:S+n.col*Ue,y:S+n.row*Ue,w:Ue,h:Ue}}function Sa(o){let n=S,e=S+Ue,r=S+2*Ue,t=S+3*Ue,a=ie-S;return R`
|
|
2
|
+
<rect class="line" x=${n} y=${n} width=${K} height=${K} stroke-width="1.5" fill="none" />
|
|
3
|
+
<line class="line" x1=${n} y1=${e} x2=${a} y2=${e} stroke-width="1" />
|
|
4
|
+
<line class="line" x1=${n} y1=${t} x2=${a} y2=${t} stroke-width="1" />
|
|
5
|
+
<line class="line" x1=${e} y1=${n} x2=${e} y2=${a} stroke-width="1" />
|
|
6
|
+
<line class="line" x1=${t} y1=${n} x2=${t} y2=${a} stroke-width="1" />
|
|
7
|
+
<line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
8
|
+
<line class="line" x1=${t} y1=${r} x2=${a} y2=${r} stroke-width="1" />
|
|
9
|
+
<line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
|
|
10
|
+
<line class="line" x1=${r} y1=${t} x2=${r} y2=${a} stroke-width="1" />
|
|
11
|
+
${o?R`<text class="centre-label" x=${T} y=${T} text-anchor="middle" dominant-baseline="central">${o}</text>`:Z}
|
|
12
|
+
`}function ft(o,n){let e=G.findIndex(t=>t===n),r=G.findIndex(t=>t===o);return e===-1||r===-1?0:(r-e+12)%12+1}function La(o,n,e,r){let t=ka(o),a=t.x+t.w/2,s=t.y+t.h/2,i=Rr[o]??o.slice(0,2),l=14;return R`
|
|
13
|
+
<g class=${e?"cell lagna":"cell"}>
|
|
14
|
+
${e?R`
|
|
15
|
+
<rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
|
|
16
|
+
<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" />
|
|
17
|
+
`:Z}
|
|
18
|
+
<text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
|
|
19
|
+
${r>0?R`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:Z}
|
|
20
|
+
${e?R`<text class="lagna-marker" x=${a} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:Z}
|
|
21
|
+
${n.length?Fr(n,o,a,s+4,14):Z}
|
|
22
|
+
</g>
|
|
23
|
+
`}function Ca(o){let n=o.lagnaSign.toLowerCase();return R`
|
|
24
|
+
${Sa(o.divisionLabel)}
|
|
25
|
+
${G.map(e=>La(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,ft(e,o.lagnaSign)))}
|
|
26
|
+
`}var w={tl:{x:S,y:S},tr:{x:ie-S,y:S},br:{x:ie-S,y:ie-S},bl:{x:S,y:ie-S},top:{x:T,y:S},right:{x:ie-S,y:T},bottom:{x:T,y:ie-S},left:{x:S,y:T},tlMid:{x:T-K/4,y:T-K/4},trMid:{x:T+K/4,y:T-K/4},brMid:{x:T+K/4,y:T+K/4},blMid:{x:T-K/4,y:T+K/4}};function fe(o){let n=o.reduce((r,t)=>r+t.x,0)/o.length,e=o.reduce((r,t)=>r+t.y,0)/o.length;return{x:n,y:e}}var Pa={1:{x:T,y:w.tlMid.y},2:fe([w.tl,w.top,w.tlMid]),3:fe([w.tl,w.left,w.tlMid]),4:{x:w.tlMid.x,y:T},5:fe([w.bl,w.left,w.blMid]),6:fe([w.bl,w.bottom,w.blMid]),7:{x:T,y:w.blMid.y},8:fe([w.br,w.bottom,w.brMid]),9:fe([w.br,w.right,w.brMid]),10:{x:w.brMid.x,y:T},11:fe([w.tr,w.right,w.trMid]),12:fe([w.tr,w.top,w.trMid])};function Ta(o,n){let e=G.findIndex(r=>r===n);return e===-1?o:(e+o-1)%12+1}function Ra(o){let{tl:n,tr:e,br:r,bl:t,top:a,right:s,bottom:i,left:l}=w;return R`
|
|
27
|
+
<rect class="line" x=${n.x} y=${n.y} width=${K} height=${K} stroke-width="1.5" fill="none" />
|
|
28
|
+
<polygon class="line" points="${a.x},${a.y} ${s.x},${s.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
|
|
29
|
+
<line class="line" x1=${n.x} y1=${n.y} x2=${r.x} y2=${r.y} stroke-width="1" />
|
|
30
|
+
<line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
|
|
31
|
+
${o?R`<text class="centre-label" x=${T} y=${T} text-anchor="middle" dominant-baseline="central">${o}</text>`:Z}
|
|
32
|
+
`}function Aa(o,n,e,r,t){let a=Pa[o];if(!a)return R``;let s=Math.min(14,Math.abs(a.y-T)*.45+6),i=s+12,l=t?`${n} \xB7 ${Rr[e]??e.slice(0,2)}`:`${n}`;return R`
|
|
33
|
+
<g class=${t?"cell lagna":"cell"}>
|
|
34
|
+
<text class="rashi-num" x=${a.x} y=${a.y-s} text-anchor="middle" dominant-baseline="central">${l}</text>
|
|
35
|
+
${t?R`<text class="lagna-marker" x=${a.x} y=${a.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:Z}
|
|
36
|
+
${r.length?Fr(r,e,a.x,a.y+8,12):Z}
|
|
37
|
+
</g>
|
|
38
|
+
`}function za(o){let n=o.lagnaSign||"Aries";return R`
|
|
39
|
+
${Ra(o.divisionLabel)}
|
|
40
|
+
${Array.from({length:12},(e,r)=>{let t=r+1,a=Ta(t,n),s=G[a-1]??"Aries";return Aa(t,a,s,o.placements[s.toLowerCase()]??[],t===1)})}
|
|
41
|
+
`}var Mr=K/3;function Na(){let o=S,n=S+Mr,e=S+2*Mr,r=ie-S,Cr={Aries:[{x:n,y:o},{x:e,y:o},{x:e,y:n},{x:n,y:n}],Taurus:[{x:o,y:o},{x:n,y:o},{x:n,y:n}],Gemini:[{x:o,y:o},{x:n,y:n},{x:o,y:n}],Cancer:[{x:o,y:n},{x:n,y:n},{x:n,y:e},{x:o,y:e}],Leo:[{x:o,y:e},{x:n,y:e},{x:o,y:r}],Virgo:[{x:n,y:e},{x:n,y:r},{x:o,y:r}],Libra:[{x:n,y:e},{x:e,y:e},{x:e,y:r},{x:n,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:n},{x:r,y:n},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:o},{x:r,y:n},{x:e,y:n}],Pisces:[{x:e,y:o},{x:r,y:o},{x:e,y:n}]},xr={};for(let[Pr,Tr]of Object.entries(Cr))xr[Pr]={points:[...Tr],centroid:fe(Tr)};return xr}var Ma=Na();function Ea(o){let n=S,e=S+Mr,r=S+2*Mr,t=ie-S;return R`
|
|
42
|
+
<rect class="line" x=${n} y=${n} width=${K} height=${K} stroke-width="1.5" fill="none" />
|
|
43
|
+
<line class="line" x1=${n} y1=${e} x2=${e} y2=${e} stroke-width="1" />
|
|
44
|
+
<line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
|
|
45
|
+
<line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
46
|
+
<line class="line" x1=${r} y1=${r} x2=${t} y2=${r} stroke-width="1" />
|
|
47
|
+
<line class="line" x1=${e} y1=${n} x2=${e} y2=${e} stroke-width="1" />
|
|
48
|
+
<line class="line" x1=${e} y1=${r} x2=${e} y2=${t} stroke-width="1" />
|
|
49
|
+
<line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
|
|
50
|
+
<line class="line" x1=${r} y1=${r} x2=${r} y2=${t} stroke-width="1" />
|
|
51
|
+
<line class="line" x1=${n} y1=${n} x2=${e} y2=${e} stroke-width="1" />
|
|
52
|
+
<line class="line" x1=${t} y1=${n} x2=${r} y2=${e} stroke-width="1" />
|
|
53
|
+
<line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
|
|
54
|
+
<line class="line" x1=${n} y1=${t} x2=${e} y2=${r} stroke-width="1" />
|
|
55
|
+
${o?R`<text class="centre-label" x=${T} y=${T} text-anchor="middle" dominant-baseline="central">${o}</text>`:Z}
|
|
56
|
+
`}function Da(o,n,e,r){let t=Ma[o];if(!t)return R``;let{centroid:a,points:s}=t,i=Rr[o]??o.slice(0,2),l=s.map(c=>`${c.x},${c.y}`).join(" ");return R`
|
|
57
|
+
<g class=${e?"cell lagna":"cell"}>
|
|
58
|
+
${e?R`<polygon class="lagna-bg" points=${l} />`:Z}
|
|
59
|
+
<text class="sign-text" x=${a.x} y=${a.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
|
|
60
|
+
${r>0?R`<text class="house-num" x=${a.x+18} y=${a.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:Z}
|
|
61
|
+
${e?R`<text class="lagna-marker" x=${a.x} y=${a.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:Z}
|
|
62
|
+
${n.length?Fr(n,o,a.x,a.y+4,12):Z}
|
|
63
|
+
</g>
|
|
64
|
+
`}function Ga(o){let n=o.lagnaSign.toLowerCase();return R`
|
|
65
|
+
${Ea(o.divisionLabel)}
|
|
66
|
+
${G.map(e=>Da(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,ft(e,o.lagnaSign)))}
|
|
67
|
+
`}function Dr(o,n){switch(n){case"north":return za(o);case"east":return Ga(o);default:return Ca(o)}}function Gr(o,n){return ir({items:fa,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}import{css as Oa}from"lit";var Or=Oa`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var Re=class extends Ia{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Er(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return lr`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return lr`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?lr`<span class="division-meta">· ${r.sanskritName}</span>`:Ur}</h2>${r.significance?lr`<p class="significance">${r.significance}</p>`:Ur}</div>${Gr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${r.number} ${r.name} divisional chart with twelve sign houses"><title>D${r.number} ${r.name}</title>${Dr(e,this.chartStyle)}</svg> ${t&&t.length>0?lr`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(a=>lr`<span class="vargottama-pill" role="listitem">${L[a]??""} ${a}</span>`)}</div>`:Ur}</div>`}};Re.styles=[y,Or,Te,Ha`.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([bt({attribute:!1})],Re.prototype,"data",2),d([bt({type:String,reflect:!0,attribute:"chart-style"})],Re.prototype,"chartStyle",2),Re=d([ja("roxy-divisional-chart")],Re);import{css as Ka,html as ge,LitElement as Ba,nothing as dr}from"lit";import{customElement as _a,property as vt}from"lit/decorators.js";var Ya={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Ae=class extends Ba{constructor(){super();this.data=null;this.type="manglik";new h(this)}render(){let e=this.data;if(!e)return ge`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=Ya[this.type]??this.type,a=(e.severity??"").toLowerCase(),s=a==="severe"?3:a==="moderate"?2:a==="mild"?1:0,i=s*33,l=s===3?"var(--roxy-danger)":s===2?"var(--roxy-warning)":s===1?"var(--roxy-success)":"transparent";return ge`<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?ge`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${s}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:dr} ${e.description?ge`<p class="description">${e.description}</p>`:dr} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?ge`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>ge`<li>${c}</li>`)}</ul></div>`:dr} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?ge`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>ge`<li>${c}</li>`)}</ul></div>`:dr}</article>`}renderEffects(e){if(!e.effects)return dr;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?dr:ge`<div class="effects">${r.map(([t,a])=>ge`<div><h3>${t}</h3><p>${a}</p></div>`)}</div>`}};Ae.styles=[y,Ka`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([vt({attribute:!1})],Ae.prototype,"data",2),d([vt({type:String,reflect:!0})],Ae.prototype,"type",2),Ae=d([_a("roxy-dosha-card")],Ae);import{css as qa,html as ye,LitElement as Va,nothing as Hr}from"lit";import{customElement as Fa,property as Ir,state as vr}from"lit/decorators.js";var Wr=new Map;async function Ua(o){let n=Wr.get(o);return n||(n=fetch(o).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw Wr.delete(o),e}),Wr.set(o,n)),n}var F=class extends Va{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(t=>t.required).filter(t=>this.values[t.name]===void 0||this.values[t.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(t=>t.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Ua(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let a=e.components?.schemas??{},s=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,a)}if(i?.properties){let c=new Set(i.required??[]);for(let[m,p]of Object.entries(i.properties)){let g=this.resolve(p,a)??{};s.push({name:m,type:this.fieldType(g),required:c.has(m),description:g.description,enum:g.enum,min:g.minimum,max:g.maximum,default:g.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let m=this.resolve(c.schema,a)??{};s.push({name:c.name,type:this.fieldType(m),required:!!c.required,description:m.description,enum:m.enum,default:m.default})}this.fields=s,this.hasLocation=s.some(c=>c.name==="latitude")&&s.some(c=>c.name==="longitude")&&s.some(c=>c.name==="timezone");let l={};for(let c of s)c.default!==void 0&&(l[c.name]=c.default);this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return ye`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return ye`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return Hr;let t=`roxy-form-${r.name}`;return ye`<div class="field"><label for="${t}">${ke(r.name)}${r.required?ye`<span class="req" aria-hidden="true">*</span>`:Hr}</label> ${r.enum?ye`<select id="${t}" ?required="${r.required}" @change="${a=>this.setValue(r.name,a.target.value)}"><option value="">Choose</option>${r.enum.map(a=>ye`<option value="${a}" ?selected="${this.values[r.name]===a}">${a}</option>`)}</select>`:ye`<input id="${t}" type="${this.htmlType(r.type)}" ?required="${r.required}" min="${r.min??""}" max="${r.max??""}" step="${r.type==="number"?"any":""}" .value="${this.values[r.name]??""}" @input="${a=>this.setValue(r.name,this.coerce(r.type,a.target.value))}">`} ${r.description?ye`<small class="help">${r.description}</small>`:Hr}</div>`};return ye`<form @submit="${this.onSubmit}"><h2 class="title">${ke(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?ye`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:Hr}<div class="fields">${this.fields.map(r=>e(r))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};F.styles=[y,qa`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([Ir({type:String,attribute:"data-endpoint"})],F.prototype,"endpoint",2),d([Ir({type:String})],F.prototype,"method",2),d([Ir({type:String,attribute:"spec-url"})],F.prototype,"specUrl",2),d([Ir({type:String,attribute:"submit-label"})],F.prototype,"submitLabel",2),d([vr()],F.prototype,"fields",2),d([vr()],F.prototype,"values",2),d([vr()],F.prototype,"hasLocation",2),d([vr()],F.prototype,"loaded",2),d([vr()],F.prototype,"specError",2),F=d([Fa("roxy-endpoint-form")],F);import{css as Wa,html as be,LitElement as Ja,nothing as jr}from"lit";import{customElement as Xa,property as Za}from"lit/decorators.js";var We=class extends Ja{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return be`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(p=>p?.category!==void 0),t=e.total??0,a=e.maxScore??36,s=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",l=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,m=(100-s)*2.827;return be`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${x(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?be`<small style="margin-left:.5rem;color:var(--roxy-muted)">${ct(e.percentage,1)}</small>`:jr}</div>${e.recommendation?be`<span class="recommendation">${e.recommendation}</span>`:jr}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${l}" stroke-width="8" stroke-dasharray="${c},${m}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${r.length>0?be`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(p=>{let g=p.score??0,v=p.maxScore??Qa(p.category),u=v?g/v*100:0;return be`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${u}%"></span></div></td><td class="score">${x(g,1)} / ${v}</td></tr>`})}</tbody></table>`:jr} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?be`<div class="tags">${e.doshas?.map(p=>be`<span class="dosha">${p}</span>`)} ${e.doshaCancellations?.map(p=>be`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:jr}</article>`}};We.styles=[y,Wa`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],d([Za({attribute:!1})],We.prototype,"data",2),We=d([Xa("roxy-guna-milan")],We);function Qa(o){if(!o)return 1;switch(o.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}import{css as es,html as U,LitElement as rs,nothing as re,svg as $t}from"lit";import{customElement as ts,property as wt}from"lit/decorators.js";var ze=class extends rs{constructor(){super();this.data=null;this.mode="lookup";new h(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return U`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:a,dailyMessage:s,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(a??[]);return U`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?U`<div class="symbol">${r.symbol}</div>`:re}<div class="lines" aria-hidden="true">${l.slice().reverse().map((m,p)=>{let g=l.length-1-p+1,v=c.has(g),u=m===6||m===8;return U`<div class="line ${`${u?"broken":"solid"}${v?" changing":""}`}">${u?$t`<span class="seg"></span><span class="seg"></span>`:$t`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?U`${r.number}.`:re}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?U`${r.chinese}`:re} ${r.pinyin?U`· ${r.pinyin}`:re}</p><div class="trigrams">${r.upperTrigram?U`<div>Upper <span class="tri-glyph">${_r[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:re} ${r.lowerTrigram?U`<div>Lower <span class="tri-glyph">${_r[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:re}</div>${r.judgment?U`<p class="judgment">${r.judgment}</p>`:re} ${r.image?U`<p class="image">${r.image}</p>`:re} ${s?U`<p class="message">${s}</p>`:re} ${r.interpretation?.general?U`<p>${r.interpretation.general}</p>`:re} ${c.size>0?U`<div class="changing">Changing lines: ${Array.from(c).sort((m,p)=>m-p).join(", ")}. ${i?.english?U`Becomes hexagram ${i.number} ${i.english}.`:re}</div>`:re}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,a=[];for(let s=0;s<6;s++){let i=t>>s&1;a.push(i?8:7)}return a}return Array.from({length:6},()=>7)}};ze.styles=[y,es`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([wt({attribute:!1})],ze.prototype,"data",2),d([wt({type:String,reflect:!0})],ze.prototype,"mode",2),ze=d([ts("roxy-hexagram")],ze);import{css as as,html as j,LitElement as ss,nothing as J}from"lit";import{customElement as os,property as kt}from"lit/decorators.js";var Ne=class extends ss{constructor(){super();this.data=null;this.period="daily";new h(this)}render(){let e=this.data;if(!e)return j`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?Y[b(r)]??"":"",a="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,s="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return j`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${s?j`<div class="date">${s}</div>`:J}</div>${a!==null?j`<span class="energy" aria-label="${`Energy ${a} of 10`}">Energy ${a}/10 <span class="energy-bar"><span style="width:${a/10*100}%"></span></span></span>`:J}</header>${e.overview?j`<p class="overview">${e.overview}</p>`:J}<div class="sections">${e.love?j`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:J} ${e.career?j`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:J} ${e.health?j`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:J} ${e.finance?j`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:J} ${"advice"in e&&e.advice?j`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:J}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],m="luckyDays"in e&&e.luckyDays?e.luckyDays:[],p=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&m.length===0&&p.length===0?J:j`<div class="lucky">${i!==void 0?j`<span>Lucky number <strong>${i}</strong></span>`:J} ${l?j`<span>Lucky color <strong>${l}</strong></span>`:J} ${c.length?j`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:J} ${m.length?j`<span>Lucky days <strong>${m.join(", ")}</strong></span>`:J} ${p.length?j`<span class="compat-wrap">Best with <span class="compat">${p.map(g=>j`<span>${g}</span>`)}</span></span>`:J}</div>`})()}</article>`}};Ne.styles=[y,as`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([kt({attribute:!1})],Ne.prototype,"data",2),d([kt({type:String,reflect:!0})],Ne.prototype,"period",2),Ne=d([os("roxy-horoscope-card")],Ne);import{css as ns,html as B,LitElement as is,nothing as Je}from"lit";import{customElement as ls,property as ds,state as cs}from"lit/decorators.js";var Me=class extends is{constructor(){super();this.data=null;this.activeTab="planets";new h(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.planet,sign:a.sign,house:a.house,nakshatra:a.nakshatra,starLord:a.starLord,subLord:a.subLord,subSubLord:a.subSubLord,kpNumber:a.kpNumber,retrograde:a.retrograde})),t=e.nodes;for(let[a,s]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])s&&r.push({name:a,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}render(){if(!this.data)return B`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return B`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?B`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?B`· ${r.nakshatra}`:Je} ${r.subLord?B`· sub lord ${r.subLord}`:Je} ${typeof r.kpNumber=="number"?B`· KP ${r.kpNumber}`:Je}</div>`:Je} ${typeof e.meta?.ayanamsa=="number"?B`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${x(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?B`· ${e.meta.houseSystem} houses`:Je}</div>`:Je}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>B`<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?B`<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=>B`<tr><td class="body">${r.name}${r.retrograde?B`<span class="retro">R</span>`:Je}</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>`:B`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?B`<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=>B`<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>`:B`<p class="roxy-empty" role="status">No cusps</p>`}};Me.styles=[y,ns`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([ds({attribute:!1})],Me.prototype,"data",2),d([cs()],Me.prototype,"activeTab",2),Me=d([ls("roxy-kp-chart")],Me);import{css as ps,html as $r,LitElement as ms,nothing as St}from"lit";import{customElement as gs,property as ys}from"lit/decorators.js";var Xe=class extends ms{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return $r`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return $r`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?$r`<span class="ayanamsa">Ayanamsa: ${x(this.data.ayanamsa,2)}°</span>`:St}</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=>$r`<tr><td class="planet">${r.planet} ${r.retrograde?$r`<span class="retro">R</span>`:St}</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>`}};Xe.styles=[y,ps`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],d([ys({attribute:!1})],Xe.prototype,"data",2),Xe=d([gs("roxy-kp-planets-table")],Xe);import{css as hs,html as Ze,LitElement as us,nothing as Jr}from"lit";import{customElement as xs,property as fs}from"lit/decorators.js";var Qe=class extends us{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return Ze`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return Ze`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?Ze`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:Jr}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?Ze`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,a)=>Ze`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:Jr} ${r.length?Ze`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>Ze`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:Jr}</div>`}};Qe.styles=[y,hs`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],d([fs({attribute:!1})],Qe.prototype,"data",2),Qe=d([xs("roxy-kp-ruling-planets")],Qe);import{css as bs,html as cr,LitElement as vs,nothing as Ct}from"lit";import{customElement as $s,property as wr,state as kr}from"lit/decorators.js";function Lt(o,n){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,o(...t)},n)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var _=class extends vs{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=Lt(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let a={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let s=this.publishableKey??this.apiKey;s&&(a["X-API-Key"]=s);let i=await fetch(t,{headers:a,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return cr`<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?cr`<span class="spinner" role="status" aria-label="Loading"></span>`:Ct} ${this.isOpen?cr`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?cr`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>cr`<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?cr`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:Ct}</div>`}};_.styles=[y,bs`: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([wr({type:String,attribute:"api-key"})],_.prototype,"apiKey",2),d([wr({type:String,attribute:"publishable-key"})],_.prototype,"publishableKey",2),d([wr({type:String})],_.prototype,"endpoint",2),d([wr({type:String})],_.prototype,"placeholder",2),d([wr({type:String,attribute:"default-value"})],_.prototype,"defaultValue",2),d([kr()],_.prototype,"query",2),d([kr()],_.prototype,"results",2),d([kr()],_.prototype,"isOpen",2),d([kr()],_.prototype,"isLoading",2),d([kr()],_.prototype,"highlight",2),_=d([$s("roxy-location-search")],_);import{css as ws,html as te,LitElement as ks,nothing as Ee}from"lit";import{customElement as Ss,property as Pt}from"lit/decorators.js";var De=class extends ks{constructor(){super();this.data=null;this.mode="current";new h(this)}render(){let e=this.data;if(!e)return te`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,a="year"in e?e.year:void 0;return te`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${a??""}</h2><div class="list" role="list">${r.map(s=>this.renderListItem(s))}</div></article>`}return"phase"in e?this.renderSingle(e):Ee}renderSingle(e){let r=Tt(e.phase);return te`<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?te`<div class="date">${e.date}</div>`:Ee}</div></div><div class="stats">${typeof e.illumination=="number"?te`<div><span>Illumination</span> <strong>${Ls(e.illumination)}</strong></div>`:Ee} ${typeof e.age=="number"?te`<div><span>Age</span> <strong>${x(e.age,1)} days</strong></div>`:Ee} ${e.sign?te`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:Ee} ${typeof e.distance=="number"?te`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:Ee}</div>${e.meaning?.description?te`<p class="meaning">${e.meaning.description}</p>`:Ee} ${e.meaning?.keywords?.length?te`<div class="keywords">${e.meaning.keywords.map(t=>te`<span>${t}</span>`)}</div>`:Ee}</article>`}renderListItem(e){let r=Tt(e.phase);return te`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};De.styles=[y,ws`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([Pt({attribute:!1})],De.prototype,"data",2),d([Pt({type:String,reflect:!0})],De.prototype,"mode",2),De=d([Ss("roxy-moon-phase")],De);function Tt(o){return o?nt[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Ls(o){let n=o<=1?o*100:o;return`${Math.round(n)}%`}import{css as Cs,html as ae,LitElement as Ps,nothing as he}from"lit";import{customElement as Ts,property as Rs}from"lit/decorators.js";var er=class extends Ps{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return ae`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return ae`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?ae`<span class="number">Nakshatra ${e.number} of 27</span>`:he} ${e.range?ae`<span class="range">${e.range}</span>`:he}</header><dl class="facts">${e.lord?ae`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:he} ${e.deity?ae`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:he} ${e.symbol?ae`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:he}</dl>${e.characteristics?ae`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:he} ${r?ae`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?ae`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:he} ${r.gemstones?ae`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:he} ${r.rituals?ae`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:he}</div></div>`:he}</article>`}};er.styles=[y,Cs`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],d([Rs({attribute:!1})],er.prototype,"data",2),er=d([Ts("roxy-nakshatra-card")],er);import{css as Ns,html as $,LitElement as Ms,nothing as H,svg as le}from"lit";import{customElement as Es,property as Rt,state as Ds}from"lit/decorators.js";import{css as As,html as zs}from"lit";function ue(){return zs`<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 pr=As`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var Zr=420,f=Zr/2,mr=164,Xr=146,Sr=120,gr=96,Gs=178,Os=196,ve=class extends Ms{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new h(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return $`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return $`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?$`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:H}</header>${ir({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:a=>{this.view=a},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?$`<span>${this.data.houseSystem} houses</span>`:H} <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 $`<svg viewBox="0 0 ${Zr} ${Zr}" 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="${f}" cy="${f}" r="${mr}" stroke-width="1.5"/><circle class="wheel-line" cx="${f}" cy="${f}" r="${Xr-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${f}" cy="${f}" r="${Sr}" stroke-width="1"/><circle class="wheel-line" cx="${f}" cy="${f}" r="${gr-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(s=>b(s.name)),a=new Map;for(let s of r){let i=[b(s.planet1),b(s.planet2)].sort().join("|");a.set(i,s)}return t.length===0?$`<p class="roxy-empty" role="status">No planets to grid</p>`:$`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(s=>{let i=L[s]??s.slice(0,2);return $`<th scope="col" title="${s}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((s,i)=>{let l=L[s]??s.slice(0,2);return $`<tr><th scope="row" title="${s}">${l}</th>${t.slice(0,i+1).map(c=>{let m=a.get([s,c].sort().join("|"));if(!m)return $`<td class="empty"></td>`;let p=nr(m),g=Br[p]??Br[p.replace(/-/g,"")]??p.slice(0,3),v=fr[p]??"aspect-other",u=x(m.orb,1);return $`<td class="${`cell ${v}`}" title="${`${s} ${p} ${c}${u?` (orb ${u}\xB0)`:""}`}"><span class="asp">${g}</span></td>`})} ${t.slice(i+1,-1).map(()=>$`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Vr(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Vr(r),"IC")));let a=this.data?.partOfFortune?.longitude;typeof a=="number"&&t.push(this.renderAngleMark(pe(a),"PoF"));let s=this.data?.vertex?.longitude;return typeof s=="number"&&t.push(this.renderAngleMark(pe(s),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),a=k(f,f,mr,t),s=k(f,f,Gs,t),i=k(f,f,Os,t);return le`
|
|
68
|
+
<g>
|
|
69
|
+
<line class="angle-tick" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />
|
|
70
|
+
<text class="angle-marker" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r}</text>
|
|
71
|
+
</g>
|
|
72
|
+
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,a)=>this.getAscendant()+a*30)).map(t=>{let a=this.toAngle(t),s=k(f,f,Sr,a),i=k(f,f,mr,a);return le`<line class="wheel-line" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return G.map((e,r)=>{let t=this.toAngle(r*30+15),a=k(f,f,Xr,t);return le`<text class="sign-glyph" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${Y[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,a)=>{let s=e[(a+1)%12],i=ht(t.longitude,s?s.longitude:t.longitude+30),l=k(f,f,Sr-12,this.toAngle(i));return le`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,a)=>{let s=this.toAngle(a*30+15),i=k(f,f,Sr-12,s),l=(a-r+12)%12+1;return le`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),a=r%30===0,s=a?Xr-14:mr-5,i=k(f,f,s,t),l=k(f,f,mr,t);e.push(le`<line class=${a?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${a?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?H:e.map(r=>{let t=this.toAngle(r.longitude),a=k(f,f,Sr+9,t),s=me(r.longitude);return le`<text class="cusp-deg" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${s.degree}°${String(s.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(s=>Number.isFinite(s.longitude)).map(s=>({p:s,trueLon:pe(s.longitude),displayLon:pe(s.longitude)})).sort((s,i)=>s.trueLon-i.trueLon);for(let s=1;s<t.length;s++){let i=t[s-1],l=t[s];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let a=t[t.length-1];if(a&&a.displayLon>360){let s=a.displayLon-360;for(let i of t)i.displayLon-=s}return t.map(({p:s,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),m=this.toAngle(l),p=k(f,f,gr,m),g=k(f,f,gr-13,m),v=k(f,f,mr-4,c),u=k(f,f,gr+8,m),qe=L[b(s.name)]??s.name.slice(0,2),Cr=me(s.longitude),xr=s.isRetrograde===!0,Pr=`${Cr.degree}\xB0${String(Cr.minute).padStart(2,"0")}'`,Tr=Math.abs(l-i)>.5;return le`<g>
|
|
73
|
+
${Tr?le`<line class="planet-leader" x1=${v.x} y1=${v.y} x2=${u.x} y2=${u.y} />`:H}
|
|
74
|
+
<text class="planet-glyph" x=${p.x} y=${p.y} text-anchor="middle" dominant-baseline="central"><title>${s.name}${xr?" retrograde":""} - ${Pr} ${s.sign??""}</title>${qe}</text>
|
|
75
|
+
<text class="planet-deg" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central">${Pr}${xr?le`<tspan class="retro"> ℞</tspan>`:H}</text>
|
|
76
|
+
</g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return H;let t=e?.retrogradePlanets??[];return $`<div class="details">${e?.dominantElement||e?.dominantModality?$`<div class="pill-row">${e.dominantElement?$`<span class="pill">Dominant element: ${e.dominantElement}</span>`:H} ${e.dominantModality?$`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:H}</div>`:H} ${r?$`<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>`:H} ${t.length>0?$`<div class="pill-row">${t.map(a=>{let s=L[a]??a.slice(0,2);return $`<span class="pill pill--muted">${s} ${a} R</span>`})}</div>`:H} ${r?.summary?$`<p class="summary">${r.summary}</p>`:H} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return H;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],a=G,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=a.indexOf(b(i.sign??""));if(l<0)continue;let c=r[l%4],m=t[l%3],p=L[b(i.name)]??b(i.name).slice(0,2);s[c]?.[m]?.push(p)}return $`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>$`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,m)=>c+(s[i]?.[m]?.length??0),0);return $`<tr><th scope="row">${i}</th>${t.map(c=>$`<td>${(s[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>$`<td class="em-total">${r.reduce((l,c)=>l+(s[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?H:$`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let a=r.interpretation,s=L[b(r.name)]??"",i=x(r.degree??0,1);return $`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${s} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${ue()}</span></summary><div class="interp-body">${a.summary?$`<p class="interp-summary">${a.summary}</p>`:H} ${a.detailed?$`<p class="interp-detail">${a.detailed}</p>`:H} ${a.keywords?.length?$`<div class="interp-keywords">${a.keywords.map(l=>$`<span class="kw">${l}</span>`)}</div>`:H}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let a of e){if(typeof a.longitude!="number")continue;let s=b(a.name);s&&t.set(s,a.longitude)}return r.map(a=>{let s=t.get(b(a.planet1)),i=t.get(b(a.planet2));if(s===void 0||i===void 0)return H;let l=k(f,f,gr-18,this.toAngle(s)),c=k(f,f,gr-18,this.toAngle(i)),m=nr(a),p=fr[m]??"aspect-other",g=x(a.orb,1);return le`<line class=${`aspect ${p}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${a.planet1} ${m||""} ${a.planet2}${g?` (orb ${g}\xB0)`:""}</title></line>`})}};ve.styles=[y,Te,pr,Ns`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([Rt({attribute:!1})],ve.prototype,"data",2),d([Rt({type:String,attribute:"house-system",reflect:!0})],ve.prototype,"houseSystem",2),d([Ds()],ve.prototype,"view",2),ve=d([Es("roxy-natal-chart")],ve);import{css as Hs,html as I,LitElement as Is,nothing as se}from"lit";import{customElement as js,property as At}from"lit/decorators.js";var Ge=class extends Is{constructor(){super();this.data=null;this.type="life-path";new h(this)}render(){let e=this.data;if(!e)return I`<div class="roxy-empty" role="status">No numerology data</div>`;let r=Ks[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return I`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?I`<div class="numeral">${e.number}</div>`:se}<div><p class="label">${r}</p>${e.meaning?.title?I`<h2 class="title">${e.meaning.title}</h2>`:se}</div></div>${e.meaning?.description?I`<p class="meaning">${e.meaning.description}</p>`:se} ${e.calculation?I`<pre class="calc">${e.calculation}</pre>`:se} ${t.length>0?I`<div class="chips">${t.map(a=>I`<span>${a}</span>`)}</div>`:se} ${e.hasKarmicDebt&&e.karmicDebtNumber?I`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Bs(e.karmicDebtMeaning)}</div>`:se}</article>`}renderPersonalYear(e,r){return I`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?I`<div class="numeral">${e.personalYear}</div>`:se}<div><p class="label">${r}</p>${e.theme?I`<h2 class="title">${e.theme}</h2>`:se}</div></div>${e.forecast?I`<p class="meaning">${e.forecast}</p>`:se} ${e.advice?I`<p>${e.advice}</p>`:se}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,a])=>a!=null);return I`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?I`<h2 class="title">${e.profile.name}</h2>`:se}</div>${t.length>0?I`<div class="cores">${t.map(([a,s])=>I`<div class="item"><span>${ke(a)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:se}</article>`}};Ge.styles=[y,Hs`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([At({attribute:!1})],Ge.prototype,"data",2),d([At({type:String,reflect:!0})],Ge.prototype,"type",2),Ge=d([js("roxy-numerology-card")],Ge);var Ks={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Bs(o){return o?[o.description,o.challenge,o.resolution].filter(Boolean).join(" "):""}import{css as _s,html as oe,LitElement as Ys,nothing as Oe}from"lit";import{customElement as qs,property as zt}from"lit/decorators.js";var He=class extends Ys{constructor(){super();this.data=null;this.detail="detailed";new h(this)}render(){let e=this.data;if(!e)return oe`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let a=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(p=>!!p[1]):[],s=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],m=r&&"transitions"in r?r.transitions:void 0;return oe`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?zr(r.date):""}</span></header><table><tbody>${t.map(([p,g])=>oe`<tr><th>${p}</th><td>${g}</td></tr>`)} ${r?.sunrise?oe`<tr><th>Sunrise</th><td>${ce(r.sunrise)}</td></tr>`:Oe} ${r?.sunset?oe`<tr><th>Sunset</th><td>${ce(r.sunset)}</td></tr>`:Oe} ${r?.moonrise?oe`<tr><th>Moonrise</th><td>${ce(r.moonrise)}</td></tr>`:Oe} ${r?.moonset?oe`<tr><th>Moonset</th><td>${ce(r.moonset)}</td></tr>`:Oe} ${a.map(([p,g])=>oe`<tr><th>${p}</th><td>${g}</td></tr>`)}</tbody></table>${m?oe`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",m.tithi)} ${this.renderTransitionRow("Nakshatra",m.nakshatra)} ${this.renderTransitionRow("Yoga",m.yoga)} ${this.renderTransitionRow("Karana",m.karana)}</tbody></table>`:Oe} ${this.detail==="detailed"&&(s.some(p=>!!p[1])||i.length>0||l.some(p=>!!p[1])||c.length>0)?oe`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...s.filter(p=>!!p[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(p=>!!p[1]),...c])}</tbody></table>`:Oe}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let a=qr(t);return a?oe`<tr><th>${r}</th><td>${a}</td></tr>`:Oe})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,a)=>[r.length>1?`${e} ${a+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return Oe;let t=ce(r.endsAt),a=r.next?` \u2192 ${r.next}`:"";return oe`<tr><th>${e}</th><td>ends ${t}${a}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=qr(e);return r?`${e.current} (${r})`:e.current}};He.styles=[y,_s`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([zt({attribute:!1})],He.prototype,"data",2),d([zt({type:String,reflect:!0})],He.prototype,"detail",2),He=d([qs("roxy-panchang-table")],He);import{css as Vs,html as yr,LitElement as Fs,nothing as Qr}from"lit";import{customElement as Us,property as Ws}from"lit/decorators.js";var et=[{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)"}],rr=class extends Fs{constructor(){super();this.data=null;new h(this)}render(){if(!this.data?.planets?.length)return yr`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return yr`<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">${et.map(r=>yr`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=L[b(e.planet)]??"",t=et.map(m=>Math.max(0,e[m.key])),a=t.reduce((m,p)=>m+p,0),s=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,i=s?"adequacy-badge--adequate":"adequacy-badge--weak",l=s?"adequate":"weak",c=x(e.totalRupas,2)&&x(e.minRequired,2)?`${x(e.totalRupas,2)} / ${x(e.minRequired,2)} R`:"";return yr`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${r}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${a>0?et.map((m,p)=>{let g=t[p];if(g<=0)return Qr;let v=g/a*100;return yr`<div class="bar-segment" style="flex-grow:${v};background:${m.color}" title="${m.label}: ${x(g,1)}"></div>`}):Qr}</div></div><div class="pills">${c?yr`<span class="rupas-label">${c}</span>`:Qr} <span class="${`adequacy-badge ${i}`}">${l}</span></div></div>`}};rr.styles=[y,Vs`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],d([Ws({attribute:!1})],rr.prototype,"data",2),rr=d([Us("roxy-shadbala-table")],rr);import{css as Js,html as N,LitElement as Xs,nothing as W,svg as hr}from"lit";import{customElement as Zs,property as Qs}from"lit/decorators.js";var at=360,C=at/2,rt=170,eo=154,tt=124,ur=96,tr=class extends Xs{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return N`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:a}=this.data,s=this.data.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,m=a?.overall,p=a?.strengths??[],g=a?.challenges??[];return i.length>0&&l.length>0?N`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?N`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:W}</div><svg viewBox="0 0 ${at} ${at}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${C}" cy="${C}" r="${rt}" stroke-width="1.5"/><circle class="wheel-line" cx="${C}" cy="${C}" r="${ur+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${C}" cy="${C}" r="${ur-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,s)} ${this.renderRing(i,tt,"p1",1)} ${this.renderRing(l,ur,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${m?N`<p class="summary">${m}</p>`:W} ${s.length>0?this.renderAspects(s):W} ${p.length>0||g.length>0?N`<div class="lists">${p.length?N`<div><h3>Strengths</h3><ul>${p.map(u=>N`<li>${u}</li>`)}</ul></div>`:W} ${g.length?N`<div><h3>Challenges</h3><ul>${g.map(u=>N`<li>${u}</li>`)}</ul></div>`:W}</div>`:W}</div>`:N`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?N`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:W}</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><roxy-data></code> fallback.</div>${m?N`<p class="summary">${m}</p>`:W} ${s.length>0?this.renderAspects(s):W} ${p.length>0||g.length>0?N`<div class="lists">${p.length?N`<div><h3>Strengths</h3><ul>${p.map(u=>N`<li>${u}</li>`)}</ul></div>`:W} ${g.length?N`<div><h3>Challenges</h3><ul>${g.map(u=>N`<li>${u}</li>`)}</ul></div>`:W}</div>`:W}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),a=k(C,C,ur-14,t),s=k(C,C,rt,t);return hr`<line class="wheel-line" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return G.map((e,r)=>{let t=this.toAngle(r*30+15),a=k(C,C,eo,t);return hr`<text class="sign" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${Y[e]}</text>`})}renderRing(e,r,t,a){return e.map(s=>{if(!Number.isFinite(s.longitude))return W;let i=this.toAngle(s.longitude),l=k(C,C,r,i),m=k(C,C,r+(a===1?-12:-10),i),p=L[b(s.name)]??s.name.slice(0,2),g=me(s.longitude),v=s.isRetrograde===!0,u=`${g.degree}\xB0${String(g.minute).padStart(2,"0")}'`,qe=`${s.name}${v?" retrograde":""} - ${u} ${g.sign}`;return hr`<g>
|
|
77
|
+
<text class=${t} x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central"><title>${qe}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${a}</tspan></text>
|
|
78
|
+
<text class="planet-deg" x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${g.degree}°${v?hr`<tspan class="retro"> ℞</tspan>`:W}</text>
|
|
79
|
+
</g>`})}renderAscendants(e){let r=[],t=(a,s)=>{if(!a)return;let i=G.findIndex(v=>v.toLowerCase()===a.sign.toLowerCase());if(i===-1)return;let l=i*30+a.degree,c=this.toAngle(l),m=s===1?tt+14:ur+14,p=k(C,C,m,c),g=k(C,C,rt+14,c);r.push(hr`<g>
|
|
80
|
+
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${g.x} y2=${g.y} />
|
|
81
|
+
<text class="asc-label" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
|
|
82
|
+
</g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=b(i);for(let c of s)if(b(c.name)===l&&typeof c.longitude=="number")return c.longitude};return t.map(s=>{let i=a(e,s.planet1),l=a(r,s.planet2);if(i===void 0||l===void 0)return W;let c=k(C,C,tt-12,this.toAngle(i)),m=k(C,C,ur+8,this.toAngle(l)),p=nr(s),g=fr[p]??"aspect-other",v=x(s.orb,1);return hr`<line class=${`aspect ${g}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${s.planet1} ${p} ${s.planet2}${v?` (orb ${v}\xB0)`:""}</title></line>`})}renderAspects(e){return N`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(r=>N`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${nr(r)||""}</td><td class="orb">${x(r.orb,1)}</td><td>${ro(r.strength)}</td></tr>`)}</tbody></table>`}};tr.styles=[y,Js`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],d([Qs({attribute:!1})],tr.prototype,"data",2),tr=d([Zs("roxy-synastry-chart")],tr);function ro(o){return typeof o=="number"?Math.round(o).toString():""}import{css as to,html as M,LitElement as ao,nothing as xe}from"lit";import{customElement as so,property as oo,state as no}from"lit/decorators.js";var Ie=class extends ao{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new h(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):M`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,a=r.keywords??[];return M`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?M`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:M`<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?M`${r.arcana} arcana`:xe} ${t?M`· reversed`:xe}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?M`<p class="message">${e.dailyMessage}</p>`:xe} ${r.meaning?M`<p>${r.meaning}</p>`:xe} ${a.length>0?M`<div class="chips">${a.map(s=>M`<span>${s}</span>`)}</div>`:xe} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,a=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return M`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?M`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:M`<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?M`${e.arcana} arcana`:xe} ${e.number!==void 0&&e.number!==null?M`· ${e.number}`:xe} ${r?M`· reversed`:xe}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?M`<p>${t.description}</p>`:xe} ${a.length>0?M`<div class="chips">${a.map(s=>M`<span>${s}</span>`)}</div>`:xe} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};Ie.styles=[y,to`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([oo({attribute:!1})],Ie.prototype,"data",2),d([no()],Ie.prototype,"flipped",2),Ie=d([so("roxy-tarot-card")],Ie);import{css as io,html as E,LitElement as lo,nothing as de}from"lit";import{customElement as co,property as Nt}from"lit/decorators.js";var je=class extends lo{constructor(){super();this.data=null;this.spread="three-card";new h(this)}render(){let e=this.data;if(!e)return E`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),a=t?[]:"positions"in e?e.positions??[]:[],s=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,p="summary"in e?e.summary:void 0,g=r?e.interpretation:void 0,v=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return E`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${m?E`<span class="question">"${m}"</span>`:de}</header>${r?E`<div><span class="${`answer ${v}`}">${i}</span> ${l?E`<small>· ${l}</small>`:de}</div>`:de} ${a.length>0?E`<div class="grid">${a.map(u=>E`<div class="card"><p class="label">${u.name??""}</p><div class="image">${u.card?.imageUrl?E`<img src="${u.card.imageUrl}" alt="${u.card.name??"tarot card"}" class="${u.card.reversed?"reversed":""}">`:E`${u.card?.name??"?"}`}</div><p class="name">${u.card?.name??""} ${u.card?.reversed?E`<small>(reversed)</small>`:de}</p>${u.interpretation?E`<p class="interp">${u.interpretation}</p>`:de}</div>`)}</div>`:de} ${s.length>0?E`<div class="grid">${s.map(u=>E`<div class="card"><div class="image">${u.imageUrl?E`<img src="${u.imageUrl}" alt="${u.name??"tarot card"}" class="${u.reversed?"reversed":""}">`:E`${u.name??"?"}`}</div><p class="name">${u.name??""} ${u.reversed?E`<small>(reversed)</small>`:de}</p>${u.meaning?E`<p class="interp">${u.meaning}</p>`:de}</div>`)}</div>`:de} ${p?E`<p class="reading">${p}</p>`:de} ${g?E`<p class="reading">${g}</p>`:de}</article>`}};je.styles=[y,io`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([Nt({attribute:!1})],je.prototype,"data",2),d([Nt({type:String,reflect:!0})],je.prototype,"spread",2),je=d([co("roxy-tarot-spread")],je);import{css as po,html as D,LitElement as mo,nothing as Ke}from"lit";import{customElement as go,property as yo,state as ho}from"lit/decorators.js";var Be=class extends mo{constructor(){super();this.data=null;this.tab="positions";new h(this)}render(){if(!this.data?.transitPlanets?.length)return D`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:a,summary:s}=this.data,i=[zr(e),ce(r)].filter(Boolean).join(" "),l=a?.length??0,c=this.tab;return D`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${i?D`<p class="subtitle">${i}</p>`:Ke}</div>${l>0?D`${ir({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${l})`}],active:c,onSelect:m=>{this.tab=m},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?D`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:D`${s?this.renderSummaryPills(s):Ke}<div class="overflow-scroll">${this.renderAspectsList(a??[])}</div>`}</div>`:D`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return D`<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 D`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=L[b(r.name)]??"",a=Y[b(r.sign)]??"",s=r.speed>=0?"\u2191":"\u2193";return D`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?D`<span class="retro-badge" aria-label="retrograde">R</span>`:Ke}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${r.sign}</div></td><td class="num">${x(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${x(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return D`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let a=L[b(r.transitPlanet)]??"",s=L[b(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),m=r.isApplying?"Applying":"Separating";return D`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${a}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${m} · orb ${x(r.orb,2)}° · strength ${x(r.strength,1)} </span>${ue()}</summary><div class="interp-body">${l?.summary?D`<p>${l.summary}</p>`:Ke} ${l?.impact?D`<p><strong>Impact:</strong> ${l.impact}</p>`:Ke} ${l?.timing?D`<p><strong>Timing:</strong> ${l.timing}</p>`:Ke} ${l?.guidance?D`<p><strong>Guidance:</strong> ${l.guidance}</p>`:Ke} ${l?.keywords?.length?D`<div class="interp-keywords">${l.keywords.map(p=>D`<span class="kw">${p}</span>`)}</div>`:Ke}</div></details>`})}</div>`}};Be.styles=[y,Te,pr,po`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([yo({attribute:!1})],Be.prototype,"data",2),d([ho()],Be.prototype,"tab",2),Be=d([go("roxy-transits-table")],Be);import{html as Mt,LitElement as uo}from"lit";import{customElement as xo,property as Et}from"lit/decorators.js";var _e=class extends uo{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){return this.data?.meta?Er(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?Mt`<div class="wrap"><div class="header"><h2 class="title">Vedic kundli</h2>${Gr(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>${Dr(e,this.chartStyle)}</svg></div>`:Mt`<div class="roxy-empty" role="status">No kundli data</div>`}};_e.styles=[y,Or,Te],d([Et({attribute:!1})],_e.prototype,"data",2),d([Et({type:String,reflect:!0,attribute:"chart-style"})],_e.prototype,"chartStyle",2),_e=d([xo("roxy-vedic-kundli")],_e);import{css as fo,html as A,LitElement as bo,nothing as Q}from"lit";import{customElement as vo,property as $o}from"lit/decorators.js";var wo=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],ar=class extends bo{constructor(){super();this.data=null;new h(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let a of wo){let s=e[a];s&&(t.push([a,s]),r.add(a))}for(let[a,s]of Object.entries(e))r.has(a)||t.push([a,s]);return t}render(){if(!this.data?.meta)return A`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return A`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let a=(t.graha??r)==="Lagna",s=L[b(t.graha??r)]??"",i=Y[b(t.rashi??"")]??"";return A`<tr class="${a?"lagna":""}"><td class="graha">${s?A`<span class="glyph">${s}</span>`:Q}${t.graha??r}</td><td>${i?A`<span class="glyph">${i}</span>`:Q}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Nr(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?A`<span class="retro">R</span>`:Q}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?Q:A`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${ue()}</summary><div class="panel-body">${e.map(r=>{let t=L[b(r.planet)]??"",a=x(r.distanceFromSun,2),s=x(r.orb,1);return A`<div class="condition"><span class="planet">${t?`${t} `:""}${r.planet}</span> <span class="detail">${a} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?Q:A`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${ue()}</summary><div class="panel-body">${e.map(r=>{let t=x(r.distance,2);return A`<div class="condition"><span class="planet">${r.planet1} vs ${r.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${r.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},r=this.orderedRows().map(([t,a])=>[a.graha??t,e[a.graha??t]]).filter(([,t])=>t!=null);return r.length===0?Q:A`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${ue()}</summary><div class="panel-body">${r.map(([t,a])=>{let s=L[b(t)]??"";return A`<div class="interp"><span class="planet">${s?`${s} `:""}${t}</span> ${a.rashi?A`<p><span class="label">Rashi.</span> ${a.rashi}</p>`:Q} ${a.nakshatra?A`<p><span class="label">Nakshatra.</span> ${a.nakshatra}</p>`:Q}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?Q:A`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${ue()}</summary><div class="panel-body">${e.map(r=>A`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?A`<p class="desc">${r.description}</p>`:Q}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?Q:A`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${ue()}</summary><div class="panel-body">${e.map(r=>A`<div class="bhava"><span class="name">${r.name} ${r.quality?A`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:Q}</span> ${r.result?A`<p class="desc">${r.result}</p>`:Q}</div>`)}</div></details>`}};ar.styles=[y,pr,fo`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],d([$o({attribute:!1})],ar.prototype,"data",2),ar=d([vo("roxy-vedic-planets-table")],ar);import{css as ko,html as sr,LitElement as So,nothing as Kr}from"lit";import{customElement as Lo,property as Co}from"lit/decorators.js";var or=class extends So{constructor(){super();this.data=null;new h(this)}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,a]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])a&&r.push({name:t,sign:a.sign,longitude:a.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return sr`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return sr`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=L[b(r.name)]??"",a=Y[b(r.sign??"")]??"",s=typeof r.speed=="number"?x(r.speed,3):"";return sr`<tr class="${r.isPoint?"point":""}"><td class="body">${t?sr`<span class="glyph">${t}</span>`:Kr}${r.name}</td><td>${a?sr`<span class="glyph">${a}</span>`:Kr}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Nr(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${s?sr`${s}°/day`:Kr} ${r.isRetrograde?sr`<span class="retro">℞</span>`:Kr}</td></tr>`})}</tbody></table></div>`}};or.styles=[y,ko`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],d([Co({attribute:!1})],or.prototype,"data",2),or=d([Lo("roxy-western-planets-table")],or);import{css as Po,html as X,LitElement as To,nothing as Lr}from"lit";import{customElement as Ro,property as Ao,state as zo}from"lit/decorators.js";var Ye=class extends To{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new h(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return X`<span class="${r}">${e}</span>`}renderDetailCard(e){return X`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Lr}</p>${e.description?X`<p class="description">${e.description}</p>`:Lr} ${e.result?X`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Lr}</div>`}render(){if(!this.data)return X`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return X`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,m=r?c.filter(g=>g.name.toLowerCase().includes(r)):c,p=e.total;return X`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${p!==void 0?X`<span class="count">${p} total</span>`:Lr}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${m.length>0?m.map(g=>this.renderDetailCard(g)):X`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let s=t,i=r?s.filter(c=>c.name.toLowerCase().includes(r)):s,l=e.total;return X`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?X`<span class="count">${l} total</span>`:Lr}</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=>X`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):X`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return X`<div class="roxy-empty" role="status">No yoga data</div>`}};Ye.styles=[y,Po`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([Ao({attribute:!1})],Ye.prototype,"data",2),d([zo()],Ye.prototype,"filter",2),Ye=d([Ro("roxy-yoga-list")],Ye);var st=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,personal-year,chart}",docsSummary:"Life path, expression, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var No="0.7.0";var vc=st.map(o=>o.slug);export{st as ROXY_COMPONENTS,vc as ROXY_UI_COMPONENTS,No as ROXY_UI_VERSION,$e as RoxyAshtakavargaGrid,we as RoxyBiorhythmChart,Fe as RoxyChoghadiyaGrid,Le as RoxyCompatibilityCard,Ce as RoxyDashaTimeline,Pe as RoxyData,Re as RoxyDivisionalChart,Ae as RoxyDoshaCard,F as RoxyEndpointForm,We as RoxyGunaMilan,ze as RoxyHexagram,Ne as RoxyHoroscopeCard,Me as RoxyKpChart,Xe as RoxyKpPlanetsTable,Qe as RoxyKpRulingPlanets,_ as RoxyLocationSearch,De as RoxyMoonPhase,er as RoxyNakshatraCard,ve as RoxyNatalChart,Ge as RoxyNumerologyCard,He as RoxyPanchangTable,rr as RoxyShadbalaTable,tr as RoxySynastryChart,Ie as RoxyTarotCard,je as RoxyTarotSpread,Be as RoxyTransitsTable,_e as RoxyVedicKundli,ar as RoxyVedicPlanetsTable,or as RoxyWesternPlanetsTable,Ye as RoxyYogaList};
|
|
2
83
|
//# sourceMappingURL=index.js.map
|