@roxyapi/ui 0.12.2 → 0.12.3

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/dist/index.js CHANGED
@@ -13,7 +13,7 @@ var Ps=Object.defineProperty;var Ns=Object.getOwnPropertyDescriptor;var d=(n,a,e
13
13
  ${vo(n.activeChannels,n.activeGates)}
14
14
  ${ko(n.definedCenters)}
15
15
  ${So(n.activeGates,n.gateTitles)}
16
- `}var Wr=class extends m{renderEmpty(){return ze`<div class="roxy-empty" role="status">No bodygraph data</div>`}renderData(a){let e=new Set((a.centers??[]).filter(o=>o.defined).map(o=>o.id)),r=new Set((a.gates??[]).map(o=>o.gate).filter(o=>o!=null)),t=new Set((a.channels??[]).map(o=>ps(o.gateA,o.gateB))),s=this.buildGateTitles(a.gates??[]);return ze`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${a.type?ze`<div class="type-line">${a.type}${a.profile?ze`· Profile ${a.profile}`:rr}</div>`:rr}</header><div class="layout"><svg viewBox="${ms}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${gs({definedCenters:e,activeChannels:t,activeGates:r,gateTitles:s})}</svg> ${this.renderSummary(a)}</div></div>`}buildGateTitles(a){let e=new Map;for(let r of a){if(r.gate==null)continue;let t=[`Gate ${r.gate}`];r.line!=null&&(t[0]+=`.${r.line}`),r.gateName&&t.push(r.gateName);let s=r.planet?u(r.planet):"",o=s?v[s]??s:"";o&&t.push(`${o} ${r.side??""}`.trim()),e.set(r.gate,t.join(" \xB7 "))}return e}renderSummary(a){let e=[{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile},{label:"Definition",value:a.definition}],r=a.incarnationCross;return ze`<div class="summary"><div class="facts">${e.map(t=>t.value?ze`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:rr)}</div>${r?.name?ze`<p class="cross">${r.name} ${r.gates?.length?ze`<span class="gates">(${r.gates.join(", ")})</span>`:rr}</p>`:rr} ${a.signature||a.notSelf?ze`<div class="themes">${a.signature?ze`<span class="pill pill--good">Signature: ${a.signature}</span>`:rr} ${a.notSelf?ze`<span class="pill pill--shadow">Not-self: ${a.notSelf}</span>`:rr}</div>`:rr}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};Wr.styles=[y,Ro`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:var(--roxy-chart-max-width,340px);height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],Wr=d([Co("roxy-bodygraph")],Wr);import{css as Mo,html as ar,nothing as Tt}from"lit";import{customElement as To}from"lit/decorators.js";function ys(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var Jr=class extends m{isCurrent(a){let e=Date.now(),r=Date.parse(a.start),t=Date.parse(a.end);return Number.isNaN(r)||Number.isNaN(t)?!1:e>=r&&e<t}renderTile(a){let e=a.effect==="Good"?"good":a.effect==="Bad"?"bad":"neutral",r=this.isCurrent(a),t=v[u(a.lord)]??"",s=`${ys(a.start)} - ${ys(a.end)}`;return ar`<div class="cho-tile ${e}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${a.name}${r?ar`<span class="now-badge">Now</span>`:Tt} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?ar`<span aria-hidden="true">${t}</span>`:Tt} ${a.lord}</span></div>`}renderEmpty(){return ar`<div class="roxy-empty" role="status">No choghadiya data</div>`}renderData(a){let{date:e,dayChoghadiya:r,nightChoghadiya:t}=a;return ar`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?ar`<p class="subtitle">${e}</p>`:Tt}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(s=>this.renderTile(s)):ar`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(s=>this.renderTile(s)):ar`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Jr.styles=[y,Mo`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],Jr=d([To("roxy-choghadiya-grid")],Jr);import{css as zo,html as V,nothing as he}from"lit";import{customElement as Ao,property as Eo}from"lit/decorators.js";var hr=class extends m{constructor(){super(...arguments);this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,s]of Object.entries(e.categories))typeof s=="number"&&Number.isFinite(s)&&(r[t]=s);return r}return{}}renderEmpty(){return V`<div class="roxy-empty" role="status">No compatibility data</div>`}renderData(e){let r=e.overallScore,t=this.getBreakdown(),s="rating"in e?e.rating:void 0,o="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,p="strengths"in e?e.strengths:void 0,g="challenges"in e?e.challenges:void 0,x="keyAspects"in e?e.keyAspects:void 0;return V`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?V`<div class="score">${h(r,0)}</div>`:he} ${s?V`<div class="rating">${s}</div>`:he}</div></div>${Object.keys(t).length>0?V`<div role="list">${Object.entries(t).map(([f,L])=>V`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${f}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,L))}%"></span></span> <span>${h(L,0)}</span></div>`)}</div>`:he} ${o?V`<p><span class="archetype">${o.label}</span> ${o.description?V`· ${o.description}`:he}</p>`:he} ${l?V`<p>${l}</p>`:he} ${c&&!l?V`<p>${c}</p>`:he} ${i?V`<p>${i}</p>`:he} ${(p?.length??0)>0||(g?.length??0)>0?V`<div class="lists">${p?.length?V`<div><h3>Strengths</h3><ul>${p.map(f=>V`<li>${f}</li>`)}</ul></div>`:he} ${g?.length?V`<div><h3>Challenges</h3><ul>${g.map(f=>V`<li>${f}</li>`)}</ul></div>`:he}</div>`:he} ${x?.length?V`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${x.slice(0,6).map(f=>V`<li>${Do(f)}</li>`)}</ul></div>`:he}</article>`}};hr.styles=[y,zo`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([Eo({type:String,reflect:!0})],hr.prototype,"mode",2),hr=d([Ao("roxy-compatibility-card")],hr);function Do(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${h(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}import{css as Po,html as re,nothing as Ge}from"lit";import{customElement as No}from"lit/decorators.js";var Go=["January","February","March","April","May","June","July","August","September","October","November","December"],Xr=class extends m{renderEmpty(){return re`<div class="roxy-empty" role="status">No crystal data</div>`}renderData(a){let e=a.colors??[],r=a.keywords??[],t=a.pairsWith??[],s=typeof a.birthMonth=="number"?Go[a.birthMonth-1]:void 0;return re`<article class="wrap" aria-label="${a.name??"Crystal"}"><div class="hero">${a.imageUrl?re`<img class="photo" src="${a.imageUrl}" alt="${a.name??"Crystal"}" loading="lazy">`:Ge}<div><h2 class="title">${a.name}</h2>${a.description?re`<p class="desc">${a.description}</p>`:Ge}</div></div><dl class="attrs">${this.attr("Planet",a.planet)} ${this.attr("Hardness",typeof a.hardness=="number"?`${a.hardness} Mohs`:void 0)} ${this.attr("Vibration",a.numericalVibration)} ${this.attr("Birthstone",s)} ${this.list("Chakras",a.chakras)} ${this.list("Zodiac",a.zodiacSigns)} ${this.list("Elements",a.elements)} ${e.length?re`<div class="attr"><dt>Colors</dt><dd><div class="colors">${e.map(o=>re`<span class="color"><span class="dot" style="background:${o}"></span>${o}</span>`)}</div></dd></div>`:Ge}</dl>${this.renderMeaning(a.meaning)} ${r.length?re`<div><p class="section-label">Keywords</p><div class="chips">${r.map(o=>re`<span class="chip">${o}</span>`)}</div></div>`:Ge} ${a.affirmation?re`<p class="affirmation">${a.affirmation}</p>`:Ge} ${t.length?re`<div><p class="section-label">Pairs with</p><div class="chips">${t.map(o=>re`<span class="chip">${String(o).replace(/-/g," ")}</span>`)}</div></div>`:Ge}</article>`}attr(a,e){return e==null||e===""?Ge:re`<div class="attr"><dt>${a}</dt><dd>${e}</dd></div>`}list(a,e){return e?.length?re`<div class="attr"><dt>${a}</dt><dd>${e.join(", ")}</dd></div>`:Ge}renderMeaning(a){if(!a)return Ge;let r=[["Spiritual",a.spiritual],["Emotional",a.emotional],["Physical",a.physical]].filter(([,t])=>!!t);return r.length===0?Ge:re`<div class="meaning">${r.map(([t,s])=>re`<h3>${t}</h3><p>${s}</p>`)}</div>`}};Xr.styles=[y,Po`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{gap:var(--roxy-space-md,1rem);align-items:flex-start;display:flex}.photo{border-radius:var(--roxy-radius-md,8px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);flex:none;width:96px;height:96px}.title{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600)}.desc{line-height:1.55;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.attrs{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));display:grid}.attr{gap:2px;display:grid}.attr dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.attr dd{font-size:var(--roxy-text-sm,.875rem);margin:0;font-weight:500}.colors{flex-wrap:wrap;gap:.4rem;display:flex}.color{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;align-items:center;gap:.3rem;display:inline-flex}.dot{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:.7rem;height:.7rem}.meaning h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.meaning p{margin:0 0 var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);line-height:1.55}.chips{flex-wrap:wrap;gap:.3rem;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:1px 8px}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.affirmation{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-left:3px solid var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);font-style:italic;font-size:var(--roxy-text-sm,.875rem);border-radius:0 var(--roxy-radius-sm,4px) var(--roxy-radius-sm,4px) 0;margin:0}`],Xr=d([No("roxy-crystal-card")],Xr);import{css as Ho,html as Lr,nothing as Oo}from"lit";import{customElement as jo,property as Bo}from"lit/decorators.js";var Io=["January","February","March","April","May","June","July","August","September","October","November","December"],fr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Lr`<div class="roxy-empty" role="status">No crystals</div>`}renderData(e){let r=e.crystals??[];if(r.length===0)return this.renderEmpty();let t=this.heading||this.deriveHeading(e),s="total"in e&&typeof e.total=="number"?e.total:r.length;return Lr`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(o=>Lr`<li class="tile">${o.imageUrl?Lr`<img class="photo" src="${o.imageUrl}" alt="${o.name??"Crystal"}" loading="lazy">`:Lr`<div class="photo" aria-hidden="true"></div>`}<p class="name">${o.name}</p>${o.colors&&o.colors.length>0?Lr`<div class="colors" aria-label="${`Colours: ${o.colors.join(", ")}`}">${o.colors.map(i=>Lr`<span class="swatch" style="${`background:${_o(i)}`}" title="${i}"></span>`)}</div>`:Oo}</li>`)}</ul></section>`}deriveHeading(e){return"chakra"in e&&e.chakra?`${e.chakra} chakra crystals`:"element"in e&&e.element?`${e.element} element crystals`:"sign"in e&&e.sign?`Crystals for ${e.sign}`:"month"in e&&typeof e.month=="number"?`${Io[e.month-1]??""} birthstones`.trim():"Crystals"}};fr.styles=[y,Ho`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.photo{aspect-ratio:1;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.colors{flex-wrap:wrap;gap:4px;display:flex}.swatch{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:10px;height:10px}`],d([Bo({type:String,reflect:!0})],fr.prototype,"heading",2),fr=d([jo("roxy-crystal-grid")],fr);function _o(n){return n.trim().toLowerCase().replace(/\s+/g,"")}import{css as Ko,html as B,nothing as ae}from"lit";import{customElement as Fo,property as Zo}from"lit/decorators.js";var br=class extends m{constructor(){super(...arguments);this.period="current"}renderEmpty(){return B`<div class="roxy-empty" role="status">No dasha data</div>`}renderData(e){let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(s=>s.durationYears)):0;return B`<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?B`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?B`(lord ${e.nakshatraLord})`:ae}</div>`:ae}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):ae} ${r.length>0?B`<div class="timeline" role="list">${r.map(s=>this.renderBar(s,t))}</div>`:ae} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return ae;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",s=r.years??0,o=r.months??0,i=r.days??0,l=[];s&&l.push(`${s}y`),o&&l.push(`${o}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return B`<p class="balance">Birth dasha balance: ${c} of ${t?B`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?B`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:ae}renderCurrent(e){return"mahadasha"in e?B`<div class="current">${"mahadasha"in e&&e.mahadasha?B`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?B`<small>${h(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:ae}</div>`:ae} ${"antardasha"in e&&e.antardasha?B`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?B`<small>${h(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:ae}</div>`:ae} ${"pratyantardasha"in e&&e.pratyantardasha?B`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?B`<small>${h(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:ae}</div>`:ae}</div>`:ae}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),s=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(s)?!1:r>=t&&r<s}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),s=Date.now();return Number.isNaN(r)||Number.isNaN(t)||s<r||s>=t||t<=r?-1:(s-r)/(t-r)}renderBar(e,r){let t=e.durationYears,s=r>0?t/r*100:0,o=this.isCurrent(e),i=o?this.progressIn(e):-1,l=o?"bar-track bar-now":"bar-track";return B`<div class="${o?"bar now":"bar"}" role="listitem" aria-current="${o?"time":"false"}"><span><strong>${e.planet}</strong>${o?B`<span class="now-badge">Now</span>`:ae} </span><span class="${l}"><span class="bar-fill" style="width:${s}%"></span> ${i>=0?B`<span class="bar-progress" style="left:${i*s}%" aria-hidden="true"></span>`:ae} </span><span class="dates">${e.startDate?us(e.startDate):""} ${e.endDate?B`- ${us(e.endDate)}`:""}</span></div>`}};br.styles=[y,Ko`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([Zo({type:String,reflect:!0})],br.prototype,"period",2),br=d([Fo("roxy-dasha-timeline")],br);function us(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}import{css as Yo,html as A,nothing as Ha}from"lit";import{customElement as Vo,property as qo}from"lit/decorators.js";var Uo=["title","name","label","heading","overview","summary"],Wo=["imageUrl","image","icon","symbol"],Jo=["imageUrl","image"],Xo=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}(:\d{2})?)?$/,Qo=/^[A-Z0-9]+(_[A-Z0-9]+)+$/,en=/^https?:\/\//,rn=6;function vr(n){return n===null||["string","number","boolean"].includes(typeof n)}function xs(n){return n!==null&&typeof n=="object"&&!(Array.isArray(n)&&n.every(vr))}var $r=class extends m{constructor(){super(...arguments);this.depth=0}renderData(e){return this.depth>=rn?A`<div class="roxy-empty" role="status">Nested data omitted</div>`:A`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(e)}</div>`}renderValue(e){return e==null?Ha:vr(e)?A`<p>${this.scalarTemplate(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?A`<div class="roxy-empty" role="status">Empty list</div>`:e.every(vr)?this.renderChips(e):e.every(t=>t!==null&&typeof t=="object"&&!Array.isArray(t))?this.renderTable(e):A`<ol>${e.map(t=>A`<li>${this.renderValue(t)}</li>`)}</ol>`}renderChips(e){return A`<ul class="roxy-chips">${e.filter(r=>r!==null).map(r=>A`<li>${this.formatScalar(r)}</li>`)}</ul>`}renderTable(e){let r=this.collectKeys(e);return A`<div class="roxy-table-wrap" role="group" aria-label="Data table" tabindex="0"><table class="roxy-table" role="table"><thead><tr>${r.map(t=>A`<th>${C(t)}</th>`)}</tr></thead><tbody>${e.map(t=>A`<tr>${r.map(s=>A`<td>${this.renderCell(t[s])}</td>`)}</tr>`)}</tbody></table></div>`}renderObject(e){let r=Uo.find(c=>typeof e[c]=="string"),t=Wo.find(c=>typeof e[c]=="string"&&e[c].startsWith("http")),s=r!=="summary"&&typeof e.summary=="string"?"summary":null,o=Object.entries(e).filter(([c,p])=>c!==r&&c!==s&&!Jo.includes(c)&&p!==null&&p!==void 0),i=o.filter(([,c])=>!xs(c)),l=o.filter(([,c])=>xs(c));return A`${t?A`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:Ha} ${r?A`<h3 class="roxy-title">${e[r]}</h3>`:Ha} ${s?A`<p class="roxy-summary">${e[s]}</p>`:Ha} ${i.length>0?A`<dl class="roxy-rows">${i.map(([c,p])=>A`<dt>${C(c)}</dt><dd>${this.renderField(p)}</dd>`)}</dl>`:Ha} ${l.map(([c,p])=>A`<div class="roxy-section"><h4>${C(c)}</h4>${this.renderField(p)}</div>`)}`}renderField(e){return e==null?"":vr(e)?A`${this.scalarTemplate(e)}`:Array.isArray(e)&&e.every(vr)?this.renderChips(e):A`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}renderCell(e){return e==null?"":vr(e)?this.scalarTemplate(e):Array.isArray(e)&&e.every(vr)?e.filter(r=>r!==null).map(r=>this.formatScalar(r)).join(", "):A`<roxy-data bare .data="${e}" .depth="${this.depth+1}"></roxy-data>`}scalarTemplate(e){return typeof e=="string"&&en.test(e)?A`<a href="${e}" target="_blank" rel="noopener noreferrer">${e}</a>`:this.formatScalar(e)}formatScalar(e){if(typeof e=="number")return h(e,2)||String(e);if(typeof e=="boolean")return e?"Yes":"No";if(Xo.test(e)){let r=ue(e),t=de(e);return r?`${t}, ${r}`:t}return Qo.test(e)?C(e.toLowerCase()):e}collectKeys(e){let r=new Set;for(let t of e)for(let s of Object.keys(t))r.add(s);return Array.from(r)}};$r.styles=[y,Yo`.roxy-card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-card a{color:var(--roxy-accent-ink,#b45309)}.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}.roxy-table-wrap{overflow-x:auto}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;word-break:normal;overflow-wrap:normal}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;white-space:nowrap}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-top: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([qo({attribute:!1})],$r.prototype,"depth",2),$r=d([Vo("roxy-data")],$r);import{css as Sn,html as ea,nothing as Et}from"lit";import{customElement as Rn,property as Cn}from"lit/decorators.js";import{nothing as ge,svg as P}from"lit";function He(n){let a=n%360;return a<0?a+360:a}function Le(n){let a=He(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),s=(r-t)*60,o=Math.floor(s),i=Math.round((s-o)*60);return{sign:Y[e]??"Aries",signIndex:e,degree:t,minute:o,second:i}}function lt(n){let{sign:a,degree:e,minute:r}=Le(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function Oa(n){let a=Math.floor(n),e=Math.round((n-a)*60);return e===60&&(e=0,a+=1),`${a}\xB0${String(e).padStart(2,"0")}'`}function zt(n){return He(n+180)}function hs(n,a){let e=He(n),r=He(a)-e;return r<0&&(r+=360),He(e+r/2)}function k(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}import{css as an,html as Ls,nothing as tn}from"lit";var tr=an`.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 Qr(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:s,controls:o=!1}=n;return Ls`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=a.findIndex(f=>f.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,g=a[(c+p+a.length)%a.length];if(!g)return;r(g.id);let x=l.currentTarget.getRootNode();requestAnimationFrame(()=>{x.querySelector(`#${s}-tab-${g.id}`)?.focus()})}}">${a.map(l=>Ls`<button type="button" class="roxy-tab" role="tab" id="${s}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${o&&e===l.id?`${s}-panel-${l.id}`:tn}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var Ae=400,S=20,W=Ae-2*S,E=Ae/2,fs=Object.fromEntries(Y.map(n=>[n.toLowerCase(),n])),sn=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],on="\u02B3";function bs(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:Le(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function nn(n,a){let e=Xt[u(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?on:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||bs(n,a))return`${e}${r}`;let{degree:t}=Le(n.longitude);return`${e} ${t}\xB0${r}`}function ln(n,a){let e=[u(n.graha)],r=bs(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=Le(n.longitude),s=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${s}' ${t.sign}`:`${t.degree}\xB0${s}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function At(n,a,e,r,t){let s=r-(n.length-1)*t/2;return n.map((o,i)=>{let l=s+i*t;return P`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${nn(o,a)}<title>${ln(o,a)}</title></text>`})}function ct(n,a,e){let r={};for(let o of Y)r[o.toLowerCase()]=[];let t=e?fs[e.toLowerCase()]??"":"",s=t;for(let[o,i]of Object.entries(n??{})){let l=(i?.rashi??"").toLowerCase();if(o==="Lagna"||i?.graha==="Lagna"){t||(s=fs[l]??"");continue}!l||!(l in r)||r[l]?.push({graha:i.graha??o,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:s,placements:r,divisionLabel:a}}var wr=W/4,dn={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 cn(n){let a=dn[n]??{col:0,row:0};return{x:S+a.col*wr,y:S+a.row*wr,w:wr,h:wr}}function pn(n){let a=S,e=S+wr,r=S+2*wr,t=S+3*wr,s=Ae-S;return P`
16
+ `}var Wr=class extends m{renderEmpty(){return ze`<div class="roxy-empty" role="status">No bodygraph data</div>`}renderData(a){let e=new Set((a.centers??[]).filter(o=>o.defined).map(o=>o.id)),r=new Set((a.gates??[]).map(o=>o.gate).filter(o=>o!=null)),t=new Set((a.channels??[]).map(o=>ps(o.gateA,o.gateB))),s=this.buildGateTitles(a.gates??[]);return ze`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${a.type?ze`<div class="type-line">${a.type}${a.profile?ze`· Profile ${a.profile}`:rr}</div>`:rr}</header><div class="layout"><svg viewBox="${ms}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${gs({definedCenters:e,activeChannels:t,activeGates:r,gateTitles:s})}</svg> ${this.renderSummary(a)}</div></div>`}buildGateTitles(a){let e=new Map;for(let r of a){if(r.gate==null)continue;let t=[`Gate ${r.gate}`];r.line!=null&&(t[0]+=`.${r.line}`),r.gateName&&t.push(r.gateName);let s=r.planet?u(r.planet):"",o=s?v[s]??s:"";o&&t.push(`${o} ${r.side??""}`.trim()),e.set(r.gate,t.join(" \xB7 "))}return e}renderSummary(a){let e=[{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile},{label:"Definition",value:a.definition}],r=a.incarnationCross;return ze`<div class="summary"><div class="facts">${e.map(t=>t.value?ze`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:rr)}</div>${r?.name?ze`<p class="cross">${r.name} ${r.gates?.length?ze`<span class="gates">(${r.gates.join(", ")})</span>`:rr}</p>`:rr} ${a.signature||a.notSelf?ze`<div class="themes">${a.signature?ze`<span class="pill pill--good">Signature: ${a.signature}</span>`:rr} ${a.notSelf?ze`<span class="pill pill--shadow">Not-self: ${a.notSelf}</span>`:rr}</div>`:rr}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};Wr.styles=[y,Ro`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:var(--roxy-chart-max-width,340px);height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],Wr=d([Co("roxy-bodygraph")],Wr);import{css as Mo,html as ar,nothing as Tt}from"lit";import{customElement as To}from"lit/decorators.js";function ys(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var Jr=class extends m{isCurrent(a){let e=Date.now(),r=Date.parse(a.start),t=Date.parse(a.end);return Number.isNaN(r)||Number.isNaN(t)?!1:e>=r&&e<t}renderTile(a){let e=a.effect==="Good"?"good":a.effect==="Bad"?"bad":"neutral",r=this.isCurrent(a),t=v[u(a.lord)]??"",s=`${ys(a.start)} - ${ys(a.end)}`;return ar`<div class="cho-tile ${e}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${a.name}${r?ar`<span class="now-badge">Now</span>`:Tt} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?ar`<span aria-hidden="true">${t}</span>`:Tt} ${a.lord}</span></div>`}renderEmpty(){return ar`<div class="roxy-empty" role="status">No choghadiya data</div>`}renderData(a){let{date:e,dayChoghadiya:r,nightChoghadiya:t}=a;return ar`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?ar`<p class="subtitle">${e}</p>`:Tt}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(s=>this.renderTile(s)):ar`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(s=>this.renderTile(s)):ar`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Jr.styles=[y,Mo`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],Jr=d([To("roxy-choghadiya-grid")],Jr);import{css as zo,html as V,nothing as he}from"lit";import{customElement as Ao,property as Eo}from"lit/decorators.js";var hr=class extends m{constructor(){super(...arguments);this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,s]of Object.entries(e.categories))typeof s=="number"&&Number.isFinite(s)&&(r[t]=s);return r}return{}}renderEmpty(){return V`<div class="roxy-empty" role="status">No compatibility data</div>`}renderData(e){let r=e.overallScore,t=this.getBreakdown(),s="rating"in e?e.rating:void 0,o="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,p="strengths"in e?e.strengths:void 0,g="challenges"in e?e.challenges:void 0,x="keyAspects"in e?e.keyAspects:void 0;return V`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?V`<div class="score">${h(r,0)}</div>`:he} ${s?V`<div class="rating">${s}</div>`:he}</div></div>${Object.keys(t).length>0?V`<div role="list">${Object.entries(t).map(([f,L])=>V`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${f}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,L))}%"></span></span> <span>${h(L,0)}</span></div>`)}</div>`:he} ${o?V`<p><span class="archetype">${o.label}</span> ${o.description?V`· ${o.description}`:he}</p>`:he} ${l?V`<p>${l}</p>`:he} ${c&&!l?V`<p>${c}</p>`:he} ${i?V`<p>${i}</p>`:he} ${(p?.length??0)>0||(g?.length??0)>0?V`<div class="lists">${p?.length?V`<div><h3>Strengths</h3><ul>${p.map(f=>V`<li>${f}</li>`)}</ul></div>`:he} ${g?.length?V`<div><h3>Challenges</h3><ul>${g.map(f=>V`<li>${f}</li>`)}</ul></div>`:he}</div>`:he} ${x?.length?V`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${x.slice(0,6).map(f=>V`<li>${Do(f)}</li>`)}</ul></div>`:he}</article>`}};hr.styles=[y,zo`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([Eo({type:String,reflect:!0})],hr.prototype,"mode",2),hr=d([Ao("roxy-compatibility-card")],hr);function Do(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${h(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}import{css as Po,html as re,nothing as Ge}from"lit";import{customElement as No}from"lit/decorators.js";var Go=["January","February","March","April","May","June","July","August","September","October","November","December"],Xr=class extends m{renderEmpty(){return re`<div class="roxy-empty" role="status">No crystal data</div>`}renderData(a){let e=a.colors??[],r=a.keywords??[],t=a.pairsWith??[],s=typeof a.birthMonth=="number"?Go[a.birthMonth-1]:void 0;return re`<article class="wrap" aria-label="${a.name??"Crystal"}"><div class="hero">${a.imageUrl?re`<img class="photo" src="${a.imageUrl}" alt="${a.name??"Crystal"}" loading="lazy">`:Ge}<div><h2 class="title">${a.name}</h2>${a.description?re`<p class="desc">${a.description}</p>`:Ge}</div></div><dl class="attrs">${this.attr("Planet",a.planet)} ${this.attr("Hardness",typeof a.hardness=="number"?`${a.hardness} Mohs`:void 0)} ${this.attr("Vibration",a.numericalVibration)} ${this.attr("Birthstone",s)} ${this.list("Chakras",a.chakras)} ${this.list("Zodiac",a.zodiacSigns)} ${this.list("Elements",a.elements)} ${e.length?re`<div class="attr"><dt>Colors</dt><dd><div class="colors">${e.map(o=>re`<span class="color"><span class="dot" style="background:${o}"></span>${o}</span>`)}</div></dd></div>`:Ge}</dl>${this.renderMeaning(a.meaning)} ${r.length?re`<div><p class="section-label">Keywords</p><div class="chips">${r.map(o=>re`<span class="chip">${o}</span>`)}</div></div>`:Ge} ${a.affirmation?re`<p class="affirmation">${a.affirmation}</p>`:Ge} ${t.length?re`<div><p class="section-label">Pairs with</p><div class="chips">${t.map(o=>re`<span class="chip">${String(o).replace(/-/g," ")}</span>`)}</div></div>`:Ge}</article>`}attr(a,e){return e==null||e===""?Ge:re`<div class="attr"><dt>${a}</dt><dd>${e}</dd></div>`}list(a,e){return e?.length?re`<div class="attr"><dt>${a}</dt><dd>${e.join(", ")}</dd></div>`:Ge}renderMeaning(a){if(!a)return Ge;let r=[["Spiritual",a.spiritual],["Emotional",a.emotional],["Physical",a.physical]].filter(([,t])=>!!t);return r.length===0?Ge:re`<div class="meaning">${r.map(([t,s])=>re`<h3>${t}</h3><p>${s}</p>`)}</div>`}};Xr.styles=[y,Po`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{gap:var(--roxy-space-md,1rem);align-items:flex-start;display:flex}.photo{border-radius:var(--roxy-radius-md,8px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);flex:none;width:96px;height:96px}.title{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600)}.desc{line-height:1.55;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.attrs{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));display:grid}.attr{gap:2px;display:grid}.attr dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.attr dd{font-size:var(--roxy-text-sm,.875rem);margin:0;font-weight:500}.colors{flex-wrap:wrap;gap:.4rem;display:flex}.color{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;align-items:center;gap:.3rem;display:inline-flex}.dot{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:.7rem;height:.7rem}.meaning h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.meaning p{margin:0 0 var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);line-height:1.55}.chips{flex-wrap:wrap;gap:.3rem;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:1px 8px}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.affirmation{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-left:3px solid var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);font-style:italic;font-size:var(--roxy-text-sm,.875rem);border-radius:0 var(--roxy-radius-sm,4px) var(--roxy-radius-sm,4px) 0;margin:0}`],Xr=d([No("roxy-crystal-card")],Xr);import{css as Ho,html as Lr,nothing as Oo}from"lit";import{customElement as jo,property as Bo}from"lit/decorators.js";var Io=["January","February","March","April","May","June","July","August","September","October","November","December"],fr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Lr`<div class="roxy-empty" role="status">No crystals</div>`}renderData(e){let r=e.crystals??[];if(r.length===0)return this.renderEmpty();let t=this.heading||this.deriveHeading(e),s="total"in e&&typeof e.total=="number"?e.total:r.length;return Lr`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(o=>Lr`<li class="tile">${o.imageUrl?Lr`<img class="photo" src="${o.imageUrl}" alt="${o.name??"Crystal"}" loading="lazy">`:Lr`<div class="photo" aria-hidden="true"></div>`}<p class="name">${o.name}</p>${o.colors&&o.colors.length>0?Lr`<div class="colors" aria-label="${`Colours: ${o.colors.join(", ")}`}">${o.colors.map(i=>Lr`<span class="swatch" style="${`background:${_o(i)}`}" title="${i}"></span>`)}</div>`:Oo}</li>`)}</ul></section>`}deriveHeading(e){return"chakra"in e&&e.chakra?`${e.chakra} chakra crystals`:"element"in e&&e.element?`${e.element} element crystals`:"sign"in e&&e.sign?`Crystals for ${e.sign}`:"month"in e&&typeof e.month=="number"?`${Io[e.month-1]??""} birthstones`.trim():"Crystals"}};fr.styles=[y,Ho`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.photo{aspect-ratio:1;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.colors{flex-wrap:wrap;gap:4px;display:flex}.swatch{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:10px;height:10px}`],d([Bo({type:String,reflect:!0})],fr.prototype,"heading",2),fr=d([jo("roxy-crystal-grid")],fr);function _o(n){return n.trim().toLowerCase().replace(/\s+/g,"")}import{css as Ko,html as B,nothing as ae}from"lit";import{customElement as Fo,property as Zo}from"lit/decorators.js";var br=class extends m{constructor(){super(...arguments);this.period="current"}renderEmpty(){return B`<div class="roxy-empty" role="status">No dasha data</div>`}renderData(e){let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(s=>s.durationYears)):0;return B`<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?B`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?B`(lord ${e.nakshatraLord})`:ae}</div>`:ae}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):ae} ${r.length>0?B`<div class="timeline" role="list">${r.map(s=>this.renderBar(s,t))}</div>`:ae} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return ae;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",s=r.years??0,o=r.months??0,i=r.days??0,l=[];s&&l.push(`${s}y`),o&&l.push(`${o}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return B`<p class="balance">Birth dasha balance: ${c} of ${t?B`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?B`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:ae}renderCurrent(e){return"mahadasha"in e?B`<div class="current">${"mahadasha"in e&&e.mahadasha?B`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?B`<small>${h(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:ae}</div>`:ae} ${"antardasha"in e&&e.antardasha?B`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?B`<small>${h(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:ae}</div>`:ae} ${"pratyantardasha"in e&&e.pratyantardasha?B`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?B`<small>${h(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:ae}</div>`:ae}</div>`:ae}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),s=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(s)?!1:r>=t&&r<s}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),s=Date.now();return Number.isNaN(r)||Number.isNaN(t)||s<r||s>=t||t<=r?-1:(s-r)/(t-r)}renderBar(e,r){let t=e.durationYears,s=r>0?t/r*100:0,o=this.isCurrent(e),i=o?this.progressIn(e):-1,l=o?"bar-track bar-now":"bar-track";return B`<div class="${o?"bar now":"bar"}" role="listitem" aria-current="${o?"time":"false"}"><span><strong>${e.planet}</strong>${o?B`<span class="now-badge">Now</span>`:ae} </span><span class="${l}"><span class="bar-fill" style="width:${s}%"></span> ${i>=0?B`<span class="bar-progress" style="left:${i*s}%" aria-hidden="true"></span>`:ae} </span><span class="dates">${e.startDate?us(e.startDate):""} ${e.endDate?B`- ${us(e.endDate)}`:""}</span></div>`}};br.styles=[y,Ko`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([Zo({type:String,reflect:!0})],br.prototype,"period",2),br=d([Fo("roxy-dasha-timeline")],br);function us(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}import{css as Yo,html as A,nothing as Ha}from"lit";import{customElement as Vo,property as qo}from"lit/decorators.js";var Uo=["title","name","label","heading","overview","summary"],Wo=["imageUrl","image","icon","symbol"],Jo=["imageUrl","image"],Xo=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:\d{2})?)?$/,Qo=/^[A-Z0-9]+(_[A-Z0-9]+)+$/,en=/^https?:\/\//,rn=6;function vr(n){return n===null||["string","number","boolean"].includes(typeof n)}function xs(n){return n!==null&&typeof n=="object"&&!(Array.isArray(n)&&n.every(vr))}var $r=class extends m{constructor(){super(...arguments);this.depth=0}renderData(e){return this.depth>=rn?A`<div class="roxy-empty" role="status">Nested data omitted</div>`:A`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(e)}</div>`}renderValue(e){return e==null?Ha:vr(e)?A`<p>${this.scalarTemplate(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?A`<div class="roxy-empty" role="status">Empty list</div>`:e.every(vr)?this.renderChips(e):e.every(t=>t!==null&&typeof t=="object"&&!Array.isArray(t))?this.renderTable(e):A`<ol>${e.map(t=>A`<li>${this.renderValue(t)}</li>`)}</ol>`}renderChips(e){return A`<ul class="roxy-chips">${e.filter(r=>r!==null).map(r=>A`<li>${this.formatScalar(r)}</li>`)}</ul>`}renderTable(e){let r=this.collectKeys(e);return A`<div class="roxy-table-wrap" role="group" aria-label="Data table" tabindex="0"><table class="roxy-table" role="table"><thead><tr>${r.map(t=>A`<th>${C(t)}</th>`)}</tr></thead><tbody>${e.map(t=>A`<tr>${r.map(s=>A`<td>${this.renderCell(t[s])}</td>`)}</tr>`)}</tbody></table></div>`}renderObject(e){let r=Uo.find(c=>typeof e[c]=="string"),t=Wo.find(c=>typeof e[c]=="string"&&e[c].startsWith("http")),s=r!=="summary"&&typeof e.summary=="string"?"summary":null,o=Object.entries(e).filter(([c,p])=>c!==r&&c!==s&&!Jo.includes(c)&&p!==null&&p!==void 0),i=o.filter(([,c])=>!xs(c)),l=o.filter(([,c])=>xs(c));return A`${t?A`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:Ha} ${r?A`<h3 class="roxy-title">${e[r]}</h3>`:Ha} ${s?A`<p class="roxy-summary">${e[s]}</p>`:Ha} ${i.length>0?A`<dl class="roxy-rows">${i.map(([c,p])=>A`<dt>${C(c)}</dt><dd>${this.renderField(p)}</dd>`)}</dl>`:Ha} ${l.map(([c,p])=>A`<div class="roxy-section"><h4>${C(c)}</h4>${this.renderField(p)}</div>`)}`}renderField(e){return e==null?"":vr(e)?A`${this.scalarTemplate(e)}`:Array.isArray(e)&&e.every(vr)?this.renderChips(e):A`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}renderCell(e){return e==null?"":vr(e)?this.scalarTemplate(e):Array.isArray(e)&&e.every(vr)?e.filter(r=>r!==null).map(r=>this.formatScalar(r)).join(", "):A`<roxy-data bare .data="${e}" .depth="${this.depth+1}"></roxy-data>`}scalarTemplate(e){return typeof e=="string"&&en.test(e)?A`<a href="${e}" target="_blank" rel="noopener noreferrer">${e}</a>`:this.formatScalar(e)}formatScalar(e){if(typeof e=="number")return h(e,2)||String(e);if(typeof e=="boolean")return e?"Yes":"No";if(Xo.test(e)){let r=ue(e),t=de(e);return r?`${t}, ${r}`:t}return Qo.test(e)?C(e.toLowerCase()):e}collectKeys(e){let r=new Set;for(let t of e)for(let s of Object.keys(t))r.add(s);return Array.from(r)}};$r.styles=[y,Yo`.roxy-card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-card a{color:var(--roxy-accent-ink,#b45309)}.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}.roxy-table-wrap{overflow-x:auto}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;word-break:normal;overflow-wrap:normal}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;white-space:nowrap}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-top: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([qo({attribute:!1})],$r.prototype,"depth",2),$r=d([Vo("roxy-data")],$r);import{css as Sn,html as ea,nothing as Et}from"lit";import{customElement as Rn,property as Cn}from"lit/decorators.js";import{nothing as ge,svg as P}from"lit";function He(n){let a=n%360;return a<0?a+360:a}function Le(n){let a=He(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),s=(r-t)*60,o=Math.floor(s),i=Math.round((s-o)*60);return{sign:Y[e]??"Aries",signIndex:e,degree:t,minute:o,second:i}}function lt(n){let{sign:a,degree:e,minute:r}=Le(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function Oa(n){let a=Math.floor(n),e=Math.round((n-a)*60);return e===60&&(e=0,a+=1),`${a}\xB0${String(e).padStart(2,"0")}'`}function zt(n){return He(n+180)}function hs(n,a){let e=He(n),r=He(a)-e;return r<0&&(r+=360),He(e+r/2)}function k(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}import{css as an,html as Ls,nothing as tn}from"lit";var tr=an`.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 Qr(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:s,controls:o=!1}=n;return Ls`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=a.findIndex(f=>f.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,g=a[(c+p+a.length)%a.length];if(!g)return;r(g.id);let x=l.currentTarget.getRootNode();requestAnimationFrame(()=>{x.querySelector(`#${s}-tab-${g.id}`)?.focus()})}}">${a.map(l=>Ls`<button type="button" class="roxy-tab" role="tab" id="${s}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${o&&e===l.id?`${s}-panel-${l.id}`:tn}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var Ae=400,S=20,W=Ae-2*S,E=Ae/2,fs=Object.fromEntries(Y.map(n=>[n.toLowerCase(),n])),sn=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],on="\u02B3";function bs(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:Le(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function nn(n,a){let e=Xt[u(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?on:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||bs(n,a))return`${e}${r}`;let{degree:t}=Le(n.longitude);return`${e} ${t}\xB0${r}`}function ln(n,a){let e=[u(n.graha)],r=bs(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=Le(n.longitude),s=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${s}' ${t.sign}`:`${t.degree}\xB0${s}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function At(n,a,e,r,t){let s=r-(n.length-1)*t/2;return n.map((o,i)=>{let l=s+i*t;return P`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${nn(o,a)}<title>${ln(o,a)}</title></text>`})}function ct(n,a,e){let r={};for(let o of Y)r[o.toLowerCase()]=[];let t=e?fs[e.toLowerCase()]??"":"",s=t;for(let[o,i]of Object.entries(n??{})){let l=(i?.rashi??"").toLowerCase();if(o==="Lagna"||i?.graha==="Lagna"){t||(s=fs[l]??"");continue}!l||!(l in r)||r[l]?.push({graha:i.graha??o,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:s,placements:r,divisionLabel:a}}var wr=W/4,dn={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 cn(n){let a=dn[n]??{col:0,row:0};return{x:S+a.col*wr,y:S+a.row*wr,w:wr,h:wr}}function pn(n){let a=S,e=S+wr,r=S+2*wr,t=S+3*wr,s=Ae-S;return P`
17
17
  <rect class="line" x=${a} y=${a} width=${W} height=${W} stroke-width="1.5" fill="none" />
18
18
  <line class="line" x1=${a} y1=${e} x2=${s} y2=${e} stroke-width="1" />
19
19
  <line class="line" x1=${a} y1=${t} x2=${s} y2=${t} stroke-width="1" />
@@ -100,5 +100,5 @@ var Ps=Object.defineProperty;var Ns=Object.getOwnPropertyDescriptor;var d=(n,a,e
100
100
  </g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=Y.findIndex(x=>x.toLowerCase()===t.sign.toLowerCase());if(o===-1)return;let i=o*30+t.degree,l=this.toAngle(i),c=s===1?Ft+14:Ra+14,p=k(T,T,c,l),g=k(T,T,Kt+14,l);e.push(Sa`<g>
101
101
  <line class="asc-tick" x1=${p.x} y1=${p.y} x2=${g.x} y2=${g.y} />
102
102
  <text class="asc-label" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
103
- </g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=u(o);for(let l of s)if(u(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return ie;let l=k(T,T,Ft-12,this.toAngle(o)),c=k(T,T,Ra+8,this.toAngle(i)),p=Zr(s),g=gr[p]??"aspect-other",x=h(s.orb,1);return Sa`<line class=${`aspect ${g}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p} ${s.planet2}${x?` (orb ${x}\xB0)`:""}</title></line>`})}renderAspects(a){return I`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(e=>I`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${Zr(e)||""}</td><td class="orb">${h(e.orb,1)}</td><td>${cl(e.strength)}</td></tr>`)}</tbody></table>`}};Ca.styles=[y,il`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],Ca=d([ll("roxy-synastry-chart")],Ca);function cl(n){return typeof n=="number"?Math.round(n).toString():""}import{css as pl,html as _,nothing as Ie}from"lit";import{customElement as ml,state as gl}from"lit/decorators.js";var Hr=class extends m{constructor(){super(...arguments);this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}renderEmpty(){return _`<div class="roxy-empty" role="status">No tarot data</div>`}renderData(e){return"card"in e?this.renderDailyCard(e):this.renderFullCard(e)}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,s=r.keywords??[];return _`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?_`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:_`<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?_`${r.arcana} arcana`:Ie} ${t?_`· reversed`:Ie}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?_`<p class="message">${e.dailyMessage}</p>`:Ie} ${r.meaning?_`<p>${r.meaning}</p>`:Ie} ${s.length>0?_`<div class="chips">${s.map(o=>_`<span>${o}</span>`)}</div>`:Ie} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,s=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return _`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?_`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:_`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?_`${e.arcana} arcana`:Ie} ${e.number!==void 0&&e.number!==null?_`· ${e.number}`:Ie} ${r?_`· reversed`:Ie}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?_`<p>${t.description}</p>`:Ie} ${s.length>0?_`<div class="chips">${s.map(o=>_`<span>${o}</span>`)}</div>`:Ie} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};Hr.styles=[y,pl`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([gl()],Hr.prototype,"flipped",2),Hr=d([ml("roxy-tarot-card")],Hr);import{css as yl,html as qa}from"lit";import{customElement as ul,property as xl}from"lit/decorators.js";var Or=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return qa`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let r=e.cards??[];if(r.length===0)return this.renderEmpty();let t=this.heading||"Tarot deck",s=typeof e.total=="number"?e.total:r.length;return qa`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"card":"cards"}</span></header><ul class="grid">${r.map(o=>qa`<li class="tile">${o.imageUrl?qa`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:qa`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${hl(o)}</p></li>`)}</ul></section>`}};Or.styles=[y,yl`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(7rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.art{aspect-ratio:2/3;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meta{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0}`],d([xl({type:String,reflect:!0})],Or.prototype,"heading",2),Or=d([ul("roxy-tarot-catalog")],Or);function hl(n){return n.suit?`${u(n.arcana)} \xB7 ${u(n.suit)}`:`${u(n.arcana)} Arcana`}import{css as Ll,html as K,nothing as Pe}from"lit";import{customElement as fl,property as bl}from"lit/decorators.js";var jr=class extends m{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return K`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let r="answer"in e,t="cards"in e&&!("spread"in e),s=t?[]:"positions"in e?e.positions??[]:[],o=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),p="question"in e?e.question:void 0,g="summary"in e?e.summary:void 0,x=r?e.interpretation:void 0,f=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return K`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?K`<span class="question">"${p}"</span>`:Pe}</header>${r?K`<div><span class="${`answer ${f}`}">${i}</span> ${l?K`<small>· ${l}</small>`:Pe}</div>`:Pe} ${s.length>0?K`<div class="grid">${s.map(L=>K`<div class="card"><p class="label">${L.name??""}</p><div class="image">${L.card?.imageUrl?K`<img src="${L.card.imageUrl}" alt="${L.card.name??"tarot card"}" class="${L.card.reversed?"reversed":""}">`:K`${L.card?.name??"?"}`}</div><p class="name">${L.card?.name??""} ${L.card?.reversed?K`<small>(reversed)</small>`:Pe}</p>${L.interpretation?K`<p class="interp">${L.interpretation}</p>`:Pe}</div>`)}</div>`:Pe} ${o.length>0?K`<div class="grid">${o.map(L=>K`<div class="card"><div class="image">${L.imageUrl?K`<img src="${L.imageUrl}" alt="${L.name??"tarot card"}" class="${L.reversed?"reversed":""}">`:K`${L.name??"?"}`}</div><p class="name">${L.name??""} ${L.reversed?K`<small>(reversed)</small>`:Pe}</p>${L.meaning?K`<p class="interp">${L.meaning}</p>`:Pe}</div>`)}</div>`:Pe} ${g?K`<p class="reading">${g}</p>`:Pe} ${x?K`<p class="reading">${x}</p>`:Pe}</article>`}};jr.styles=[y,Ll`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([bl({type:String,reflect:!0})],jr.prototype,"spread",2),jr=d([fl("roxy-tarot-spread")],jr);import{css as vl,html as F,nothing as dr}from"lit";import{customElement as $l,state as wl}from"lit/decorators.js";var Br=class extends m{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return F`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:r,transitTime:t,transitPlanets:s,transitAspects:o,summary:i}=e,l=[de(r),ue(t)].filter(Boolean).join(" "),c=o?.length??0,p=this.tab;return F`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?F`<p class="subtitle">${l}</p>`:dr}</div>${c>0?F`${Qr({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:p,onSelect:g=>{this.tab=g},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?F`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:F`${i?this.renderSummaryPills(i):dr}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:F`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return F`<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 F`<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=v[u(r.name)]??"",s=D[u(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return F`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?F`<span class="retro-badge" aria-label="retrograde">R</span>`:dr}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${h(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${h(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return F`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=v[u(r.transitPlanet)]??"",o=v[u(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return F`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${s}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${o}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${h(r.orb,2)}° · strength ${h(r.strength,1)} </span>${j()}</summary><div class="interp-body">${l?.summary?F`<p>${l.summary}</p>`:dr} ${l?.impact?F`<p><strong>Impact:</strong> ${l.impact}</p>`:dr} ${l?.timing?F`<p><strong>Timing:</strong> ${l.timing}</p>`:dr} ${l?.guidance?F`<p><strong>Guidance:</strong> ${l.guidance}</p>`:dr} ${l?.keywords?.length?F`<div class="interp-keywords">${l.keywords.map(g=>F`<span class="kw">${g}</span>`)}</div>`:dr}</div></details>`})}</div>`}};Br.styles=[y,tr,le,vl`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([wl()],Br.prototype,"tab",2),Br=d([$l("roxy-transits-table")],Br);import{css as kl,html as We,nothing as Ua}from"lit";import{customElement as Sl}from"lit/decorators.js";var Ma=class extends m{renderEmpty(){return We`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[];if(e.length===0&&r.length===0)return this.renderEmpty();let t=a.datetime?String(a.datetime).replace("T"," "):"";return We`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${t?We`<p class="subtitle">${t}</p>`:Ua}</div>${r.length>0?We`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(s=>We`<span class="mutual-pill">${s.planet1} ⟷ ${s.planet2} ${s.aspectType?We`<span class="rel">${s.aspectType}</span>`:Ua}</span>`)}</div></div>`:Ua} ${e.length>0?We`<div class="overflow-scroll"><table><thead><tr><th scope="col">From</th><th scope="col">Aspect</th><th scope="col">To</th><th scope="col">Strength</th><th scope="col">Orb</th></tr></thead><tbody>${e.map(s=>We`<tr><td>${s.aspectingPlanet}</td><td><span class="kind">${s.aspectType}</span></td><td>${s.aspectedPlanet}</td><td>${typeof s.strength=="number"?We`<span class="bar" style="width:${Math.max(4,Math.min(100,s.strength)*.4)}px"></span><span class="num">${h(s.strength,0)}</span>`:Ua}</td><td class="num">${typeof s.orb=="number"?`${h(s.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:Ua}</div>`}};Ma.styles=[y,kl`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.mutual{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.mutual-pill{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:.35rem;padding:2px 10px;display:inline-flex}.mutual-pill .rel{font-size:var(--roxy-text-xs,.75rem);font-weight:400}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}tbody tr:last-child td{border-bottom:none}.kind{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);font-size:var(--roxy-text-xs,.75rem);padding:1px 8px;font-weight:600;display:inline-block}.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.bar{background:var(--roxy-accent,#f59e0b);vertical-align:middle;border-radius:3px;height:6px;margin-right:6px;display:inline-block}`],Ma=d([Sl("roxy-vedic-aspects")],Ma);import{html as Ds}from"lit";import{customElement as Rl,property as Yt}from"lit/decorators.js";var Je=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e}}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?ct(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return Ds`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let t=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return Ds`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${mt(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>${pt(r,this.chartStyle)}</svg></div>`}};Je.styles=[y,gt,tr],d([Yt({type:String,reflect:!0,attribute:"chart-style"})],Je.prototype,"chartStyle",2),d([Yt({type:String,reflect:!0,attribute:"chart-reference"})],Je.prototype,"chartReference",2),d([Yt({type:String,reflect:!0,attribute:"lagna-override"})],Je.prototype,"lagnaOverride",2),Je=d([Rl("roxy-vedic-kundli")],Je);import{css as Cl,html as G,nothing as ye}from"lit";import{customElement as Ml}from"lit/decorators.js";var Tl=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Ta=class extends m{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of Tl){let s=a[t];s&&(r.push([t,s]),e.add(t))}for(let[t,s]of Object.entries(a))e.has(t)||r.push([t,s]);return r}renderEmpty(){return G`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return G`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let s=(t.graha??r)==="Lagna",o=v[u(t.graha??r)]??"",i=D[u(t.rashi??"")]??"";return G`<tr class="${s?"lagna":""}"><td class="graha">${o?G`<span class="glyph">${o}</span>`:ye}${t.graha??r}</td><td>${i?G`<span class="glyph">${i}</span>`:ye}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?lt(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?G`<span class="retro">R</span>`:ye}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let a=this.data?.combustion??[];return a.length===0?ye:G`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${j()}</summary><div class="panel-body">${a.map(e=>{let r=v[u(e.planet)]??"",t=h(e.distanceFromSun,2),s=h(e.orb,1);return G`<div class="condition"><span class="planet">${r?`${r} `:""}${e.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let a=this.data?.planetaryWar??[];return a.length===0?ye:G`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${j()}</summary><div class="panel-body">${a.map(e=>{let r=h(e.distance,2);return G`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let a=this.data?.interpretations??{},e=this.orderedRows().map(([r,t])=>[t.graha??r,a[t.graha??r]]).filter(([,r])=>r!=null);return e.length===0?ye:G`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${j()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=v[u(r)]??"";return G`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?G`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:ye} ${t.nakshatra?G`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:ye}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?ye:G`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${j()}</summary><div class="panel-body">${a.map(e=>G`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?G`<p class="desc">${e.description}</p>`:ye}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?ye:G`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${j()}</summary><div class="panel-body">${a.map(e=>G`<div class="bhava"><span class="name">${e.name} ${e.quality?G`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:ye}</span> ${e.result?G`<p class="desc">${e.result}</p>`:ye}</div>`)}</div></details>`}};Ta.styles=[y,le,Cl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],Ta=d([Ml("roxy-vedic-planets-table")],Ta);import{css as zl,html as Ir,nothing as $t}from"lit";import{customElement as Al}from"lit/decorators.js";var za=class extends m{rows(){let a=this.data;if(!a)return[];let e=(a.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,t]of[["Ascendant",a.ascendant],["Midheaven",a.midheaven],["Part of Fortune",a.partOfFortune],["Vertex",a.vertex]])t&&e.push({name:r,sign:t.sign,longitude:t.longitude,isPoint:!0});return e}renderEmpty(){return Ir`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return Ir`<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=v[u(r.name)]??"",s=D[u(r.sign??"")]??"",o=typeof r.speed=="number"?h(r.speed,3):"";return Ir`<tr class="${r.isPoint?"point":""}"><td class="body">${t?Ir`<span class="glyph">${t}</span>`:$t}${r.name}</td><td>${s?Ir`<span class="glyph">${s}</span>`:$t}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?lt(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?Ir`${o}°/day`:$t} ${r.isRetrograde?Ir`<span class="retro">℞</span>`:$t}</td></tr>`})}</tbody></table></div>`}};za.styles=[y,zl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],za=d([Al("roxy-western-planets-table")],za);import{css as El,html as O,nothing as Xe}from"lit";import{customElement as Dl,state as Pl}from"lit/decorators.js";var _r=class extends m{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return O`<span class="${r}">${e}</span>`}renderDetailCard(e){return O`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Xe}</p>${e.description?O`<p class="description">${e.description}</p>`:Xe} ${e.result?O`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Xe}</div>`}renderDetectCard(e){return O`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Xe} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?O`<p class="description">${e.description}</p>`:Xe} ${e.present&&e.result?O`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Xe} ${e.evidence?O`<p class="evidence">${e.evidence}</p>`:Xe}</div>`}renderEmpty(){return O`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return O`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"present"in t[0]){let c=t,p=r?c.filter(f=>f.name.toLowerCase().includes(r)):c,g=[...p.filter(f=>f.present),...p.filter(f=>!f.present)],x=e.total??c.filter(f=>f.present).length;return O`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${x} of ${c.length} present</span></div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter detected yogas by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Detected yogas">${g.length>0?g.map(f=>this.renderDetectCard(f)):O`<p class="no-results">No yogas match your search.</p>`}</div></div>`}if(t.length>0&&"description"in t[0]){let c=t,p=r?c.filter(x=>x.name.toLowerCase().includes(r)):c,g=e.total;return O`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${g!==void 0?O`<span class="count">${g} total</span>`:Xe}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(x=>this.renderDetailCard(x)):O`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let o=t,i=r?o.filter(c=>c.name.toLowerCase().includes(r)):o,l=e.total;return O`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?O`<span class="count">${l} total</span>`:Xe}</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=>O`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):O`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return O`<div class="roxy-empty" role="status">No yoga data</div>`}};_r.styles=[y,El`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.present-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.present-badge.is-present{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.present-badge.is-absent{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);color:var(--roxy-fg,#0a0a0a)}.detail-card.absent{opacity:.72}.evidence{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([Pl()],_r.prototype,"filter",2),_r=d([Dl("roxy-yoga-list")],_r);var Vt=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyAstrocartographyMap",tag:"roxy-astrocartography-map",slug:"astrocartography-map",heading:"Astrocartography",description:"Astrocartography world map plotting each body Midheaven, IC, Ascendant, and Descendant relocation lines",docsLabel:"Western",endpointLabel:"POST /astrology/astrocartography",docsSummary:"World map of planetary MC, IC, Ascendant, and Descendant lines with per-line interpretations",topic:"Astrology"},{pascal:"RoxyLocalSpaceCompass",tag:"roxy-local-space-compass",slug:"local-space-compass",heading:"Local space",description:"Local space compass plotting each body direction from the birthplace by azimuth and altitude",docsLabel:"Western",endpointLabel:"POST /astrology/local-space",docsSummary:"Compass dial of planetary azimuth lines from the birthplace, dimmed below the horizon",topic:"Astrology"},{pascal:"RoxyRelocationWheel",tag:"roxy-relocation-wheel",slug:"relocation-wheel",heading:"Relocation chart",description:"Relocation chart wheel recomputing houses and angles for a new place, with the planets that change house",docsLabel:"Western",endpointLabel:"POST /astrology/relocation-chart",docsSummary:"Relocated chart wheel plus the move geometry, angular planets, and planets that change house",topic:"Astrology"},{pascal:"RoxyPositionsTable",tag:"roxy-positions-table",slug:"positions-table",heading:"Positions table",description:"Editorial positions table for asteroids, Black Moon Lilith, secondary progressions, solar arc directions, and the Arabic lots",docsLabel:"Western",endpointLabel:"POST /astrology/asteroids, /astrology/lilith, /astrology/progressions, /astrology/solar-arc, /astrology/arabic-lots",docsSummary:"Body, sign, degree, and per-shape columns (house, motion, formula, or natal arc) plus each reading",topic:"Astrology"},{pascal:"RoxyFixedStars",tag:"roxy-fixed-stars",slug:"fixed-stars",heading:"Fixed stars",description:"Fixed star conjunctions to the natal chart, tightest first, with the precessed star catalog",docsLabel:"Western",endpointLabel:"POST /astrology/fixed-stars",docsSummary:"Star to natal point conjunctions with readings, plus a catalog of position, magnitude, nature, and keywords",topic:"Astrology"},{pascal:"RoxyProfectionCard",tag:"roxy-profection-card",slug:"profection-card",heading:"Annual profection",description:"Annual profection card with the profected house and sign, the lord of the year, and its natal placement",docsLabel:"Western",endpointLabel:"POST /astrology/profections",docsSummary:"Profected house and sign for the year, the lord of the year, its natal placement, and the reading",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyVedicAspects",tag:"roxy-vedic-aspects",slug:"vedic-aspects",heading:"Vedic aspects",description:"Vedic graha drishti table: which planet aspects which, with mutual aspects surfaced first",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/aspects",docsSummary:"Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",topic:"Vedic"},{pascal:"RoxyHoraTable",tag:"roxy-hora-table",slug:"hora-table",heading:"Hora",description:"Vedic Hora (planetary hours) table: 12 day and 12 night horas by ruling planet for electional timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/hora",docsSummary:"Day and night planetary hours with ruling planet and window",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, soul urge, personality, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,soul-urge,personality,birth-day,maturity,daily,personal-day,personal-month,personal-year,chart}",docsSummary:"Life path, expression, soul urge, personality, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotCatalog",tag:"roxy-tarot-catalog",slug:"tarot-catalog",heading:"Tarot deck",description:"Responsive tarot deck gallery with card art, name, and an arcana and suit caption from the tarot catalog response",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards",docsSummary:"Deck gallery tiles with card art, name, and arcana and suit",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyHdConnection",tag:"roxy-hd-connection",slug:"hd-connection",heading:"HD connection",description:"Human Design connection chart: the composite channels two people form, with circuit, dynamic, and which person holds each gate",docsLabel:"Human Design",endpointLabel:"POST /human-design/connection",docsSummary:"Electromagnetic, compromise, and dominance channels between two charts",topic:"Human Design"},{pascal:"RoxyHdPenta",tag:"roxy-hd-penta",slug:"hd-penta",heading:"HD penta",description:"Human Design penta for a 3 to 5 person group: upper and lower triangle channels, defined or open, with core channels and member coverage",docsLabel:"Human Design",endpointLabel:"POST /human-design/penta",docsSummary:"Group penta channels split into upper and lower triangles",topic:"Human Design"},{pascal:"RoxyHdVariables",tag:"roxy-hd-variables",slug:"hd-variables",heading:"HD variables",description:"Human Design variables: the four PHS arrows (determination, environment, perspective, motivation) with left/right direction and color, tone, and base",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction and PHS labels",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyForecastDigest",tag:"roxy-forecast-digest",slug:"forecast-digest",heading:"Forecast digest",description:"Rolled-up forecast across the next 24 hours, 7, 30, and 90 days with per-domain breakdown and top events",docsLabel:"Forecast",endpointLabel:"POST /forecast/digest",docsSummary:"Per-window event counts, domain breakdown, and the highest-significance events",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyCrystalCard",tag:"roxy-crystal-card",slug:"crystal-card",heading:"Crystal detail",description:"Single-crystal detail card with photo, spiritual, emotional, and physical meaning, metaphysical attributes, affirmation, and pairings",docsLabel:"Crystals",endpointLabel:"GET /crystals/{id}",docsSummary:"Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",topic:"Crystals"},{pascal:"RoxyCrystalGrid",tag:"roxy-crystal-grid",slug:"crystal-grid",heading:"Crystal grid",description:"Responsive crystal gallery with photo, name, and colour swatches from any crystals list response",docsLabel:"Crystals",endpointLabel:"GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",docsSummary:"Crystal gallery tiles with photo, name, and colour swatches",topic:"Crystals"},{pascal:"RoxyDreamCard",tag:"roxy-dream-card",slug:"dream-card",heading:"Dream symbol",description:"Dream symbol card with the symbol name, full interpretation, and dictionary letter",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols/{id}",docsSummary:"Symbol name, interpretation body, and letter chip",topic:"Dreams"},{pascal:"RoxyDreamSearch",tag:"roxy-dream-search",slug:"dream-search",heading:"Dream search",description:"Dream-symbol search results as selectable tiles; emits roxy-symbol-select to pair with roxy-dream-card",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols",docsSummary:"Matched dream symbols as selectable tiles with a letter chip",topic:"Dreams"},{pascal:"RoxyAngelNumberCard",tag:"roxy-angel-number-card",slug:"angel-number-card",heading:"Angel number",description:"Angel number card with title, core message, badges, keywords, life-area interpretations, affirmation, and action steps",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/numbers/{number}",docsSummary:"Number meaning with spiritual, love, career, money, twin flame, biblical, and shadow sections",topic:"Angel Numbers"},{pascal:"RoxyAngelNumberLookup",tag:"roxy-angel-number-lookup",slug:"angel-number-lookup",heading:"Angel number lookup",description:"Angel number sequence analysis with pattern classification, the known meaning when present, and a digit-root fallback for any number",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/lookup",docsSummary:"Pattern analysis plus known meaning and digit-root fallback",topic:"Angel Numbers"},{pascal:"RoxyReferenceCard",tag:"roxy-reference-card",slug:"reference-card",heading:"Reference card",description:"Glossary entry for any reference lookup: zodiac sign, planet meaning, rashi, I Ching trigram, Human Design gate or center, numerology number or compound number",docsLabel:"Reference",endpointLabel:"GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/rashis/{id}, /iching/trigrams/{id}, /human-design/{gates,centers}/{id}, /numerology/{meanings,compound-number}/{number}",docsSummary:"Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",topic:"Helpers"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint, from the spec",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Nl="0.12.2";var rx=Vt.map(n=>n.slug);export{Vt as ROXY_COMPONENTS,rx as ROXY_UI_COMPONENTS,Nl as ROXY_UI_VERSION,Kr as RoxyAngelNumberCard,Fr as RoxyAngelNumberLookup,mr as RoxyAshtakavargaGrid,Yr as RoxyAspectsTable,Ur as RoxyAstrocartographyMap,ur as RoxyBiorhythmChart,Wr as RoxyBodygraph,Jr as RoxyChoghadiyaGrid,hr as RoxyCompatibilityCard,Xr as RoxyCrystalCard,fr as RoxyCrystalGrid,br as RoxyDashaTimeline,$r as RoxyData,kr as RoxyDivisionalChart,Rr as RoxyDoshaCard,ra as RoxyDreamCard,aa as RoxyDreamSearch,te as RoxyEndpointForm,ta as RoxyFixedStars,sa as RoxyForecastDigest,oa as RoxyForecastTimeline,na as RoxyGunaMilan,ia as RoxyHdConnection,la as RoxyHdPenta,da as RoxyHdVariables,Mr as RoxyHexagram,pa as RoxyHoraTable,Tr as RoxyHoroscopeCard,Ar as RoxyKpChart,ma as RoxyKpPlanetsTable,ga as RoxyKpRulingPlanets,ya as RoxyLocalSpaceCompass,X as RoxyLocationSearch,Dr as RoxyMoonPhase,xa as RoxyNakshatraCard,Ue as RoxyNatalChart,Pr as RoxyNumerologyCard,Nr as RoxyPanchangTable,Gr as RoxyPositionsTable,ba as RoxyProfectionCard,va as RoxyReferenceCard,$a as RoxyRelocationWheel,ka as RoxyShadbalaTable,Ca as RoxySynastryChart,Hr as RoxyTarotCard,Or as RoxyTarotCatalog,jr as RoxyTarotSpread,Br as RoxyTransitsTable,Ma as RoxyVedicAspects,Je as RoxyVedicKundli,Ta as RoxyVedicPlanetsTable,za as RoxyWesternPlanetsTable,_r as RoxyYogaList,js as roxyDataScript,Wt as serializeRoxyData};
103
+ </g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=u(o);for(let l of s)if(u(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return ie;let l=k(T,T,Ft-12,this.toAngle(o)),c=k(T,T,Ra+8,this.toAngle(i)),p=Zr(s),g=gr[p]??"aspect-other",x=h(s.orb,1);return Sa`<line class=${`aspect ${g}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p} ${s.planet2}${x?` (orb ${x}\xB0)`:""}</title></line>`})}renderAspects(a){return I`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(e=>I`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${Zr(e)||""}</td><td class="orb">${h(e.orb,1)}</td><td>${cl(e.strength)}</td></tr>`)}</tbody></table>`}};Ca.styles=[y,il`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],Ca=d([ll("roxy-synastry-chart")],Ca);function cl(n){return typeof n=="number"?Math.round(n).toString():""}import{css as pl,html as _,nothing as Ie}from"lit";import{customElement as ml,state as gl}from"lit/decorators.js";var Hr=class extends m{constructor(){super(...arguments);this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}renderEmpty(){return _`<div class="roxy-empty" role="status">No tarot data</div>`}renderData(e){return"card"in e?this.renderDailyCard(e):this.renderFullCard(e)}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,s=r.keywords??[];return _`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?_`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:_`<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?_`${r.arcana} arcana`:Ie} ${t?_`· reversed`:Ie}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?_`<p class="message">${e.dailyMessage}</p>`:Ie} ${r.meaning?_`<p>${r.meaning}</p>`:Ie} ${s.length>0?_`<div class="chips">${s.map(o=>_`<span>${o}</span>`)}</div>`:Ie} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,s=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return _`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?_`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:_`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?_`${e.arcana} arcana`:Ie} ${e.number!==void 0&&e.number!==null?_`· ${e.number}`:Ie} ${r?_`· reversed`:Ie}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?_`<p>${t.description}</p>`:Ie} ${s.length>0?_`<div class="chips">${s.map(o=>_`<span>${o}</span>`)}</div>`:Ie} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};Hr.styles=[y,pl`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([gl()],Hr.prototype,"flipped",2),Hr=d([ml("roxy-tarot-card")],Hr);import{css as yl,html as qa}from"lit";import{customElement as ul,property as xl}from"lit/decorators.js";var Or=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return qa`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let r=e.cards??[];if(r.length===0)return this.renderEmpty();let t=this.heading||"Tarot deck",s=typeof e.total=="number"?e.total:r.length;return qa`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"card":"cards"}</span></header><ul class="grid">${r.map(o=>qa`<li class="tile">${o.imageUrl?qa`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:qa`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${hl(o)}</p></li>`)}</ul></section>`}};Or.styles=[y,yl`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(7rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.art{aspect-ratio:2/3;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meta{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0}`],d([xl({type:String,reflect:!0})],Or.prototype,"heading",2),Or=d([ul("roxy-tarot-catalog")],Or);function hl(n){return n.suit?`${u(n.arcana)} \xB7 ${u(n.suit)}`:`${u(n.arcana)} Arcana`}import{css as Ll,html as K,nothing as Pe}from"lit";import{customElement as fl,property as bl}from"lit/decorators.js";var jr=class extends m{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return K`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let r="answer"in e,t="cards"in e&&!("spread"in e),s=t?[]:"positions"in e?e.positions??[]:[],o=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),p="question"in e?e.question:void 0,g="summary"in e?e.summary:void 0,x=r?e.interpretation:void 0,f=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return K`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?K`<span class="question">"${p}"</span>`:Pe}</header>${r?K`<div><span class="${`answer ${f}`}">${i}</span> ${l?K`<small>· ${l}</small>`:Pe}</div>`:Pe} ${s.length>0?K`<div class="grid">${s.map(L=>K`<div class="card"><p class="label">${L.name??""}</p><div class="image">${L.card?.imageUrl?K`<img src="${L.card.imageUrl}" alt="${L.card.name??"tarot card"}" class="${L.card.reversed?"reversed":""}">`:K`${L.card?.name??"?"}`}</div><p class="name">${L.card?.name??""} ${L.card?.reversed?K`<small>(reversed)</small>`:Pe}</p>${L.interpretation?K`<p class="interp">${L.interpretation}</p>`:Pe}</div>`)}</div>`:Pe} ${o.length>0?K`<div class="grid">${o.map(L=>K`<div class="card"><div class="image">${L.imageUrl?K`<img src="${L.imageUrl}" alt="${L.name??"tarot card"}" class="${L.reversed?"reversed":""}">`:K`${L.name??"?"}`}</div><p class="name">${L.name??""} ${L.reversed?K`<small>(reversed)</small>`:Pe}</p>${L.meaning?K`<p class="interp">${L.meaning}</p>`:Pe}</div>`)}</div>`:Pe} ${g?K`<p class="reading">${g}</p>`:Pe} ${x?K`<p class="reading">${x}</p>`:Pe}</article>`}};jr.styles=[y,Ll`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([bl({type:String,reflect:!0})],jr.prototype,"spread",2),jr=d([fl("roxy-tarot-spread")],jr);import{css as vl,html as F,nothing as dr}from"lit";import{customElement as $l,state as wl}from"lit/decorators.js";var Br=class extends m{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return F`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:r,transitTime:t,transitPlanets:s,transitAspects:o,summary:i}=e,l=[de(r),ue(t)].filter(Boolean).join(" "),c=o?.length??0,p=this.tab;return F`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?F`<p class="subtitle">${l}</p>`:dr}</div>${c>0?F`${Qr({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:p,onSelect:g=>{this.tab=g},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?F`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:F`${i?this.renderSummaryPills(i):dr}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:F`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return F`<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 F`<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=v[u(r.name)]??"",s=D[u(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return F`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?F`<span class="retro-badge" aria-label="retrograde">R</span>`:dr}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${h(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${h(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return F`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=v[u(r.transitPlanet)]??"",o=v[u(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return F`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${s}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${o}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${h(r.orb,2)}° · strength ${h(r.strength,1)} </span>${j()}</summary><div class="interp-body">${l?.summary?F`<p>${l.summary}</p>`:dr} ${l?.impact?F`<p><strong>Impact:</strong> ${l.impact}</p>`:dr} ${l?.timing?F`<p><strong>Timing:</strong> ${l.timing}</p>`:dr} ${l?.guidance?F`<p><strong>Guidance:</strong> ${l.guidance}</p>`:dr} ${l?.keywords?.length?F`<div class="interp-keywords">${l.keywords.map(g=>F`<span class="kw">${g}</span>`)}</div>`:dr}</div></details>`})}</div>`}};Br.styles=[y,tr,le,vl`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([wl()],Br.prototype,"tab",2),Br=d([$l("roxy-transits-table")],Br);import{css as kl,html as We,nothing as Ua}from"lit";import{customElement as Sl}from"lit/decorators.js";var Ma=class extends m{renderEmpty(){return We`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[];if(e.length===0&&r.length===0)return this.renderEmpty();let t=a.datetime?String(a.datetime).replace("T"," "):"";return We`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${t?We`<p class="subtitle">${t}</p>`:Ua}</div>${r.length>0?We`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(s=>We`<span class="mutual-pill">${s.planet1} ⟷ ${s.planet2} ${s.aspectType?We`<span class="rel">${s.aspectType}</span>`:Ua}</span>`)}</div></div>`:Ua} ${e.length>0?We`<div class="overflow-scroll"><table><thead><tr><th scope="col">From</th><th scope="col">Aspect</th><th scope="col">To</th><th scope="col">Strength</th><th scope="col">Orb</th></tr></thead><tbody>${e.map(s=>We`<tr><td>${s.aspectingPlanet}</td><td><span class="kind">${s.aspectType}</span></td><td>${s.aspectedPlanet}</td><td>${typeof s.strength=="number"?We`<span class="bar" style="width:${Math.max(4,Math.min(100,s.strength)*.4)}px"></span><span class="num">${h(s.strength,0)}</span>`:Ua}</td><td class="num">${typeof s.orb=="number"?`${h(s.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:Ua}</div>`}};Ma.styles=[y,kl`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.mutual{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.mutual-pill{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:.35rem;padding:2px 10px;display:inline-flex}.mutual-pill .rel{font-size:var(--roxy-text-xs,.75rem);font-weight:400}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}tbody tr:last-child td{border-bottom:none}.kind{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);font-size:var(--roxy-text-xs,.75rem);padding:1px 8px;font-weight:600;display:inline-block}.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.bar{background:var(--roxy-accent,#f59e0b);vertical-align:middle;border-radius:3px;height:6px;margin-right:6px;display:inline-block}`],Ma=d([Sl("roxy-vedic-aspects")],Ma);import{html as Ds}from"lit";import{customElement as Rl,property as Yt}from"lit/decorators.js";var Je=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e}}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?ct(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return Ds`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let t=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return Ds`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${mt(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>${pt(r,this.chartStyle)}</svg></div>`}};Je.styles=[y,gt,tr],d([Yt({type:String,reflect:!0,attribute:"chart-style"})],Je.prototype,"chartStyle",2),d([Yt({type:String,reflect:!0,attribute:"chart-reference"})],Je.prototype,"chartReference",2),d([Yt({type:String,reflect:!0,attribute:"lagna-override"})],Je.prototype,"lagnaOverride",2),Je=d([Rl("roxy-vedic-kundli")],Je);import{css as Cl,html as G,nothing as ye}from"lit";import{customElement as Ml}from"lit/decorators.js";var Tl=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Ta=class extends m{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of Tl){let s=a[t];s&&(r.push([t,s]),e.add(t))}for(let[t,s]of Object.entries(a))e.has(t)||r.push([t,s]);return r}renderEmpty(){return G`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return G`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let s=(t.graha??r)==="Lagna",o=v[u(t.graha??r)]??"",i=D[u(t.rashi??"")]??"";return G`<tr class="${s?"lagna":""}"><td class="graha">${o?G`<span class="glyph">${o}</span>`:ye}${t.graha??r}</td><td>${i?G`<span class="glyph">${i}</span>`:ye}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?lt(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?G`<span class="retro">R</span>`:ye}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let a=this.data?.combustion??[];return a.length===0?ye:G`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${j()}</summary><div class="panel-body">${a.map(e=>{let r=v[u(e.planet)]??"",t=h(e.distanceFromSun,2),s=h(e.orb,1);return G`<div class="condition"><span class="planet">${r?`${r} `:""}${e.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let a=this.data?.planetaryWar??[];return a.length===0?ye:G`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${j()}</summary><div class="panel-body">${a.map(e=>{let r=h(e.distance,2);return G`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let a=this.data?.interpretations??{},e=this.orderedRows().map(([r,t])=>[t.graha??r,a[t.graha??r]]).filter(([,r])=>r!=null);return e.length===0?ye:G`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${j()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=v[u(r)]??"";return G`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?G`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:ye} ${t.nakshatra?G`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:ye}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?ye:G`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${j()}</summary><div class="panel-body">${a.map(e=>G`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?G`<p class="desc">${e.description}</p>`:ye}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?ye:G`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${j()}</summary><div class="panel-body">${a.map(e=>G`<div class="bhava"><span class="name">${e.name} ${e.quality?G`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:ye}</span> ${e.result?G`<p class="desc">${e.result}</p>`:ye}</div>`)}</div></details>`}};Ta.styles=[y,le,Cl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],Ta=d([Ml("roxy-vedic-planets-table")],Ta);import{css as zl,html as Ir,nothing as $t}from"lit";import{customElement as Al}from"lit/decorators.js";var za=class extends m{rows(){let a=this.data;if(!a)return[];let e=(a.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,t]of[["Ascendant",a.ascendant],["Midheaven",a.midheaven],["Part of Fortune",a.partOfFortune],["Vertex",a.vertex]])t&&e.push({name:r,sign:t.sign,longitude:t.longitude,isPoint:!0});return e}renderEmpty(){return Ir`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return Ir`<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=v[u(r.name)]??"",s=D[u(r.sign??"")]??"",o=typeof r.speed=="number"?h(r.speed,3):"";return Ir`<tr class="${r.isPoint?"point":""}"><td class="body">${t?Ir`<span class="glyph">${t}</span>`:$t}${r.name}</td><td>${s?Ir`<span class="glyph">${s}</span>`:$t}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?lt(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?Ir`${o}°/day`:$t} ${r.isRetrograde?Ir`<span class="retro">℞</span>`:$t}</td></tr>`})}</tbody></table></div>`}};za.styles=[y,zl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],za=d([Al("roxy-western-planets-table")],za);import{css as El,html as O,nothing as Xe}from"lit";import{customElement as Dl,state as Pl}from"lit/decorators.js";var _r=class extends m{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return O`<span class="${r}">${e}</span>`}renderDetailCard(e){return O`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Xe}</p>${e.description?O`<p class="description">${e.description}</p>`:Xe} ${e.result?O`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Xe}</div>`}renderDetectCard(e){return O`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Xe} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?O`<p class="description">${e.description}</p>`:Xe} ${e.present&&e.result?O`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Xe} ${e.evidence?O`<p class="evidence">${e.evidence}</p>`:Xe}</div>`}renderEmpty(){return O`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return O`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"present"in t[0]){let c=t,p=r?c.filter(f=>f.name.toLowerCase().includes(r)):c,g=[...p.filter(f=>f.present),...p.filter(f=>!f.present)],x=e.total??c.filter(f=>f.present).length;return O`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${x} of ${c.length} present</span></div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter detected yogas by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Detected yogas">${g.length>0?g.map(f=>this.renderDetectCard(f)):O`<p class="no-results">No yogas match your search.</p>`}</div></div>`}if(t.length>0&&"description"in t[0]){let c=t,p=r?c.filter(x=>x.name.toLowerCase().includes(r)):c,g=e.total;return O`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${g!==void 0?O`<span class="count">${g} total</span>`:Xe}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(x=>this.renderDetailCard(x)):O`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let o=t,i=r?o.filter(c=>c.name.toLowerCase().includes(r)):o,l=e.total;return O`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?O`<span class="count">${l} total</span>`:Xe}</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=>O`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):O`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return O`<div class="roxy-empty" role="status">No yoga data</div>`}};_r.styles=[y,El`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.present-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.present-badge.is-present{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.present-badge.is-absent{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);color:var(--roxy-fg,#0a0a0a)}.detail-card.absent{opacity:.72}.evidence{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([Pl()],_r.prototype,"filter",2),_r=d([Dl("roxy-yoga-list")],_r);var Vt=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyAstrocartographyMap",tag:"roxy-astrocartography-map",slug:"astrocartography-map",heading:"Astrocartography",description:"Astrocartography world map plotting each body Midheaven, IC, Ascendant, and Descendant relocation lines",docsLabel:"Western",endpointLabel:"POST /astrology/astrocartography",docsSummary:"World map of planetary MC, IC, Ascendant, and Descendant lines with per-line interpretations",topic:"Astrology"},{pascal:"RoxyLocalSpaceCompass",tag:"roxy-local-space-compass",slug:"local-space-compass",heading:"Local space",description:"Local space compass plotting each body direction from the birthplace by azimuth and altitude",docsLabel:"Western",endpointLabel:"POST /astrology/local-space",docsSummary:"Compass dial of planetary azimuth lines from the birthplace, dimmed below the horizon",topic:"Astrology"},{pascal:"RoxyRelocationWheel",tag:"roxy-relocation-wheel",slug:"relocation-wheel",heading:"Relocation chart",description:"Relocation chart wheel recomputing houses and angles for a new place, with the planets that change house",docsLabel:"Western",endpointLabel:"POST /astrology/relocation-chart",docsSummary:"Relocated chart wheel plus the move geometry, angular planets, and planets that change house",topic:"Astrology"},{pascal:"RoxyPositionsTable",tag:"roxy-positions-table",slug:"positions-table",heading:"Positions table",description:"Editorial positions table for asteroids, Black Moon Lilith, secondary progressions, solar arc directions, and the Arabic lots",docsLabel:"Western",endpointLabel:"POST /astrology/asteroids, /astrology/lilith, /astrology/progressions, /astrology/solar-arc, /astrology/arabic-lots",docsSummary:"Body, sign, degree, and per-shape columns (house, motion, formula, or natal arc) plus each reading",topic:"Astrology"},{pascal:"RoxyFixedStars",tag:"roxy-fixed-stars",slug:"fixed-stars",heading:"Fixed stars",description:"Fixed star conjunctions to the natal chart, tightest first, with the precessed star catalog",docsLabel:"Western",endpointLabel:"POST /astrology/fixed-stars",docsSummary:"Star to natal point conjunctions with readings, plus a catalog of position, magnitude, nature, and keywords",topic:"Astrology"},{pascal:"RoxyProfectionCard",tag:"roxy-profection-card",slug:"profection-card",heading:"Annual profection",description:"Annual profection card with the profected house and sign, the lord of the year, and its natal placement",docsLabel:"Western",endpointLabel:"POST /astrology/profections",docsSummary:"Profected house and sign for the year, the lord of the year, its natal placement, and the reading",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyVedicAspects",tag:"roxy-vedic-aspects",slug:"vedic-aspects",heading:"Vedic aspects",description:"Vedic graha drishti table: which planet aspects which, with mutual aspects surfaced first",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/aspects",docsSummary:"Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",topic:"Vedic"},{pascal:"RoxyHoraTable",tag:"roxy-hora-table",slug:"hora-table",heading:"Hora",description:"Vedic Hora (planetary hours) table: 12 day and 12 night horas by ruling planet for electional timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/hora",docsSummary:"Day and night planetary hours with ruling planet and window",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, soul urge, personality, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,soul-urge,personality,birth-day,maturity,daily,personal-day,personal-month,personal-year,chart}",docsSummary:"Life path, expression, soul urge, personality, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotCatalog",tag:"roxy-tarot-catalog",slug:"tarot-catalog",heading:"Tarot deck",description:"Responsive tarot deck gallery with card art, name, and an arcana and suit caption from the tarot catalog response",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards",docsSummary:"Deck gallery tiles with card art, name, and arcana and suit",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyHdConnection",tag:"roxy-hd-connection",slug:"hd-connection",heading:"HD connection",description:"Human Design connection chart: the composite channels two people form, with circuit, dynamic, and which person holds each gate",docsLabel:"Human Design",endpointLabel:"POST /human-design/connection",docsSummary:"Electromagnetic, compromise, and dominance channels between two charts",topic:"Human Design"},{pascal:"RoxyHdPenta",tag:"roxy-hd-penta",slug:"hd-penta",heading:"HD penta",description:"Human Design penta for a 3 to 5 person group: upper and lower triangle channels, defined or open, with core channels and member coverage",docsLabel:"Human Design",endpointLabel:"POST /human-design/penta",docsSummary:"Group penta channels split into upper and lower triangles",topic:"Human Design"},{pascal:"RoxyHdVariables",tag:"roxy-hd-variables",slug:"hd-variables",heading:"HD variables",description:"Human Design variables: the four PHS arrows (determination, environment, perspective, motivation) with left/right direction and color, tone, and base",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction and PHS labels",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyForecastDigest",tag:"roxy-forecast-digest",slug:"forecast-digest",heading:"Forecast digest",description:"Rolled-up forecast across the next 24 hours, 7, 30, and 90 days with per-domain breakdown and top events",docsLabel:"Forecast",endpointLabel:"POST /forecast/digest",docsSummary:"Per-window event counts, domain breakdown, and the highest-significance events",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyCrystalCard",tag:"roxy-crystal-card",slug:"crystal-card",heading:"Crystal detail",description:"Single-crystal detail card with photo, spiritual, emotional, and physical meaning, metaphysical attributes, affirmation, and pairings",docsLabel:"Crystals",endpointLabel:"GET /crystals/{id}",docsSummary:"Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",topic:"Crystals"},{pascal:"RoxyCrystalGrid",tag:"roxy-crystal-grid",slug:"crystal-grid",heading:"Crystal grid",description:"Responsive crystal gallery with photo, name, and colour swatches from any crystals list response",docsLabel:"Crystals",endpointLabel:"GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",docsSummary:"Crystal gallery tiles with photo, name, and colour swatches",topic:"Crystals"},{pascal:"RoxyDreamCard",tag:"roxy-dream-card",slug:"dream-card",heading:"Dream symbol",description:"Dream symbol card with the symbol name, full interpretation, and dictionary letter",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols/{id}",docsSummary:"Symbol name, interpretation body, and letter chip",topic:"Dreams"},{pascal:"RoxyDreamSearch",tag:"roxy-dream-search",slug:"dream-search",heading:"Dream search",description:"Dream-symbol search results as selectable tiles; emits roxy-symbol-select to pair with roxy-dream-card",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols",docsSummary:"Matched dream symbols as selectable tiles with a letter chip",topic:"Dreams"},{pascal:"RoxyAngelNumberCard",tag:"roxy-angel-number-card",slug:"angel-number-card",heading:"Angel number",description:"Angel number card with title, core message, badges, keywords, life-area interpretations, affirmation, and action steps",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/numbers/{number}",docsSummary:"Number meaning with spiritual, love, career, money, twin flame, biblical, and shadow sections",topic:"Angel Numbers"},{pascal:"RoxyAngelNumberLookup",tag:"roxy-angel-number-lookup",slug:"angel-number-lookup",heading:"Angel number lookup",description:"Angel number sequence analysis with pattern classification, the known meaning when present, and a digit-root fallback for any number",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/lookup",docsSummary:"Pattern analysis plus known meaning and digit-root fallback",topic:"Angel Numbers"},{pascal:"RoxyReferenceCard",tag:"roxy-reference-card",slug:"reference-card",heading:"Reference card",description:"Glossary entry for any reference lookup: zodiac sign, planet meaning, rashi, I Ching trigram, Human Design gate or center, numerology number or compound number",docsLabel:"Reference",endpointLabel:"GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/rashis/{id}, /iching/trigrams/{id}, /human-design/{gates,centers}/{id}, /numerology/{meanings,compound-number}/{number}",docsSummary:"Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",topic:"Helpers"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint, from the spec",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Nl="0.12.3";var rx=Vt.map(n=>n.slug);export{Vt as ROXY_COMPONENTS,rx as ROXY_UI_COMPONENTS,Nl as ROXY_UI_VERSION,Kr as RoxyAngelNumberCard,Fr as RoxyAngelNumberLookup,mr as RoxyAshtakavargaGrid,Yr as RoxyAspectsTable,Ur as RoxyAstrocartographyMap,ur as RoxyBiorhythmChart,Wr as RoxyBodygraph,Jr as RoxyChoghadiyaGrid,hr as RoxyCompatibilityCard,Xr as RoxyCrystalCard,fr as RoxyCrystalGrid,br as RoxyDashaTimeline,$r as RoxyData,kr as RoxyDivisionalChart,Rr as RoxyDoshaCard,ra as RoxyDreamCard,aa as RoxyDreamSearch,te as RoxyEndpointForm,ta as RoxyFixedStars,sa as RoxyForecastDigest,oa as RoxyForecastTimeline,na as RoxyGunaMilan,ia as RoxyHdConnection,la as RoxyHdPenta,da as RoxyHdVariables,Mr as RoxyHexagram,pa as RoxyHoraTable,Tr as RoxyHoroscopeCard,Ar as RoxyKpChart,ma as RoxyKpPlanetsTable,ga as RoxyKpRulingPlanets,ya as RoxyLocalSpaceCompass,X as RoxyLocationSearch,Dr as RoxyMoonPhase,xa as RoxyNakshatraCard,Ue as RoxyNatalChart,Pr as RoxyNumerologyCard,Nr as RoxyPanchangTable,Gr as RoxyPositionsTable,ba as RoxyProfectionCard,va as RoxyReferenceCard,$a as RoxyRelocationWheel,ka as RoxyShadbalaTable,Ca as RoxySynastryChart,Hr as RoxyTarotCard,Or as RoxyTarotCatalog,jr as RoxyTarotSpread,Br as RoxyTransitsTable,Ma as RoxyVedicAspects,Je as RoxyVedicKundli,Ta as RoxyVedicPlanetsTable,za as RoxyWesternPlanetsTable,_r as RoxyYogaList,js as roxyDataScript,Wt as serializeRoxyData};
104
104
  //# sourceMappingURL=index.js.map