@roxyapi/ui 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -0
- package/README.md +1 -1
- package/THEMING.md +1 -1
- package/dist/cdn/components/ashtakavarga-grid.js +1 -1
- package/dist/cdn/components/ashtakavarga-grid.js.map +2 -2
- package/dist/cdn/components/biorhythm-chart.js +3 -3
- package/dist/cdn/components/biorhythm-chart.js.map +2 -2
- package/dist/cdn/components/choghadiya-grid.js +1 -1
- package/dist/cdn/components/choghadiya-grid.js.map +2 -2
- package/dist/cdn/components/compatibility-card.js +1 -1
- package/dist/cdn/components/compatibility-card.js.map +2 -2
- package/dist/cdn/components/dasha-timeline.js +3 -3
- package/dist/cdn/components/dasha-timeline.js.map +4 -4
- package/dist/cdn/components/divisional-chart.js +67 -1
- package/dist/cdn/components/divisional-chart.js.map +2 -2
- package/dist/cdn/components/endpoint-form.js +2 -2
- package/dist/cdn/components/endpoint-form.js.map +2 -2
- package/dist/cdn/components/guna-milan.js +1 -1
- package/dist/cdn/components/guna-milan.js.map +2 -2
- package/dist/cdn/components/hexagram.js +1 -1
- package/dist/cdn/components/hexagram.js.map +2 -2
- package/dist/cdn/components/horoscope-card.js +1 -1
- package/dist/cdn/components/horoscope-card.js.map +2 -2
- package/dist/cdn/components/kp-chart.js +1 -1
- package/dist/cdn/components/kp-chart.js.map +2 -2
- package/dist/cdn/components/kp-ruling-planets.js +1 -1
- package/dist/cdn/components/kp-ruling-planets.js.map +2 -2
- package/dist/cdn/components/location-search.js +1 -1
- package/dist/cdn/components/location-search.js.map +2 -2
- package/dist/cdn/components/nakshatra-card.js +1 -1
- package/dist/cdn/components/nakshatra-card.js.map +2 -2
- package/dist/cdn/components/natal-chart.js +12 -3
- package/dist/cdn/components/natal-chart.js.map +2 -2
- package/dist/cdn/components/numerology-card.js +2 -2
- package/dist/cdn/components/numerology-card.js.map +2 -2
- package/dist/cdn/components/panchang-table.js +3 -3
- package/dist/cdn/components/panchang-table.js.map +3 -3
- package/dist/cdn/components/shadbala-table.js +1 -1
- package/dist/cdn/components/shadbala-table.js.map +2 -2
- package/dist/cdn/components/synastry-chart.js +8 -2
- package/dist/cdn/components/synastry-chart.js.map +2 -2
- package/dist/cdn/components/transits-table.js +2 -2
- package/dist/cdn/components/transits-table.js.map +2 -2
- package/dist/cdn/components/vedic-kundli.js +67 -1
- package/dist/cdn/components/vedic-kundli.js.map +2 -2
- package/dist/cdn/components/vedic-planets-table.js +3 -3
- package/dist/cdn/components/vedic-planets-table.js.map +4 -4
- package/dist/cdn/components/yoga-list.js +2 -2
- package/dist/cdn/components/yoga-list.js.map +2 -2
- package/dist/cdn/roxy-ui.js +84 -3
- package/dist/cdn/roxy-ui.js.map +4 -4
- package/dist/components/ashtakavarga-grid.js +1 -1
- package/dist/components/ashtakavarga-grid.js.map +3 -3
- package/dist/components/biorhythm-chart.js +1 -1
- package/dist/components/biorhythm-chart.js.map +2 -2
- package/dist/components/choghadiya-grid.js +1 -1
- package/dist/components/choghadiya-grid.js.map +2 -2
- package/dist/components/compatibility-card.js +1 -1
- package/dist/components/compatibility-card.js.map +2 -2
- package/dist/components/dasha-timeline.d.ts.map +1 -1
- package/dist/components/dasha-timeline.js +1 -1
- package/dist/components/dasha-timeline.js.map +4 -4
- package/dist/components/divisional-chart.js +67 -1
- package/dist/components/divisional-chart.js.map +2 -2
- package/dist/components/endpoint-form.js +1 -1
- package/dist/components/endpoint-form.js.map +2 -2
- package/dist/components/guna-milan.js +1 -1
- package/dist/components/guna-milan.js.map +2 -2
- package/dist/components/hexagram.js +1 -1
- package/dist/components/hexagram.js.map +2 -2
- package/dist/components/horoscope-card.js +1 -1
- package/dist/components/horoscope-card.js.map +2 -2
- package/dist/components/kp-chart.js +1 -1
- package/dist/components/kp-chart.js.map +2 -2
- package/dist/components/kp-ruling-planets.js +1 -1
- package/dist/components/kp-ruling-planets.js.map +2 -2
- package/dist/components/location-search.js +1 -1
- package/dist/components/location-search.js.map +2 -2
- package/dist/components/nakshatra-card.js +1 -1
- package/dist/components/nakshatra-card.js.map +2 -2
- package/dist/components/natal-chart.js +10 -1
- package/dist/components/natal-chart.js.map +2 -2
- package/dist/components/numerology-card.js +1 -1
- package/dist/components/numerology-card.js.map +2 -2
- package/dist/components/panchang-table.d.ts +22 -1
- package/dist/components/panchang-table.d.ts.map +1 -1
- package/dist/components/panchang-table.js +1 -1
- package/dist/components/panchang-table.js.map +3 -3
- package/dist/components/shadbala-table.js +1 -1
- package/dist/components/shadbala-table.js.map +2 -2
- package/dist/components/synastry-chart.js +7 -1
- package/dist/components/synastry-chart.js.map +2 -2
- package/dist/components/transits-table.js +1 -1
- package/dist/components/transits-table.js.map +2 -2
- package/dist/components/vedic-kundli.js +67 -1
- package/dist/components/vedic-kundli.js.map +2 -2
- package/dist/components/vedic-planets-table.d.ts +14 -0
- package/dist/components/vedic-planets-table.d.ts.map +1 -1
- package/dist/components/vedic-planets-table.js +1 -1
- package/dist/components/vedic-planets-table.js.map +4 -4
- package/dist/components/yoga-list.js +1 -1
- package/dist/components/yoga-list.js.map +2 -2
- package/dist/index.cjs +82 -1
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +82 -1
- package/dist/index.js.map +4 -4
- package/dist/styles/tokens.css +4 -4
- package/dist/types/types.gen.d.ts +679 -40
- package/dist/types/types.gen.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/ashtakavarga-grid.ts +1 -1
- package/src/components/biorhythm-chart.ts +1 -1
- package/src/components/choghadiya-grid.ts +1 -1
- package/src/components/compatibility-card.ts +2 -2
- package/src/components/dasha-timeline.ts +10 -19
- package/src/components/endpoint-form.ts +2 -2
- package/src/components/guna-milan.ts +1 -1
- package/src/components/hexagram.ts +3 -3
- package/src/components/horoscope-card.ts +1 -1
- package/src/components/kp-chart.ts +1 -1
- package/src/components/kp-ruling-planets.ts +1 -1
- package/src/components/location-search.ts +1 -1
- package/src/components/nakshatra-card.ts +1 -1
- package/src/components/natal-chart.ts +5 -5
- package/src/components/numerology-card.ts +2 -2
- package/src/components/panchang-table.ts +112 -18
- package/src/components/shadbala-table.ts +1 -1
- package/src/components/synastry-chart.ts +4 -4
- package/src/components/transits-table.ts +1 -1
- package/src/components/vedic-planets-table.ts +221 -3
- package/src/components/yoga-list.ts +1 -1
- package/src/styles/tokens.css +4 -4
- package/src/types/types.gen.ts +680 -41
- package/src/utils/kundli-styles.ts +2 -2
- package/src/utils/tablist.ts +1 -1
- package/src/version.ts +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,83 @@
|
|
|
1
|
-
"use strict";var Rr=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var $t=Object.getOwnPropertyNames;var wt=Object.prototype.hasOwnProperty;var kt=(o,n)=>{for(var e in n)Rr(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&&Rr(o,t,{get:()=>n[t],enumerable:!(r=nt(n,t))||r.enumerable});return o};var Lt=o=>St(Rr({},"__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&&Rr(n,e,t),t};var ma={};kt(ma,{ROXY_COMPONENTS:()=>Fr,ROXY_UI_COMPONENTS:()=>pa,ROXY_UI_VERSION:()=>vt,RoxyAshtakavargaGrid:()=>he,RoxyBiorhythmChart:()=>ue,RoxyChoghadiyaGrid:()=>De,RoxyCompatibilityCard:()=>xe,RoxyDashaTimeline:()=>fe,RoxyData:()=>be,RoxyDivisionalChart:()=>$e,RoxyDoshaCard:()=>we,RoxyEndpointForm:()=>ee,RoxyGunaMilan:()=>Oe,RoxyHexagram:()=>ke,RoxyHoroscopeCard:()=>Se,RoxyKpChart:()=>Le,RoxyKpPlanetsTable:()=>He,RoxyKpRulingPlanets:()=>Ie,RoxyLocationSearch:()=>X,RoxyMoonPhase:()=>Ce,RoxyNakshatraCard:()=>je,RoxyNatalChart:()=>ye,RoxyNumerologyCard:()=>Te,RoxyPanchangTable:()=>Re,RoxyShadbalaTable:()=>Ke,RoxySynastryChart:()=>Be,RoxyTarotCard:()=>Pe,RoxyTarotSpread:()=>Ae,RoxyTransitsTable:()=>ze,RoxyVedicKundli:()=>Me,RoxyVedicPlanetsTable:()=>_e,RoxyWesternPlanetsTable:()=>Ye,RoxyYogaList:()=>Ee});module.exports=Lt(ma);var V=require("lit"),Je=require("lit/decorators.js");var B={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},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"},te={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Pr={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},W=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],ya=W.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"),y=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 Tt(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(Tt(n)&&n.classList.contains(Ct))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var Rt={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},qe=["sarva","bhinna","pinda"],he=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}">${qe.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}}">${Rt[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=qe.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=qe[(r+1)%qe.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=qe[(r-1+qe.length)%qe.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">${te[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}">${te[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>`}};he.styles=[y,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-fg,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([(0,Je.property)({attribute:!1})],he.prototype,"data",2),d([(0,Je.state)()],he.prototype,"activeTab",2),he=d([(0,Je.customElement)("roxy-ashtakavarga-grid")],he);var _=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"},ue=class extends _.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):_.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 _.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?_.html`<span class="energy">Energy ${e.energyRating}/10</span>`:_.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 _.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?_.html`<p class="advice">${e.dailyMessage}</p>`:_.nothing} ${e.advice?_.html`<p class="advice">${e.advice}</p>`:_.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return _.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 _.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((m,h)=>{let S=m[l]??0,x=h*s,Ve=a/2-S/100*(a/2-8);return`${x.toFixed(2)},${Ve.toFixed(2)}`}).join(" "),p=ct[l]??"#475569";return _.svg`<polyline points="${c}" fill="none" stroke="${p}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">`})}</svg> ${e.summary?.periodAdvice?_.html`<p class="advice">${e.summary.periodAdvice}</p>`:_.nothing}</section>`}renderCritical(e){return _.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=>_.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};ue.styles=[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-fg,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([(0,dr.property)({attribute:!1})],ue.prototype,"data",2),d([(0,dr.property)({type:String,reflect:!0})],ue.prototype,"mode",2),ue=d([(0,dr.customElement)("roxy-biorhythm-chart")],ue);var J=require("lit"),Ar=require("lit/decorators.js");function L(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function Ne(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 De=class extends J.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=B[L(e.lord)]??"",s=`${pt(e.start)} - ${pt(e.end)}`;return J.html`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?J.html`<span class="now-badge">Now</span>`:J.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${a?J.html`<span aria-hidden="true">${a}</span>`:J.nothing} ${e.lord}</span></div>`}render(){if(!this.data)return J.html`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return J.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?J.html`<p class="subtitle">${e}</p>`:J.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)):J.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)):J.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};De.styles=[y,J.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-fg,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],d([(0,Ar.property)({attribute:!1})],De.prototype,"data",2),De=d([(0,Ar.customElement)("roxy-choghadiya-grid")],De);var C=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 $(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function mt(o,n=1){let e=$(o,n);return e?`${e}%`:""}var cr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function Xe(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var xe=class extends C.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 C.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,p="strengths"in e?e.strengths:void 0,m="challenges"in e?e.challenges:void 0,h="keyAspects"in e?e.keyAspects:void 0;return C.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?C.html`<div class="score">${$(r,0)}</div>`:C.nothing} ${a?C.html`<div class="rating">${a}</div>`:C.nothing}</div></div>${Object.keys(t).length>0?C.html`<div role="list">${Object.entries(t).map(([S,x])=>C.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${S}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,x))}%"></span></span> <span>${$(x,0)}</span></div>`)}</div>`:C.nothing} ${s?C.html`<p><span class="archetype">${s.label}</span> ${s.description?C.html`· ${s.description}`:C.nothing}</p>`:C.nothing} ${l?C.html`<p>${l}</p>`:C.nothing} ${c&&!l?C.html`<p>${c}</p>`:C.nothing} ${i?C.html`<p>${i}</p>`:C.nothing} ${(p?.length??0)>0||(m?.length??0)>0?C.html`<div class="lists">${p?.length?C.html`<div><h3>Strengths</h3><ul>${p.map(S=>C.html`<li>${S}</li>`)}</ul></div>`:C.nothing} ${m?.length?C.html`<div><h3>Challenges</h3><ul>${m.map(S=>C.html`<li>${S}</li>`)}</ul></div>`:C.nothing}</div>`:C.nothing} ${h?.length?C.html`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${h.slice(0,6).map(S=>C.html`<li>${Pt(S)}</li>`)}</ul></div>`:C.nothing}</article>`}};xe.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);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-fg,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([(0,pr.property)({attribute:!1})],xe.prototype,"data",2),d([(0,pr.property)({type:String,reflect:!0})],xe.prototype,"mode",2),xe=d([(0,pr.customElement)("roxy-compatibility-card")],xe);function Pt(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${$(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}var v=require("lit"),mr=require("lit/decorators.js");var Mr=require("lit");function Ze(){return Mr.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 Qe=Mr.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 fe=class extends v.LitElement{constructor(){super();this.data=null;this.period="current";new u(this)}render(){let e=this.data;if(!e)return v.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 v.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?v.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?v.html`(lord ${e.nakshatraLord})`:v.nothing}</div>`:v.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):v.nothing} ${r.length>0?v.html`<div class="timeline" role="list">${r.map(a=>this.renderBar(a,t))}</div>`:v.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return v.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 v.html`<p class="balance">Birth dasha balance: ${c} of ${t?v.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?v.html`<details class="interp"><summary><span>${r.planet} mahadasha interpretation</span> ${Ze()}</summary><p>${r.interpretation}</p></details>`:v.nothing}renderCurrent(e){return"mahadasha"in e?v.html`<div class="current">${"mahadasha"in e&&e.mahadasha?v.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?v.html`<small>${$(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:v.nothing}</div>`:v.nothing} ${"antardasha"in e&&e.antardasha?v.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?v.html`<small>${$(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:v.nothing}</div>`:v.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?v.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?v.html`<small>${$(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:v.nothing}</div>`:v.nothing}</div>`:v.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 v.html`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?v.html`<span class="now-badge">Now</span>`:v.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${a}%"></span> ${i>=0?v.html`<span class="bar-progress" style="left:${i*a}%" aria-hidden="true"></span>`:v.nothing} </span><span class="dates">${e.startDate?gt(e.startDate):""} ${e.endDate?v.html`- ${gt(e.endDate)}`:""}</span></div>`}};fe.styles=[y,Qe,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}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-fg,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-fg,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}details.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}details.interp summary{cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);display:flex}details.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([(0,mr.property)({attribute:!1})],fe.prototype,"data",2),d([(0,mr.property)({type:String,reflect:!0})],fe.prototype,"period",2),fe=d([(0,mr.customElement)("roxy-dasha-timeline")],fe);function gt(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}var z=require("lit"),gr=require("lit/decorators.js");var At=["title","name","label","heading","overview","summary"],zt=["imageUrl","image","icon","symbol"],Mt=["imageUrl","image"],Et=6,be=class extends z.LitElement{constructor(){super();this.data=null;this.depth=0;new u(this)}render(){return this.data==null?z.html`<div class="roxy-empty" role="status">No data</div>`:this.depth>=Et?z.html`<div class="roxy-empty" role="status">…</div>`:z.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?z.nothing:typeof e=="string"?z.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?z.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?z.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(a=>a===null||["string","number","boolean"].includes(typeof a))?z.html`<ul class="roxy-chips">${e.map(a=>z.html`<li>${String(a)}</li>`)}</ul>`:e.every(a=>a!==null&&typeof a=="object"&&!Array.isArray(a))?this.renderTable(e):z.html`<ol>${e.map(a=>z.html`<li>${this.renderValue(a)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return z.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>z.html`<th>${Ne(t)}</th>`)}</tr></thead><tbody>${e.map(t=>z.html`<tr>${r.map(a=>z.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&&!Mt.includes(i)&&l!==null&&l!==void 0);return z.html`${t?z.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:z.nothing} ${r?z.html`<h3 class="roxy-title">${e[r]}</h3>`:z.nothing} ${a?z.html`<p class="roxy-summary">${e[a]}</p>`:z.nothing} ${s.length>0?z.html`<dl class="roxy-rows">${s.map(([i,l])=>z.html`<dt>${Ne(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:z.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))?z.html`<ul class="roxy-chips">${e.map(t=>z.html`<li>${String(t)}</li>`)}</ul>`:z.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)}};be.styles=[y,z.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})],be.prototype,"data",2),d([(0,gr.property)({attribute:!1})],be.prototype,"depth",2),be=d([(0,gr.customElement)("roxy-data")],be);var ae=require("lit"),yr=require("lit/decorators.js");var w=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:W[e]??"Aries",signIndex:e,degree:t,minute:s,second:i}}function Er(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 D(o,n,e,r){let t=r*Math.PI/180;return{x:o+e*Math.cos(t),y:n+e*Math.sin(t)}}var Fe=require("lit"),Ge=Fe.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-fg,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function er(o){let{items:n,active:e,onSelect:r,label:t,idPrefix:a,controls:s=!1}=o;return Fe.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(S=>S.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,m=n[(c+p+n.length)%n.length];if(!m)return;r(m.id);let h=l.currentTarget.getRootNode();requestAnimationFrame(()=>{h.querySelector(`#${a}-tab-${m.id}`)?.focus()})}}">${n.map(l=>Fe.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}`:Fe.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ce=400,G=20,Q=ce-2*G,Y=ce/2,Nt=Object.fromEntries(W.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[L(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=[L(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 w.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 Dr(o,n){let e={};for(let t of W)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=Nt[s]??"";continue}!s||!(s in e)||e[s]?.push({graha:a.graha??t,longitude:a.longitude,nakshatra:a.nakshatra,isRetrograde:a.isRetrograde,awastha:a.awastha})}return{lagnaSign:r,placements:e,divisionLabel:n}}var Ue=Q/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:G+n.col*Ue,y:G+n.row*Ue,w:Ue,h:Ue}}function Kt(o){let n=G,e=G+Ue,r=G+2*Ue,t=G+3*Ue,a=ce-G;return w.svg`<rect class="line" x="${n}" y="${n}" width="${Q}" height="${Q}" stroke-width="1.5" fill="none"><line class="line" x1="${n}" y1="${e}" x2="${a}" y2="${e}" stroke-width="1"><line class="line" x1="${n}" y1="${t}" x2="${a}" y2="${t}" stroke-width="1"><line class="line" x1="${e}" y1="${n}" x2="${e}" y2="${a}" stroke-width="1"><line class="line" x1="${t}" y1="${n}" x2="${t}" y2="${a}" stroke-width="1"><line class="line" x1="${n}" y1="${r}" x2="${e}" y2="${r}" stroke-width="1"><line class="line" x1="${t}" y1="${r}" x2="${a}" y2="${r}" stroke-width="1"><line class="line" x1="${r}" y1="${n}" x2="${r}" y2="${e}" stroke-width="1"><line class="line" x1="${r}" y1="${t}" x2="${r}" y2="${a}" stroke-width="1">${o?w.svg`<text class="centre-label" x="${Y}" y="${Y}" text-anchor="middle" dominant-baseline="central">${o}</text>`:w.nothing}`}function ut(o,n){let e=W.findIndex(t=>t===n),r=W.findIndex(t=>t===o);return e===-1||r===-1?0:(r-e+12)%12+1}function Bt(o,n,e,r){let t=jt(o),a=t.x+t.w/2,s=t.y+t.h/2,i=Pr[o]??o.slice(0,2),l=14;return w.svg`<g class="${e?"cell lagna":"cell"}">${e?w.svg`<rect class="lagna-bg" x="${t.x}" y="${t.y}" width="${t.w}" height="${t.h}"><line class="lagna-slash" x1="${t.x+t.w-l}" y1="${t.y+l}" x2="${t.x+l}" y2="${t.y+t.h-l}" stroke-width="1.2">`:w.nothing}<text class="sign-text" x="${t.x+6}" y="${t.y+12}" text-anchor="start" dominant-baseline="central">${i}</text>${r>0?w.svg`<text class="house-num" x="${t.x+t.w-6}" y="${t.y+12}" text-anchor="end" dominant-baseline="central">${r}</text>`:w.nothing} ${e?w.svg`<text class="lagna-marker" x="${a}" y="${t.y+26}" text-anchor="middle" dominant-baseline="central">Asc</text>`:w.nothing} ${n.length?Zr(n,o,a,s+4,14):w.nothing}</g>`}function _t(o){let n=o.lagnaSign.toLowerCase();return w.svg`${Kt(o.divisionLabel)} ${W.map(e=>Bt(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,ut(e,o.lagnaSign)))}`}var E={tl:{x:G,y:G},tr:{x:ce-G,y:G},br:{x:ce-G,y:ce-G},bl:{x:G,y:ce-G},top:{x:Y,y:G},right:{x:ce-G,y:Y},bottom:{x:Y,y:ce-G},left:{x:G,y:Y},tlMid:{x:Y-Q/4,y:Y-Q/4},trMid:{x:Y+Q/4,y:Y-Q/4},brMid:{x:Y+Q/4,y:Y+Q/4},blMid:{x:Y-Q/4,y:Y+Q/4}};function ve(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 Yt={1:{x:Y,y:E.tlMid.y},2:ve([E.tl,E.top,E.tlMid]),3:ve([E.tl,E.left,E.tlMid]),4:{x:E.tlMid.x,y:Y},5:ve([E.bl,E.left,E.blMid]),6:ve([E.bl,E.bottom,E.blMid]),7:{x:Y,y:E.blMid.y},8:ve([E.br,E.bottom,E.brMid]),9:ve([E.br,E.right,E.brMid]),10:{x:E.brMid.x,y:Y},11:ve([E.tr,E.right,E.trMid]),12:ve([E.tr,E.top,E.trMid])};function Vt(o,n){let e=W.findIndex(r=>r===n);return e===-1?o:(e+o-1)%12+1}function qt(o){let{tl:n,tr:e,br:r,bl:t,top:a,right:s,bottom:i,left:l}=E;return w.svg`<rect class="line" x="${n.x}" y="${n.y}" width="${Q}" height="${Q}" stroke-width="1.5" fill="none"><polygon class="line" points="${a.x},${a.y} ${s.x},${s.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none"><line class="line" x1="${n.x}" y1="${n.y}" x2="${r.x}" y2="${r.y}" stroke-width="1"><line class="line" x1="${e.x}" y1="${e.y}" x2="${t.x}" y2="${t.y}" stroke-width="1">${o?w.svg`<text class="centre-label" x="${Y}" y="${Y}" text-anchor="middle" dominant-baseline="central">${o}</text>`:w.nothing}`}function Ft(o,n,e,r,t){let a=Yt[o];if(!a)return w.svg``;let s=Math.min(14,Math.abs(a.y-Y)*.45+6),i=s+12,l=t?`${n} \xB7 ${Pr[e]??e.slice(0,2)}`:`${n}`;return w.svg`<g class="${t?"cell lagna":"cell"}"><text class="rashi-num" x="${a.x}" y="${a.y-s}" text-anchor="middle" dominant-baseline="central">${l}</text>${t?w.svg`<text class="lagna-marker" x="${a.x}" y="${a.y-i}" text-anchor="middle" dominant-baseline="central">Asc</text>`:w.nothing} ${r.length?Zr(r,e,a.x,a.y+8,12):w.nothing}</g>`}function Ut(o){let n=o.lagnaSign||"Aries";return w.svg`${qt(o.divisionLabel)} ${Array.from({length:12},(e,r)=>{let t=r+1,a=Vt(t,n),s=W[a-1]??"Aries";return Ft(t,a,s,o.placements[s.toLowerCase()]??[],t===1)})}`}var Nr=Q/3;function Wt(){let o=G,n=G+Nr,e=G+2*Nr,r=ce-G,Lr={Aries:[{x:n,y:o},{x:e,y:o},{x:e,y:n},{x:n,y:n}],Taurus:[{x:o,y:o},{x:n,y:o},{x:n,y:n}],Gemini:[{x:o,y:o},{x:n,y:n},{x:o,y:n}],Cancer:[{x:o,y:n},{x:n,y:n},{x:n,y:e},{x:o,y:e}],Leo:[{x:o,y:e},{x:n,y:e},{x:o,y:r}],Virgo:[{x:n,y:e},{x:n,y:r},{x:o,y:r}],Libra:[{x:n,y:e},{x:e,y:e},{x:e,y:r},{x:n,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:n},{x:r,y:n},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:o},{x:r,y:n},{x:e,y:n}],Pisces:[{x:e,y:o},{x:r,y:o},{x:e,y:n}]},lr={};for(let[Cr,Tr]of Object.entries(Lr))lr[Cr]={points:[...Tr],centroid:ve(Tr)};return lr}var Jt=Wt();function Xt(o){let n=G,e=G+Nr,r=G+2*Nr,t=ce-G;return w.svg`<rect class="line" x="${n}" y="${n}" width="${Q}" height="${Q}" stroke-width="1.5" fill="none"><line class="line" x1="${n}" y1="${e}" x2="${e}" y2="${e}" stroke-width="1"><line class="line" x1="${r}" y1="${e}" x2="${t}" y2="${e}" stroke-width="1"><line class="line" x1="${n}" y1="${r}" x2="${e}" y2="${r}" stroke-width="1"><line class="line" x1="${r}" y1="${r}" x2="${t}" y2="${r}" stroke-width="1"><line class="line" x1="${e}" y1="${n}" x2="${e}" y2="${e}" stroke-width="1"><line class="line" x1="${e}" y1="${r}" x2="${e}" y2="${t}" stroke-width="1"><line class="line" x1="${r}" y1="${n}" x2="${r}" y2="${e}" stroke-width="1"><line class="line" x1="${r}" y1="${r}" x2="${r}" y2="${t}" stroke-width="1"><line class="line" x1="${n}" y1="${n}" x2="${e}" y2="${e}" stroke-width="1"><line class="line" x1="${t}" y1="${n}" x2="${r}" y2="${e}" stroke-width="1"><line class="line" x1="${t}" y1="${t}" x2="${r}" y2="${r}" stroke-width="1"><line class="line" x1="${n}" y1="${t}" x2="${e}" y2="${r}" stroke-width="1">${o?w.svg`<text class="centre-label" x="${Y}" y="${Y}" text-anchor="middle" dominant-baseline="central">${o}</text>`:w.nothing}`}function Zt(o,n,e,r){let t=Jt[o];if(!t)return w.svg``;let{centroid:a,points:s}=t,i=Pr[o]??o.slice(0,2),l=s.map(c=>`${c.x},${c.y}`).join(" ");return w.svg`<g class="${e?"cell lagna":"cell"}">${e?w.svg`<polygon class="lagna-bg" points="${l}">`:w.nothing}<text class="sign-text" x="${a.x}" y="${a.y-16}" text-anchor="middle" dominant-baseline="central">${i}</text>${r>0?w.svg`<text class="house-num" x="${a.x+18}" y="${a.y-16}" text-anchor="start" dominant-baseline="central">${r}</text>`:w.nothing} ${e?w.svg`<text class="lagna-marker" x="${a.x}" y="${a.y-30}" text-anchor="middle" dominant-baseline="central">Asc</text>`:w.nothing} ${n.length?Zr(n,o,a.x,a.y+4,12):w.nothing}</g>`}function Qt(o){let n=o.lagnaSign.toLowerCase();return w.svg`${Xt(o.divisionLabel)} ${W.map(e=>Zt(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,ut(e,o.lagnaSign)))}`}function Gr(o,n){switch(n){case"north":return Ut(o);case"east":return Qt(o);default:return _t(o)}}function Or(o,n){return er({items:Dt,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}var xt=require("lit"),Hr=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-fg,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-fg,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var $e=class extends ae.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 Dr(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return ae.html`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return ae.html`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?ae.html`<span class="division-meta">· ${r.sanskritName}</span>`:ae.nothing}</h2>${r.significance?ae.html`<p class="significance">${r.significance}</p>`:ae.nothing}</div>${Or(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>${Gr(e,this.chartStyle)}</svg> ${t&&t.length>0?ae.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(a=>ae.html`<span class="vargottama-pill" role="listitem">${B[a]??""} ${a}</span>`)}</div>`:ae.nothing}</div>`}};$e.styles=[y,Hr,Ge,ae.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})],$e.prototype,"data",2),d([(0,yr.property)({type:String,reflect:!0,attribute:"chart-style"})],$e.prototype,"chartStyle",2),$e=d([(0,yr.customElement)("roxy-divisional-chart")],$e);var q=require("lit"),hr=require("lit/decorators.js");var ea={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},we=class extends q.LitElement{constructor(){super();this.data=null;this.type="manglik";new u(this)}render(){let e=this.data;if(!e)return q.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 q.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?q.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>`:q.nothing} ${e.description?q.html`<p class="description">${e.description}</p>`:q.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?q.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>q.html`<li>${c}</li>`)}</ul></div>`:q.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?q.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>q.html`<li>${c}</li>`)}</ul></div>`:q.nothing}</article>`}renderEffects(e){if(!e.effects)return q.nothing;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?q.nothing:q.html`<div class="effects">${r.map(([t,a])=>q.html`<div><h3>${t}</h3><p>${a}</p></div>`)}</div>`}};we.styles=[y,q.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.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})],we.prototype,"data",2),d([(0,hr.property)({type:String,reflect:!0})],we.prototype,"type",2),we=d([(0,hr.customElement)("roxy-dosha-card")],we);var F=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 ee=class extends F.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[p,m]of Object.entries(i.properties)){let h=this.resolve(m,a)??{};s.push({name:p,type:this.fieldType(h),required:c.has(p),description:h.description,enum:h.enum,min:h.minimum,max:h.maximum,default:h.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let p=this.resolve(c.schema,a)??{};s.push({name:c.name,type:this.fieldType(p),required:!!c.required,description:p.description,enum:p.enum,default:p.default})}this.fields=s,this.hasLocation=s.some(c=>c.name==="latitude")&&s.some(c=>c.name==="longitude")&&s.some(c=>c.name==="timezone");let l={};for(let c of s)c.default!==void 0&&(l[c.name]=c.default);this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return F.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return F.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 F.nothing;let t=`roxy-form-${r.name}`;return F.html`<div class="field"><label for="${t}">${Ne(r.name)}${r.required?F.html`<span class="req" aria-hidden="true">*</span>`:F.nothing}</label> ${r.enum?F.html`<select id="${t}" ?required="${r.required}" @change="${a=>this.setValue(r.name,a.target.value)}"><option value="">Choose</option>${r.enum.map(a=>F.html`<option value="${a}" ?selected="${this.values[r.name]===a}">${a}</option>`)}</select>`:F.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?F.html`<small class="help">${r.description}</small>`:F.nothing}</div>`};return F.html`<form @submit="${this.onSubmit}"><h2 class="title">${Ne(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?F.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>`:F.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}}};ee.styles=[y,F.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-fg,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-fg,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([(0,le.property)({type:String,attribute:"data-endpoint"})],ee.prototype,"endpoint",2),d([(0,le.property)({type:String})],ee.prototype,"method",2),d([(0,le.property)({type:String,attribute:"spec-url"})],ee.prototype,"specUrl",2),d([(0,le.property)({type:String,attribute:"submit-label"})],ee.prototype,"submitLabel",2),d([(0,le.state)()],ee.prototype,"fields",2),d([(0,le.state)()],ee.prototype,"values",2),d([(0,le.state)()],ee.prototype,"hasLocation",2),d([(0,le.state)()],ee.prototype,"loaded",2),d([(0,le.state)()],ee.prototype,"specError",2),ee=d([(0,le.customElement)("roxy-endpoint-form")],ee);var U=require("lit"),Ir=require("lit/decorators.js");var Oe=class extends U.LitElement{constructor(){super();this.data=null;new u(this)}render(){let e=this.data;if(!e)return U.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(m=>m?.category!==void 0),t=e.total??0,a=e.maxScore??36,s=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",l=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,p=(100-s)*2.827;return U.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">${$(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?U.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${mt(e.percentage,1)}</small>`:U.nothing}</div>${e.recommendation?U.html`<span class="recommendation">${e.recommendation}</span>`:U.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},${p}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${r.length>0?U.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(m=>{let h=m.score??0,S=m.maxScore??ta(m.category),x=S?h/S*100:0;return U.html`<tr><td>${m.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${x}%"></span></div></td><td class="score">${$(h,1)} / ${S}</td></tr>`})}</tbody></table>`:U.nothing} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?U.html`<div class="tags">${e.doshas?.map(m=>U.html`<span class="dosha">${m}</span>`)} ${e.doshaCancellations?.map(m=>U.html`<span class="cancel" title="${m.reason}">${m.dosha} cancelled</span>`)}</div>`:U.nothing}</article>`}};Oe.styles=[y,U.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-fg,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],d([(0,Ir.property)({attribute:!1})],Oe.prototype,"data",2),Oe=d([(0,Ir.customElement)("roxy-guna-milan")],Oe);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 ke=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((p,m)=>{let h=l.length-1-m+1,S=c.has(h),x=p===6||p===8;return T.html`<div class="line ${`${x?"broken":"solid"}${S?" 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((p,m)=>p-m).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)}};ke.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-fg,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-fg,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-fg,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,ur.property)({attribute:!1})],ke.prototype,"data",2),d([(0,ur.property)({type:String,reflect:!0})],ke.prototype,"mode",2),ke=d([(0,ur.customElement)("roxy-hexagram")],ke);var k=require("lit"),xr=require("lit/decorators.js");var Se=class extends k.LitElement{constructor(){super();this.data=null;this.period="daily";new u(this)}render(){let e=this.data;if(!e)return k.html`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?te[L(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 k.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?k.html`<div class="date">${s}</div>`:k.nothing}</div>${a!==null?k.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>`:k.nothing}</header>${e.overview?k.html`<p class="overview">${e.overview}</p>`:k.nothing}<div class="sections">${e.love?k.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:k.nothing} ${e.career?k.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:k.nothing} ${e.health?k.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:k.nothing} ${e.finance?k.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:k.nothing} ${"advice"in e&&e.advice?k.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:k.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],m=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&p.length===0&&m.length===0?k.nothing:k.html`<div class="lucky">${i!==void 0?k.html`<span>Lucky number <strong>${i}</strong></span>`:k.nothing} ${l?k.html`<span>Lucky color <strong>${l}</strong></span>`:k.nothing} ${c.length?k.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:k.nothing} ${p.length?k.html`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:k.nothing} ${m.length?k.html`<span class="compat-wrap">Best with <span class="compat">${m.map(h=>k.html`<span>${h}</span>`)}</span></span>`:k.nothing}</div>`})()}</article>`}};Se.styles=[y,k.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-fg,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([(0,xr.property)({attribute:!1})],Se.prototype,"data",2),d([(0,xr.property)({type:String,reflect:!0})],Se.prototype,"period",2),Se=d([(0,xr.customElement)("roxy-horoscope-card")],Se);var N=require("lit"),rr=require("lit/decorators.js");var Le=class extends N.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 N.html`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return N.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?N.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?N.html`· ${r.nakshatra}`:N.nothing} ${r.subLord?N.html`· sub lord ${r.subLord}`:N.nothing} ${typeof r.kpNumber=="number"?N.html`· KP ${r.kpNumber}`:N.nothing}</div>`:N.nothing} ${typeof e.meta?.ayanamsa=="number"?N.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${$(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?N.html`· ${e.meta.houseSystem} houses`:N.nothing}</div>`:N.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>N.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?N.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=>N.html`<tr><td class="body">${r.name}${r.retrograde?N.html`<span class="retro">R</span>`:N.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>`:N.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?N.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=>N.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>`:N.html`<p class="roxy-empty" role="status">No cusps</p>`}};Le.styles=[y,N.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-fg,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([(0,rr.property)({attribute:!1})],Le.prototype,"data",2),d([(0,rr.state)()],Le.prototype,"activeTab",2),Le=d([(0,rr.customElement)("roxy-kp-chart")],Le);var de=require("lit"),jr=require("lit/decorators.js");var He=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: ${$(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>`}};He.styles=[y,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,jr.property)({attribute:!1})],He.prototype,"data",2),He=d([(0,jr.customElement)("roxy-kp-planets-table")],He);var re=require("lit"),Kr=require("lit/decorators.js");var Ie=class extends re.LitElement{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return re.html`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return re.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?re.html`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:re.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?re.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)=>re.html`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:re.nothing} ${r.length?re.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=>re.html`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:re.nothing}</div>`}};Ie.styles=[y,re.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-fg,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],d([(0,Kr.property)({attribute:!1})],Ie.prototype,"data",2),Ie=d([(0,Kr.customElement)("roxy-kp-ruling-planets")],Ie);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 X=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>`}};X.styles=[y,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-fg,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,ie.property)({type:String,attribute:"api-key"})],X.prototype,"apiKey",2),d([(0,ie.property)({type:String,attribute:"publishable-key"})],X.prototype,"publishableKey",2),d([(0,ie.property)({type:String})],X.prototype,"endpoint",2),d([(0,ie.property)({type:String})],X.prototype,"placeholder",2),d([(0,ie.property)({type:String,attribute:"default-value"})],X.prototype,"defaultValue",2),d([(0,ie.state)()],X.prototype,"query",2),d([(0,ie.state)()],X.prototype,"results",2),d([(0,ie.state)()],X.prototype,"isOpen",2),d([(0,ie.state)()],X.prototype,"isLoading",2),d([(0,ie.state)()],X.prototype,"highlight",2),X=d([(0,ie.customElement)("roxy-location-search")],X);var H=require("lit"),fr=require("lit/decorators.js");var Ce=class extends H.LitElement{constructor(){super();this.data=null;this.mode="current";new u(this)}render(){let e=this.data;if(!e)return H.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 H.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):H.nothing}renderSingle(e){let r=bt(e.phase);return H.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?H.html`<div class="date">${e.date}</div>`:H.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?H.html`<div><span>Illumination</span> <strong>${aa(e.illumination)}</strong></div>`:H.nothing} ${typeof e.age=="number"?H.html`<div><span>Age</span> <strong>${$(e.age,1)} days</strong></div>`:H.nothing} ${e.sign?H.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:H.nothing} ${typeof e.distance=="number"?H.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:H.nothing}</div>${e.meaning?.description?H.html`<p class="meaning">${e.meaning.description}</p>`:H.nothing} ${e.meaning?.keywords?.length?H.html`<div class="keywords">${e.meaning.keywords.map(t=>H.html`<span>${t}</span>`)}</div>`:H.nothing}</article>`}renderListItem(e){let r=bt(e.phase);return H.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};Ce.styles=[y,H.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})],Ce.prototype,"data",2),d([(0,fr.property)({type:String,reflect:!0})],Ce.prototype,"mode",2),Ce=d([(0,fr.customElement)("roxy-moon-phase")],Ce);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 O=require("lit"),Br=require("lit/decorators.js");var je=class extends O.LitElement{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return O.html`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return O.html`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?O.html`<span class="number">Nakshatra ${e.number} of 27</span>`:O.nothing} ${e.range?O.html`<span class="range">${e.range}</span>`:O.nothing}</header><dl class="facts">${e.lord?O.html`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:O.nothing} ${e.deity?O.html`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:O.nothing} ${e.symbol?O.html`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:O.nothing}</dl>${e.characteristics?O.html`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:O.nothing} ${r?O.html`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?O.html`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:O.nothing} ${r.gemstones?O.html`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:O.nothing} ${r.rituals?O.html`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:O.nothing}</div></div>`:O.nothing}</article>`}};je.styles=[y,O.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-fg,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],d([(0,Br.property)({attribute:!1})],je.prototype,"data",2),je=d([(0,Br.customElement)("roxy-nakshatra-card")],je);var g=require("lit"),We=require("lit/decorators.js");var rt=420,b=rt/2,tr=164,et=146,br=120,ar=96,sa=178,oa=196,ye=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>${er({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="${b}" cy="${b}" r="${tr}" stroke-width="1.5"/><circle class="wheel-line" cx="${b}" cy="${b}" r="${et-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${b}" cy="${b}" r="${br}" stroke-width="1"/><circle class="wheel-line" cx="${b}" cy="${b}" 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=>L(s.name)),a=new Map;for(let s of r){let i=[L(s.planet1),L(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=B[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=B[s]??s.slice(0,2);return g.html`<tr><th scope="row" title="${s}">${l}</th>${t.slice(0,i+1).map(c=>{let p=a.get([s,c].sort().join("|"));if(!p)return g.html`<td class="empty"></td>`;let m=Xe(p),h=Ur[m]??Ur[m.replace(/-/g,"")]??m.slice(0,3),S=cr[m]??"aspect-other",x=$(p.orb,1);return g.html`<td class="${`cell ${S}`}" title="${`${s} ${m} ${c}${x?` (orb ${x}\xB0)`:""}`}"><span class="asp">${h}</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=D(b,b,tr,t),s=D(b,b,sa,t),i=D(b,b,oa,t);return g.svg`<g><line class="angle-tick" x1="${a.x}" y1="${a.y}" x2="${s.x}" y2="${s.y}"><text class="angle-marker" x="${i.x}" y="${i.y}" text-anchor="middle" dominant-baseline="central">${r}</text></g>`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,a)=>this.getAscendant()+a*30)).map(t=>{let a=this.toAngle(t),s=D(b,b,br,a),i=D(b,b,tr,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 W.map((e,r)=>{let t=this.toAngle(r*30+15),a=D(b,b,et,t);return g.svg`<text class="sign-glyph" x="${a.x}" y="${a.y}" text-anchor="middle" dominant-baseline="central">${te[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,a)=>{let s=e[(a+1)%12],i=yt(t.longitude,s?s.longitude:t.longitude+30),l=D(b,b,br-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=D(b,b,br-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?et-14:tr-5,i=D(b,b,s,t),l=D(b,b,tr,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=D(b,b,br+9,t),s=ge(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:me(s.longitude),displayLon:me(s.longitude)})).sort((s,i)=>s.trueLon-i.trueLon);for(let s=1;s<t.length;s++){let i=t[s-1],l=t[s];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let a=t[t.length-1];if(a&&a.displayLon>360){let s=a.displayLon-360;for(let i of t)i.displayLon-=s}return t.map(({p:s,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),p=this.toAngle(l),m=D(b,b,ar,p),h=D(b,b,ar-13,p),S=D(b,b,tr-4,c),x=D(b,b,ar+8,p),Ve=B[L(s.name)]??s.name.slice(0,2),Lr=ge(s.longitude),lr=s.isRetrograde===!0,Cr=`${Lr.degree}\xB0${String(Lr.minute).padStart(2,"0")}'`,Tr=Math.abs(l-i)>.5;return g.svg`<g>${Tr?g.svg`<line class="planet-leader" x1="${S.x}" y1="${S.y}" x2="${x.x}" y2="${x.y}">`:g.nothing}<text class="planet-glyph" x="${m.x}" y="${m.y}" text-anchor="middle" dominant-baseline="central"><title>${s.name}${lr?" retrograde":""} - ${Cr} ${s.sign??""}</title>${Ve}</text><text class="planet-deg" x="${h.x}" y="${h.y}" text-anchor="middle" dominant-baseline="central">${Cr}${lr?g.svg`<tspan class="retro">℞</tspan>`:g.nothing}</text></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=B[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=W,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=a.indexOf(L(i.sign??""));if(l<0)continue;let c=r[l%4],p=t[l%3],m=B[L(i.name)]??L(i.name).slice(0,2);s[c]?.[p]?.push(m)}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,p)=>c+(s[i]?.[p]?.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=B[L(r.name)]??"",i=$(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> ${Ze()}</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=L(a.name);s&&t.set(s,a.longitude)}return r.map(a=>{let s=t.get(L(a.planet1)),i=t.get(L(a.planet2));if(s===void 0||i===void 0)return g.nothing;let l=D(b,b,ar-18,this.toAngle(s)),c=D(b,b,ar-18,this.toAngle(i)),p=Xe(a),m=cr[p]??"aspect-other",h=$(a.orb,1);return g.svg`<line class="${`aspect ${m}`}" x1="${l.x}" y1="${l.y}" x2="${c.x}" y2="${c.y}"><title>${a.planet1} ${p||""} ${a.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}};ye.styles=[y,Ge,Qe,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-fg,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-fg,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-fg,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-fg,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-fg,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([(0,We.property)({attribute:!1})],ye.prototype,"data",2),d([(0,We.property)({type:String,attribute:"house-system",reflect:!0})],ye.prototype,"houseSystem",2),d([(0,We.state)()],ye.prototype,"view",2),ye=d([(0,We.customElement)("roxy-natal-chart")],ye);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>${Ne(a)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:R.nothing}</article>`}};Te.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-fg,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-fg,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([(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 I=require("lit"),$r=require("lit/decorators.js");var Re=class extends I.LitElement{constructor(){super();this.data=null;this.detail="detailed";new u(this)}render(){let e=this.data;if(!e)return I.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?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],s=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],i=r&&"transitions"in r?r.transitions:void 0;return I.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(([l,c])=>I.html`<tr><th>${l}</th><td>${c}</td></tr>`)} ${r?.sunrise?I.html`<tr><th>Sunrise</th><td>${pe(r.sunrise)}</td></tr>`:I.nothing} ${r?.sunset?I.html`<tr><th>Sunset</th><td>${pe(r.sunset)}</td></tr>`:I.nothing} ${r?.moonrise?I.html`<tr><th>Moonrise</th><td>${pe(r.moonrise)}</td></tr>`:I.nothing} ${r?.moonset?I.html`<tr><th>Moonset</th><td>${pe(r.moonset)}</td></tr>`:I.nothing}</tbody></table>${i?I.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",i.tithi)} ${this.renderTransitionRow("Nakshatra",i.nakshatra)} ${this.renderTransitionRow("Yoga",i.yoga)} ${this.renderTransitionRow("Karana",i.karana)}</tbody></table>`:I.nothing} ${this.detail==="detailed"&&(a.some(l=>!!l[1])||s.some(l=>!!l[1]))?I.html`<div class="section">Auspicious muhurtas</div><table><tbody>${a.filter(([,l])=>!!l).map(([l,c])=>I.html`<tr><th>${l}</th><td>${Jr(c)}</td></tr>`)}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${s.filter(([,l])=>!!l).map(([l,c])=>I.html`<tr><th>${l}</th><td>${Jr(c)}</td></tr>`)}</tbody></table>`:I.nothing}</div>`}renderTransitionRow(e,r){if(!r?.endsAt)return I.nothing;let t=pe(r.endsAt),a=r.next?` \u2192 ${r.next}`:"";return I.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)}};Re.styles=[y,I.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 se=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)"}],Ke=class extends se.LitElement{constructor(){super();this.data=null;new u(this)}render(){if(!this.data?.planets?.length)return se.html`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return se.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=>se.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=B[L(e.planet)]??"",t=tt.map(p=>Math.max(0,e[p.key])),a=t.reduce((p,m)=>p+m,0),s=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,i=s?"adequacy-badge--adequate":"adequacy-badge--weak",l=s?"adequate":"weak",c=$(e.totalRupas,2)&&$(e.minRequired,2)?`${$(e.totalRupas,2)} / ${$(e.minRequired,2)} R`:"";return se.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((p,m)=>{let h=t[m];if(h<=0)return se.nothing;let S=h/a*100;return se.html`<div class="bar-segment" style="flex-grow:${S};background:${p.color}" title="${p.label}: ${$(h,1)}"></div>`}):se.nothing}</div></div><div class="pills">${c?se.html`<span class="rupas-label">${c}</span>`:se.nothing} <span class="${`adequacy-badge ${i}`}">${l}</span></div></div>`}};Ke.styles=[y,se.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-fg,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],d([(0,_r.property)({attribute:!1})],Ke.prototype,"data",2),Ke=d([(0,_r.customElement)("roxy-shadbala-table")],Ke);var f=require("lit"),Yr=require("lit/decorators.js");var ot=360,K=ot/2,at=170,la=154,st=124,sr=96,Be=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,p=a?.overall,m=a?.strengths??[],h=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="${K}" cy="${K}" r="${at}" stroke-width="1.5"/><circle class="wheel-line" cx="${K}" cy="${K}" r="${sr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${K}" cy="${K}" 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>${p?f.html`<p class="summary">${p}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${m.length>0||h.length>0?f.html`<div class="lists">${m.length?f.html`<div><h3>Strengths</h3><ul>${m.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${h.length?f.html`<div><h3>Challenges</h3><ul>${h.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>${p?f.html`<p class="summary">${p}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${m.length>0||h.length>0?f.html`<div class="lists">${m.length?f.html`<div><h3>Strengths</h3><ul>${m.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${h.length?f.html`<div><h3>Challenges</h3><ul>${h.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=D(K,K,sr-14,t),s=D(K,K,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 W.map((e,r)=>{let t=this.toAngle(r*30+15),a=D(K,K,la,t);return f.svg`<text class="sign" x="${a.x}" y="${a.y}" text-anchor="middle" dominant-baseline="central">${te[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=D(K,K,r,i),p=D(K,K,r+(a===1?-12:-10),i),m=B[L(s.name)]??s.name.slice(0,2),h=ge(s.longitude),S=s.isRetrograde===!0,x=`${h.degree}\xB0${String(h.minute).padStart(2,"0")}'`,Ve=`${s.name}${S?" retrograde":""} - ${x} ${h.sign}`;return f.svg`<g><text class="${t}" x="${l.x}" y="${l.y}" text-anchor="middle" dominant-baseline="central"><title>${Ve}</title>${m}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${a}</tspan></text><text class="planet-deg" x="${p.x}" y="${p.y}" text-anchor="middle" dominant-baseline="central">${h.degree}°${S?f.svg`<tspan class="retro">℞</tspan>`:f.nothing}</text></g>`})}renderAscendants(e){let r=[],t=(a,s)=>{if(!a)return;let i=W.findIndex(S=>S.toLowerCase()===a.sign.toLowerCase());if(i===-1)return;let l=i*30+a.degree,c=this.toAngle(l),p=s===1?st+14:sr+14,m=D(K,K,p,c),h=D(K,K,at+14,c);r.push(f.svg`<g><line class="asc-tick" x1="${m.x}" y1="${m.y}" x2="${h.x}" y2="${h.y}"><text class="asc-label" x="${h.x}" y="${h.y}" text-anchor="middle" dominant-baseline="central">Asc${s}</text></g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=L(i);for(let c of s)if(L(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=D(K,K,st-12,this.toAngle(i)),p=D(K,K,sr+8,this.toAngle(l)),m=Xe(s),h=cr[m]??"aspect-other",S=$(s.orb,1);return f.svg`<line class="${`aspect ${h}`}" x1="${c.x}" y1="${c.y}" x2="${p.x}" y2="${p.y}"><title>${s.planet1} ${m} ${s.planet2}${S?` (orb ${S}\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>${Xe(r)||""}</td><td class="orb">${$(r.orb,1)}</td><td>${da(r.strength)}</td></tr>`)}</tbody></table>`}};Be.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-fg,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-fg,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-fg,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-fg,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],d([(0,Yr.property)({attribute:!1})],Be.prototype,"data",2),Be=d([(0,Yr.customElement)("roxy-synastry-chart")],Be);function da(o){return typeof o=="number"?Math.round(o).toString():""}var A=require("lit"),or=require("lit/decorators.js");var Pe=class extends A.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):A.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 A.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?A.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:A.html`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?A.html`${r.arcana} arcana`:A.nothing} ${t?A.html`· reversed`:A.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?A.html`<p class="message">${e.dailyMessage}</p>`:A.nothing} ${r.meaning?A.html`<p>${r.meaning}</p>`:A.nothing} ${a.length>0?A.html`<div class="chips">${a.map(s=>A.html`<span>${s}</span>`)}</div>`:A.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,a=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return A.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?A.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:A.html`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?A.html`${e.arcana} arcana`:A.nothing} ${e.number!==void 0&&e.number!==null?A.html`· ${e.number}`:A.nothing} ${r?A.html`· reversed`:A.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?A.html`<p>${t.description}</p>`:A.nothing} ${a.length>0?A.html`<div class="chips">${a.map(s=>A.html`<span>${s}</span>`)}</div>`:A.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};Pe.styles=[y,A.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-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})],Pe.prototype,"data",2),d([(0,or.state)()],Pe.prototype,"flipped",2),Pe=d([(0,or.customElement)("roxy-tarot-card")],Pe);var P=require("lit"),wr=require("lit/decorators.js");var Ae=class extends P.LitElement{constructor(){super();this.data=null;this.spread="three-card";new u(this)}render(){let e=this.data;if(!e)return P.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," "),p="question"in e?e.question:void 0,m="summary"in e?e.summary:void 0,h=r?e.interpretation:void 0,S=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return P.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?P.html`<span class="question">"${p}"</span>`:P.nothing}</header>${r?P.html`<div><span class="${`answer ${S}`}">${i}</span> ${l?P.html`<small>· ${l}</small>`:P.nothing}</div>`:P.nothing} ${a.length>0?P.html`<div class="grid">${a.map(x=>P.html`<div class="card"><p class="label">${x.name??""}</p><div class="image">${x.card?.imageUrl?P.html`<img src="${x.card.imageUrl}" alt="${x.card.name??"tarot card"}" class="${x.card.reversed?"reversed":""}">`:P.html`${x.card?.name??"?"}`}</div><p class="name">${x.card?.name??""} ${x.card?.reversed?P.html`<small>(reversed)</small>`:P.nothing}</p>${x.interpretation?P.html`<p class="interp">${x.interpretation}</p>`:P.nothing}</div>`)}</div>`:P.nothing} ${s.length>0?P.html`<div class="grid">${s.map(x=>P.html`<div class="card"><div class="image">${x.imageUrl?P.html`<img src="${x.imageUrl}" alt="${x.name??"tarot card"}" class="${x.reversed?"reversed":""}">`:P.html`${x.name??"?"}`}</div><p class="name">${x.name??""} ${x.reversed?P.html`<small>(reversed)</small>`:P.nothing}</p>${x.meaning?P.html`<p class="interp">${x.meaning}</p>`:P.nothing}</div>`)}</div>`:P.nothing} ${m?P.html`<p class="reading">${m}</p>`:P.nothing} ${h?P.html`<p class="reading">${h}</p>`:P.nothing}</article>`}};Ae.styles=[y,P.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})],Ae.prototype,"data",2),d([(0,wr.property)({type:String,reflect:!0})],Ae.prototype,"spread",2),Ae=d([(0,wr.customElement)("roxy-tarot-spread")],Ae);var M=require("lit"),nr=require("lit/decorators.js");var ze=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`${er({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${l})`}],active:c,onSelect:p=>{this.tab=p},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?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=B[L(r.name)]??"",a=te[L(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">${$(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${$(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=B[L(r.transitPlanet)]??"",s=B[L(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return M.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${a}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${$(r.orb,2)}° · strength ${$(r.strength,1)} </span>${Ze()}</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(m=>M.html`<span class="kw">${m}</span>`)}</div>`:M.nothing}</div></details>`})}</div>`}};ze.styles=[y,Ge,Qe,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-fg,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([(0,nr.property)({attribute:!1})],ze.prototype,"data",2),d([(0,nr.state)()],ze.prototype,"tab",2),ze=d([(0,nr.customElement)("roxy-transits-table")],ze);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?Dr(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>${Or(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>${Gr(e,this.chartStyle)}</svg></div>`:kr.html`<div class="roxy-empty" role="status">No kundli data</div>`}};Me.styles=[y,Hr,Ge],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 oe=require("lit"),Vr=require("lit/decorators.js");var ca=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],_e=class extends oe.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 oe.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return oe.html`<div class="wrap" aria-label="Vedic planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let a=(t.graha??r)==="Lagna",s=B[L(t.graha??r)]??"",i=te[L(t.rashi??"")]??"";return oe.html`<tr class="${a?"lagna":""}"><td class="graha">${s?oe.html`<span class="glyph">${s}</span>`:oe.nothing}${t.graha??r}</td><td>${i?oe.html`<span class="glyph">${i}</span>`:oe.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Er(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?oe.html`<span class="retro">R</span>`:oe.nothing}</td></tr>`})}</tbody></table></div>`}};_e.styles=[y,oe.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:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-fg,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],d([(0,Vr.property)({attribute:!1})],_e.prototype,"data",2),_e=d([(0,Vr.customElement)("roxy-vedic-planets-table")],_e);var Z=require("lit"),qr=require("lit/decorators.js");var Ye=class extends Z.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 Z.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return Z.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=B[L(r.name)]??"",a=te[L(r.sign??"")]??"",s=typeof r.speed=="number"?$(r.speed,3):"";return Z.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?Z.html`<span class="glyph">${t}</span>`:Z.nothing}${r.name}</td><td>${a?Z.html`<span class="glyph">${a}</span>`:Z.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Er(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${s?Z.html`${s}°/day`:Z.nothing} ${r.isRetrograde?Z.html`<span class="retro">℞</span>`:Z.nothing}</td></tr>`})}</tbody></table></div>`}};Ye.styles=[y,Z.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,qr.property)({attribute:!1})],Ye.prototype,"data",2),Ye=d([(0,qr.customElement)("roxy-western-planets-table")],Ye);var j=require("lit"),ir=require("lit/decorators.js");var Ee=class extends j.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 j.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return j.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):j.nothing}</p>${e.description?j.html`<p class="description">${e.description}</p>`:j.nothing} ${e.result?j.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:j.nothing}</div>`}render(){if(!this.data)return j.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 j.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,p=r?c.filter(h=>h.name.toLowerCase().includes(r)):c,m=e.total;return j.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${m!==void 0?j.html`<span class="count">${m} total</span>`:j.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(h=>this.renderDetailCard(h)):j.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 j.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?j.html`<span class="count">${l} total</span>`:j.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=>j.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):j.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return j.html`<div class="roxy-empty" role="status">No yoga data</div>`}};Ee.styles=[y,j.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-fg,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([(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.6.0";var pa=Fr.map(o=>o.slug);
|
|
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
|
+
<rect class="line" x=${n} y=${n} width=${ee} height=${ee} stroke-width="1.5" fill="none" />
|
|
3
|
+
<line class="line" x1=${n} y1=${e} x2=${a} y2=${e} stroke-width="1" />
|
|
4
|
+
<line class="line" x1=${n} y1=${t} x2=${a} y2=${t} stroke-width="1" />
|
|
5
|
+
<line class="line" x1=${e} y1=${n} x2=${e} y2=${a} stroke-width="1" />
|
|
6
|
+
<line class="line" x1=${t} y1=${n} x2=${t} y2=${a} stroke-width="1" />
|
|
7
|
+
<line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
8
|
+
<line class="line" x1=${t} y1=${r} x2=${a} y2=${r} stroke-width="1" />
|
|
9
|
+
<line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
|
|
10
|
+
<line class="line" x1=${r} y1=${t} x2=${r} y2=${a} stroke-width="1" />
|
|
11
|
+
${o?S.svg`<text class="centre-label" x=${q} y=${q} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
|
|
12
|
+
`}function ut(o,n){let e=J.findIndex(t=>t===n),r=J.findIndex(t=>t===o);return e===-1||r===-1?0:(r-e+12)%12+1}function Bt(o,n,e,r){let t=jt(o),a=t.x+t.w/2,s=t.y+t.h/2,i=Rr[o]??o.slice(0,2),l=14;return S.svg`
|
|
13
|
+
<g class=${e?"cell lagna":"cell"}>
|
|
14
|
+
${e?S.svg`
|
|
15
|
+
<rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
|
|
16
|
+
<line class="lagna-slash" x1=${t.x+t.w-l} y1=${t.y+l} x2=${t.x+l} y2=${t.y+t.h-l} stroke-width="1.2" />
|
|
17
|
+
`:S.nothing}
|
|
18
|
+
<text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
|
|
19
|
+
${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
|
+
${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?Zr(n,o,a,s+4,14):S.nothing}
|
|
22
|
+
</g>
|
|
23
|
+
`}function _t(o){let n=o.lagnaSign.toLowerCase();return S.svg`
|
|
24
|
+
${Kt(o.divisionLabel)}
|
|
25
|
+
${J.map(e=>Bt(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,ut(e,o.lagnaSign)))}
|
|
26
|
+
`}var E={tl:{x:O,y:O},tr:{x:ce-O,y:O},br:{x:ce-O,y:ce-O},bl:{x:O,y:ce-O},top:{x:q,y:O},right:{x:ce-O,y:q},bottom:{x:q,y:ce-O},left:{x:O,y:q},tlMid:{x:q-ee/4,y:q-ee/4},trMid:{x:q+ee/4,y:q-ee/4},brMid:{x:q+ee/4,y:q+ee/4},blMid:{x:q-ee/4,y:q+ee/4}};function $e(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 Yt={1:{x:q,y:E.tlMid.y},2:$e([E.tl,E.top,E.tlMid]),3:$e([E.tl,E.left,E.tlMid]),4:{x:E.tlMid.x,y:q},5:$e([E.bl,E.left,E.blMid]),6:$e([E.bl,E.bottom,E.blMid]),7:{x:q,y:E.blMid.y},8:$e([E.br,E.bottom,E.brMid]),9:$e([E.br,E.right,E.brMid]),10:{x:E.brMid.x,y:q},11:$e([E.tr,E.right,E.trMid]),12:$e([E.tr,E.top,E.trMid])};function qt(o,n){let e=J.findIndex(r=>r===n);return e===-1?o:(e+o-1)%12+1}function Vt(o){let{tl:n,tr:e,br:r,bl:t,top:a,right:s,bottom:i,left:l}=E;return S.svg`
|
|
27
|
+
<rect class="line" x=${n.x} y=${n.y} width=${ee} height=${ee} stroke-width="1.5" fill="none" />
|
|
28
|
+
<polygon class="line" points="${a.x},${a.y} ${s.x},${s.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
|
|
29
|
+
<line class="line" x1=${n.x} y1=${n.y} x2=${r.x} y2=${r.y} stroke-width="1" />
|
|
30
|
+
<line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
|
|
31
|
+
${o?S.svg`<text class="centre-label" x=${q} y=${q} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
|
|
32
|
+
`}function Ft(o,n,e,r,t){let a=Yt[o];if(!a)return S.svg``;let s=Math.min(14,Math.abs(a.y-q)*.45+6),i=s+12,l=t?`${n} \xB7 ${Rr[e]??e.slice(0,2)}`:`${n}`;return S.svg`
|
|
33
|
+
<g class=${t?"cell lagna":"cell"}>
|
|
34
|
+
<text class="rashi-num" x=${a.x} y=${a.y-s} text-anchor="middle" dominant-baseline="central">${l}</text>
|
|
35
|
+
${t?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?Zr(r,e,a.x,a.y+8,12):S.nothing}
|
|
37
|
+
</g>
|
|
38
|
+
`}function Ut(o){let n=o.lagnaSign||"Aries";return S.svg`
|
|
39
|
+
${Vt(o.divisionLabel)}
|
|
40
|
+
${Array.from({length:12},(e,r)=>{let t=r+1,a=qt(t,n),s=J[a-1]??"Aries";return Ft(t,a,s,o.placements[s.toLowerCase()]??[],t===1)})}
|
|
41
|
+
`}var Mr=ee/3;function Wt(){let o=O,n=O+Mr,e=O+2*Mr,r=ce-O,Lr={Aries:[{x:n,y:o},{x:e,y:o},{x:e,y:n},{x:n,y:n}],Taurus:[{x:o,y:o},{x:n,y:o},{x:n,y:n}],Gemini:[{x:o,y:o},{x:n,y:n},{x:o,y:n}],Cancer:[{x:o,y:n},{x:n,y:n},{x:n,y:e},{x:o,y:e}],Leo:[{x:o,y:e},{x:n,y:e},{x:o,y:r}],Virgo:[{x:n,y:e},{x:n,y:r},{x:o,y:r}],Libra:[{x:n,y:e},{x:e,y:e},{x:e,y:r},{x:n,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:n},{x:r,y:n},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:o},{x:r,y:n},{x:e,y:n}],Pisces:[{x:e,y:o},{x:r,y:o},{x:e,y:n}]},lr={};for(let[Cr,Pr]of Object.entries(Lr))lr[Cr]={points:[...Pr],centroid:$e(Pr)};return lr}var Jt=Wt();function Xt(o){let n=O,e=O+Mr,r=O+2*Mr,t=ce-O;return S.svg`
|
|
42
|
+
<rect class="line" x=${n} y=${n} width=${ee} height=${ee} stroke-width="1.5" fill="none" />
|
|
43
|
+
<line class="line" x1=${n} y1=${e} x2=${e} y2=${e} stroke-width="1" />
|
|
44
|
+
<line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
|
|
45
|
+
<line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
46
|
+
<line class="line" x1=${r} y1=${r} x2=${t} y2=${r} stroke-width="1" />
|
|
47
|
+
<line class="line" x1=${e} y1=${n} x2=${e} y2=${e} stroke-width="1" />
|
|
48
|
+
<line class="line" x1=${e} y1=${r} x2=${e} y2=${t} stroke-width="1" />
|
|
49
|
+
<line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
|
|
50
|
+
<line class="line" x1=${r} y1=${r} x2=${r} y2=${t} stroke-width="1" />
|
|
51
|
+
<line class="line" x1=${n} y1=${n} x2=${e} y2=${e} stroke-width="1" />
|
|
52
|
+
<line class="line" x1=${t} y1=${n} x2=${r} y2=${e} stroke-width="1" />
|
|
53
|
+
<line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
|
|
54
|
+
<line class="line" x1=${n} y1=${t} x2=${e} y2=${r} stroke-width="1" />
|
|
55
|
+
${o?S.svg`<text class="centre-label" x=${q} y=${q} text-anchor="middle" dominant-baseline="central">${o}</text>`:S.nothing}
|
|
56
|
+
`}function Zt(o,n,e,r){let t=Jt[o];if(!t)return S.svg``;let{centroid:a,points:s}=t,i=Rr[o]??o.slice(0,2),l=s.map(c=>`${c.x},${c.y}`).join(" ");return S.svg`
|
|
57
|
+
<g class=${e?"cell lagna":"cell"}>
|
|
58
|
+
${e?S.svg`<polygon class="lagna-bg" points=${l} />`:S.nothing}
|
|
59
|
+
<text class="sign-text" x=${a.x} y=${a.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
|
|
60
|
+
${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
|
+
${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?Zr(n,o,a.x,a.y+4,12):S.nothing}
|
|
63
|
+
</g>
|
|
64
|
+
`}function Qt(o){let n=o.lagnaSign.toLowerCase();return S.svg`
|
|
65
|
+
${Xt(o.divisionLabel)}
|
|
66
|
+
${J.map(e=>Zt(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,ut(e,o.lagnaSign)))}
|
|
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`
|
|
68
|
+
<g>
|
|
69
|
+
<line class="angle-tick" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />
|
|
70
|
+
<text class="angle-marker" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r}</text>
|
|
71
|
+
</g>
|
|
72
|
+
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,a)=>this.getAscendant()+a*30)).map(t=>{let a=this.toAngle(t),s=G(v,v,br,a),i=G(v,v,tr,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 J.map((e,r)=>{let t=this.toAngle(r*30+15),a=G(v,v,et,t);return g.svg`<text class="sign-glyph" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${ae[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,a)=>{let s=e[(a+1)%12],i=yt(t.longitude,s?s.longitude:t.longitude+30),l=G(v,v,br-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(v,v,br-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?et-14:tr-5,i=G(v,v,s,t),l=G(v,v,tr,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(v,v,br+9,t),s=ge(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:me(s.longitude),displayLon:me(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(v,v,ar,m),y=G(v,v,ar-13,m),C=G(v,v,tr-4,c),x=G(v,v,ar+8,m),Ve=K[k(s.name)]??s.name.slice(0,2),Lr=ge(s.longitude),lr=s.isRetrograde===!0,Cr=`${Lr.degree}\xB0${String(Lr.minute).padStart(2,"0")}'`,Pr=Math.abs(l-i)>.5;return g.svg`<g>
|
|
73
|
+
${Pr?g.svg`<line class="planet-leader" x1=${C.x} y1=${C.y} x2=${x.x} y2=${x.y} />`:g.nothing}
|
|
74
|
+
<text class="planet-glyph" x=${p.x} y=${p.y} text-anchor="middle" dominant-baseline="central"><title>${s.name}${lr?" retrograde":""} - ${Cr} ${s.sign??""}</title>${Ve}</text>
|
|
75
|
+
<text class="planet-deg" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">${Cr}${lr?g.svg`<tspan class="retro"> ℞</tspan>`:g.nothing}</text>
|
|
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>${Ve}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${a}</tspan></text>
|
|
78
|
+
<text class="planet-deg" x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${y.degree}°${C?f.svg`<tspan class="retro"> ℞</tspan>`:f.nothing}</text>
|
|
79
|
+
</g>`})}renderAscendants(e){let r=[],t=(a,s)=>{if(!a)return;let i=J.findIndex(C=>C.toLowerCase()===a.sign.toLowerCase());if(i===-1)return;let l=i*30+a.degree,c=this.toAngle(l),m=s===1?st+14:sr+14,p=G(_,_,m,c),y=G(_,_,at+14,c);r.push(f.svg`<g>
|
|
80
|
+
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${y.x} y2=${y.y} />
|
|
81
|
+
<text class="asc-label" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
|
|
82
|
+
</g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=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);
|
|
2
83
|
//# sourceMappingURL=index.cjs.map
|