@roxyapi/ui 0.7.0 → 0.8.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 +5 -1
- package/README.md +30 -1
- package/dist/cdn/components/bodygraph.js +54 -0
- package/dist/cdn/components/bodygraph.js.map +7 -0
- package/dist/cdn/components/forecast-timeline.js +45 -0
- package/dist/cdn/components/forecast-timeline.js.map +7 -0
- package/dist/cdn/roxy-ui.js +49 -40
- package/dist/cdn/roxy-ui.js.map +4 -4
- package/dist/components/bodygraph.d.ts +27 -0
- package/dist/components/bodygraph.d.ts.map +1 -0
- package/dist/components/bodygraph.js +11 -0
- package/dist/components/bodygraph.js.map +7 -0
- package/dist/components/forecast-timeline.d.ts +38 -0
- package/dist/components/forecast-timeline.d.ts.map +1 -0
- package/dist/components/forecast-timeline.js +2 -0
- package/dist/components/forecast-timeline.js.map +7 -0
- package/dist/index.cjs +45 -36
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -43
- package/dist/index.js.map +4 -4
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.json +2 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.gen.d.ts +3994 -6
- package/dist/types/types.gen.d.ts.map +1 -1
- package/dist/utils/bodygraph-render.d.ts +105 -0
- package/dist/utils/bodygraph-render.d.ts.map +1 -0
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/bodygraph.ts +390 -0
- package/src/components/forecast-timeline.ts +336 -0
- package/src/index.ts +4 -0
- package/src/manifest.ts +26 -0
- package/src/types/index.ts +1 -1
- package/src/types/types.gen.ts +4079 -6
- package/src/utils/bodygraph-render.ts +641 -0
- package/src/version.ts +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
"use strict";var Tr=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var $t=Object.getOwnPropertyNames;var wt=Object.prototype.hasOwnProperty;var kt=(o,n)=>{for(var e in n)Tr(o,e,{get:n[e],enumerable:!0})},St=(o,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of $t(n))!wt.call(o,t)&&t!==e&&Tr(o,t,{get:()=>n[t],enumerable:!(r=nt(n,t))||r.enumerable});return o};var Lt=o=>St(Tr({},"__esModule",{value:!0}),o),d=(o,n,e,r)=>{for(var t=r>1?void 0:r?nt(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&&Tr(n,e,t),t};var ma={};kt(ma,{ROXY_COMPONENTS:()=>Fr,ROXY_UI_COMPONENTS:()=>pa,ROXY_UI_VERSION:()=>vt,RoxyAshtakavargaGrid:()=>ue,RoxyBiorhythmChart:()=>xe,RoxyChoghadiyaGrid:()=>Ge,RoxyCompatibilityCard:()=>fe,RoxyDashaTimeline:()=>be,RoxyData:()=>ve,RoxyDivisionalChart:()=>we,RoxyDoshaCard:()=>ke,RoxyEndpointForm:()=>re,RoxyGunaMilan:()=>He,RoxyHexagram:()=>Se,RoxyHoroscopeCard:()=>Le,RoxyKpChart:()=>Ce,RoxyKpPlanetsTable:()=>Ie,RoxyKpRulingPlanets:()=>je,RoxyLocationSearch:()=>Z,RoxyMoonPhase:()=>Pe,RoxyNakshatraCard:()=>Ke,RoxyNatalChart:()=>he,RoxyNumerologyCard:()=>Te,RoxyPanchangTable:()=>Re,RoxyShadbalaTable:()=>Be,RoxySynastryChart:()=>_e,RoxyTarotCard:()=>Ae,RoxyTarotSpread:()=>ze,RoxyTransitsTable:()=>Ne,RoxyVedicKundli:()=>Me,RoxyVedicPlanetsTable:()=>Ye,RoxyWesternPlanetsTable:()=>qe,RoxyYogaList:()=>Ee});module.exports=Lt(ma);var V=require("lit"),Xe=require("lit/decorators.js");var K={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"},it={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},ae={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},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"},J=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],ya=J.map(o=>o.toLowerCase()),Ur={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},Wr={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"},lt={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var dt=require("lit"),h=dt.css`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var Ct="roxy-data";function Pt(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var u=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(Pt(n)&&n.classList.contains(Ct))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var Tt={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Fe=["sarva","bhinna","pinda"],ue=class extends V.LitElement{constructor(){super();this.data=null;this.activeTab="sarva";new u(this)}render(){if(!this.data)return V.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return V.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?V.html`<p class="subtitle">${e.length} signs</p>`:V.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Fe.map(r=>V.html`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${Tt[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=Fe.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Fe[(r+1)%Fe.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Fe[(r-1+Fe.length)%Fe.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?V.html`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,a)=>{let s=r.bindus[a]??0,i=this.sarvaHeat(s);return V.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${ae[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>`:V.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?V.html`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>V.html`<th scope="col" title="${t}">${ae[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>V.html`<tr><td>${t.planet}</td>${t.bindus.map(a=>{let s=this.bhinnaHeat(a);return V.html`<td class="${`heat-cell ${s}`}">${a}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:V.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?V.html`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>V.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:V.html`<p class="roxy-empty">No shodhya pinda data</p>`}};ue.styles=[h,V.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([(0,Xe.property)({attribute:!1})],ue.prototype,"data",2),d([(0,Xe.state)()],ue.prototype,"activeTab",2),ue=d([(0,Xe.customElement)("roxy-ashtakavarga-grid")],ue);var Y=require("lit"),dr=require("lit/decorators.js");var ct={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},xe=class extends Y.LitElement{constructor(){super();this.data=null;this.mode="daily";new u(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):Y.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([a,s])=>{let i=typeof s=="number"?s:0,l=Math.abs(i)>1?i/100:i;return[a,l]});return Y.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?Y.html`<span class="energy">Energy ${e.energyRating}/10</span>`:Y.nothing}</header><div class="bars" role="list">${t.map(([a,s])=>{let i=(s+1)/2*100,l=ct[a]??"var(--roxy-accent, #f59e0b)";return Y.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${a}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(s*100)}%</span></div>`})}</div>${e.dailyMessage?Y.html`<p class="advice">${e.dailyMessage}</p>`:Y.nothing} ${e.advice?Y.html`<p class="advice">${e.advice}</p>`:Y.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return Y.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,a=160,s=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return Y.html`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${a}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${a/2}" x2="${t}" y2="${a/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((p,y)=>{let C=p[l]??0,x=y*s,Ve=a/2-C/100*(a/2-8);return`${x.toFixed(2)},${Ve.toFixed(2)}`}).join(" "),m=ct[l]??"#475569";return Y.svg`<polyline points=${c} fill="none" stroke=${m} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?Y.html`<p class="advice">${e.summary.periodAdvice}</p>`:Y.nothing}</section>`}renderCritical(e){return Y.html`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>Y.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};xe.styles=[h,Y.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([(0,dr.property)({attribute:!1})],xe.prototype,"data",2),d([(0,dr.property)({type:String,reflect:!0})],xe.prototype,"mode",2),xe=d([(0,dr.customElement)("roxy-biorhythm-chart")],xe);var X=require("lit"),Ar=require("lit/decorators.js");function k(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function De(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,n=>n.toUpperCase())}function pt(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 Ge=class extends X.LitElement{constructor(){super();this.data=null;new u(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=K[k(e.lord)]??"",s=`${pt(e.start)} - ${pt(e.end)}`;return X.html`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?X.html`<span class="now-badge">Now</span>`:X.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${a?X.html`<span aria-hidden="true">${a}</span>`:X.nothing} ${e.lord}</span></div>`}render(){if(!this.data)return X.html`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return X.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?X.html`<p class="subtitle">${e}</p>`:X.nothing}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(a=>this.renderTile(a)):X.html`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(a=>this.renderTile(a)):X.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Ge.styles=[h,X.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],d([(0,Ar.property)({attribute:!1})],Ge.prototype,"data",2),Ge=d([(0,Ar.customElement)("roxy-choghadiya-grid")],Ge);var P=require("lit"),pr=require("lit/decorators.js");function pe(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 Jr(o){if(!o)return"";let n=pe(o.start),e=pe(o.end);return n&&e?`${n} - ${e}`:n||e||""}function b(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function mt(o,n=1){let e=b(o,n);return e?`${e}%`:""}var cr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function Ze(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var fe=class extends P.LitElement{constructor(){super();this.data=null;this.mode="astrology";new u(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 P.html`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),a="rating"in e?e.rating:void 0,s="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,m="strengths"in e?e.strengths:void 0,p="challenges"in e?e.challenges:void 0,y="keyAspects"in e?e.keyAspects:void 0;return P.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?P.html`<div class="score">${b(r,0)}</div>`:P.nothing} ${a?P.html`<div class="rating">${a}</div>`:P.nothing}</div></div>${Object.keys(t).length>0?P.html`<div role="list">${Object.entries(t).map(([C,x])=>P.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${C}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,x))}%"></span></span> <span>${b(x,0)}</span></div>`)}</div>`:P.nothing} ${s?P.html`<p><span class="archetype">${s.label}</span> ${s.description?P.html`· ${s.description}`:P.nothing}</p>`:P.nothing} ${l?P.html`<p>${l}</p>`:P.nothing} ${c&&!l?P.html`<p>${c}</p>`:P.nothing} ${i?P.html`<p>${i}</p>`:P.nothing} ${(m?.length??0)>0||(p?.length??0)>0?P.html`<div class="lists">${m?.length?P.html`<div><h3>Strengths</h3><ul>${m.map(C=>P.html`<li>${C}</li>`)}</ul></div>`:P.nothing} ${p?.length?P.html`<div><h3>Challenges</h3><ul>${p.map(C=>P.html`<li>${C}</li>`)}</ul></div>`:P.nothing}</div>`:P.nothing} ${y?.length?P.html`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${y.slice(0,6).map(C=>P.html`<li>${Rt(C)}</li>`)}</ul></div>`:P.nothing}</article>`}};fe.styles=[h,P.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([(0,pr.property)({attribute:!1})],fe.prototype,"data",2),d([(0,pr.property)({type:String,reflect:!0})],fe.prototype,"mode",2),fe=d([(0,pr.customElement)("roxy-compatibility-card")],fe);function Rt(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${b(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}var $=require("lit"),mr=require("lit/decorators.js");var be=class extends $.LitElement{constructor(){super();this.data=null;this.period="current";new u(this)}render(){let e=this.data;if(!e)return $.html`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(a=>a.durationYears)):0;return $.html`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?$.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?$.html`(lord ${e.nakshatraLord})`:$.nothing}</div>`:$.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):$.nothing} ${r.length>0?$.html`<div class="timeline" role="list">${r.map(a=>this.renderBar(a,t))}</div>`:$.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return $.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",a=r.years??0,s=r.months??0,i=r.days??0,l=[];a&&l.push(`${a}y`),s&&l.push(`${s}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return $.html`<p class="balance">Birth dasha balance: ${c} of ${t?$.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?$.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:$.nothing}renderCurrent(e){return"mahadasha"in e?$.html`<div class="current">${"mahadasha"in e&&e.mahadasha?$.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?$.html`<small>${b(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:$.nothing}</div>`:$.nothing} ${"antardasha"in e&&e.antardasha?$.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?$.html`<small>${b(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:$.nothing}</div>`:$.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?$.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?$.html`<small>${b(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:$.nothing}</div>`:$.nothing}</div>`:$.nothing}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),a=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),a=Date.now();return Number.isNaN(r)||Number.isNaN(t)||a<r||a>=t||t<=r?-1:(a-r)/(t-r)}renderBar(e,r){let t=e.durationYears,a=r>0?t/r*100:0,s=this.isCurrent(e),i=s?this.progressIn(e):-1,l=s?"bar-track bar-now":"bar-track";return $.html`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?$.html`<span class="now-badge">Now</span>`:$.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${a}%"></span> ${i>=0?$.html`<span class="bar-progress" style="left:${i*a}%" aria-hidden="true"></span>`:$.nothing} </span><span class="dates">${e.startDate?gt(e.startDate):""} ${e.endDate?$.html`- ${gt(e.endDate)}`:""}</span></div>`}};be.styles=[h,$.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([(0,mr.property)({attribute:!1})],be.prototype,"data",2),d([(0,mr.property)({type:String,reflect:!0})],be.prototype,"period",2),be=d([(0,mr.customElement)("roxy-dasha-timeline")],be);function gt(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}var N=require("lit"),gr=require("lit/decorators.js");var At=["title","name","label","heading","overview","summary"],zt=["imageUrl","image","icon","symbol"],Nt=["imageUrl","image"],Mt=6,ve=class extends N.LitElement{constructor(){super();this.data=null;this.depth=0;new u(this)}render(){return this.data==null?N.html`<div class="roxy-empty" role="status">No data</div>`:this.depth>=Mt?N.html`<div class="roxy-empty" role="status">…</div>`:N.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?N.nothing:typeof e=="string"?N.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?N.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?N.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(a=>a===null||["string","number","boolean"].includes(typeof a))?N.html`<ul class="roxy-chips">${e.map(a=>N.html`<li>${String(a)}</li>`)}</ul>`:e.every(a=>a!==null&&typeof a=="object"&&!Array.isArray(a))?this.renderTable(e):N.html`<ol>${e.map(a=>N.html`<li>${this.renderValue(a)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return N.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>N.html`<th>${De(t)}</th>`)}</tr></thead><tbody>${e.map(t=>N.html`<tr>${r.map(a=>N.html`<td>${this.formatPrimitive(t[a])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=At.find(i=>typeof e[i]=="string"),t=zt.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&&!Nt.includes(i)&&l!==null&&l!==void 0);return N.html`${t?N.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:N.nothing} ${r?N.html`<h3 class="roxy-title">${e[r]}</h3>`:N.nothing} ${a?N.html`<p class="roxy-summary">${e[a]}</p>`:N.nothing} ${s.length>0?N.html`<dl class="roxy-rows">${s.map(([i,l])=>N.html`<dt>${De(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:N.nothing}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?N.html`<ul class="roxy-chips">${e.map(t=>N.html`<li>${String(t)}</li>`)}</ul>`:N.html`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let a of Object.keys(t))r.add(a);return Array.from(r)}};ve.styles=[h,N.css`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([(0,gr.property)({attribute:!1})],ve.prototype,"data",2),d([(0,gr.property)({attribute:!1})],ve.prototype,"depth",2),ve=d([(0,gr.customElement)("roxy-data")],ve);var se=require("lit"),yr=require("lit/decorators.js");var S=require("lit");function me(o){let n=o%360;return n<0?n+360:n}function ge(o){let n=me(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:J[e]??"Aries",signIndex:e,degree:t,minute:s,second:i}}function Nr(o){let{sign:n,degree:e,minute:r}=ge(o);return`${e}\xB0 ${n} ${String(r).padStart(2,"0")}'`}function Xr(o){return me(o+180)}function yt(o,n){let e=me(o),r=me(n)-e;return r<0&&(r+=360),me(e+r/2)}function G(o,n,e,r){let t=r*Math.PI/180;return{x:o+e*Math.cos(t),y:n+e*Math.sin(t)}}var Ue=require("lit"),Oe=Ue.css`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function Qe(o){let{items:n,active:e,onSelect:r,label:t,idPrefix:a,controls:s=!1}=o;return Ue.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=n.findIndex(C=>C.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 y=l.currentTarget.getRootNode();requestAnimationFrame(()=>{y.querySelector(`#${a}-tab-${p.id}`)?.focus()})}}">${n.map(l=>Ue.html`<button type="button" class="roxy-tab" role="tab" id="${a}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${s&&e===l.id?`${a}-panel-${l.id}`:Ue.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ce=400,O=20,ee=ce-2*O,q=ce/2,Et=Object.fromEntries(J.map(o=>[o.toLowerCase(),o])),Dt=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Gt="\u02B3";function ht(o,n){return typeof o.longitude!="number"||!Number.isFinite(o.longitude)?!1:ge(o.longitude).sign.toLowerCase()!==n.toLowerCase()}function Ot(o,n){let e=it[k(o.graha)]??o.graha.slice(0,2),r=o.isRetrograde?Gt:"";if(typeof o.longitude!="number"||!Number.isFinite(o.longitude)||ht(o,n))return`${e}${r}`;let{degree:t}=ge(o.longitude);return`${e} ${t}\xB0${r}`}function Ht(o,n){let e=[k(o.graha)],r=ht(o,n);if(r&&e.push(`in ${n}`),typeof o.longitude=="number"&&Number.isFinite(o.longitude)){let t=ge(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 Zr(o,n,e,r,t){let a=r-(o.length-1)*t/2;return o.map((s,i)=>{let l=a+i*t;return S.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${Ot(s,n)}<title>${Ht(s,n)}</title></text>`})}function Er(o,n){let e={};for(let t of J)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=Et[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 We=ee/4,It={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 jt(o){let n=It[o]??{col:0,row:0};return{x:O+n.col*We,y:O+n.row*We,w:We,h:We}}function Kt(o){let n=O,e=O+We,r=O+2*We,t=O+3*We,a=ce-O;return S.svg`
|
|
2
|
-
|
|
1
|
+
"use strict";var Hr=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var qt=Object.getOwnPropertyNames;var Vt=Object.prototype.hasOwnProperty;var Ft=(o,n)=>{for(var e in n)Hr(o,e,{get:n[e],enumerable:!0})},Ut=(o,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of qt(n))!Vt.call(o,t)&&t!==e&&Hr(o,t,{get:()=>n[t],enumerable:!(r=St(n,t))||r.enumerable});return o};var Wt=o=>Ut(Hr({},"__esModule",{value:!0}),o),d=(o,n,e,r)=>{for(var t=r>1?void 0:r?St(n,e):n,a=o.length-1,s;a>=0;a--)(s=o[a])&&(t=(r?s(n,e,t):s(t))||t);return r&&t&&Hr(n,e,t),t};var Qa={};Ft(Qa,{ROXY_COMPONENTS:()=>lt,ROXY_UI_COMPONENTS:()=>Xa,ROXY_UI_VERSION:()=>Yt,RoxyAshtakavargaGrid:()=>$e,RoxyBiorhythmChart:()=>we,RoxyBodygraph:()=>je,RoxyChoghadiyaGrid:()=>Be,RoxyCompatibilityCard:()=>ke,RoxyDashaTimeline:()=>Se,RoxyData:()=>Ce,RoxyDivisionalChart:()=>Le,RoxyDoshaCard:()=>Te,RoxyEndpointForm:()=>ae,RoxyForecastTimeline:()=>Ye,RoxyGunaMilan:()=>qe,RoxyHexagram:()=>Re,RoxyHoroscopeCard:()=>Ae,RoxyKpChart:()=>Ee,RoxyKpPlanetsTable:()=>Ve,RoxyKpRulingPlanets:()=>Fe,RoxyLocationSearch:()=>ee,RoxyMoonPhase:()=>Ne,RoxyNakshatraCard:()=>Ue,RoxyNatalChart:()=>ve,RoxyNumerologyCard:()=>ze,RoxyPanchangTable:()=>Me,RoxyShadbalaTable:()=>We,RoxySynastryChart:()=>Je,RoxyTarotCard:()=>De,RoxyTarotSpread:()=>Ge,RoxyTransitsTable:()=>Oe,RoxyVedicKundli:()=>He,RoxyVedicPlanetsTable:()=>Xe,RoxyWesternPlanetsTable:()=>Qe,RoxyYogaList:()=>Ie});module.exports=Wt(Qa);var U=require("lit"),nr=require("lit/decorators.js");var I={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},Ct={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},oe={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Ir={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},Q=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],es=Q.map(o=>o.toLowerCase()),fr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},dt={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},Pt={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var Lt=require("lit"),y=Lt.css`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var Jt="roxy-data";function Xt(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var h=class{constructor(n){this.host=n,n.addController(this)}hostConnected(){if(this.host.data!=null)return;let n=this.read();n!==void 0&&(this.host.data=n,this.host.requestUpdate())}read(){let n=this.findInlineScript();return n?this.parse(n.textContent):void 0}findInlineScript(){for(let n of Array.from(this.host.children))if(Xt(n)&&n.classList.contains(Jt))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var Qt={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},er=["sarva","bhinna","pinda"],$e=class extends U.LitElement{constructor(){super();this.data=null;this.activeTab="sarva";new h(this)}render(){if(!this.data)return U.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return U.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?U.html`<p class="subtitle">${e.length} signs</p>`:U.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${er.map(r=>U.html`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${Qt[r]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=er.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=er[(r+1)%er.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=er[(r-1+er.length)%er.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?U.html`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,a)=>{let s=r.bindus[a]??0,i=this.sarvaHeat(s);return U.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${oe[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${s}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:U.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?U.html`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>U.html`<th scope="col" title="${t}">${oe[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>U.html`<tr><td>${t.planet}</td>${t.bindus.map(a=>{let s=this.bhinnaHeat(a);return U.html`<td class="${`heat-cell ${s}`}">${a}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:U.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?U.html`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>U.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:U.html`<p class="roxy-empty">No shodhya pinda data</p>`}};$e.styles=[y,U.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([(0,nr.property)({attribute:!1})],$e.prototype,"data",2),d([(0,nr.state)()],$e.prototype,"activeTab",2),$e=d([(0,nr.customElement)("roxy-ashtakavarga-grid")],$e);var V=require("lit"),br=require("lit/decorators.js");var Tt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},we=class extends V.LitElement{constructor(){super();this.data=null;this.mode="daily";new h(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):V.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([a,s])=>{let i=typeof s=="number"?s:0,l=Math.abs(i)>1?i/100:i;return[a,l]});return V.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?V.html`<span class="energy">Energy ${e.energyRating}/10</span>`:V.nothing}</header><div class="bars" role="list">${t.map(([a,s])=>{let i=(s+1)/2*100,l=Tt[a]??"var(--roxy-accent, #f59e0b)";return V.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${a}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(s*100)}%</span></div>`})}</div>${e.dailyMessage?V.html`<p class="advice">${e.dailyMessage}</p>`:V.nothing} ${e.advice?V.html`<p class="advice">${e.advice}</p>`:V.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return V.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,a=160,s=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return V.html`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${a}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${a/2}" x2="${t}" y2="${a/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((p,u)=>{let P=p[l]??0,x=u*s,Ze=a/2-P/100*(a/2-8);return`${x.toFixed(2)},${Ze.toFixed(2)}`}).join(" "),m=Tt[l]??"#475569";return V.svg`<polyline points=${c} fill="none" stroke=${m} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?V.html`<p class="advice">${e.summary.periodAdvice}</p>`:V.nothing}</section>`}renderCritical(e){return V.html`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>V.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};we.styles=[y,V.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([(0,br.property)({attribute:!1})],we.prototype,"data",2),d([(0,br.property)({type:String,reflect:!0})],we.prototype,"mode",2),we=d([(0,br.customElement)("roxy-biorhythm-chart")],we);var _=require("lit"),Yr=require("lit/decorators.js");var ge=require("lit"),_r=4,Kr=9,At=(100+2*Kr)*_r,Zt=(100+2*Kr)*_r;function ce(o,n){return{x:(o+Kr)*_r,y:(n+Kr)*_r}}var vr=50,gt=o=>2*vr-o,ct={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},ea={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function ra(){let o={},n={};for(let[e,[r,t]]of Object.entries(ct.spleen))ct["solar-plexus"][ea[Number(e)]]=[gt(r),t];for(let[e,r]of Object.entries(ct))for(let[t,[a,s]]of Object.entries(r))o[Number(t)]=ce(a,s),n[Number(t)]=e;return{points:o,centerOf:n}}var{points:mt,centerOf:gs}=ra(),ys=At/2;function rr(o){return o.map(([n,e])=>ce(n,e))}function pt(o,n,e){return rr([[vr-o,n],[vr+o,n],[vr+o,e],[vr-o,e]])}var Rt=[[18.4,68],[18.4,81.8],[34.7,74.9]],ta=[{id:"head",label:"Head",color:"gold",points:rr([[40,14.3],[60,14.3],[50,6]]),labelAnchor:ce(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:rr([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:ce(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:pt(9.5,30.4,43.6),labelAnchor:ce(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:rr([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:ce(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:rr([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:ce(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:rr(Rt),labelAnchor:ce(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:pt(9.5,70.6,83.6),labelAnchor:ce(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:rr(Rt.map(([o,n])=>[gt(o),n])),labelAnchor:ce(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:pt(9.5,87.9,99.9),labelAnchor:ce(50,103),labelAlign:"middle"}],aa=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],sa=oa();function oa(){let o=gt,n=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${jr(n[0])}`];for(let r=1;r+2<n.length;r+=3)e.push(`C ${jr(n[r])} ${jr(n[r+1])} ${jr(n[r+2])}`);e.push(`L ${Br(n[n.length-1],o)}`);for(let r=n.length-3;r>=1;r-=3)e.push(`C ${Br(n[r+1],o)} ${Br(n[r],o)} ${Br(n[r-1],o)}`);return e.push("Z"),e.join(" ")}function jr([o,n]){let e=ce(o,n);return`${e.x} ${e.y}`}function Br([o,n],e){let r=ce(e(o),n);return`${r.x} ${r.y}`}function na(o){return o.map(n=>`${n.x},${n.y}`).join(" ")}function Et(o,n){return o<n?`${o}-${n}`:`${n}-${o}`}function ia(){return ge.svg`<path class="bg-body" d=${sa} />`}function la(o,n){let e=[];for(let[r,t]of aa){let a=mt[r],s=mt[t];if(!a||!s)continue;if(e.push(ge.svg`<line class="bg-channel" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />`),o.has(Et(r,t))){e.push(ge.svg`<line class="bg-channel on" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />`);continue}let i={x:(a.x+s.x)/2,y:(a.y+s.y)/2};n.has(r)&&e.push(ge.svg`<line class="bg-half" x1=${a.x} y1=${a.y} x2=${i.x} y2=${i.y} />`),n.has(t)&&e.push(ge.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`)}return e}function da(o,n,e){let r=e.x-n.x,t=e.y-n.y,a=r*r+t*t;if(a===0)return n;let s=Math.max(0,Math.min(1,((o.x-n.x)*r+(o.y-n.y)*t)/a));return{x:n.x+s*r,y:n.y+s*t}}function ca(o,n){let e=n[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<n.length;t++){let a=da(o,n[t],n[(t+1)%n.length]),s=(a.x-o.x)**2+(a.y-o.y)**2;s<r&&(r=s,e=a)}return e}function pa(o){return ta.map(n=>{let e=o.has(n.id),r=`bg-center bg-${n.color}${e?" defined":""}`,t=ca(n.labelAnchor,n.points);return ge.svg`<g>
|
|
2
|
+
<line class="bg-leader" x1=${n.labelAnchor.x} y1=${n.labelAnchor.y} x2=${t.x} y2=${t.y} />
|
|
3
|
+
<polygon class=${r} points=${na(n.points)}><title>${n.label}: ${e?"defined":"open"}</title></polygon>
|
|
4
|
+
<text class="bg-center-label" x=${n.labelAnchor.x} y=${n.labelAnchor.y} text-anchor=${n.labelAlign} dominant-baseline="central">${n.label}</text>
|
|
5
|
+
</g>`})}function ma(o,n){let e=[];for(let[r,t]of Object.entries(mt)){let a=Number(r);if(!o.has(a))continue;let s=n.get(a);e.push(ge.svg`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${a}${s?ge.svg`<title>${s}</title>`:ge.nothing}</text>`)}return e}function Nt(o,n){return Et(o,n)}var zt=`0 0 ${At} ${Zt}`;function Mt(o){return ge.svg`
|
|
6
|
+
${ia()}
|
|
7
|
+
${la(o.activeChannels,o.activeGates)}
|
|
8
|
+
${pa(o.definedCenters)}
|
|
9
|
+
${ma(o.activeGates,o.gateTitles)}
|
|
10
|
+
`}function b(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function ye(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,n=>n.toUpperCase())}var je=class extends _.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return _.html`<div class="roxy-empty" role="status">No bodygraph data</div>`;let r=new Set((e.centers??[]).filter(i=>i.defined).map(i=>i.id)),t=new Set((e.gates??[]).map(i=>i.gate).filter(i=>i!=null)),a=new Set((e.channels??[]).map(i=>Nt(i.gateA,i.gateB))),s=this.buildGateTitles(e.gates??[]);return _.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?_.html`<div class="type-line">${e.type}${e.profile?_.html`· Profile ${e.profile}`:_.nothing}</div>`:_.nothing}</header><div class="layout"><svg viewBox="${zt}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Mt({definedCenters:r,activeChannels:a,activeGates:t,gateTitles:s})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let r=new Map;for(let t of e){if(t.gate==null)continue;let a=[`Gate ${t.gate}`];t.line!=null&&(a[0]+=`.${t.line}`),t.gateName&&a.push(t.gateName);let s=t.planet?b(t.planet):"",i=s?I[s]??s:"";i&&a.push(`${i} ${t.side??""}`.trim()),r.set(t.gate,a.join(" \xB7 "))}return r}renderSummary(e){let r=[{label:"Type",value:e.type},{label:"Strategy",value:e.strategy},{label:"Authority",value:e.authority},{label:"Profile",value:e.profile},{label:"Definition",value:e.definition}],t=e.incarnationCross;return _.html`<div class="summary"><div class="facts">${r.map(a=>a.value?_.html`<div class="fact"><span>${a.label}</span> <strong>${a.value}</strong></div>`:_.nothing)}</div>${t?.name?_.html`<p class="cross">${t.name} ${t.gates?.length?_.html`<span class="gates">(${t.gates.join(", ")})</span>`:_.nothing}</p>`:_.nothing} ${e.signature||e.notSelf?_.html`<div class="themes">${e.signature?_.html`<span class="pill pill--good">Signature: ${e.signature}</span>`:_.nothing} ${e.notSelf?_.html`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:_.nothing}</div>`:_.nothing}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};je.styles=[y,_.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:340px;height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],d([(0,Yr.property)({attribute:!1})],je.prototype,"data",2),je=d([(0,Yr.customElement)("roxy-bodygraph")],je);var Z=require("lit"),qr=require("lit/decorators.js");function Dt(o){try{let n=new Date(o);return Number.isNaN(n.getTime())?o:n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return o}}var Be=class extends Z.LitElement{constructor(){super();this.data=null;new h(this)}isCurrent(e){let r=Date.now(),t=Date.parse(e.start),a=Date.parse(e.end);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",t=this.isCurrent(e),a=I[b(e.lord)]??"",s=`${Dt(e.start)} - ${Dt(e.end)}`;return Z.html`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?Z.html`<span class="now-badge">Now</span>`:Z.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${a?Z.html`<span aria-hidden="true">${a}</span>`:Z.nothing} ${e.lord}</span></div>`}render(){if(!this.data)return Z.html`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return Z.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?Z.html`<p class="subtitle">${e}</p>`:Z.nothing}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(a=>this.renderTile(a)):Z.html`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(a=>this.renderTile(a)):Z.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Be.styles=[y,Z.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],d([(0,qr.property)({attribute:!1})],Be.prototype,"data",2),Be=d([(0,qr.customElement)("roxy-choghadiya-grid")],Be);var L=require("lit"),$r=require("lit/decorators.js");function he(o){if(typeof o!="string"||o.length===0||/^\d{4}-\d{2}-\d{2}$/.test(o))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(o)?`1970-01-01T${o}`:o,r=new Date(e);return Number.isNaN(r.getTime())?o:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function _e(o){if(typeof o!="string"||o.length===0)return"";let n=new Date(/^\d{4}-\d{2}-\d{2}$/.test(o)?`${o}T00:00:00`:o);return Number.isNaN(n.getTime())?o:n.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function yt(o){if(!o)return"";let n=he(o.start),e=he(o.end);return n&&e?`${n} - ${e}`:n||e||""}function v(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function Gt(o,n=1){let e=v(o,n);return e?`${e}%`:""}var tr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function ir(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var ke=class extends L.LitElement{constructor(){super();this.data=null;this.mode="astrology";new h(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,a]of Object.entries(e.categories))typeof a=="number"&&Number.isFinite(a)&&(r[t]=a);return r}return{}}render(){let e=this.data;if(!e)return L.html`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),a="rating"in e?e.rating:void 0,s="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,m="strengths"in e?e.strengths:void 0,p="challenges"in e?e.challenges:void 0,u="keyAspects"in e?e.keyAspects:void 0;return L.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?L.html`<div class="score">${v(r,0)}</div>`:L.nothing} ${a?L.html`<div class="rating">${a}</div>`:L.nothing}</div></div>${Object.keys(t).length>0?L.html`<div role="list">${Object.entries(t).map(([P,x])=>L.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${P}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,x))}%"></span></span> <span>${v(x,0)}</span></div>`)}</div>`:L.nothing} ${s?L.html`<p><span class="archetype">${s.label}</span> ${s.description?L.html`· ${s.description}`:L.nothing}</p>`:L.nothing} ${l?L.html`<p>${l}</p>`:L.nothing} ${c&&!l?L.html`<p>${c}</p>`:L.nothing} ${i?L.html`<p>${i}</p>`:L.nothing} ${(m?.length??0)>0||(p?.length??0)>0?L.html`<div class="lists">${m?.length?L.html`<div><h3>Strengths</h3><ul>${m.map(P=>L.html`<li>${P}</li>`)}</ul></div>`:L.nothing} ${p?.length?L.html`<div><h3>Challenges</h3><ul>${p.map(P=>L.html`<li>${P}</li>`)}</ul></div>`:L.nothing}</div>`:L.nothing} ${u?.length?L.html`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${u.slice(0,6).map(P=>L.html`<li>${ga(P)}</li>`)}</ul></div>`:L.nothing}</article>`}};ke.styles=[y,L.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([(0,$r.property)({attribute:!1})],ke.prototype,"data",2),d([(0,$r.property)({type:String,reflect:!0})],ke.prototype,"mode",2),ke=d([(0,$r.customElement)("roxy-compatibility-card")],ke);function ga(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${v(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}var w=require("lit"),wr=require("lit/decorators.js");var Se=class extends w.LitElement{constructor(){super();this.data=null;this.period="current";new h(this)}render(){let e=this.data;if(!e)return w.html`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(a=>a.durationYears)):0;return w.html`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?w.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?w.html`(lord ${e.nakshatraLord})`:w.nothing}</div>`:w.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):w.nothing} ${r.length>0?w.html`<div class="timeline" role="list">${r.map(a=>this.renderBar(a,t))}</div>`:w.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return w.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",a=r.years??0,s=r.months??0,i=r.days??0,l=[];a&&l.push(`${a}y`),s&&l.push(`${s}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return w.html`<p class="balance">Birth dasha balance: ${c} of ${t?w.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?w.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:w.nothing}renderCurrent(e){return"mahadasha"in e?w.html`<div class="current">${"mahadasha"in e&&e.mahadasha?w.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?w.html`<small>${v(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing} ${"antardasha"in e&&e.antardasha?w.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?w.html`<small>${v(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?w.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?w.html`<small>${v(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing}</div>`:w.nothing}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),a=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),a=Date.now();return Number.isNaN(r)||Number.isNaN(t)||a<r||a>=t||t<=r?-1:(a-r)/(t-r)}renderBar(e,r){let t=e.durationYears,a=r>0?t/r*100:0,s=this.isCurrent(e),i=s?this.progressIn(e):-1,l=s?"bar-track bar-now":"bar-track";return w.html`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?w.html`<span class="now-badge">Now</span>`:w.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${a}%"></span> ${i>=0?w.html`<span class="bar-progress" style="left:${i*a}%" aria-hidden="true"></span>`:w.nothing} </span><span class="dates">${e.startDate?Ot(e.startDate):""} ${e.endDate?w.html`- ${Ot(e.endDate)}`:""}</span></div>`}};Se.styles=[y,w.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([(0,wr.property)({attribute:!1})],Se.prototype,"data",2),d([(0,wr.property)({type:String,reflect:!0})],Se.prototype,"period",2),Se=d([(0,wr.customElement)("roxy-dasha-timeline")],Se);function Ot(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}var N=require("lit"),kr=require("lit/decorators.js");var ya=["title","name","label","heading","overview","summary"],ua=["imageUrl","image","icon","symbol"],ha=["imageUrl","image"],xa=6,Ce=class extends N.LitElement{constructor(){super();this.data=null;this.depth=0;new h(this)}render(){return this.data==null?N.html`<div class="roxy-empty" role="status">No data</div>`:this.depth>=xa?N.html`<div class="roxy-empty" role="status">…</div>`:N.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?N.nothing:typeof e=="string"?N.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?N.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?N.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(a=>a===null||["string","number","boolean"].includes(typeof a))?N.html`<ul class="roxy-chips">${e.map(a=>N.html`<li>${String(a)}</li>`)}</ul>`:e.every(a=>a!==null&&typeof a=="object"&&!Array.isArray(a))?this.renderTable(e):N.html`<ol>${e.map(a=>N.html`<li>${this.renderValue(a)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return N.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>N.html`<th>${ye(t)}</th>`)}</tr></thead><tbody>${e.map(t=>N.html`<tr>${r.map(a=>N.html`<td>${this.formatPrimitive(t[a])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=ya.find(i=>typeof e[i]=="string"),t=ua.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),a=r!=="summary"&&typeof e.summary=="string"?"summary":null,s=Object.entries(e).filter(([i,l])=>i!==r&&i!==a&&!ha.includes(i)&&l!==null&&l!==void 0);return N.html`${t?N.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:N.nothing} ${r?N.html`<h3 class="roxy-title">${e[r]}</h3>`:N.nothing} ${a?N.html`<p class="roxy-summary">${e[a]}</p>`:N.nothing} ${s.length>0?N.html`<dl class="roxy-rows">${s.map(([i,l])=>N.html`<dt>${ye(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:N.nothing}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?N.html`<ul class="roxy-chips">${e.map(t=>N.html`<li>${String(t)}</li>`)}</ul>`:N.html`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let a of Object.keys(t))r.add(a);return Array.from(r)}};Ce.styles=[y,N.css`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([(0,kr.property)({attribute:!1})],Ce.prototype,"data",2),d([(0,kr.property)({attribute:!1})],Ce.prototype,"depth",2),Ce=d([(0,kr.customElement)("roxy-data")],Ce);var ne=require("lit"),Sr=require("lit/decorators.js");var S=require("lit");function xe(o){let n=o%360;return n<0?n+360:n}function fe(o){let n=xe(o),e=Math.floor(n/30)%12,r=n%30,t=Math.floor(r),a=(r-t)*60,s=Math.floor(a),i=Math.round((a-s)*60);return{sign:Q[e]??"Aries",signIndex:e,degree:t,minute:s,second:i}}function Vr(o){let{sign:n,degree:e,minute:r}=fe(o);return`${e}\xB0 ${n} ${String(r).padStart(2,"0")}'`}function ut(o){return xe(o+180)}function Ht(o,n){let e=xe(o),r=xe(n)-e;return r<0&&(r+=360),xe(e+r/2)}function G(o,n,e,r){let t=r*Math.PI/180;return{x:o+e*Math.cos(t),y:n+e*Math.sin(t)}}var ar=require("lit"),Ke=ar.css`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function lr(o){let{items:n,active:e,onSelect:r,label:t,idPrefix:a,controls:s=!1}=o;return ar.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=n.findIndex(P=>P.id===e);if(c===-1)return;let m=l.key==="ArrowRight"?1:-1,p=n[(c+m+n.length)%n.length];if(!p)return;r(p.id);let u=l.currentTarget.getRootNode();requestAnimationFrame(()=>{u.querySelector(`#${a}-tab-${p.id}`)?.focus()})}}">${n.map(l=>ar.html`<button type="button" class="roxy-tab" role="tab" id="${a}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${s&&e===l.id?`${a}-panel-${l.id}`:ar.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ue=400,O=20,te=ue-2*O,F=ue/2,fa=Object.fromEntries(Q.map(o=>[o.toLowerCase(),o])),ba=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],va="\u02B3";function It(o,n){return typeof o.longitude!="number"||!Number.isFinite(o.longitude)?!1:fe(o.longitude).sign.toLowerCase()!==n.toLowerCase()}function $a(o,n){let e=Ct[b(o.graha)]??o.graha.slice(0,2),r=o.isRetrograde?va:"";if(typeof o.longitude!="number"||!Number.isFinite(o.longitude)||It(o,n))return`${e}${r}`;let{degree:t}=fe(o.longitude);return`${e} ${t}\xB0${r}`}function wa(o,n){let e=[b(o.graha)],r=It(o,n);if(r&&e.push(`in ${n}`),typeof o.longitude=="number"&&Number.isFinite(o.longitude)){let t=fe(o.longitude),a=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${a}' ${t.sign}`:`${t.degree}\xB0${a}' ${t.sign}`)}if(o.nakshatra?.name){let t=o.nakshatra.pada?` pada ${o.nakshatra.pada}`:"";e.push(`${o.nakshatra.name}${t}`)}return o.awastha&&e.push(o.awastha),o.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function ht(o,n,e,r,t){let a=r-(o.length-1)*t/2;return o.map((s,i)=>{let l=a+i*t;return S.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${$a(s,n)}<title>${wa(s,n)}</title></text>`})}function Ur(o,n){let e={};for(let t of Q)e[t.toLowerCase()]=[];let r="";for(let[t,a]of Object.entries(o??{})){let s=(a?.rashi??"").toLowerCase();if(t==="Lagna"||a?.graha==="Lagna"){r=fa[s]??"";continue}!s||!(s in e)||e[s]?.push({graha:a.graha??t,longitude:a.longitude,nakshatra:a.nakshatra,isRetrograde:a.isRetrograde,awastha:a.awastha})}return{lagnaSign:r,placements:e,divisionLabel:n}}var sr=te/4,ka={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function Sa(o){let n=ka[o]??{col:0,row:0};return{x:O+n.col*sr,y:O+n.row*sr,w:sr,h:sr}}function Ca(o){let n=O,e=O+sr,r=O+2*sr,t=O+3*sr,a=ue-O;return S.svg`
|
|
11
|
+
<rect class="line" x=${n} y=${n} width=${te} height=${te} stroke-width="1.5" fill="none" />
|
|
3
12
|
<line class="line" x1=${n} y1=${e} x2=${a} y2=${e} stroke-width="1" />
|
|
4
13
|
<line class="line" x1=${n} y1=${t} x2=${a} y2=${t} stroke-width="1" />
|
|
5
14
|
<line class="line" x1=${e} y1=${n} x2=${e} y2=${a} stroke-width="1" />
|
|
@@ -8,8 +17,8 @@
|
|
|
8
17
|
<line class="line" x1=${t} y1=${r} x2=${a} y2=${r} stroke-width="1" />
|
|
9
18
|
<line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
|
|
10
19
|
<line class="line" x1=${r} y1=${t} x2=${r} y2=${a} stroke-width="1" />
|
|
11
|
-
${o?S.svg`<text class="centre-label" x=${
|
|
12
|
-
`}function
|
|
20
|
+
${o?S.svg`<text class="centre-label" x=${F} y=${F} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
|
|
21
|
+
`}function jt(o,n){let e=Q.findIndex(t=>t===n),r=Q.findIndex(t=>t===o);return e===-1||r===-1?0:(r-e+12)%12+1}function Pa(o,n,e,r){let t=Sa(o),a=t.x+t.w/2,s=t.y+t.h/2,i=Ir[o]??o.slice(0,2),l=14;return S.svg`
|
|
13
22
|
<g class=${e?"cell lagna":"cell"}>
|
|
14
23
|
${e?S.svg`
|
|
15
24
|
<rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
|
|
@@ -18,28 +27,28 @@
|
|
|
18
27
|
<text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
|
|
19
28
|
${r>0?S.svg`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:S.nothing}
|
|
20
29
|
${e?S.svg`<text class="lagna-marker" x=${a} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:S.nothing}
|
|
21
|
-
${n.length?
|
|
30
|
+
${n.length?ht(n,o,a,s+4,14):S.nothing}
|
|
22
31
|
</g>
|
|
23
|
-
`}function
|
|
24
|
-
${
|
|
25
|
-
${
|
|
26
|
-
`}var
|
|
27
|
-
<rect class="line" x=${n.x} y=${n.y} width=${
|
|
32
|
+
`}function La(o){let n=o.lagnaSign.toLowerCase();return S.svg`
|
|
33
|
+
${Ca(o.divisionLabel)}
|
|
34
|
+
${Q.map(e=>Pa(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,jt(e,o.lagnaSign)))}
|
|
35
|
+
`}var M={tl:{x:O,y:O},tr:{x:ue-O,y:O},br:{x:ue-O,y:ue-O},bl:{x:O,y:ue-O},top:{x:F,y:O},right:{x:ue-O,y:F},bottom:{x:F,y:ue-O},left:{x:O,y:F},tlMid:{x:F-te/4,y:F-te/4},trMid:{x:F+te/4,y:F-te/4},brMid:{x:F+te/4,y:F+te/4},blMid:{x:F-te/4,y:F+te/4}};function Pe(o){let n=o.reduce((r,t)=>r+t.x,0)/o.length,e=o.reduce((r,t)=>r+t.y,0)/o.length;return{x:n,y:e}}var Ta={1:{x:F,y:M.tlMid.y},2:Pe([M.tl,M.top,M.tlMid]),3:Pe([M.tl,M.left,M.tlMid]),4:{x:M.tlMid.x,y:F},5:Pe([M.bl,M.left,M.blMid]),6:Pe([M.bl,M.bottom,M.blMid]),7:{x:F,y:M.blMid.y},8:Pe([M.br,M.bottom,M.brMid]),9:Pe([M.br,M.right,M.brMid]),10:{x:M.brMid.x,y:F},11:Pe([M.tr,M.right,M.trMid]),12:Pe([M.tr,M.top,M.trMid])};function Ra(o,n){let e=Q.findIndex(r=>r===n);return e===-1?o:(e+o-1)%12+1}function Aa(o){let{tl:n,tr:e,br:r,bl:t,top:a,right:s,bottom:i,left:l}=M;return S.svg`
|
|
36
|
+
<rect class="line" x=${n.x} y=${n.y} width=${te} height=${te} stroke-width="1.5" fill="none" />
|
|
28
37
|
<polygon class="line" points="${a.x},${a.y} ${s.x},${s.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
|
|
29
38
|
<line class="line" x1=${n.x} y1=${n.y} x2=${r.x} y2=${r.y} stroke-width="1" />
|
|
30
39
|
<line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
|
|
31
|
-
${o?S.svg`<text class="centre-label" x=${
|
|
32
|
-
`}function
|
|
40
|
+
${o?S.svg`<text class="centre-label" x=${F} y=${F} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
|
|
41
|
+
`}function Ea(o,n,e,r,t){let a=Ta[o];if(!a)return S.svg``;let s=Math.min(14,Math.abs(a.y-F)*.45+6),i=s+12,l=t?`${n} \xB7 ${Ir[e]??e.slice(0,2)}`:`${n}`;return S.svg`
|
|
33
42
|
<g class=${t?"cell lagna":"cell"}>
|
|
34
43
|
<text class="rashi-num" x=${a.x} y=${a.y-s} text-anchor="middle" dominant-baseline="central">${l}</text>
|
|
35
44
|
${t?S.svg`<text class="lagna-marker" x=${a.x} y=${a.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:S.nothing}
|
|
36
|
-
${r.length?
|
|
45
|
+
${r.length?ht(r,e,a.x,a.y+8,12):S.nothing}
|
|
37
46
|
</g>
|
|
38
|
-
`}function
|
|
39
|
-
${
|
|
40
|
-
${Array.from({length:12},(e,r)=>{let t=r+1,a=
|
|
41
|
-
`}var
|
|
42
|
-
<rect class="line" x=${n} y=${n} width=${
|
|
47
|
+
`}function Na(o){let n=o.lagnaSign||"Aries";return S.svg`
|
|
48
|
+
${Aa(o.divisionLabel)}
|
|
49
|
+
${Array.from({length:12},(e,r)=>{let t=r+1,a=Ra(t,n),s=Q[a-1]??"Aries";return Ea(t,a,s,o.placements[s.toLowerCase()]??[],t===1)})}
|
|
50
|
+
`}var Fr=te/3;function za(){let o=O,n=O+Fr,e=O+2*Fr,r=ue-O,Dr={Aries:[{x:n,y:o},{x:e,y:o},{x:e,y:n},{x:n,y:n}],Taurus:[{x:o,y:o},{x:n,y:o},{x:n,y:n}],Gemini:[{x:o,y:o},{x:n,y:n},{x:o,y:n}],Cancer:[{x:o,y:n},{x:n,y:n},{x:n,y:e},{x:o,y:e}],Leo:[{x:o,y:e},{x:n,y:e},{x:o,y:r}],Virgo:[{x:n,y:e},{x:n,y:r},{x:o,y:r}],Libra:[{x:n,y:e},{x:e,y:e},{x:e,y:r},{x:n,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:n},{x:r,y:n},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:o},{x:r,y:n},{x:e,y:n}],Pisces:[{x:e,y:o},{x:r,y:o},{x:e,y:n}]},xr={};for(let[Gr,Or]of Object.entries(Dr))xr[Gr]={points:[...Or],centroid:Pe(Or)};return xr}var Ma=za();function Da(o){let n=O,e=O+Fr,r=O+2*Fr,t=ue-O;return S.svg`
|
|
51
|
+
<rect class="line" x=${n} y=${n} width=${te} height=${te} stroke-width="1.5" fill="none" />
|
|
43
52
|
<line class="line" x1=${n} y1=${e} x2=${e} y2=${e} stroke-width="1" />
|
|
44
53
|
<line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
|
|
45
54
|
<line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
@@ -52,32 +61,32 @@
|
|
|
52
61
|
<line class="line" x1=${t} y1=${n} x2=${r} y2=${e} stroke-width="1" />
|
|
53
62
|
<line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
|
|
54
63
|
<line class="line" x1=${n} y1=${t} x2=${e} y2=${r} stroke-width="1" />
|
|
55
|
-
${o?S.svg`<text class="centre-label" x=${
|
|
56
|
-
`}function
|
|
64
|
+
${o?S.svg`<text class="centre-label" x=${F} y=${F} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
|
|
65
|
+
`}function Ga(o,n,e,r){let t=Ma[o];if(!t)return S.svg``;let{centroid:a,points:s}=t,i=Ir[o]??o.slice(0,2),l=s.map(c=>`${c.x},${c.y}`).join(" ");return S.svg`
|
|
57
66
|
<g class=${e?"cell lagna":"cell"}>
|
|
58
67
|
${e?S.svg`<polygon class="lagna-bg" points=${l} />`:S.nothing}
|
|
59
68
|
<text class="sign-text" x=${a.x} y=${a.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
|
|
60
69
|
${r>0?S.svg`<text class="house-num" x=${a.x+18} y=${a.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:S.nothing}
|
|
61
70
|
${e?S.svg`<text class="lagna-marker" x=${a.x} y=${a.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:S.nothing}
|
|
62
|
-
${n.length?
|
|
71
|
+
${n.length?ht(n,o,a.x,a.y+4,12):S.nothing}
|
|
63
72
|
</g>
|
|
64
|
-
`}function
|
|
65
|
-
${
|
|
66
|
-
${
|
|
67
|
-
`}function Dr(o,n){switch(n){case"north":return Ut(o);case"east":return Qt(o);default:return _t(o)}}function Gr(o,n){return Qe({items:Dt,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}var xt=require("lit"),Or=xt.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var we=class extends se.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new u(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 se.html`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return se.html`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?se.html`<span class="division-meta">· ${r.sanskritName}</span>`:se.nothing}</h2>${r.significance?se.html`<p class="significance">${r.significance}</p>`:se.nothing}</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?se.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(a=>se.html`<span class="vargottama-pill" role="listitem">${K[a]??""} ${a}</span>`)}</div>`:se.nothing}</div>`}};we.styles=[h,Or,Oe,se.css`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],d([(0,yr.property)({attribute:!1})],we.prototype,"data",2),d([(0,yr.property)({type:String,reflect:!0,attribute:"chart-style"})],we.prototype,"chartStyle",2),we=d([(0,yr.customElement)("roxy-divisional-chart")],we);var F=require("lit"),hr=require("lit/decorators.js");var ea={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},ke=class extends F.LitElement{constructor(){super();this.data=null;this.type="manglik";new u(this)}render(){let e=this.data;if(!e)return F.html`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=ea[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 F.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?F.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${s}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:F.nothing} ${e.description?F.html`<p class="description">${e.description}</p>`:F.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?F.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>F.html`<li>${c}</li>`)}</ul></div>`:F.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?F.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>F.html`<li>${c}</li>`)}</ul></div>`:F.nothing}</article>`}renderEffects(e){if(!e.effects)return F.nothing;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?F.nothing:F.html`<div class="effects">${r.map(([t,a])=>F.html`<div><h3>${t}</h3><p>${a}</p></div>`)}</div>`}};ke.styles=[h,F.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([(0,hr.property)({attribute:!1})],ke.prototype,"data",2),d([(0,hr.property)({type:String,reflect:!0})],ke.prototype,"type",2),ke=d([(0,hr.customElement)("roxy-dosha-card")],ke);var U=require("lit"),le=require("lit/decorators.js");var Qr=new Map;async function ra(o){let n=Qr.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 Qr.delete(o),e}),Qr.set(o,n)),n}var re=class extends U.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(t=>t.required).filter(t=>this.values[t.name]===void 0||this.values[t.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(t=>t.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await ra(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 y=this.resolve(p,a)??{};s.push({name:m,type:this.fieldType(y),required:c.has(m),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 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 U.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return U.html`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return U.nothing;let t=`roxy-form-${r.name}`;return U.html`<div class="field"><label for="${t}">${De(r.name)}${r.required?U.html`<span class="req" aria-hidden="true">*</span>`:U.nothing}</label> ${r.enum?U.html`<select id="${t}" ?required="${r.required}" @change="${a=>this.setValue(r.name,a.target.value)}"><option value="">Choose</option>${r.enum.map(a=>U.html`<option value="${a}" ?selected="${this.values[r.name]===a}">${a}</option>`)}</select>`:U.html`<input id="${t}" type="${this.htmlType(r.type)}" ?required="${r.required}" min="${r.min??""}" max="${r.max??""}" step="${r.type==="number"?"any":""}" .value="${this.values[r.name]??""}" @input="${a=>this.setValue(r.name,this.coerce(r.type,a.target.value))}">`} ${r.description?U.html`<small class="help">${r.description}</small>`:U.nothing}</div>`};return U.html`<form @submit="${this.onSubmit}"><h2 class="title">${De(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?U.html`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:U.nothing}<div class="fields">${this.fields.map(r=>e(r))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};re.styles=[h,U.css`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([(0,le.property)({type:String,attribute:"data-endpoint"})],re.prototype,"endpoint",2),d([(0,le.property)({type:String})],re.prototype,"method",2),d([(0,le.property)({type:String,attribute:"spec-url"})],re.prototype,"specUrl",2),d([(0,le.property)({type:String,attribute:"submit-label"})],re.prototype,"submitLabel",2),d([(0,le.state)()],re.prototype,"fields",2),d([(0,le.state)()],re.prototype,"values",2),d([(0,le.state)()],re.prototype,"hasLocation",2),d([(0,le.state)()],re.prototype,"loaded",2),d([(0,le.state)()],re.prototype,"specError",2),re=d([(0,le.customElement)("roxy-endpoint-form")],re);var W=require("lit"),Hr=require("lit/decorators.js");var He=class extends W.LitElement{constructor(){super();this.data=null;new u(this)}render(){let e=this.data;if(!e)return W.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(p=>p?.category!==void 0),t=e.total??0,a=e.maxScore??36,s=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",l=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,m=(100-s)*2.827;return W.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${b(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?W.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${mt(e.percentage,1)}</small>`:W.nothing}</div>${e.recommendation?W.html`<span class="recommendation">${e.recommendation}</span>`:W.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${l}" stroke-width="8" stroke-dasharray="${c},${m}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${r.length>0?W.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(p=>{let y=p.score??0,C=p.maxScore??ta(p.category),x=C?y/C*100:0;return W.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${x}%"></span></div></td><td class="score">${b(y,1)} / ${C}</td></tr>`})}</tbody></table>`:W.nothing} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?W.html`<div class="tags">${e.doshas?.map(p=>W.html`<span class="dosha">${p}</span>`)} ${e.doshaCancellations?.map(p=>W.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:W.nothing}</article>`}};He.styles=[h,W.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],d([(0,Hr.property)({attribute:!1})],He.prototype,"data",2),He=d([(0,Hr.customElement)("roxy-guna-milan")],He);function ta(o){if(!o)return 1;switch(o.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var T=require("lit"),ur=require("lit/decorators.js");var Se=class extends T.LitElement{constructor(){super();this.data=null;this.mode="lookup";new u(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return T.html`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:a,dailyMessage:s,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(a??[]);return T.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?T.html`<div class="symbol">${r.symbol}</div>`:T.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((m,p)=>{let y=l.length-1-p+1,C=c.has(y),x=m===6||m===8;return T.html`<div class="line ${`${x?"broken":"solid"}${C?" changing":""}`}">${x?T.svg`<span class="seg"></span><span class="seg"></span>`:T.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?T.html`${r.number}.`:T.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?T.html`${r.chinese}`:T.nothing} ${r.pinyin?T.html`· ${r.pinyin}`:T.nothing}</p><div class="trigrams">${r.upperTrigram?T.html`<div>Upper <span class="tri-glyph">${Wr[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:T.nothing} ${r.lowerTrigram?T.html`<div>Lower <span class="tri-glyph">${Wr[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:T.nothing}</div>${r.judgment?T.html`<p class="judgment">${r.judgment}</p>`:T.nothing} ${r.image?T.html`<p class="image">${r.image}</p>`:T.nothing} ${s?T.html`<p class="message">${s}</p>`:T.nothing} ${r.interpretation?.general?T.html`<p>${r.interpretation.general}</p>`:T.nothing} ${c.size>0?T.html`<div class="changing">Changing lines: ${Array.from(c).sort((m,p)=>m-p).join(", ")}. ${i?.english?T.html`Becomes hexagram ${i.number} ${i.english}.`:T.nothing}</div>`:T.nothing}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,a=[];for(let s=0;s<6;s++){let i=t>>s&1;a.push(i?8:7)}return a}return Array.from({length:6},()=>7)}};Se.styles=[h,T.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,ur.property)({attribute:!1})],Se.prototype,"data",2),d([(0,ur.property)({type:String,reflect:!0})],Se.prototype,"mode",2),Se=d([(0,ur.customElement)("roxy-hexagram")],Se);var L=require("lit"),xr=require("lit/decorators.js");var Le=class extends L.LitElement{constructor(){super();this.data=null;this.period="daily";new u(this)}render(){let e=this.data;if(!e)return L.html`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?ae[k(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 L.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${s?L.html`<div class="date">${s}</div>`:L.nothing}</div>${a!==null?L.html`<span class="energy" aria-label="${`Energy ${a} of 10`}">Energy ${a}/10 <span class="energy-bar"><span style="width:${a/10*100}%"></span></span></span>`:L.nothing}</header>${e.overview?L.html`<p class="overview">${e.overview}</p>`:L.nothing}<div class="sections">${e.love?L.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:L.nothing} ${e.career?L.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:L.nothing} ${e.health?L.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:L.nothing} ${e.finance?L.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:L.nothing} ${"advice"in e&&e.advice?L.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:L.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,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?L.nothing:L.html`<div class="lucky">${i!==void 0?L.html`<span>Lucky number <strong>${i}</strong></span>`:L.nothing} ${l?L.html`<span>Lucky color <strong>${l}</strong></span>`:L.nothing} ${c.length?L.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:L.nothing} ${m.length?L.html`<span>Lucky days <strong>${m.join(", ")}</strong></span>`:L.nothing} ${p.length?L.html`<span class="compat-wrap">Best with <span class="compat">${p.map(y=>L.html`<span>${y}</span>`)}</span></span>`:L.nothing}</div>`})()}</article>`}};Le.styles=[h,L.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([(0,xr.property)({attribute:!1})],Le.prototype,"data",2),d([(0,xr.property)({type:String,reflect:!0})],Le.prototype,"period",2),Le=d([(0,xr.customElement)("roxy-horoscope-card")],Le);var D=require("lit"),er=require("lit/decorators.js");var Ce=class extends D.LitElement{constructor(){super();this.data=null;this.activeTab="planets";new u(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.planet,sign:a.sign,house:a.house,nakshatra:a.nakshatra,starLord:a.starLord,subLord:a.subLord,subSubLord:a.subSubLord,kpNumber:a.kpNumber,retrograde:a.retrograde})),t=e.nodes;for(let[a,s]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])s&&r.push({name:a,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}render(){if(!this.data)return D.html`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return D.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?D.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?D.html`· ${r.nakshatra}`:D.nothing} ${r.subLord?D.html`· sub lord ${r.subLord}`:D.nothing} ${typeof r.kpNumber=="number"?D.html`· KP ${r.kpNumber}`:D.nothing}</div>`:D.nothing} ${typeof e.meta?.ayanamsa=="number"?D.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${b(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?D.html`· ${e.meta.houseSystem} houses`:D.nothing}</div>`:D.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>D.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?D.html`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>D.html`<tr><td class="body">${r.name}${r.retrograde?D.html`<span class="retro">R</span>`:D.nothing}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:D.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?D.html`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>D.html`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:D.html`<p class="roxy-empty" role="status">No cusps</p>`}};Ce.styles=[h,D.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([(0,er.property)({attribute:!1})],Ce.prototype,"data",2),d([(0,er.state)()],Ce.prototype,"activeTab",2),Ce=d([(0,er.customElement)("roxy-kp-chart")],Ce);var de=require("lit"),Ir=require("lit/decorators.js");var Ie=class extends de.LitElement{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return de.html`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return de.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?de.html`<span class="ayanamsa">Ayanamsa: ${b(this.data.ayanamsa,2)}°</span>`:de.nothing}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>de.html`<tr><td class="planet">${r.planet} ${r.retrograde?de.html`<span class="retro">R</span>`:de.nothing}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Ie.styles=[h,de.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],d([(0,Ir.property)({attribute:!1})],Ie.prototype,"data",2),Ie=d([(0,Ir.customElement)("roxy-kp-planets-table")],Ie);var te=require("lit"),jr=require("lit/decorators.js");var je=class extends te.LitElement{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return te.html`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return te.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?te.html`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:te.nothing}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?te.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,a)=>te.html`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:te.nothing} ${r.length?te.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>te.html`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:te.nothing}</div>`}};je.styles=[h,te.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],d([(0,jr.property)({attribute:!1})],je.prototype,"data",2),je=d([(0,jr.customElement)("roxy-kp-ruling-planets")],je);var ne=require("lit"),ie=require("lit/decorators.js");function ft(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 Z=class extends ne.LitElement{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=ft(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 ne.html`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?ne.html`<span class="spinner" role="status" aria-label="Loading"></span>`:ne.nothing} ${this.isOpen?ne.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?ne.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>ne.html`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?ne.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:ne.nothing}</div>`}};Z.styles=[h,ne.css`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,ie.property)({type:String,attribute:"api-key"})],Z.prototype,"apiKey",2),d([(0,ie.property)({type:String,attribute:"publishable-key"})],Z.prototype,"publishableKey",2),d([(0,ie.property)({type:String})],Z.prototype,"endpoint",2),d([(0,ie.property)({type:String})],Z.prototype,"placeholder",2),d([(0,ie.property)({type:String,attribute:"default-value"})],Z.prototype,"defaultValue",2),d([(0,ie.state)()],Z.prototype,"query",2),d([(0,ie.state)()],Z.prototype,"results",2),d([(0,ie.state)()],Z.prototype,"isOpen",2),d([(0,ie.state)()],Z.prototype,"isLoading",2),d([(0,ie.state)()],Z.prototype,"highlight",2),Z=d([(0,ie.customElement)("roxy-location-search")],Z);var I=require("lit"),fr=require("lit/decorators.js");var Pe=class extends I.LitElement{constructor(){super();this.data=null;this.mode="current";new u(this)}render(){let e=this.data;if(!e)return I.html`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,a="year"in e?e.year:void 0;return I.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${a??""}</h2><div class="list" role="list">${r.map(s=>this.renderListItem(s))}</div></article>`}return"phase"in e?this.renderSingle(e):I.nothing}renderSingle(e){let r=bt(e.phase);return I.html`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?I.html`<div class="date">${e.date}</div>`:I.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?I.html`<div><span>Illumination</span> <strong>${aa(e.illumination)}</strong></div>`:I.nothing} ${typeof e.age=="number"?I.html`<div><span>Age</span> <strong>${b(e.age,1)} days</strong></div>`:I.nothing} ${e.sign?I.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:I.nothing} ${typeof e.distance=="number"?I.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:I.nothing}</div>${e.meaning?.description?I.html`<p class="meaning">${e.meaning.description}</p>`:I.nothing} ${e.meaning?.keywords?.length?I.html`<div class="keywords">${e.meaning.keywords.map(t=>I.html`<span>${t}</span>`)}</div>`:I.nothing}</article>`}renderListItem(e){let r=bt(e.phase);return I.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};Pe.styles=[h,I.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([(0,fr.property)({attribute:!1})],Pe.prototype,"data",2),d([(0,fr.property)({type:String,reflect:!0})],Pe.prototype,"mode",2),Pe=d([(0,fr.customElement)("roxy-moon-phase")],Pe);function bt(o){return o?lt[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function aa(o){let n=o<=1?o*100:o;return`${Math.round(n)}%`}var H=require("lit"),Kr=require("lit/decorators.js");var Ke=class extends H.LitElement{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return H.html`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return H.html`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?H.html`<span class="number">Nakshatra ${e.number} of 27</span>`:H.nothing} ${e.range?H.html`<span class="range">${e.range}</span>`:H.nothing}</header><dl class="facts">${e.lord?H.html`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:H.nothing} ${e.deity?H.html`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:H.nothing} ${e.symbol?H.html`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:H.nothing}</dl>${e.characteristics?H.html`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:H.nothing} ${r?H.html`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?H.html`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:H.nothing} ${r.gemstones?H.html`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:H.nothing} ${r.rituals?H.html`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:H.nothing}</div></div>`:H.nothing}</article>`}};Ke.styles=[h,H.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],d([(0,Kr.property)({attribute:!1})],Ke.prototype,"data",2),Ke=d([(0,Kr.customElement)("roxy-nakshatra-card")],Ke);var g=require("lit"),Je=require("lit/decorators.js");var Br=require("lit");function ye(){return Br.html`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var rr=Br.css`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var rt=420,v=rt/2,tr=164,et=146,br=120,ar=96,sa=178,oa=196,he=class extends g.LitElement{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new u(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return g.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return g.html`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?g.html`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:g.nothing}</header>${Qe({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:a=>{this.view=a},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?g.html`<span>${this.data.houseSystem} houses</span>`:g.nothing} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return g.html`<svg viewBox="0 0 ${rt} ${rt}" 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="${v}" cy="${v}" r="${tr}" stroke-width="1.5"/><circle class="wheel-line" cx="${v}" cy="${v}" r="${et-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${v}" cy="${v}" r="${br}" stroke-width="1"/><circle class="wheel-line" cx="${v}" cy="${v}" r="${ar-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=>k(s.name)),a=new Map;for(let s of r){let i=[k(s.planet1),k(s.planet2)].sort().join("|");a.set(i,s)}return t.length===0?g.html`<p class="roxy-empty" role="status">No planets to grid</p>`:g.html`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(s=>{let i=K[s]??s.slice(0,2);return g.html`<th scope="col" title="${s}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((s,i)=>{let l=K[s]??s.slice(0,2);return g.html`<tr><th scope="row" title="${s}">${l}</th>${t.slice(0,i+1).map(c=>{let m=a.get([s,c].sort().join("|"));if(!m)return g.html`<td class="empty"></td>`;let p=Ze(m),y=Ur[p]??Ur[p.replace(/-/g,"")]??p.slice(0,3),C=cr[p]??"aspect-other",x=b(m.orb,1);return g.html`<td class="${`cell ${C}`}" title="${`${s} ${p} ${c}${x?` (orb ${x}\xB0)`:""}`}"><span class="asp">${y}</span></td>`})} ${t.slice(i+1,-1).map(()=>g.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Xr(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Xr(r),"IC")));let a=this.data?.partOfFortune?.longitude;typeof a=="number"&&t.push(this.renderAngleMark(me(a),"PoF"));let s=this.data?.vertex?.longitude;return typeof s=="number"&&t.push(this.renderAngleMark(me(s),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),a=G(v,v,tr,t),s=G(v,v,sa,t),i=G(v,v,oa,t);return g.svg`
|
|
73
|
+
`}function Oa(o){let n=o.lagnaSign.toLowerCase();return S.svg`
|
|
74
|
+
${Da(o.divisionLabel)}
|
|
75
|
+
${Q.map(e=>Ga(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,jt(e,o.lagnaSign)))}
|
|
76
|
+
`}function Wr(o,n){switch(n){case"north":return Na(o);case"east":return Oa(o);default:return La(o)}}function Jr(o,n){return lr({items:ba,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}var Bt=require("lit"),Xr=Bt.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var Le=class extends ne.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Ur(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return ne.html`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return ne.html`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?ne.html`<span class="division-meta">· ${r.sanskritName}</span>`:ne.nothing}</h2>${r.significance?ne.html`<p class="significance">${r.significance}</p>`:ne.nothing}</div>${Jr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${r.number} ${r.name} divisional chart with twelve sign houses"><title>D${r.number} ${r.name}</title>${Wr(e,this.chartStyle)}</svg> ${t&&t.length>0?ne.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(a=>ne.html`<span class="vargottama-pill" role="listitem">${I[a]??""} ${a}</span>`)}</div>`:ne.nothing}</div>`}};Le.styles=[y,Xr,Ke,ne.css`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],d([(0,Sr.property)({attribute:!1})],Le.prototype,"data",2),d([(0,Sr.property)({type:String,reflect:!0,attribute:"chart-style"})],Le.prototype,"chartStyle",2),Le=d([(0,Sr.customElement)("roxy-divisional-chart")],Le);var W=require("lit"),Cr=require("lit/decorators.js");var Ha={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Te=class extends W.LitElement{constructor(){super();this.data=null;this.type="manglik";new h(this)}render(){let e=this.data;if(!e)return W.html`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=Ha[this.type]??this.type,a=(e.severity??"").toLowerCase(),s=a==="severe"?3:a==="moderate"?2:a==="mild"?1:0,i=s*33,l=s===3?"var(--roxy-danger)":s===2?"var(--roxy-warning)":s===1?"var(--roxy-success)":"transparent";return W.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?W.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${s}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:W.nothing} ${e.description?W.html`<p class="description">${e.description}</p>`:W.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?W.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>W.html`<li>${c}</li>`)}</ul></div>`:W.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?W.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>W.html`<li>${c}</li>`)}</ul></div>`:W.nothing}</article>`}renderEffects(e){if(!e.effects)return W.nothing;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?W.nothing:W.html`<div class="effects">${r.map(([t,a])=>W.html`<div><h3>${t}</h3><p>${a}</p></div>`)}</div>`}};Te.styles=[y,W.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([(0,Cr.property)({attribute:!1})],Te.prototype,"data",2),d([(0,Cr.property)({type:String,reflect:!0})],Te.prototype,"type",2),Te=d([(0,Cr.customElement)("roxy-dosha-card")],Te);var J=require("lit"),pe=require("lit/decorators.js");var xt=new Map;async function Ia(o){let n=xt.get(o);return n||(n=fetch(o).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw xt.delete(o),e}),xt.set(o,n)),n}var ae=class extends J.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(t=>t.required).filter(t=>this.values[t.name]===void 0||this.values[t.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(t=>t.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Ia(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let a=e.components?.schemas??{},s=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,a)}if(i?.properties){let c=new Set(i.required??[]);for(let[m,p]of Object.entries(i.properties)){let u=this.resolve(p,a)??{};s.push({name:m,type:this.fieldType(u),required:c.has(m),description:u.description,enum:u.enum,min:u.minimum,max:u.maximum,default:u.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let m=this.resolve(c.schema,a)??{};s.push({name:c.name,type:this.fieldType(m),required:!!c.required,description:m.description,enum:m.enum,default:m.default})}this.fields=s,this.hasLocation=s.some(c=>c.name==="latitude")&&s.some(c=>c.name==="longitude")&&s.some(c=>c.name==="timezone");let l={};for(let c of s)c.default!==void 0&&(l[c.name]=c.default);this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return J.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return J.html`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return J.nothing;let t=`roxy-form-${r.name}`;return J.html`<div class="field"><label for="${t}">${ye(r.name)}${r.required?J.html`<span class="req" aria-hidden="true">*</span>`:J.nothing}</label> ${r.enum?J.html`<select id="${t}" ?required="${r.required}" @change="${a=>this.setValue(r.name,a.target.value)}"><option value="">Choose</option>${r.enum.map(a=>J.html`<option value="${a}" ?selected="${this.values[r.name]===a}">${a}</option>`)}</select>`:J.html`<input id="${t}" type="${this.htmlType(r.type)}" ?required="${r.required}" min="${r.min??""}" max="${r.max??""}" step="${r.type==="number"?"any":""}" .value="${this.values[r.name]??""}" @input="${a=>this.setValue(r.name,this.coerce(r.type,a.target.value))}">`} ${r.description?J.html`<small class="help">${r.description}</small>`:J.nothing}</div>`};return J.html`<form @submit="${this.onSubmit}"><h2 class="title">${ye(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?J.html`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:J.nothing}<div class="fields">${this.fields.map(r=>e(r))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};ae.styles=[y,J.css`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([(0,pe.property)({type:String,attribute:"data-endpoint"})],ae.prototype,"endpoint",2),d([(0,pe.property)({type:String})],ae.prototype,"method",2),d([(0,pe.property)({type:String,attribute:"spec-url"})],ae.prototype,"specUrl",2),d([(0,pe.property)({type:String,attribute:"submit-label"})],ae.prototype,"submitLabel",2),d([(0,pe.state)()],ae.prototype,"fields",2),d([(0,pe.state)()],ae.prototype,"values",2),d([(0,pe.state)()],ae.prototype,"hasLocation",2),d([(0,pe.state)()],ae.prototype,"loaded",2),d([(0,pe.state)()],ae.prototype,"specError",2),ae=d([(0,pe.customElement)("roxy-endpoint-form")],ae);var K=require("lit"),Qr=require("lit/decorators.js");var ja={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Ba=["western","vedic","biorhythm"],Ye=class extends K.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return K.html`<div class="roxy-empty" role="status">No forecast data</div>`;let r=e.events??[],t=this.groupByDate(r),a=Ba.filter(s=>r.some(i=>i.domain===s));return K.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?K.html`<div class="range">${_e(e.startDate)} - ${_e(e.endDate)} · ${e.count??r.length} events</div>`:K.nothing}</header>${a.length?K.html`<div class="legend">${a.map(s=>K.html`<span><span class="swatch swatch-${s}"></span>${ja[s]}</span>`)}</div>`:K.nothing} ${t.length?K.html`<div class="days" role="list">${t.map(([s,i])=>this.renderDay(s,i))}</div>`:K.html`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(e){let r=new Map;for(let t of e){let a=t.date??"",s=r.get(a)??[];s.push(t),r.set(a,s)}return[...r.entries()]}renderDay(e,r){return K.html`<div class="day" role="listitem"><div class="day-date">${_e(e)}</div><div class="events">${r.map(t=>this.renderEvent(t))}</div></div>`}renderEvent(e){let r=typeof e.significance=="number"?e.significance:0,t=Math.max(0,Math.min(100,r));return K.html`<div class="event"><span class="dot dot-${e.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(e)}</div>${e.description?K.html`<p class="event-desc">${e.description}</p>`:K.nothing}<div class="sig" title="Significance ${t} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${e.domain}" style="width:${t}%"></span> </span><span class="sig-val">${t}</span></div></div></div>`}renderHeadline(e){let r=e.body?b(e.body):"",t=e.target?b(e.target):"",a=e.aspect?e.aspect.toLowerCase():"",s=tr[a]??"",i=a?fr[a]??a:"",l=typeof e.orb=="number"?v(e.orb,1):"",c=this.typeQualifier(e);return a&&t?K.html`<strong>${r}</strong> <span class="${s}">${i}</span> <strong>${t}</strong>${l?K.html`<span class="kind">orb ${l}°</span>`:K.nothing}`:K.html`<strong>${r||ye(e.type??"")}</strong>${c?K.html`<span class="kind">${c}</span>`:K.nothing}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${b(e.target)}`:e.type==="retrograde-station"&&e.station?e.station:e.type==="eclipse"?[e.kind,"eclipse"].filter(Boolean).join(" "):e.type==="critical-day"?"critical day":e.type==="dasha-change"&&e.target?`dasha ${b(e.target)}`:ye(e.type??"")}};Ye.styles=[y,K.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],d([(0,Qr.property)({attribute:!1})],Ye.prototype,"data",2),Ye=d([(0,Qr.customElement)("roxy-forecast-timeline")],Ye);var X=require("lit"),Zr=require("lit/decorators.js");var qe=class extends X.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return X.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(p=>p?.category!==void 0),t=e.total??0,a=e.maxScore??36,s=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",l=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,m=(100-s)*2.827;return X.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${v(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?X.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Gt(e.percentage,1)}</small>`:X.nothing}</div>${e.recommendation?X.html`<span class="recommendation">${e.recommendation}</span>`:X.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${l}" stroke-width="8" stroke-dasharray="${c},${m}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${r.length>0?X.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(p=>{let u=p.score??0,P=p.maxScore??_a(p.category),x=P?u/P*100:0;return X.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${x}%"></span></div></td><td class="score">${v(u,1)} / ${P}</td></tr>`})}</tbody></table>`:X.nothing} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?X.html`<div class="tags">${e.doshas?.map(p=>X.html`<span class="dosha">${p}</span>`)} ${e.doshaCancellations?.map(p=>X.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:X.nothing}</article>`}};qe.styles=[y,X.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],d([(0,Zr.property)({attribute:!1})],qe.prototype,"data",2),qe=d([(0,Zr.customElement)("roxy-guna-milan")],qe);function _a(o){if(!o)return 1;switch(o.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var T=require("lit"),Pr=require("lit/decorators.js");var Re=class extends T.LitElement{constructor(){super();this.data=null;this.mode="lookup";new h(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return T.html`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:a,dailyMessage:s,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(a??[]);return T.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?T.html`<div class="symbol">${r.symbol}</div>`:T.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((m,p)=>{let u=l.length-1-p+1,P=c.has(u),x=m===6||m===8;return T.html`<div class="line ${`${x?"broken":"solid"}${P?" changing":""}`}">${x?T.svg`<span class="seg"></span><span class="seg"></span>`:T.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?T.html`${r.number}.`:T.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?T.html`${r.chinese}`:T.nothing} ${r.pinyin?T.html`· ${r.pinyin}`:T.nothing}</p><div class="trigrams">${r.upperTrigram?T.html`<div>Upper <span class="tri-glyph">${dt[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:T.nothing} ${r.lowerTrigram?T.html`<div>Lower <span class="tri-glyph">${dt[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:T.nothing}</div>${r.judgment?T.html`<p class="judgment">${r.judgment}</p>`:T.nothing} ${r.image?T.html`<p class="image">${r.image}</p>`:T.nothing} ${s?T.html`<p class="message">${s}</p>`:T.nothing} ${r.interpretation?.general?T.html`<p>${r.interpretation.general}</p>`:T.nothing} ${c.size>0?T.html`<div class="changing">Changing lines: ${Array.from(c).sort((m,p)=>m-p).join(", ")}. ${i?.english?T.html`Becomes hexagram ${i.number} ${i.english}.`:T.nothing}</div>`:T.nothing}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,a=[];for(let s=0;s<6;s++){let i=t>>s&1;a.push(i?8:7)}return a}return Array.from({length:6},()=>7)}};Re.styles=[y,T.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,Pr.property)({attribute:!1})],Re.prototype,"data",2),d([(0,Pr.property)({type:String,reflect:!0})],Re.prototype,"mode",2),Re=d([(0,Pr.customElement)("roxy-hexagram")],Re);var C=require("lit"),Lr=require("lit/decorators.js");var Ae=class extends C.LitElement{constructor(){super();this.data=null;this.period="daily";new h(this)}render(){let e=this.data;if(!e)return C.html`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?oe[b(r)]??"":"",a="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,s="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return C.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${s?C.html`<div class="date">${s}</div>`:C.nothing}</div>${a!==null?C.html`<span class="energy" aria-label="${`Energy ${a} of 10`}">Energy ${a}/10 <span class="energy-bar"><span style="width:${a/10*100}%"></span></span></span>`:C.nothing}</header>${e.overview?C.html`<p class="overview">${e.overview}</p>`:C.nothing}<div class="sections">${e.love?C.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:C.nothing} ${e.career?C.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:C.nothing} ${e.health?C.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:C.nothing} ${e.finance?C.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:C.nothing} ${"advice"in e&&e.advice?C.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:C.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],m="luckyDays"in e&&e.luckyDays?e.luckyDays:[],p=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&m.length===0&&p.length===0?C.nothing:C.html`<div class="lucky">${i!==void 0?C.html`<span>Lucky number <strong>${i}</strong></span>`:C.nothing} ${l?C.html`<span>Lucky color <strong>${l}</strong></span>`:C.nothing} ${c.length?C.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:C.nothing} ${m.length?C.html`<span>Lucky days <strong>${m.join(", ")}</strong></span>`:C.nothing} ${p.length?C.html`<span class="compat-wrap">Best with <span class="compat">${p.map(u=>C.html`<span>${u}</span>`)}</span></span>`:C.nothing}</div>`})()}</article>`}};Ae.styles=[y,C.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([(0,Lr.property)({attribute:!1})],Ae.prototype,"data",2),d([(0,Lr.property)({type:String,reflect:!0})],Ae.prototype,"period",2),Ae=d([(0,Lr.customElement)("roxy-horoscope-card")],Ae);var D=require("lit"),dr=require("lit/decorators.js");var Ee=class extends D.LitElement{constructor(){super();this.data=null;this.activeTab="planets";new h(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.planet,sign:a.sign,house:a.house,nakshatra:a.nakshatra,starLord:a.starLord,subLord:a.subLord,subSubLord:a.subSubLord,kpNumber:a.kpNumber,retrograde:a.retrograde})),t=e.nodes;for(let[a,s]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])s&&r.push({name:a,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}render(){if(!this.data)return D.html`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return D.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?D.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?D.html`· ${r.nakshatra}`:D.nothing} ${r.subLord?D.html`· sub lord ${r.subLord}`:D.nothing} ${typeof r.kpNumber=="number"?D.html`· KP ${r.kpNumber}`:D.nothing}</div>`:D.nothing} ${typeof e.meta?.ayanamsa=="number"?D.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${v(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?D.html`· ${e.meta.houseSystem} houses`:D.nothing}</div>`:D.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>D.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?D.html`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>D.html`<tr><td class="body">${r.name}${r.retrograde?D.html`<span class="retro">R</span>`:D.nothing}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:D.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?D.html`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>D.html`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:D.html`<p class="roxy-empty" role="status">No cusps</p>`}};Ee.styles=[y,D.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([(0,dr.property)({attribute:!1})],Ee.prototype,"data",2),d([(0,dr.state)()],Ee.prototype,"activeTab",2),Ee=d([(0,dr.customElement)("roxy-kp-chart")],Ee);var me=require("lit"),et=require("lit/decorators.js");var Ve=class extends me.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return me.html`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return me.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?me.html`<span class="ayanamsa">Ayanamsa: ${v(this.data.ayanamsa,2)}°</span>`:me.nothing}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>me.html`<tr><td class="planet">${r.planet} ${r.retrograde?me.html`<span class="retro">R</span>`:me.nothing}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Ve.styles=[y,me.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],d([(0,et.property)({attribute:!1})],Ve.prototype,"data",2),Ve=d([(0,et.customElement)("roxy-kp-planets-table")],Ve);var se=require("lit"),rt=require("lit/decorators.js");var Fe=class extends se.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return se.html`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return se.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?se.html`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:se.nothing}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?se.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,a)=>se.html`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:se.nothing} ${r.length?se.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>se.html`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:se.nothing}</div>`}};Fe.styles=[y,se.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],d([(0,rt.property)({attribute:!1})],Fe.prototype,"data",2),Fe=d([(0,rt.customElement)("roxy-kp-ruling-planets")],Fe);var le=require("lit"),de=require("lit/decorators.js");function _t(o,n){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,o(...t)},n)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ee=class extends le.LitElement{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=_t(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let a={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let s=this.publishableKey??this.apiKey;s&&(a["X-API-Key"]=s);let i=await fetch(t,{headers:a,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return le.html`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?le.html`<span class="spinner" role="status" aria-label="Loading"></span>`:le.nothing} ${this.isOpen?le.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?le.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>le.html`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?le.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:le.nothing}</div>`}};ee.styles=[y,le.css`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,de.property)({type:String,attribute:"api-key"})],ee.prototype,"apiKey",2),d([(0,de.property)({type:String,attribute:"publishable-key"})],ee.prototype,"publishableKey",2),d([(0,de.property)({type:String})],ee.prototype,"endpoint",2),d([(0,de.property)({type:String})],ee.prototype,"placeholder",2),d([(0,de.property)({type:String,attribute:"default-value"})],ee.prototype,"defaultValue",2),d([(0,de.state)()],ee.prototype,"query",2),d([(0,de.state)()],ee.prototype,"results",2),d([(0,de.state)()],ee.prototype,"isOpen",2),d([(0,de.state)()],ee.prototype,"isLoading",2),d([(0,de.state)()],ee.prototype,"highlight",2),ee=d([(0,de.customElement)("roxy-location-search")],ee);var j=require("lit"),Tr=require("lit/decorators.js");var Ne=class extends j.LitElement{constructor(){super();this.data=null;this.mode="current";new h(this)}render(){let e=this.data;if(!e)return j.html`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,a="year"in e?e.year:void 0;return j.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${a??""}</h2><div class="list" role="list">${r.map(s=>this.renderListItem(s))}</div></article>`}return"phase"in e?this.renderSingle(e):j.nothing}renderSingle(e){let r=Kt(e.phase);return j.html`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?j.html`<div class="date">${e.date}</div>`:j.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?j.html`<div><span>Illumination</span> <strong>${Ka(e.illumination)}</strong></div>`:j.nothing} ${typeof e.age=="number"?j.html`<div><span>Age</span> <strong>${v(e.age,1)} days</strong></div>`:j.nothing} ${e.sign?j.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:j.nothing} ${typeof e.distance=="number"?j.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:j.nothing}</div>${e.meaning?.description?j.html`<p class="meaning">${e.meaning.description}</p>`:j.nothing} ${e.meaning?.keywords?.length?j.html`<div class="keywords">${e.meaning.keywords.map(t=>j.html`<span>${t}</span>`)}</div>`:j.nothing}</article>`}renderListItem(e){let r=Kt(e.phase);return j.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};Ne.styles=[y,j.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([(0,Tr.property)({attribute:!1})],Ne.prototype,"data",2),d([(0,Tr.property)({type:String,reflect:!0})],Ne.prototype,"mode",2),Ne=d([(0,Tr.customElement)("roxy-moon-phase")],Ne);function Kt(o){return o?Pt[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Ka(o){let n=o<=1?o*100:o;return`${Math.round(n)}%`}var H=require("lit"),tt=require("lit/decorators.js");var Ue=class extends H.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return H.html`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return H.html`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?H.html`<span class="number">Nakshatra ${e.number} of 27</span>`:H.nothing} ${e.range?H.html`<span class="range">${e.range}</span>`:H.nothing}</header><dl class="facts">${e.lord?H.html`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:H.nothing} ${e.deity?H.html`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:H.nothing} ${e.symbol?H.html`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:H.nothing}</dl>${e.characteristics?H.html`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:H.nothing} ${r?H.html`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?H.html`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:H.nothing} ${r.gemstones?H.html`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:H.nothing} ${r.rituals?H.html`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:H.nothing}</div></div>`:H.nothing}</article>`}};Ue.styles=[y,H.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],d([(0,tt.property)({attribute:!1})],Ue.prototype,"data",2),Ue=d([(0,tt.customElement)("roxy-nakshatra-card")],Ue);var g=require("lit"),or=require("lit/decorators.js");var at=require("lit");function be(){return at.html`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var cr=at.css`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var bt=420,$=bt/2,pr=164,ft=146,Rr=120,mr=96,Ya=178,qa=196,ve=class extends g.LitElement{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new h(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return g.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return g.html`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?g.html`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:g.nothing}</header>${lr({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:a=>{this.view=a},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?g.html`<span>${this.data.houseSystem} houses</span>`:g.nothing} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return g.html`<svg viewBox="0 0 ${bt} ${bt}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${$}" cy="${$}" r="${pr}" stroke-width="1.5"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${ft-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${Rr}" stroke-width="1"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${mr-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(s=>b(s.name)),a=new Map;for(let s of r){let i=[b(s.planet1),b(s.planet2)].sort().join("|");a.set(i,s)}return t.length===0?g.html`<p class="roxy-empty" role="status">No planets to grid</p>`:g.html`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(s=>{let i=I[s]??s.slice(0,2);return g.html`<th scope="col" title="${s}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((s,i)=>{let l=I[s]??s.slice(0,2);return g.html`<tr><th scope="row" title="${s}">${l}</th>${t.slice(0,i+1).map(c=>{let m=a.get([s,c].sort().join("|"));if(!m)return g.html`<td class="empty"></td>`;let p=ir(m),u=fr[p]??fr[p.replace(/-/g,"")]??p.slice(0,3),P=tr[p]??"aspect-other",x=v(m.orb,1);return g.html`<td class="${`cell ${P}`}" title="${`${s} ${p} ${c}${x?` (orb ${x}\xB0)`:""}`}"><span class="asp">${u}</span></td>`})} ${t.slice(i+1,-1).map(()=>g.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(ut(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(ut(r),"IC")));let a=this.data?.partOfFortune?.longitude;typeof a=="number"&&t.push(this.renderAngleMark(xe(a),"PoF"));let s=this.data?.vertex?.longitude;return typeof s=="number"&&t.push(this.renderAngleMark(xe(s),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),a=G($,$,pr,t),s=G($,$,Ya,t),i=G($,$,qa,t);return g.svg`
|
|
68
77
|
<g>
|
|
69
78
|
<line class="angle-tick" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />
|
|
70
79
|
<text class="angle-marker" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r}</text>
|
|
71
80
|
</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=G(
|
|
73
|
-
${
|
|
74
|
-
<text class="planet-glyph" x=${p.x} y=${p.y} text-anchor="middle" dominant-baseline="central"><title>${s.name}${
|
|
75
|
-
<text class="planet-deg" x=${
|
|
76
|
-
</g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return g.nothing;let t=e?.retrogradePlanets??[];return g.html`<div class="details">${e?.dominantElement||e?.dominantModality?g.html`<div class="pill-row">${e.dominantElement?g.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:g.nothing} ${e.dominantModality?g.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:g.nothing}</div>`:g.nothing} ${r?g.html`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:g.nothing} ${t.length>0?g.html`<div class="pill-row">${t.map(a=>{let s=K[a]??a.slice(0,2);return g.html`<span class="pill pill--muted">${s} ${a} R</span>`})}</div>`:g.nothing} ${r?.summary?g.html`<p class="summary">${r.summary}</p>`:g.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return g.nothing;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],a=J,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=a.indexOf(k(i.sign??""));if(l<0)continue;let c=r[l%4],m=t[l%3],p=K[k(i.name)]??k(i.name).slice(0,2);s[c]?.[m]?.push(p)}return g.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>g.html`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,m)=>c+(s[i]?.[m]?.length??0),0);return g.html`<tr><th scope="row">${i}</th>${t.map(c=>g.html`<td>${(s[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>g.html`<td class="em-total">${r.reduce((l,c)=>l+(s[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?g.nothing:g.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let a=r.interpretation,s=K[k(r.name)]??"",i=b(r.degree??0,1);return g.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${s} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${ye()}</span></summary><div class="interp-body">${a.summary?g.html`<p class="interp-summary">${a.summary}</p>`:g.nothing} ${a.detailed?g.html`<p class="interp-detail">${a.detailed}</p>`:g.nothing} ${a.keywords?.length?g.html`<div class="interp-keywords">${a.keywords.map(l=>g.html`<span class="kw">${l}</span>`)}</div>`:g.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let a of e){if(typeof a.longitude!="number")continue;let s=k(a.name);s&&t.set(s,a.longitude)}return r.map(a=>{let s=t.get(k(a.planet1)),i=t.get(k(a.planet2));if(s===void 0||i===void 0)return g.nothing;let l=G(v,v,ar-18,this.toAngle(s)),c=G(v,v,ar-18,this.toAngle(i)),m=Ze(a),p=cr[m]??"aspect-other",y=b(a.orb,1);return g.svg`<line class=${`aspect ${p}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${a.planet1} ${m||""} ${a.planet2}${y?` (orb ${y}\xB0)`:""}</title></line>`})}};he.styles=[h,Oe,rr,g.css`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([(0,Je.property)({attribute:!1})],he.prototype,"data",2),d([(0,Je.property)({type:String,attribute:"house-system",reflect:!0})],he.prototype,"houseSystem",2),d([(0,Je.state)()],he.prototype,"view",2),he=d([(0,Je.customElement)("roxy-natal-chart")],he);var R=require("lit"),vr=require("lit/decorators.js");var Te=class extends R.LitElement{constructor(){super();this.data=null;this.type="life-path";new u(this)}render(){let e=this.data;if(!e)return R.html`<div class="roxy-empty" role="status">No numerology data</div>`;let r=na[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?R.html`<div class="numeral">${e.number}</div>`:R.nothing}<div><p class="label">${r}</p>${e.meaning?.title?R.html`<h2 class="title">${e.meaning.title}</h2>`:R.nothing}</div></div>${e.meaning?.description?R.html`<p class="meaning">${e.meaning.description}</p>`:R.nothing} ${e.calculation?R.html`<pre class="calc">${e.calculation}</pre>`:R.nothing} ${t.length>0?R.html`<div class="chips">${t.map(a=>R.html`<span>${a}</span>`)}</div>`:R.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?R.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${ia(e.karmicDebtMeaning)}</div>`:R.nothing}</article>`}renderPersonalYear(e,r){return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?R.html`<div class="numeral">${e.personalYear}</div>`:R.nothing}<div><p class="label">${r}</p>${e.theme?R.html`<h2 class="title">${e.theme}</h2>`:R.nothing}</div></div>${e.forecast?R.html`<p class="meaning">${e.forecast}</p>`:R.nothing} ${e.advice?R.html`<p>${e.advice}</p>`:R.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,a])=>a!=null);return R.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?R.html`<h2 class="title">${e.profile.name}</h2>`:R.nothing}</div>${t.length>0?R.html`<div class="cores">${t.map(([a,s])=>R.html`<div class="item"><span>${De(a)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:R.nothing}</article>`}};Te.styles=[h,R.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([(0,vr.property)({attribute:!1})],Te.prototype,"data",2),d([(0,vr.property)({type:String,reflect:!0})],Te.prototype,"type",2),Te=d([(0,vr.customElement)("roxy-numerology-card")],Te);var na={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function ia(o){return o?[o.description,o.challenge,o.resolution].filter(Boolean).join(" "):""}var j=require("lit"),$r=require("lit/decorators.js");var Re=class extends j.LitElement{constructor(){super();this.data=null;this.detail="detailed";new u(this)}render(){let e=this.data;if(!e)return j.html`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let a=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(p=>!!p[1]):[],s=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],m=r&&"transitions"in r?r.transitions:void 0;return j.html`<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,y])=>j.html`<tr><th>${p}</th><td>${y}</td></tr>`)} ${r?.sunrise?j.html`<tr><th>Sunrise</th><td>${pe(r.sunrise)}</td></tr>`:j.nothing} ${r?.sunset?j.html`<tr><th>Sunset</th><td>${pe(r.sunset)}</td></tr>`:j.nothing} ${r?.moonrise?j.html`<tr><th>Moonrise</th><td>${pe(r.moonrise)}</td></tr>`:j.nothing} ${r?.moonset?j.html`<tr><th>Moonset</th><td>${pe(r.moonset)}</td></tr>`:j.nothing} ${a.map(([p,y])=>j.html`<tr><th>${p}</th><td>${y}</td></tr>`)}</tbody></table>${m?j.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",m.tithi)} ${this.renderTransitionRow("Nakshatra",m.nakshatra)} ${this.renderTransitionRow("Yoga",m.yoga)} ${this.renderTransitionRow("Karana",m.karana)}</tbody></table>`:j.nothing} ${this.detail==="detailed"&&(s.some(p=>!!p[1])||i.length>0||l.some(p=>!!p[1])||c.length>0)?j.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...s.filter(p=>!!p[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(p=>!!p[1]),...c])}</tbody></table>`:j.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let a=Jr(t);return a?j.html`<tr><th>${r}</th><td>${a}</td></tr>`:j.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,a)=>[r.length>1?`${e} ${a+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return j.nothing;let t=pe(r.endsAt),a=r.next?` \u2192 ${r.next}`:"";return j.html`<tr><th>${e}</th><td>ends ${t}${a}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=Jr(e);return r?`${e.current} (${r})`:e.current}};Re.styles=[h,j.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([(0,$r.property)({attribute:!1})],Re.prototype,"data",2),d([(0,$r.property)({type:String,reflect:!0})],Re.prototype,"detail",2),Re=d([(0,$r.customElement)("roxy-panchang-table")],Re);var oe=require("lit"),_r=require("lit/decorators.js");var tt=[{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)"}],Be=class extends oe.LitElement{constructor(){super();this.data=null;new u(this)}render(){if(!this.data?.planets?.length)return oe.html`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return oe.html`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${tt.map(r=>oe.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=K[k(e.planet)]??"",t=tt.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=b(e.totalRupas,2)&&b(e.minRequired,2)?`${b(e.totalRupas,2)} / ${b(e.minRequired,2)} R`:"";return oe.html`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${r}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${a>0?tt.map((m,p)=>{let y=t[p];if(y<=0)return oe.nothing;let C=y/a*100;return oe.html`<div class="bar-segment" style="flex-grow:${C};background:${m.color}" title="${m.label}: ${b(y,1)}"></div>`}):oe.nothing}</div></div><div class="pills">${c?oe.html`<span class="rupas-label">${c}</span>`:oe.nothing} <span class="${`adequacy-badge ${i}`}">${l}</span></div></div>`}};Be.styles=[h,oe.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],d([(0,_r.property)({attribute:!1})],Be.prototype,"data",2),Be=d([(0,_r.customElement)("roxy-shadbala-table")],Be);var f=require("lit"),Yr=require("lit/decorators.js");var ot=360,_=ot/2,at=170,la=154,st=124,sr=96,_e=class extends f.LitElement{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return f.html`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:a}=this.data,s=this.data.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,m=a?.overall,p=a?.strengths??[],y=a?.challenges??[];return i.length>0&&l.length>0?f.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?f.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:f.nothing}</div><svg viewBox="0 0 ${ot} ${ot}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${_}" cy="${_}" r="${at}" stroke-width="1.5"/><circle class="wheel-line" cx="${_}" cy="${_}" r="${sr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${_}" cy="${_}" r="${sr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,s)} ${this.renderRing(i,st,"p1",1)} ${this.renderRing(l,sr,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${m?f.html`<p class="summary">${m}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${p.length>0||y.length>0?f.html`<div class="lists">${p.length?f.html`<div><h3>Strengths</h3><ul>${p.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${y.length?f.html`<div><h3>Challenges</h3><ul>${y.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing}</div>`:f.nothing}</div>`:f.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?f.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:f.nothing}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code><roxy-data></code> fallback.</div>${m?f.html`<p class="summary">${m}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${p.length>0||y.length>0?f.html`<div class="lists">${p.length?f.html`<div><h3>Strengths</h3><ul>${p.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${y.length?f.html`<div><h3>Challenges</h3><ul>${y.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing}</div>`:f.nothing}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),a=G(_,_,sr-14,t),s=G(_,_,at,t);return f.svg`<line class="wheel-line" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return J.map((e,r)=>{let t=this.toAngle(r*30+15),a=G(_,_,la,t);return f.svg`<text class="sign" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${ae[e]}</text>`})}renderRing(e,r,t,a){return e.map(s=>{if(!Number.isFinite(s.longitude))return f.nothing;let i=this.toAngle(s.longitude),l=G(_,_,r,i),m=G(_,_,r+(a===1?-12:-10),i),p=K[k(s.name)]??s.name.slice(0,2),y=ge(s.longitude),C=s.isRetrograde===!0,x=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,Ve=`${s.name}${C?" retrograde":""} - ${x} ${y.sign}`;return f.svg`<g>
|
|
77
|
-
<text class=${t} x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central"><title>${
|
|
78
|
-
<text class="planet-deg" x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${
|
|
79
|
-
</g>`})}renderAscendants(e){let r=[],t=(a,s)=>{if(!a)return;let i=
|
|
80
|
-
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${
|
|
81
|
-
<text class="asc-label" x=${
|
|
82
|
-
</g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=k(i);for(let c of s)if(k(c.name)===l&&typeof c.longitude=="number")return c.longitude};return t.map(s=>{let i=a(e,s.planet1),l=a(r,s.planet2);if(i===void 0||l===void 0)return f.nothing;let c=G(_,_,st-12,this.toAngle(i)),m=G(_,_,sr+8,this.toAngle(l)),p=Ze(s),y=cr[p]??"aspect-other",C=b(s.orb,1);return f.svg`<line class=${`aspect ${y}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${s.planet1} ${p} ${s.planet2}${C?` (orb ${C}\xB0)`:""}</title></line>`})}renderAspects(e){return f.html`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(r=>f.html`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${Ze(r)||""}</td><td class="orb">${b(r.orb,1)}</td><td>${da(r.strength)}</td></tr>`)}</tbody></table>`}};_e.styles=[h,f.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],d([(0,Yr.property)({attribute:!1})],_e.prototype,"data",2),_e=d([(0,Yr.customElement)("roxy-synastry-chart")],_e);function da(o){return typeof o=="number"?Math.round(o).toString():""}var z=require("lit"),or=require("lit/decorators.js");var Ae=class extends z.LitElement{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new u(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):z.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,a=r.keywords??[];return z.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?z.html`<img class="${`image ${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())}}">`:z.html`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?z.html`${r.arcana} arcana`:z.nothing} ${t?z.html`· reversed`:z.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?z.html`<p class="message">${e.dailyMessage}</p>`:z.nothing} ${r.meaning?z.html`<p>${r.meaning}</p>`:z.nothing} ${a.length>0?z.html`<div class="chips">${a.map(s=>z.html`<span>${s}</span>`)}</div>`:z.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,a=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return z.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?z.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:z.html`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?z.html`${e.arcana} arcana`:z.nothing} ${e.number!==void 0&&e.number!==null?z.html`· ${e.number}`:z.nothing} ${r?z.html`· reversed`:z.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?z.html`<p>${t.description}</p>`:z.nothing} ${a.length>0?z.html`<div class="chips">${a.map(s=>z.html`<span>${s}</span>`)}</div>`:z.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};Ae.styles=[h,z.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([(0,or.property)({attribute:!1})],Ae.prototype,"data",2),d([(0,or.state)()],Ae.prototype,"flipped",2),Ae=d([(0,or.customElement)("roxy-tarot-card")],Ae);var A=require("lit"),wr=require("lit/decorators.js");var ze=class extends A.LitElement{constructor(){super();this.data=null;this.spread="three-card";new u(this)}render(){let e=this.data;if(!e)return A.html`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),a=t?[]:"positions"in e?e.positions??[]:[],s=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,p="summary"in e?e.summary:void 0,y=r?e.interpretation:void 0,C=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return A.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${m?A.html`<span class="question">"${m}"</span>`:A.nothing}</header>${r?A.html`<div><span class="${`answer ${C}`}">${i}</span> ${l?A.html`<small>· ${l}</small>`:A.nothing}</div>`:A.nothing} ${a.length>0?A.html`<div class="grid">${a.map(x=>A.html`<div class="card"><p class="label">${x.name??""}</p><div class="image">${x.card?.imageUrl?A.html`<img src="${x.card.imageUrl}" alt="${x.card.name??"tarot card"}" class="${x.card.reversed?"reversed":""}">`:A.html`${x.card?.name??"?"}`}</div><p class="name">${x.card?.name??""} ${x.card?.reversed?A.html`<small>(reversed)</small>`:A.nothing}</p>${x.interpretation?A.html`<p class="interp">${x.interpretation}</p>`:A.nothing}</div>`)}</div>`:A.nothing} ${s.length>0?A.html`<div class="grid">${s.map(x=>A.html`<div class="card"><div class="image">${x.imageUrl?A.html`<img src="${x.imageUrl}" alt="${x.name??"tarot card"}" class="${x.reversed?"reversed":""}">`:A.html`${x.name??"?"}`}</div><p class="name">${x.name??""} ${x.reversed?A.html`<small>(reversed)</small>`:A.nothing}</p>${x.meaning?A.html`<p class="interp">${x.meaning}</p>`:A.nothing}</div>`)}</div>`:A.nothing} ${p?A.html`<p class="reading">${p}</p>`:A.nothing} ${y?A.html`<p class="reading">${y}</p>`:A.nothing}</article>`}};ze.styles=[h,A.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([(0,wr.property)({attribute:!1})],ze.prototype,"data",2),d([(0,wr.property)({type:String,reflect:!0})],ze.prototype,"spread",2),ze=d([(0,wr.customElement)("roxy-tarot-spread")],ze);var M=require("lit"),nr=require("lit/decorators.js");var Ne=class extends M.LitElement{constructor(){super();this.data=null;this.tab="positions";new u(this)}render(){if(!this.data?.transitPlanets?.length)return M.html`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:a,summary:s}=this.data,i=[zr(e),pe(r)].filter(Boolean).join(" "),l=a?.length??0,c=this.tab;return M.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${i?M.html`<p class="subtitle">${i}</p>`:M.nothing}</div>${l>0?M.html`${Qe({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"?M.html`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:M.html`${s?this.renderSummaryPills(s):M.nothing}<div class="overflow-scroll">${this.renderAspectsList(a??[])}</div>`}</div>`:M.html`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return M.html`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return M.html`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=K[k(r.name)]??"",a=ae[k(r.sign)]??"",s=r.speed>=0?"\u2191":"\u2193";return M.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?M.html`<span class="retro-badge" aria-label="retrograde">R</span>`:M.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${r.sign}</div></td><td class="num">${b(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${b(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return M.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let a=K[k(r.transitPlanet)]??"",s=K[k(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),m=r.isApplying?"Applying":"Separating";return M.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${a}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${m} · orb ${b(r.orb,2)}° · strength ${b(r.strength,1)} </span>${ye()}</summary><div class="interp-body">${l?.summary?M.html`<p>${l.summary}</p>`:M.nothing} ${l?.impact?M.html`<p><strong>Impact:</strong> ${l.impact}</p>`:M.nothing} ${l?.timing?M.html`<p><strong>Timing:</strong> ${l.timing}</p>`:M.nothing} ${l?.guidance?M.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:M.nothing} ${l?.keywords?.length?M.html`<div class="interp-keywords">${l.keywords.map(p=>M.html`<span class="kw">${p}</span>`)}</div>`:M.nothing}</div></details>`})}</div>`}};Ne.styles=[h,Oe,rr,M.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([(0,nr.property)({attribute:!1})],Ne.prototype,"data",2),d([(0,nr.state)()],Ne.prototype,"tab",2),Ne=d([(0,nr.customElement)("roxy-transits-table")],Ne);var kr=require("lit"),Sr=require("lit/decorators.js");var Me=class extends kr.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new u(this)}viewModel(){return this.data?.meta?Er(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?kr.html`<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>`:kr.html`<div class="roxy-empty" role="status">No kundli data</div>`}};Me.styles=[h,Or,Oe],d([(0,Sr.property)({attribute:!1})],Me.prototype,"data",2),d([(0,Sr.property)({type:String,reflect:!0,attribute:"chart-style"})],Me.prototype,"chartStyle",2),Me=d([(0,Sr.customElement)("roxy-vedic-kundli")],Me);var w=require("lit"),qr=require("lit/decorators.js");var ca=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Ye=class extends w.LitElement{constructor(){super();this.data=null;new u(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let a of ca){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 w.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return w.html`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let a=(t.graha??r)==="Lagna",s=K[k(t.graha??r)]??"",i=ae[k(t.rashi??"")]??"";return w.html`<tr class="${a?"lagna":""}"><td class="graha">${s?w.html`<span class="glyph">${s}</span>`:w.nothing}${t.graha??r}</td><td>${i?w.html`<span class="glyph">${i}</span>`:w.nothing}${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?w.html`<span class="retro">R</span>`:w.nothing}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?w.nothing:w.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${ye()}</summary><div class="panel-body">${e.map(r=>{let t=K[k(r.planet)]??"",a=b(r.distanceFromSun,2),s=b(r.orb,1);return w.html`<div class="condition"><span class="planet">${t?`${t} `:""}${r.planet}</span> <span class="detail">${a} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?w.nothing:w.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${ye()}</summary><div class="panel-body">${e.map(r=>{let t=b(r.distance,2);return w.html`<div class="condition"><span class="planet">${r.planet1} vs ${r.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${r.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},r=this.orderedRows().map(([t,a])=>[a.graha??t,e[a.graha??t]]).filter(([,t])=>t!=null);return r.length===0?w.nothing:w.html`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${ye()}</summary><div class="panel-body">${r.map(([t,a])=>{let s=K[k(t)]??"";return w.html`<div class="interp"><span class="planet">${s?`${s} `:""}${t}</span> ${a.rashi?w.html`<p><span class="label">Rashi.</span> ${a.rashi}</p>`:w.nothing} ${a.nakshatra?w.html`<p><span class="label">Nakshatra.</span> ${a.nakshatra}</p>`:w.nothing}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?w.nothing:w.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${ye()}</summary><div class="panel-body">${e.map(r=>w.html`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?w.html`<p class="desc">${r.description}</p>`:w.nothing}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?w.nothing:w.html`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${ye()}</summary><div class="panel-body">${e.map(r=>w.html`<div class="bhava"><span class="name">${r.name} ${r.quality?w.html`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:w.nothing}</span> ${r.result?w.html`<p class="desc">${r.result}</p>`:w.nothing}</div>`)}</div></details>`}};Ye.styles=[h,rr,w.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],d([(0,qr.property)({attribute:!1})],Ye.prototype,"data",2),Ye=d([(0,qr.customElement)("roxy-vedic-planets-table")],Ye);var Q=require("lit"),Vr=require("lit/decorators.js");var qe=class extends Q.LitElement{constructor(){super();this.data=null;new u(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 Q.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return Q.html`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=K[k(r.name)]??"",a=ae[k(r.sign??"")]??"",s=typeof r.speed=="number"?b(r.speed,3):"";return Q.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?Q.html`<span class="glyph">${t}</span>`:Q.nothing}${r.name}</td><td>${a?Q.html`<span class="glyph">${a}</span>`:Q.nothing}${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?Q.html`${s}°/day`:Q.nothing} ${r.isRetrograde?Q.html`<span class="retro">℞</span>`:Q.nothing}</td></tr>`})}</tbody></table></div>`}};qe.styles=[h,Q.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],d([(0,Vr.property)({attribute:!1})],qe.prototype,"data",2),qe=d([(0,Vr.customElement)("roxy-western-planets-table")],qe);var B=require("lit"),ir=require("lit/decorators.js");var Ee=class extends B.LitElement{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new u(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return B.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return B.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):B.nothing}</p>${e.description?B.html`<p class="description">${e.description}</p>`:B.nothing} ${e.result?B.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:B.nothing}</div>`}render(){if(!this.data)return B.html`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return B.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,m=r?c.filter(y=>y.name.toLowerCase().includes(r)):c,p=e.total;return B.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${p!==void 0?B.html`<span class="count">${p} total</span>`:B.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${m.length>0?m.map(y=>this.renderDetailCard(y)):B.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let s=t,i=r?s.filter(c=>c.name.toLowerCase().includes(r)):s,l=e.total;return B.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?B.html`<span class="count">${l} total</span>`:B.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>B.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):B.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return B.html`<div class="roxy-empty" role="status">No yoga data</div>`}};Ee.styles=[h,B.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([(0,ir.property)({attribute:!1})],Ee.prototype,"data",2),d([(0,ir.state)()],Ee.prototype,"filter",2),Ee=d([(0,ir.customElement)("roxy-yoga-list")],Ee);var Fr=[{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 vt="0.7.0";var pa=Fr.map(o=>o.slug);
|
|
81
|
+
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,a)=>this.getAscendant()+a*30)).map(t=>{let a=this.toAngle(t),s=G($,$,Rr,a),i=G($,$,pr,a);return g.svg`<line class="wheel-line" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return Q.map((e,r)=>{let t=this.toAngle(r*30+15),a=G($,$,ft,t);return g.svg`<text class="sign-glyph" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${oe[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,a)=>{let s=e[(a+1)%12],i=Ht(t.longitude,s?s.longitude:t.longitude+30),l=G($,$,Rr-12,this.toAngle(i));return g.svg`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,a)=>{let s=this.toAngle(a*30+15),i=G($,$,Rr-12,s),l=(a-r+12)%12+1;return g.svg`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),a=r%30===0,s=a?ft-14:pr-5,i=G($,$,s,t),l=G($,$,pr,t);e.push(g.svg`<line class=${a?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${a?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?g.nothing:e.map(r=>{let t=this.toAngle(r.longitude),a=G($,$,Rr+9,t),s=fe(r.longitude);return g.svg`<text class="cusp-deg" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${s.degree}°${String(s.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(s=>Number.isFinite(s.longitude)).map(s=>({p:s,trueLon:xe(s.longitude),displayLon:xe(s.longitude)})).sort((s,i)=>s.trueLon-i.trueLon);for(let s=1;s<t.length;s++){let i=t[s-1],l=t[s];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let a=t[t.length-1];if(a&&a.displayLon>360){let s=a.displayLon-360;for(let i of t)i.displayLon-=s}return t.map(({p:s,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),m=this.toAngle(l),p=G($,$,mr,m),u=G($,$,mr-13,m),P=G($,$,pr-4,c),x=G($,$,mr+8,m),Ze=I[b(s.name)]??s.name.slice(0,2),Dr=fe(s.longitude),xr=s.isRetrograde===!0,Gr=`${Dr.degree}\xB0${String(Dr.minute).padStart(2,"0")}'`,Or=Math.abs(l-i)>.5;return g.svg`<g>
|
|
82
|
+
${Or?g.svg`<line class="planet-leader" x1=${P.x} y1=${P.y} x2=${x.x} y2=${x.y} />`:g.nothing}
|
|
83
|
+
<text class="planet-glyph" x=${p.x} y=${p.y} text-anchor="middle" dominant-baseline="central"><title>${s.name}${xr?" retrograde":""} - ${Gr} ${s.sign??""}</title>${Ze}</text>
|
|
84
|
+
<text class="planet-deg" x=${u.x} y=${u.y} text-anchor="middle" dominant-baseline="central">${Gr}${xr?g.svg`<tspan class="retro"> ℞</tspan>`:g.nothing}</text>
|
|
85
|
+
</g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return g.nothing;let t=e?.retrogradePlanets??[];return g.html`<div class="details">${e?.dominantElement||e?.dominantModality?g.html`<div class="pill-row">${e.dominantElement?g.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:g.nothing} ${e.dominantModality?g.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:g.nothing}</div>`:g.nothing} ${r?g.html`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:g.nothing} ${t.length>0?g.html`<div class="pill-row">${t.map(a=>{let s=I[a]??a.slice(0,2);return g.html`<span class="pill pill--muted">${s} ${a} R</span>`})}</div>`:g.nothing} ${r?.summary?g.html`<p class="summary">${r.summary}</p>`:g.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return g.nothing;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],a=Q,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=a.indexOf(b(i.sign??""));if(l<0)continue;let c=r[l%4],m=t[l%3],p=I[b(i.name)]??b(i.name).slice(0,2);s[c]?.[m]?.push(p)}return g.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>g.html`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,m)=>c+(s[i]?.[m]?.length??0),0);return g.html`<tr><th scope="row">${i}</th>${t.map(c=>g.html`<td>${(s[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>g.html`<td class="em-total">${r.reduce((l,c)=>l+(s[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?g.nothing:g.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let a=r.interpretation,s=I[b(r.name)]??"",i=v(r.degree??0,1);return g.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${s} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${be()}</span></summary><div class="interp-body">${a.summary?g.html`<p class="interp-summary">${a.summary}</p>`:g.nothing} ${a.detailed?g.html`<p class="interp-detail">${a.detailed}</p>`:g.nothing} ${a.keywords?.length?g.html`<div class="interp-keywords">${a.keywords.map(l=>g.html`<span class="kw">${l}</span>`)}</div>`:g.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let a of e){if(typeof a.longitude!="number")continue;let s=b(a.name);s&&t.set(s,a.longitude)}return r.map(a=>{let s=t.get(b(a.planet1)),i=t.get(b(a.planet2));if(s===void 0||i===void 0)return g.nothing;let l=G($,$,mr-18,this.toAngle(s)),c=G($,$,mr-18,this.toAngle(i)),m=ir(a),p=tr[m]??"aspect-other",u=v(a.orb,1);return g.svg`<line class=${`aspect ${p}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${a.planet1} ${m||""} ${a.planet2}${u?` (orb ${u}\xB0)`:""}</title></line>`})}};ve.styles=[y,Ke,cr,g.css`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([(0,or.property)({attribute:!1})],ve.prototype,"data",2),d([(0,or.property)({type:String,attribute:"house-system",reflect:!0})],ve.prototype,"houseSystem",2),d([(0,or.state)()],ve.prototype,"view",2),ve=d([(0,or.customElement)("roxy-natal-chart")],ve);var R=require("lit"),Ar=require("lit/decorators.js");var ze=class extends R.LitElement{constructor(){super();this.data=null;this.type="life-path";new h(this)}render(){let e=this.data;if(!e)return R.html`<div class="roxy-empty" role="status">No numerology data</div>`;let r=Va[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?R.html`<div class="numeral">${e.number}</div>`:R.nothing}<div><p class="label">${r}</p>${e.meaning?.title?R.html`<h2 class="title">${e.meaning.title}</h2>`:R.nothing}</div></div>${e.meaning?.description?R.html`<p class="meaning">${e.meaning.description}</p>`:R.nothing} ${e.calculation?R.html`<pre class="calc">${e.calculation}</pre>`:R.nothing} ${t.length>0?R.html`<div class="chips">${t.map(a=>R.html`<span>${a}</span>`)}</div>`:R.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?R.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Fa(e.karmicDebtMeaning)}</div>`:R.nothing}</article>`}renderPersonalYear(e,r){return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?R.html`<div class="numeral">${e.personalYear}</div>`:R.nothing}<div><p class="label">${r}</p>${e.theme?R.html`<h2 class="title">${e.theme}</h2>`:R.nothing}</div></div>${e.forecast?R.html`<p class="meaning">${e.forecast}</p>`:R.nothing} ${e.advice?R.html`<p>${e.advice}</p>`:R.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,a])=>a!=null);return R.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?R.html`<h2 class="title">${e.profile.name}</h2>`:R.nothing}</div>${t.length>0?R.html`<div class="cores">${t.map(([a,s])=>R.html`<div class="item"><span>${ye(a)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:R.nothing}</article>`}};ze.styles=[y,R.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([(0,Ar.property)({attribute:!1})],ze.prototype,"data",2),d([(0,Ar.property)({type:String,reflect:!0})],ze.prototype,"type",2),ze=d([(0,Ar.customElement)("roxy-numerology-card")],ze);var Va={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Fa(o){return o?[o.description,o.challenge,o.resolution].filter(Boolean).join(" "):""}var B=require("lit"),Er=require("lit/decorators.js");var Me=class extends B.LitElement{constructor(){super();this.data=null;this.detail="detailed";new h(this)}render(){let e=this.data;if(!e)return B.html`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let a=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(p=>!!p[1]):[],s=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],m=r&&"transitions"in r?r.transitions:void 0;return B.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?_e(r.date):""}</span></header><table><tbody>${t.map(([p,u])=>B.html`<tr><th>${p}</th><td>${u}</td></tr>`)} ${r?.sunrise?B.html`<tr><th>Sunrise</th><td>${he(r.sunrise)}</td></tr>`:B.nothing} ${r?.sunset?B.html`<tr><th>Sunset</th><td>${he(r.sunset)}</td></tr>`:B.nothing} ${r?.moonrise?B.html`<tr><th>Moonrise</th><td>${he(r.moonrise)}</td></tr>`:B.nothing} ${r?.moonset?B.html`<tr><th>Moonset</th><td>${he(r.moonset)}</td></tr>`:B.nothing} ${a.map(([p,u])=>B.html`<tr><th>${p}</th><td>${u}</td></tr>`)}</tbody></table>${m?B.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",m.tithi)} ${this.renderTransitionRow("Nakshatra",m.nakshatra)} ${this.renderTransitionRow("Yoga",m.yoga)} ${this.renderTransitionRow("Karana",m.karana)}</tbody></table>`:B.nothing} ${this.detail==="detailed"&&(s.some(p=>!!p[1])||i.length>0||l.some(p=>!!p[1])||c.length>0)?B.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...s.filter(p=>!!p[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(p=>!!p[1]),...c])}</tbody></table>`:B.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let a=yt(t);return a?B.html`<tr><th>${r}</th><td>${a}</td></tr>`:B.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,a)=>[r.length>1?`${e} ${a+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return B.nothing;let t=he(r.endsAt),a=r.next?` \u2192 ${r.next}`:"";return B.html`<tr><th>${e}</th><td>ends ${t}${a}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=yt(e);return r?`${e.current} (${r})`:e.current}};Me.styles=[y,B.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([(0,Er.property)({attribute:!1})],Me.prototype,"data",2),d([(0,Er.property)({type:String,reflect:!0})],Me.prototype,"detail",2),Me=d([(0,Er.customElement)("roxy-panchang-table")],Me);var ie=require("lit"),st=require("lit/decorators.js");var vt=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],We=class extends ie.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data?.planets?.length)return ie.html`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return ie.html`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${vt.map(r=>ie.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=I[b(e.planet)]??"",t=vt.map(m=>Math.max(0,e[m.key])),a=t.reduce((m,p)=>m+p,0),s=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,i=s?"adequacy-badge--adequate":"adequacy-badge--weak",l=s?"adequate":"weak",c=v(e.totalRupas,2)&&v(e.minRequired,2)?`${v(e.totalRupas,2)} / ${v(e.minRequired,2)} R`:"";return ie.html`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${r}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${a>0?vt.map((m,p)=>{let u=t[p];if(u<=0)return ie.nothing;let P=u/a*100;return ie.html`<div class="bar-segment" style="flex-grow:${P};background:${m.color}" title="${m.label}: ${v(u,1)}"></div>`}):ie.nothing}</div></div><div class="pills">${c?ie.html`<span class="rupas-label">${c}</span>`:ie.nothing} <span class="${`adequacy-badge ${i}`}">${l}</span></div></div>`}};We.styles=[y,ie.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],d([(0,st.property)({attribute:!1})],We.prototype,"data",2),We=d([(0,st.customElement)("roxy-shadbala-table")],We);var f=require("lit"),ot=require("lit/decorators.js");var kt=360,q=kt/2,$t=170,Ua=154,wt=124,gr=96,Je=class extends f.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return f.html`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:a}=this.data,s=this.data.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,m=a?.overall,p=a?.strengths??[],u=a?.challenges??[];return i.length>0&&l.length>0?f.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?f.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:f.nothing}</div><svg viewBox="0 0 ${kt} ${kt}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${q}" cy="${q}" r="${$t}" stroke-width="1.5"/><circle class="wheel-line" cx="${q}" cy="${q}" r="${gr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${q}" cy="${q}" r="${gr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,s)} ${this.renderRing(i,wt,"p1",1)} ${this.renderRing(l,gr,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${m?f.html`<p class="summary">${m}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${p.length>0||u.length>0?f.html`<div class="lists">${p.length?f.html`<div><h3>Strengths</h3><ul>${p.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${u.length?f.html`<div><h3>Challenges</h3><ul>${u.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing}</div>`:f.nothing}</div>`:f.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?f.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:f.nothing}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code><roxy-data></code> fallback.</div>${m?f.html`<p class="summary">${m}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${p.length>0||u.length>0?f.html`<div class="lists">${p.length?f.html`<div><h3>Strengths</h3><ul>${p.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${u.length?f.html`<div><h3>Challenges</h3><ul>${u.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing}</div>`:f.nothing}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),a=G(q,q,gr-14,t),s=G(q,q,$t,t);return f.svg`<line class="wheel-line" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return Q.map((e,r)=>{let t=this.toAngle(r*30+15),a=G(q,q,Ua,t);return f.svg`<text class="sign" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${oe[e]}</text>`})}renderRing(e,r,t,a){return e.map(s=>{if(!Number.isFinite(s.longitude))return f.nothing;let i=this.toAngle(s.longitude),l=G(q,q,r,i),m=G(q,q,r+(a===1?-12:-10),i),p=I[b(s.name)]??s.name.slice(0,2),u=fe(s.longitude),P=s.isRetrograde===!0,x=`${u.degree}\xB0${String(u.minute).padStart(2,"0")}'`,Ze=`${s.name}${P?" retrograde":""} - ${x} ${u.sign}`;return f.svg`<g>
|
|
86
|
+
<text class=${t} x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central"><title>${Ze}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${a}</tspan></text>
|
|
87
|
+
<text class="planet-deg" x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${u.degree}°${P?f.svg`<tspan class="retro"> ℞</tspan>`:f.nothing}</text>
|
|
88
|
+
</g>`})}renderAscendants(e){let r=[],t=(a,s)=>{if(!a)return;let i=Q.findIndex(P=>P.toLowerCase()===a.sign.toLowerCase());if(i===-1)return;let l=i*30+a.degree,c=this.toAngle(l),m=s===1?wt+14:gr+14,p=G(q,q,m,c),u=G(q,q,$t+14,c);r.push(f.svg`<g>
|
|
89
|
+
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${u.x} y2=${u.y} />
|
|
90
|
+
<text class="asc-label" x=${u.x} y=${u.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
|
|
91
|
+
</g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=b(i);for(let c of s)if(b(c.name)===l&&typeof c.longitude=="number")return c.longitude};return t.map(s=>{let i=a(e,s.planet1),l=a(r,s.planet2);if(i===void 0||l===void 0)return f.nothing;let c=G(q,q,wt-12,this.toAngle(i)),m=G(q,q,gr+8,this.toAngle(l)),p=ir(s),u=tr[p]??"aspect-other",P=v(s.orb,1);return f.svg`<line class=${`aspect ${u}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${s.planet1} ${p} ${s.planet2}${P?` (orb ${P}\xB0)`:""}</title></line>`})}renderAspects(e){return f.html`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(r=>f.html`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${ir(r)||""}</td><td class="orb">${v(r.orb,1)}</td><td>${Wa(r.strength)}</td></tr>`)}</tbody></table>`}};Je.styles=[y,f.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],d([(0,ot.property)({attribute:!1})],Je.prototype,"data",2),Je=d([(0,ot.customElement)("roxy-synastry-chart")],Je);function Wa(o){return typeof o=="number"?Math.round(o).toString():""}var E=require("lit"),yr=require("lit/decorators.js");var De=class extends E.LitElement{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new h(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):E.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,a=r.keywords??[];return E.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?E.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:E.html`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?E.html`${r.arcana} arcana`:E.nothing} ${t?E.html`· reversed`:E.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?E.html`<p class="message">${e.dailyMessage}</p>`:E.nothing} ${r.meaning?E.html`<p>${r.meaning}</p>`:E.nothing} ${a.length>0?E.html`<div class="chips">${a.map(s=>E.html`<span>${s}</span>`)}</div>`:E.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,a=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return E.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?E.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:E.html`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?E.html`${e.arcana} arcana`:E.nothing} ${e.number!==void 0&&e.number!==null?E.html`· ${e.number}`:E.nothing} ${r?E.html`· reversed`:E.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?E.html`<p>${t.description}</p>`:E.nothing} ${a.length>0?E.html`<div class="chips">${a.map(s=>E.html`<span>${s}</span>`)}</div>`:E.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};De.styles=[y,E.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([(0,yr.property)({attribute:!1})],De.prototype,"data",2),d([(0,yr.state)()],De.prototype,"flipped",2),De=d([(0,yr.customElement)("roxy-tarot-card")],De);var A=require("lit"),Nr=require("lit/decorators.js");var Ge=class extends A.LitElement{constructor(){super();this.data=null;this.spread="three-card";new h(this)}render(){let e=this.data;if(!e)return A.html`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),a=t?[]:"positions"in e?e.positions??[]:[],s=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,p="summary"in e?e.summary:void 0,u=r?e.interpretation:void 0,P=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return A.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${m?A.html`<span class="question">"${m}"</span>`:A.nothing}</header>${r?A.html`<div><span class="${`answer ${P}`}">${i}</span> ${l?A.html`<small>· ${l}</small>`:A.nothing}</div>`:A.nothing} ${a.length>0?A.html`<div class="grid">${a.map(x=>A.html`<div class="card"><p class="label">${x.name??""}</p><div class="image">${x.card?.imageUrl?A.html`<img src="${x.card.imageUrl}" alt="${x.card.name??"tarot card"}" class="${x.card.reversed?"reversed":""}">`:A.html`${x.card?.name??"?"}`}</div><p class="name">${x.card?.name??""} ${x.card?.reversed?A.html`<small>(reversed)</small>`:A.nothing}</p>${x.interpretation?A.html`<p class="interp">${x.interpretation}</p>`:A.nothing}</div>`)}</div>`:A.nothing} ${s.length>0?A.html`<div class="grid">${s.map(x=>A.html`<div class="card"><div class="image">${x.imageUrl?A.html`<img src="${x.imageUrl}" alt="${x.name??"tarot card"}" class="${x.reversed?"reversed":""}">`:A.html`${x.name??"?"}`}</div><p class="name">${x.name??""} ${x.reversed?A.html`<small>(reversed)</small>`:A.nothing}</p>${x.meaning?A.html`<p class="interp">${x.meaning}</p>`:A.nothing}</div>`)}</div>`:A.nothing} ${p?A.html`<p class="reading">${p}</p>`:A.nothing} ${u?A.html`<p class="reading">${u}</p>`:A.nothing}</article>`}};Ge.styles=[y,A.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([(0,Nr.property)({attribute:!1})],Ge.prototype,"data",2),d([(0,Nr.property)({type:String,reflect:!0})],Ge.prototype,"spread",2),Ge=d([(0,Nr.customElement)("roxy-tarot-spread")],Ge);var z=require("lit"),ur=require("lit/decorators.js");var Oe=class extends z.LitElement{constructor(){super();this.data=null;this.tab="positions";new h(this)}render(){if(!this.data?.transitPlanets?.length)return z.html`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:a,summary:s}=this.data,i=[_e(e),he(r)].filter(Boolean).join(" "),l=a?.length??0,c=this.tab;return z.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${i?z.html`<p class="subtitle">${i}</p>`:z.nothing}</div>${l>0?z.html`${lr({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${l})`}],active:c,onSelect:m=>{this.tab=m},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?z.html`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:z.html`${s?this.renderSummaryPills(s):z.nothing}<div class="overflow-scroll">${this.renderAspectsList(a??[])}</div>`}</div>`:z.html`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return z.html`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return z.html`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=I[b(r.name)]??"",a=oe[b(r.sign)]??"",s=r.speed>=0?"\u2191":"\u2193";return z.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?z.html`<span class="retro-badge" aria-label="retrograde">R</span>`:z.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${r.sign}</div></td><td class="num">${v(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${v(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return z.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let a=I[b(r.transitPlanet)]??"",s=I[b(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),m=r.isApplying?"Applying":"Separating";return z.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${a}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${m} · orb ${v(r.orb,2)}° · strength ${v(r.strength,1)} </span>${be()}</summary><div class="interp-body">${l?.summary?z.html`<p>${l.summary}</p>`:z.nothing} ${l?.impact?z.html`<p><strong>Impact:</strong> ${l.impact}</p>`:z.nothing} ${l?.timing?z.html`<p><strong>Timing:</strong> ${l.timing}</p>`:z.nothing} ${l?.guidance?z.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:z.nothing} ${l?.keywords?.length?z.html`<div class="interp-keywords">${l.keywords.map(p=>z.html`<span class="kw">${p}</span>`)}</div>`:z.nothing}</div></details>`})}</div>`}};Oe.styles=[y,Ke,cr,z.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([(0,ur.property)({attribute:!1})],Oe.prototype,"data",2),d([(0,ur.state)()],Oe.prototype,"tab",2),Oe=d([(0,ur.customElement)("roxy-transits-table")],Oe);var zr=require("lit"),Mr=require("lit/decorators.js");var He=class extends zr.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){return this.data?.meta?Ur(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?zr.html`<div class="wrap"><div class="header"><h2 class="title">Vedic kundli</h2>${Jr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${Wr(e,this.chartStyle)}</svg></div>`:zr.html`<div class="roxy-empty" role="status">No kundli data</div>`}};He.styles=[y,Xr,Ke],d([(0,Mr.property)({attribute:!1})],He.prototype,"data",2),d([(0,Mr.property)({type:String,reflect:!0,attribute:"chart-style"})],He.prototype,"chartStyle",2),He=d([(0,Mr.customElement)("roxy-vedic-kundli")],He);var k=require("lit"),nt=require("lit/decorators.js");var Ja=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Xe=class extends k.LitElement{constructor(){super();this.data=null;new h(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let a of Ja){let s=e[a];s&&(t.push([a,s]),r.add(a))}for(let[a,s]of Object.entries(e))r.has(a)||t.push([a,s]);return t}render(){if(!this.data?.meta)return k.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return k.html`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let a=(t.graha??r)==="Lagna",s=I[b(t.graha??r)]??"",i=oe[b(t.rashi??"")]??"";return k.html`<tr class="${a?"lagna":""}"><td class="graha">${s?k.html`<span class="glyph">${s}</span>`:k.nothing}${t.graha??r}</td><td>${i?k.html`<span class="glyph">${i}</span>`:k.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Vr(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?k.html`<span class="retro">R</span>`:k.nothing}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?k.nothing:k.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>{let t=I[b(r.planet)]??"",a=v(r.distanceFromSun,2),s=v(r.orb,1);return k.html`<div class="condition"><span class="planet">${t?`${t} `:""}${r.planet}</span> <span class="detail">${a} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?k.nothing:k.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>{let t=v(r.distance,2);return k.html`<div class="condition"><span class="planet">${r.planet1} vs ${r.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${r.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},r=this.orderedRows().map(([t,a])=>[a.graha??t,e[a.graha??t]]).filter(([,t])=>t!=null);return r.length===0?k.nothing:k.html`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${be()}</summary><div class="panel-body">${r.map(([t,a])=>{let s=I[b(t)]??"";return k.html`<div class="interp"><span class="planet">${s?`${s} `:""}${t}</span> ${a.rashi?k.html`<p><span class="label">Rashi.</span> ${a.rashi}</p>`:k.nothing} ${a.nakshatra?k.html`<p><span class="label">Nakshatra.</span> ${a.nakshatra}</p>`:k.nothing}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?k.nothing:k.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>k.html`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?k.html`<p class="desc">${r.description}</p>`:k.nothing}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?k.nothing:k.html`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>k.html`<div class="bhava"><span class="name">${r.name} ${r.quality?k.html`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:k.nothing}</span> ${r.result?k.html`<p class="desc">${r.result}</p>`:k.nothing}</div>`)}</div></details>`}};Xe.styles=[y,cr,k.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],d([(0,nt.property)({attribute:!1})],Xe.prototype,"data",2),Xe=d([(0,nt.customElement)("roxy-vedic-planets-table")],Xe);var re=require("lit"),it=require("lit/decorators.js");var Qe=class extends re.LitElement{constructor(){super();this.data=null;new h(this)}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,a]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])a&&r.push({name:t,sign:a.sign,longitude:a.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return re.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return re.html`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=I[b(r.name)]??"",a=oe[b(r.sign??"")]??"",s=typeof r.speed=="number"?v(r.speed,3):"";return re.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?re.html`<span class="glyph">${t}</span>`:re.nothing}${r.name}</td><td>${a?re.html`<span class="glyph">${a}</span>`:re.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Vr(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${s?re.html`${s}°/day`:re.nothing} ${r.isRetrograde?re.html`<span class="retro">℞</span>`:re.nothing}</td></tr>`})}</tbody></table></div>`}};Qe.styles=[y,re.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],d([(0,it.property)({attribute:!1})],Qe.prototype,"data",2),Qe=d([(0,it.customElement)("roxy-western-planets-table")],Qe);var Y=require("lit"),hr=require("lit/decorators.js");var Ie=class extends Y.LitElement{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new h(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Y.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return Y.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Y.nothing}</p>${e.description?Y.html`<p class="description">${e.description}</p>`:Y.nothing} ${e.result?Y.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Y.nothing}</div>`}render(){if(!this.data)return Y.html`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return Y.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,m=r?c.filter(u=>u.name.toLowerCase().includes(r)):c,p=e.total;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${p!==void 0?Y.html`<span class="count">${p} total</span>`:Y.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${m.length>0?m.map(u=>this.renderDetailCard(u)):Y.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let s=t,i=r?s.filter(c=>c.name.toLowerCase().includes(r)):s,l=e.total;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Y.html`<span class="count">${l} total</span>`:Y.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>Y.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Y.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Y.html`<div class="roxy-empty" role="status">No yoga data</div>`}};Ie.styles=[y,Y.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([(0,hr.property)({attribute:!1})],Ie.prototype,"data",2),d([(0,hr.state)()],Ie.prototype,"filter",2),Ie=d([(0,hr.customElement)("roxy-yoga-list")],Ie);var lt=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,personal-year,chart}",docsSummary:"Life path, expression, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Yt="0.8.0";var Xa=lt.map(o=>o.slug);
|
|
83
92
|
//# sourceMappingURL=index.cjs.map
|